版权
基于 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 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 数码管显示电路
`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 十进制计数器
`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 六进制计数器
`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