版权

基于FPGA的数字跑表的设计与实现
一、设计要求
用FPGA设计并实现一个数字跑表,范畴为0~59分59.99秒。能够实现数字跑表进行启动、进行计时和显示读数三个操作,能够在数码管上显示读数。
二、设计工作
2.1根本局部
(1)理解FPGA开发板,理解数字跑表的性能。
(2)VHDL语言编程实现数字跑表零碎的功能模块,数字跑表进行启动、进行、显示读数操作,并具备计时清零性能;
(3)程序编译正确,在Modelsim中仿真正确;
(4)采纳FPGA开发板作为开发平台,可能下载验证。
2.2进步局部
可能采纳原理图设计法设计。
三、设计原理
图3.1零碎框图

如图,如果要实现计时范畴为0~59分59.99秒的数字跑表并在数码管上显示读数,那么须要设计时钟电路、分频电路、计数器电路、译码显示1电路。将DE1-SOC开发套件中提供的50MHZ时钟进行分频至100HZ后送入100进制计数器,计数器计满100后收回进位信号送入计秒模块的60进制计数器,计数器满60后收回进位信号送入计分模块的60进制计数器,每个计数器别离连贯不同的数码管显示电路,实时显示计时成果。因而应用原理图输出设计法,应用QuartusII软件编写元件代码和绘制原理图,而后进行综合仿真。
四、设计方案
4.1 硬件设计
本设计须要用到一个稳固的50MHZ的时钟,一个500000分频的分频器,一个100进制计数器,两个60进制计数器,两个拨码开关,六个7段数码管。综上所述,DE1-SOC开发套件提供的FPGA芯片可满足对分频器和计数器的设计需要,丰盛的外部设备可满足对数码管和拨码开关的需要。
图4.1 DE1-SOC开发板实物图

4.2 软件设计
一百进制计数器采纳两个十进制计数器级联的形式实现,六十进制计数器采纳十进制和六进制计数器级联的形式实现。
4.2.1 分频器

`LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY CLOCK ISPORT(CLK:IN STD_LOGIC;      CLKOUT:OUT STD_LOGIC);END CLOCK;ARCHITECTURE RTL OF CLOCK ISSIGNAL CLK_1_REG: STD_LOGIC := '1';BEGINCLKOUT<=CLK_1_REG;PROCESS(CLK)VARIABLE COUNT :INTEGER RANGE 0 TO 500000;BEGIN    IF(CLK'EVENT AND CLK='1')THEN        IF COUNT = 500000 THEN            COUNT:=0;            CLK_1_REG<=NOT CLK_1_REG;        ELSE            COUNT:=COUNT+1;        END IF;    END IF; END PROCESS; END RTL;` *   1*   2*   3*   4*   5*   6*   7*   8*   9*   10*   11*   12*   13*   14*   15*   16*   17*   18*   19*   20*   21*   22*   23*   24*   25

4.2.2 数码管显示电路

`LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY HEX ISPORT(    HEXIN:IN STD_LOGIC_VECTOR(3 DOWNTO 0);        HEXOUT:OUT STD_LOGIC_VECTOR(6 DOWNTO 0));END HEX;  ARCHITECTURE RTL OF HEX ISBEGINPROCESS(HEXIN)BEGIN    CASE HEXIN IS        WHEN "0000" => HEXOUT <="1000000";       WHEN "0001" => HEXOUT <="1111001";        WHEN "0010" => HEXOUT <="0100100";        WHEN "0011" => HEXOUT <="0110000";        WHEN "0100" => HEXOUT <="0011001";        WHEN "0101" => HEXOUT <="0010010";        WHEN "0110" => HEXOUT <="0000010";        WHEN "0111" => HEXOUT <="1011000";        WHEN "1000" => HEXOUT <="0000000";        WHEN "1001" => HEXOUT <="0010000";        WHEN "1010" => HEXOUT <="0001000";        WHEN "1011" => HEXOUT <="0000011";        WHEN "1100" => HEXOUT <="1000110";        WHEN "1101" => HEXOUT <="0100001";        WHEN "1110" => HEXOUT <="0000110";        WHEN OTHERS => HEXOUT <="1000000";    END CASE; END PROCESS;END RTL;` *   1*   2*   3*   4*   5*   6*   7*   8*   9*   10*   11*   12*   13*   14*   15*   16*   17*   18*   19*   20*   21*   22*   23*   24*   25*   26*   27*   28*   29*   30

4.2.3 十进制计数器

`LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY COUNTER10 IS    PORT(CLK,CLR,EN: IN STD_LOGIC;         DOUT : OUT STD_LOGIC_VECTOR (3 DOWNTO 0);         COUT : OUT STD_LOGIC);END COUNTER10;ARCHITECTURE RTL OF COUNTER10 ISBEGIN    PROCESS(CLK,CLR,EN)        VARIABLE Q : STD_LOGIC_VECTOR (3 DOWNTO 0);    BEGIN    IF CLR = '1' THEN Q := (OTHERS => '0');    ELSIF CLK'EVENT AND CLK = '1' THEN            IF EN = '1' THEN                 IF Q < 9 THEN Q := Q + 1;                ELSE Q := (OTHERS => '0');                END IF;            END IF;END IF;    IF Q = "0000" THEN COUT <= '1';    ELSE COUT <= '0';     END IF;    DOUT <= Q;        END PROCESS;END RTL;` *   1*   2*   3*   4*   5*   6*   7*   8*   9*   10*   11*   12*   13*   14*   15*   16*   17*   18*   19*   20*   21*   22*   23*   24*   25*   26

4.2.4 六进制计数器

`LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY COUNTER6 ISPORT(CLK,CLR,EN: IN STD_LOGIC;     DOUT : OUT STD_LOGIC_VECTOR (3 DOWNTO 0);     CO : OUT STD_LOGIC);END COUNTER6;ARCHITECTURE RTL OF COUNTER6 ISBEGINPROCESS(CLK,CLR,EN)VARIABLE Q : STD_LOGIC_VECTOR (3 DOWNTO 0);BEGINIF(CLR='1')THEN    Q:="0000";    CO<='0';ELSIF(CLK'EVENT AND CLK = '1') THEN    IF(EN='1')THEN        IF(Q <5)THEN            Q := Q + 1;        ELSE            Q := (OTHERS => '0');        END IF;    END IF;END IF;IF Q = "0000" THEN     CO <= '1';ELSE    CO <= '0'; END IF;DOUT <= Q;END PROCESS;END RTL;` *   1*   2*   3*   4*   5*   6*   7*   8*   9*   10*   11*   12*   13*   14*   15*   16*   17*   18*   19*   20*   21*   22*   23*   24*   25*   26*   27*   28*   29*   30*   31*   32*   33