EDA大作业实验报告
——数字秒表的设计实验
一 、实验目的:
1.通过实验了解数字秒表的工作原理,并实现。
2.进一步熟悉VHDL语言的编写驱动七段数码管显示的代码,熟悉quartes2软件的操作。 3.掌握VHDL编写的一些技巧。 二、实验要求:
1. 数字秒表的计数范围是0秒~59分59.99秒,即有分、秒、1%秒显示,显示的最长
时间为59分59秒。
2. 数字秒表的计时精度是10ms。
3. 复位开关可以在任何情况下使用,即便在计时过程,只要按下复位开关,计时器就
清零,并做好下次计时的准备。
4. 具有启/停开关,即按一下此开关,则可以启动计时器开始计时,再按一下此开关便
可以停止计时。 。
三、系统设计方案:
根据系统的设计要求,可以的到如图1的系统组成框图。系统设计采用自顶向下的设计方法,系统的整体组装设计原理图如图2所示,它主要由控制模块,分频模块,计时模块和显示模块四部分组成。
秒表工作原理和多少数字电子钟大致一样,不同的是秒表为0.01秒,整个秒表的时钟信号输入为40MHZ。所以,需要对时钟信号进行分频 假设该秒表应用场合小于1小时,秒表的显示格式为mm-ss-xx(mm表示分钟:0~59;ss表示秒:0~59;xx表示百分之一秒:0~99)。
(1) 控制模块
计时控制模块主要是对计时过程进行控制。计时控制模块可以由两个按钮开关来完成秒表的启动,停止和复位。 (2) 计时模块
计时模块实现的是计时功能,及时的方法是对标准时钟脉冲计数。由于秒表的计时范围是0秒~59分59.99秒,所以计数器可以由四个十进制计数器和两个六进制计数器构成,其中毫秒位,秒位和分位采用十进制计数器来实现,十秒位和十分位采用六进制计数器。 (3) 显示模块
计时显示模块是将计时值在LED七段数码管显示出来。 数字秒表 计时电路 计时控制电 控制状态机 分频电路 计数器 显示电路 七段译码器
一百进制计数器 十进制计数器
图一,系统组成框图
该时钟以六进制加法器和十进制加法器连接而成。 故原理图方案:整个秒表由两个六进制和四个十进制搭接而成(原理图如下)。 其中mh表示分钟的高位,ml表示分钟的地位,sh表示秒的高位,sl表示秒的地位,s100h表示十分之一秒,s100l表示百分之一秒。实验使用了异步使能,异步清零。时钟信号为100HZ。
图二,系统的整体组装设计原理图
四.源程序
1. 40MHZ分频器的设计程序: library IEEE;
use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity FP400K is
Port ( RESET : in std_logic; CLK : in std_logic;
CLKOUT : out std_logic); end FP400K;
architecture Behavioral of FP400K is
signal div_val : integer range 0 to 200000; --分频值=256*2 signal div_clk : std_logic;--因为CLKOUT是out类型, --故不能在 <=的右边,
--用div_clk来暂存
begin
process(CLK,RESET) begin
if(RESET='0') then--RESET的优先级最高 div_clk <= '0';
elsif(CLK'event and CLK='1') then --'event是指
--信号的属性,意为此信号不稳定, --再加上CLK='1',故此句判断CLK的上升沿 if(div_val=200000) then div_val <= 0;
div_clk <= not div_clk; else
div_val <= div_val + 1;--在CLK的上升
--沿div_val自加1,加到256时清零并将div_clk取反 end if; end if; end process;
CLKOUT <= div_clk;
end Behavioral;
2.:十进制计数器源程序:
--cnt10
LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY cnt10 IS PORT(clr:IN STD_LOGIC; en,clk:IN STD_LOGIC; co : out std_logic; cnt:BUFFER INTEGER RANGE 9 DOWNTO 0); END cnt10; ARCHITECTURE example OF cnt10 IS BEGIN
PROCESS(clr,clk) BEGIN IF clr='1' THEN cnt<=0; ELSIF en<='1' then if clk'EVENT AND clk='1' THEN IF (cnt=9) THEN cnt<=0;co<='1'; elsif en<='0' then cnt<=cnt; ELSE cnt<=cnt+1;co<='0'; END IF; END IF; end if; END PROCESS; END example; 3:六进计数器设计 程序如下: --Cnt6 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY cnt6 IS PORT(clr:IN STD_LOGIC; en,clk:IN STD_LOGIC; co : out std_logic; cnt:BUFFER INTEGER RANGE 9 DOWNTO 0); END cnt6; ARCHITECTURE example OF cnt6 IS BEGIN PROCESS(clr,clk) BEGIN IF clr='1' THEN cnt<=0; ELSIF en<='1' then if clk'EVENT AND clk='1' THEN IF (cnt=5) THEN cnt<=0;co<='1'; elsif en<='0' then cnt<=cnt; ELSE cnt<=cnt+1;co<='0'; END IF; END IF; end if; END PROCESS;