VHDL数字秒表.docx
《VHDL数字秒表.docx》由会员分享,可在线阅读,更多相关《VHDL数字秒表.docx(8页珍藏版)》请在冰豆网上搜索。
VHDL数字秒表
VHDL数字秒表
数字秒表
一设计任务
设计用于体育比赛的数字秒表,要求:
1.计时精度大于1/1000秒,计时器能显示1/1000秒的时间,提供给计时器内部定时器的时钟频率为10MHz;计时器的最长计时时间为1小时,为此需要一个7位的显示器,显示的最长时间为59分59.999秒。
2.设计复位和起/停开关。
(1)复位开关用来使计时器清零,并做好计时准备。
(2)起/停开关的使用方法与传统的机械式计时器相同,即按一下起/停开关,启动计时器开始计时,再按一下起/停开关时终止。
(3)复位开关可以在任何情况下使用,即使在计时过程中,只要按一下复位开关,计时器进程立即终止,并对计时器清零。
二方案选择与设计
方案选择
利用VHDL语言进行数字秒表设计有多种方法。
可以利用原件例化语句将各模块联系起来,也可以使用原理图的方法实现此功能,考虑到此次设计中端口众多,使用例化语句繁琐易错,因此采用了条理清晰的绘制原理图的方法生成顶层文件,实现数字秒表功能。
根据上述设计要求,可以预先设计若干个不同进制的计数器单元模块,然后将其进行例化组合来得到数字秒表系统。
要满足数字秒表的精度,首先要获得精确的计时基准信号,这里的系统精度要求为0.001秒,因此必须设置周期为0.001秒的时钟脉冲。
0.001秒、0.01秒、0.1秒、秒、分等计时单位之间的进位转换可以通过不同进制的计数器实现。
设置十进制计数器和六进制计数器,每位计数器均能输出相应计时单位计数结果,其中,十进制计数器可以实现0.01秒、0.1秒、秒、分为单位的计数,六进制计数器可以实现以10秒、10分为单位的计数。
把各级计数器级联,即可同时显示0.001秒、0.01秒、0.1秒、秒、分钟。
级联可分为串行进位方式和并行进位方式。
在串行进位方式中,以低位片的进位输出信号作为高位片的时钟输入信号。
在并行进位方式中,以低位片的进位输出信号作为高位片的工作
层电路图的绘制。
2时钟分频电路模块
在基于EDA技术的数字电路系统设计中,分频电路应用十分广泛。
常常用分频电路来得到数字系统中各种不同频率的控制信号。
所谓分频电路,就是将一个给定的频率较高的数字输入信号经过适当处理后,产生一个或数个频率较低的数字输出信号。
本设计需要一个计时范围为0.001s-59分59.999秒的秒表,首先输入一个频率为10MHZ时钟信号源,由CLK输入,经其进行10000分频后获得一个比较精确的1000Hz计时脉冲,即周期为1/1000秒的计时脉冲,由CLR_CNT输出。
分频器符号
3十进制计数控制模块
计数是一种最简单基本的运算,计数器就是实现这种运算的逻辑电路,计数器在数字系统中主要是对脉冲的个数进行计数,以实现测量、计数和控制的功能,同时兼有分频功能。
此次设计中为程序方便没有将按键控制功能单独设为一个模块,而是将其添加到了普通十进制计数器程序中,将两者综合生成十进制计数控制模块。
十进制计数控制模块符号
CLK为时钟信号输入端、RST为复位信号输入端、EN为使能控制信号输入端、DOUT[3..0]为十进制计数数据输出端、COUT为进位信号输出端。
4六进制计数控制模块
六进制计数器与十进制计数器类似,同样此处为程序方便没有将按键控制功能单独设为一个模块,而是将其添加到了普通六进制计数器程序中,将两者综合生成六进制计数控制模块。
六进制计数控制模块符号
CLK为时钟信号输入端、RST为复位信号输入端、EN为使能控制信号输入端、DOUT[3..0]为六进制计数数据输出端、COUT为进位信号输出端。
三软件设计与仿真
3.1时钟分频电路模块
程序
libraryieee;
useieee.std_logic_1164.all;
entityCLKGENis
port(clki:
instd_logic;
clko:
outstd_logic);
endCLKGEN;
architecturebehavofCLKGENis
signalq:
integerrange0to9999;
begin
process(clki,q)
begin
ifclki'eventandclki='1'then
q<=q+1;
endif;
ifq=1then
clko<='0';
else
clko<='1';
endif;
endprocess;
endbehav;
时钟分频电路模块仿真
时钟分频电路模块仿真结果
3.2六进制计数控制模块
程序
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYCNT6IS
PORT(CLK,RST,EN:
INSTD_LOGIC;
DOUT:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
COUT:
OUTSTD_LOGIC);
ENDCNT6;
ARCHITECTUREbehavOFCNT6IS
BEGIN
PROCESS(CLK,RST,EN)
VARIABLEQ:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
IFRST='1'THENQ:
=(OTHERS=>'0');
ELSIFCLK'EVENTANDCLK='1'THEN
IFEN='1'THEN
IFQ<5THEN
Q:
=Q+1;
ELSE
Q:
=(OTHERS=>'0');
ENDIF;
ELSE
Q:
=Q;
ENDIF;
ENDIF;
IFQ="0101"THENCOUT<='0';
ELSECOUT<='1';
ENDIF;
DOUT<=Q;
ENDPROCESS;
ENDbehav;
六进制计数控制模块仿真
六进制计数控制模块仿真结果
3.3十进制计数控制模块
程序
ENTITYCNT10IS
PORT(CLK,RST,EN:
INSTD_LOGIC;
DOUT:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
COUT:
OUTSTD_LOGIC);
ENDCNT10;
ARCHITECTUREbehavOFCNT10IS
BEGIN
PROCESS(CLK,RST,EN)
VARIABLEQ:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
IFRST='1'THENQ:
=(OTHERS=>'0');
ELSIFCLK'EVENTANDCLK='1'THEN
IFEN='1'THEN
IFQ<9THEN
Q:
=Q+1;
ELSE
Q:
=(OTHERS=>'0');
ENDIF;
ELSE
Q:
=Q;
ENDIF;
ENDIF;
IFQ="1001"THENCOUT<='0';
ELSECOUT<='1';
ENDIF;
DOUT<=Q;
ENDPROCESS;
ENDbehav;
十进制计数控制模块仿真
十进制计数控制模块仿真结果