版权编程
基于FPGA的数字跑表的设计与实现
1、设计要求
用FPGA设计并实现一个数字跑表,范围为0~59分59.99秒。能够实现数字跑表进行启动、中止计时和显示读数三个操做,能够在数码管上显示读数。
2、设计任务
2.1基本部分
(1)了解FPGA开发板,了解数字跑表的功能。
(2)VHDL语言编程实现数字跑表系统的功能模块,数字跑表进行启动、中止、显示读数操做,并具备计时清零功能;
(3)程序编译正确,在Modelsim中仿真正确;
(4)采用FPGA开发板做为开发平台,可以下载验证。
2.2提升部分
可以采用原理图设计法设计。
3、设计原理
图3.1系统框图
如图,若是要实现计时范围为0~59分59.99秒的数字跑表并在数码管上显示读数,那么须要设计时钟电路、分频电路、计数器电路、译码显示1电路。将DE1-SOC开发套件中提供的50MHZ时钟进行分频至100HZ后送入100进制计数器,计数器计满100后发出进位信号送入计秒模块的60进制计数器,计数器满60后发出进位信号送入计分模块的60进制计数器,每一个计数器分别链接不一样的数码管显示电路,实时显示计时效果。所以使用原理图输入设计法,使用QuartusII软件编写元件代码和绘制原理图,然后进行综合仿真。
4、设计方案
4.1 硬件设计
本设计须要用到一个稳定的50MHZ的时钟,一个500000分频的分频器,一个100进制计数器,两个60进制计数器,两个拨码开关,六个7段数码管。综上所述,DE1-SOC开发套件提供的FPGA芯片可知足对分频器和计数器的设计需求,丰富的外部设备可知足对数码管和拨码开关的需求。
图4.1 DE1-SOC开发板实物图spa
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 IS PORT(CLK:IN STD_LOGIC; CLKOUT:OUT STD_LOGIC); END CLOCK; ARCHITECTURE RTL OF CLOCK IS SIGNAL CLK_1_REG: STD_LOGIC := '1'; BEGIN CLKOUT<=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 数码管显示电路3d
`LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY HEX IS PORT( HEXIN:IN STD_LOGIC_VECTOR(3 DOWNTO 0); HEXOUT:OUT STD_LOGIC_VECTOR(6 DOWNTO 0)); END HEX; ARCHITECTURE RTL OF HEX IS BEGIN PROCESS(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 十进制计数器code
`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 IS BEGIN 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 六进制计数器blog
`LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY COUNTER6 IS PORT(CLK,CLR,EN: IN STD_LOGIC; DOUT : OUT STD_LOGIC_VECTOR (3 DOWNTO 0); CO : OUT STD_LOGIC); END COUNTER6; ARCHITECTURE RTL OF COUNTER6 IS BEGIN PROCESS(CLK,CLR,EN) VARIABLE Q : STD_LOGIC_VECTOR (3 DOWNTO 0); BEGIN IF(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