八位十进制频率计数器.docx
《八位十进制频率计数器.docx》由会员分享,可在线阅读,更多相关《八位十进制频率计数器.docx(10页珍藏版)》请在冰豆网上搜索。
八位十进制频率计数器
HefeiUniversity
EDA技术
课程设计:
八位十进制频率计数器
专业:
13电子
(1)班
姓名:
学号:
指导老师:
一、题目分析
1、设计一个八位十进制的数字频率计:
(1)、能对方波测频率
(2)、能用数码管显示
2、频率计设计原理及总设计框图
(1)、频率计的基本原理是用一个频率稳定度高的频率源作为基准时钟,对比测量 其他信号的频率。
通常情况下计算每秒内待测信号的脉冲个数,此时我们称闸门时间为2秒。
闸门时间也可以大于或小于一秒。
闸门时间越长,得到的频率值就越准确,但闸门时间越长则每次测量一次频率的间隔越长。
闸门时间越短,测得频率值刷新就越快,但测得的频率精度就受影响。
本次的课程设计设计的频率计是测频法设计的八位十进制频率计,他有一个测频控制信号发生器,八个有时钟使能的十进制计数器,一个锁存器组成。
二、选择方案
顶层文件用原理图连接,底层文件用VHDL语言。
这样整个设计清晰明了,结构直观。
三、细化框图
(1)、测频率控制信号发生器
测频测量的基本原理是计算每秒钟内待测信号的脉冲个数。
这就要求测频率控制信号发生器的计数使能信号EN能产生一个1秒的脉宽的周期信号,并对频率计的每一个计数器CNT10的EN使能端进行同步测控。
当TSTEN高电平时,允许计数;低电平时,停止计数,并保持其所计的数。
在停止计数期间,首先需要一个所存信号LOAD的上升沿将计数器在前一秒中的计数值所存进锁存器中,并由外部的7段译码器译出并稳定显示。
所存信号之后,必须有一个清零的信号对计数器进行清零,为下一秒的计数做准备。
(2)、计数模块
该十进制计数模块有八个一位十进制计数器组成,计数器的特殊之处是:
有一个时钟使能输入端EN,用于锁定计数器。
当高电平时计数允许,低电平时计数禁止。
该测频的八位十进制频率计的计数模块,先通过VHDL语言编写一位十进制计数器,再将其元件例化后搭建一个八位十进制计数模块。
(3)、所存模块
所存模块是由锁存器构成的,主要是数据的稳定显示,不会由于周期性的清零信号而不断的闪烁。
在信号LOAD的上升沿后即被所存到寄存器的内部,并由锁存器的输出端输出,然后由实验板上的额7段译码器译成能在数码管上显示的相对应的数值。
四、模块程序功能仿真
频率控制模块软件仿真图:
十进制计数器模块软件仿真图
锁存器软件仿真图
五、全系统整机电路及仿真波形图
最终程序仿真图:
结果输出:
F1hz=1us,ftest=250ns
F1hz=1us,ftest=50ns
六、硬件测试及说明
我选择了实验电路模式0,测频控制信号CLK2HZ由clock2输入,待测频率FSIN由clock0输入(可用电路帽选择所需要的频率),8个数码管(数码8-1:
PIO47--PIO16)显示测频的输出。
引脚锁定如下所示
七、结论
从测试的结果可以看出:
(1)我所设计的八位十进制频率计对于八位的待测频率可以准确的显示出来;
(2)待测频率的位数越多,越往后数码管显示结果的误差就越大。
八、课程总结
这次EDA课程设计历时一个星期,在这期间,学到很多很多的东西,同时不仅可以巩固以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。
通过这次设计,进一步加深了对EDA的了解,让我对它有了更加浓厚的兴趣。
特别是当每一个子模块编写调试成功时,心里特别的开心。
但是在编写顶层文件的程序时,遇到了不少问题,特别是各元件之间的连接,以及信号的定义,总是有错误,在细心的检查下,终于找出了错误和警告,排除困难后,程序编译就通过了,心里终于舒了一口气。
在波形仿真时,也遇到了一点困难,想要的结果不能在波形上得到正确的显示,经过很长时间的调试终于调试成功。
在连接各个模块的时候一定要注意各个输入、输出引脚的线宽,因为每个线宽是不一样的,只要让各个线宽互相匹配,才能得出正确的结果,否则,出现任何一点小的误差就会导致整个文件系统的编译出现错误提示,在器件的选择上也有一定的技巧,只有选择了合适当前电路所适合的器件,编译才能得到完满成功。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
在设计的过程中遇到问题,可以说得是困难重重,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。
九、参考文献目录
潘松、黄继业.2013.EDA技术实用教程(第五版).北京.科学出版社
一十、附录(源程序)
底层模块设计
-----------------------------------------------cnt.vhd----------------------------------------------------------
----------------------------------------------十进制计数器模块-----------------------------------------------
LIBRARYieee;
USEieee.std_logic_1164.all;--打开库
ENTITYcntIS--端口定义
PORT
(
clk,rst,ena:
INSTD_LOGIC;--clk为时钟脉冲,rst为复位信号,ena使能
outy:
OUTintegerrange0to9;--计数输出端口
COUT:
OUTSTD_LOGIC--计数进位输出端口
);
ENDCnt;--实体定义结束
ARCHITECTUREaOFCntIS--结构体开始
BEGIN
PROCESS(clk,RST,ena)--过程定义,敏感表
VARIABLECQI:
integerrange0to9;--定义进程里的局部变量,整型0到9
BEGIN
IFRST='1'THENCQI:
=0;--如果复位信号高电平,这将cqi清零
ELSIF(clk'EVENTANDclk='1')THEN--复位信号无效,clk上升沿到来就执行下一步
IFena='1'THEN--如果ena高,则cqi加1
IFCQI<9THENCQI:
=CQI+1;--如果ena高且cqi小于9,则cqi加1
ELSECQI:
=0;--否则cqi置零
ENDIF;--结束if语句
ENDIF;--结束if语句
ENDIF;--结束if语句
IFCQI=9THENCOUT<='1';--若
ELSECOUT<='0';--
ENDIF;
outy<=CQI;--将进程局部变量赋值给outy输出端口
ENDPROCESS;--结束进程
ENDa;--结束结构体
-----------------------------------------------reg4b.vhd------------------------------------------------------
----------------------------------------------锁存器模块-----------------------------------------------
libraryieee;
useieee.std_logic_1164.all;--打开库
entityreg4bis--定义实体
port(load:
instd_logic;--信号锁存
din:
instd_logic_vector(3downto0);--信号输入端口
dout:
outstd_logic_vector(3downto0));--锁存输出
endreg4b;--实体定义完毕
architecturetwoofreg4bis--定义结构体
begin
process(load,din)--定义进程及其敏感表
begin
ifload'eventandload='1'then--锁存有效,则将输入给输出显示
dout<=din;
endif;--否则不改变输出
endprocess;--进程结束
endtwo;
-----------------------------------------------Tct1.VHD
----------------------------------------------测频控制器-----------------------------------------------
Libraryieee;
Useieee.std_logic_1164.all;
Useieee.std_logic_unsigned.all;
EntityTct1is
Port(clk:
instd_logic;
ena,rst,load:
outstd_logic);
EndTct1;
ArchitectureoneofTct1is
Signaldivclk:
std_logic;
Signaldivclk1:
std_logic;
Begin
N1:
Process(clk)
Begin
ifclk'eventandclk='1'thendivclk<=notdivclk;
endif;
EndprocessN1;
N2:
Process(divclk)
Begin
ifdivclk'eventanddivclk='1'thendivclk1<=notdivclk1;
endif;
EndprocessN2;
Process(clk,divclk)
Begin
Ifclk='0'anddivclk='0'anddivclk1='0'then
rst<='1';
Elserst<='0';
Endif;
Endprocess;
Load<=notdivclk1;
ena<=divclk1;
endone;