四位十进制频率计EDA.docx
《四位十进制频率计EDA.docx》由会员分享,可在线阅读,更多相关《四位十进制频率计EDA.docx(11页珍藏版)》请在冰豆网上搜索。
四位十进制频率计EDA
四位十进制频率计
设计报告
一、题目分析
1、设计原理
根据频率的定义和频率测量的基本原理,测定信号的频率必须有一个脉宽为1S的输入信号脉冲计数允许的信号;1S计数结束后,计数值被锁入锁存器,计数器清零,为下一测评计数周期做好准备。
测频控制信号可以由一个独立的发生器来产生。
2、设计要求:
FTCTRL的计数使能信号CNT_EN能产生一个1S脉宽的周期信号,并对频率计中的16位计数器couter16D的ENABL使能端进行同步控制。
当CNT_EN高电平时允许计数;低电平时停止计数,并保持其所计的脉冲数。
在停止计数期间,首先需要一个锁存信号LOAD的上升沿将计数器在前一秒钟的计数值锁进锁存器REG16D中,并由外部的十进制7段译码器译出,显示计数值。
设置锁存器的好处是数据显示稳定,不会由于周期性的清零信号而不断闪烁。
锁存信号后,必须有一清零信号RST_CNT对计数器进行清零,为下一秒的技术操作做准备。
3、实现功能
当输入一个待测频率时,在测频信号的控制下,可以通过外部的7段译码器显示出其频率值。
二、设计方案
1、顶层实体描述
图1:
四位十进制频率计顶层实体
图2:
测频控制电路实体图3:
16位计数器实体图4:
16位锁存器实体
图5:
十进制加法计数器实体
2、模块划分
设计一个四位十进制频率计,首先需要一个测频控制电路来产生一个脉宽为1S的输入信号脉冲计数允许的信号;然后需要一个16位计数器进行计数,由于我们设计的是四位的十进制的频率计,所以还需要用4个十进制的加法计数器来构成所需要的计数器;在技计数完成之后还需要一个锁存器将计数值进行锁存,从而使显示的数值稳定。
3、模块描述
(1)四位十进制频率计顶层
该模块即为我们最终所要实现的模块,即给定一个频率后,我们可以在外部显示上看到待测频率的频率值。
(2)测频控制电路
该模块用于产生产生一个脉宽为1S的输入信号脉冲计数允许的信号,以便于后面模块的使用。
(3)16位计数器
该模块用于在1S脉宽的周期信号内对待测频率的周期进行计数,从而得到待测频率的频率值。
(4)16位锁存器
该模块用于将计数器产生的最终的计数值进行锁存,从而使显示的数值稳定。
(5)十进制加法计数器
该模块用于产生设计所要求的十进制的计数器,从而构造成我们所需要的计数器。
4、顶层电路图
16位计数器由四个十进制的加法计数器组成
三、方案实现
1、各模块仿真及描述
(1)测频控制电路的仿真
在CLKK时钟的控制下,计数使能信号CNT_EN能产生一个一定脉宽的周期信号(后面用于产生1S脉宽的周期信号),在停止计数期间,一个锁存信号LOAD的上升沿将计数器在前一秒钟的计数值锁进锁存器REG16D中。
清零信号RST_CNT对计数器进行清零,为下一秒的技术操作做准备。
(2)16位计数器的仿真
从波形图中可以看出,当清零信号CLR置0,计数使能信号置1时,计数器以十进制的方式对所给的周期信号的周期进行计数。
(3)16位锁存器的仿真
从波形图中可以看出,当LK置1时,锁存器对所给的数值进行锁存,并且使输出的锁存的数值保持不变,这将在后面的外部显示时使数值保持稳定。
(4)十进制加法计数器的仿真
从波形图中可以看出,当使能端ENA置1,清零端置0时,计数器对给定的时钟的周期进行计数,计数值从0000---1001进行循环,这就满足了我们所需要的十进制的计数器。
2、顶层电路仿真及描述
在进行仿真时,我设置的CLK1HZ的时钟周期是1s(频率为1HZ),FSIN的时钟周期为10ms(频率为100HZ),从波形图中可以看出,输出的计数值确实是100,验证是正确的。
四、硬件测试及说明
我选择了实验电路模式0,测频控制信号CLK1HZ由clock2输入,待测频率FSIN由clock0输入(可用电路帽选择所需要的频率),4个数码管(数码4-1:
PIO31--PIO16)显示测频的输出。
测试结果如下:
测频控制频率
待测频率
数码管显示结果
1HZ
64HZ
64
1HZ
1024HZ
1024
1HZ
16384HZ
6384
1HZ
65536HZ
5539
1HZ
7500000HZ
9940
从测试的结果可以看出:
(1)我所设计的四位十进制频率计对于四位的待测频率可以准确的显示出来;
(2)但对于超过四位的待测频率只能将前面超出的溢出,只保留最后四位;
(3)待测频率的位数越多,越往后数码管显示结果的误差就越大。
五、结论
本实验设计的是四位十进制频率计,利用测频控制电路、16位锁存器、16位计数器和十进制的计数加法器几个模块完成了我所要的设计。
实现的功能是:
在测频控制电路给的1HZ的测频信号下,计数器对待测频率的周期进行计数,再由锁存器锁存,最终通过外部的数码管将待测频率的频率数值显示出来。
通过本次设计实验我也学到了很多东西,刚开始时选定题目后不知道如何下手,通过翻书、上网查资料找到了一些相关知识才开始做实验。
在实验的进行中也出现了很多问题,比如说编译出现了很多错误,经过我仔细的排查和修改后,最终使得编译完全正确了,这让我有一点成就感,同时也使我对此充满了兴趣,做得就更加认真了,努力把很多没弄懂的问题都想清楚了,做完本次设计实验后真的收获颇丰!
六、课程总结
通过《在系统编程技术》这门课的学习,我真的学到了很多东西。
理论知识主要是学习了FPGA/CPLD、EDA的设计平台、VHDL语言等。
在理论学习之后,我们通过实验锻炼了自己的实践能力,同时在实验的过程中也加深了我们对课本上理论知识的理解。
记得刚开始学习这门课时,觉得还是比较有压力的,老师说我们要多了解EDA方面一些比较前沿的知识,第一节课听着老师提到的各个设计公司,比如说:
Lattice、Xilinx、Altera公司等相关方面的专业名词,其实那时心里是有点激动的,觉得自己正在接触着前沿的知识。
在后面的理论知识的学习中觉得是痛并快乐着,痛的是各方面的知识比较多,比如说在学习VHDL语言的变量、常量、信号时,要注意很多的细节知识,当然快乐的就是自己学到了知识,丰富了自己所知道的知识范围。
在实验课上,我们学会了如何用电路原理图或者VHDL语言实现一个设计,通过在实验过程中遇到的各种问题来提高自己对Quartusii6.0软件的应用能力。
以及在最后的设计实验中更是让我知道一个设计人员的专业素养的要求也很高,要有一定的理论知识、清晰地头脑、较强的分析能力。
我认识到自己离一个设计人员的标准很有很多距离,但我会不断努力下去,努力让自己接近于一个设计人员的水平。
在最后,谢谢同学在学习的过程中给我的帮助以及老师给予的指导!
七、附录(源程序,加中文注释)
1、频率计顶层文件
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.all;
ENTITYfreqtestIS
PORT(CLK1HZ:
INSTD_LOGIC;--测频控制信号
FSIN:
INSTD_LOGIC;--待测频率
D:
OUTSTD_LOGIC_VECTOR(15DOWNTO0));--输出计数值
ENDentityfreqtest;
ARCHITECTUREfd1OFfreqtestIS
COMPONENTcouter16DIS
PORT(FIN:
INSTD_LOGIC;--时钟信号
ENABL:
INSTD_LOGIC;--计数使能信号
CLR:
INSTD_LOGIC;--清零信号
DOUT:
OUTSTD_LOGIC_VECTOR(15DOWNTO0));--计数结果
ENDCOMPONENT;
COMPONENTFTCTRLIS
PORT(CLKK:
INSTD_LOGIC;--测频控制信号(选取1HZ)
CNT_EN:
outSTD_LOGIC;--计数器时钟使能
RST_CNT:
OUTSTD_LOGIC;--计数器清零
LOAD:
outSTD_LOGIC);--输出锁存信号
ENDCOMPONENT;
COMPONENTREG16DIS
PORT(LK:
INSTD_LOGIC;--控制端,置1时锁存输出
DIN:
inSTD_LOGIC_VECTOR(15downto0);--输入的计数值
DOUT:
OUTSTD_LOGIC_VECTOR(15downto0));--输出的计数值
ENDCOMPONENT;
SIGNALx,y,z:
STD_LOGIC;--定义信号x,y,z
SIGNALe:
STD_LOGIC_VECTOR(15DOWNTO0);--定义16位的信号e
BEGIN--下面就是有原先设计的模块构成顶层文件
u1:
couter16DPORTMAP(FIN=>FSIN,ENABL=>x,CLR=>y,DOUT=>e);
u2:
FTCTRLPORTMAP(CLKK=>CLK1HZ,CNT_EN=>x,RST_CNT=>y,LOAD=>z);
u3:
REG16DPORTMAP(DIN=>e,LK=>z,DOUT=>D);
ENDARCHITECTUREfd1;
2、测频控制电路
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.all;
ENTITYFTCTRLIS
PORT(CLKK:
INSTD_LOGIC;--测频控制信号(验证时取1HZ)
CNT_EN:
OUTSTD_LOGIC;--计数器时钟使能
RST_CNT:
OUTSTD_LOGIC;--计数器清零
LOAD:
OUTSTD_LOGIC);--输出锁存信号
ENDFTCTRL;
ARCHITECTUREbehavOFFTCTRLIS
SIGNALDiv2CLK:
STD_LOGIC;
BEGIN
PROCESS(CLKK)
BEGIN
IFCLKK'EVENTANDCLKK='1'THEN--1HZ时钟2分频
Div2CLK<=NOTDiv2CLK;
ENDIF;
ENDPROCESS;
PROCESS(CLKK,Div2CLK)
BEGIN
IFCLKK='0'ANDDiv2CLK='0'THENRST_CNT<='1';--产生计数器清零信号
ELSERST_CNT<='0';
ENDIF;
ENDPROCESS;
LOAD<=NOTDiv2CLK;
CNT_EN<=Div2CLK;
ENDbehav;
3、16位锁存器
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.all;
ENTITYREG16DIS
PORT(LK:
INSTD_LOGIC;--控制端,置1时锁存输出
DIN:
inSTD_LOGIC_VECTOR(15downto0);--输入的计数值
DOUT:
OUTSTD_LOGIC_VECTOR(15downto0));--输出的计数值
ENDENTITYREG16D;
ARCHITECTUREfd1OFREG16DIS
BEGIN
process(LK,DIN)
begin
if(LK'EVENTandLK='1')thenDOUT<=DIN;--在LK上升沿时锁存输出
endif;
endprocess;
ENDARCHITECTUREfd1;
4、16位计数器
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.all;
USEIEEE.STD_LOGIC_UNSIGNED.all;
ENTITYcouter16DIS
PORT(FIN:
:
INSTD_LOGIC;--时钟信号
ENABL:
INSTD_LOGIC;--计数使能信号
CLR:
INSTD_LOGIC;--清零信号
DOUT:
OUTSTD_LOGIC_VECTOR(15DOWNTO0));--计数结果
ENDentitycouter16D;
ARCHITECTUREfd1OFcouter16DIS
COMPONENTCNT10
PORT(RST:
INSTD_LOGIC;--清零端
FX:
:
INSTD_LOGIC;--时钟信号
ENA:
INSTD_LOGIC;--使能端
OUTY:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);--输出计数结果
COUT:
OUTSTD_LOGIC);--输出信号用于进位
ENDCOMPONENT;
SIGNALx,y,z:
STD_LOGIC;--定义信号x,y,z
BEGIN--由四个十进制加法计数器设计成16位计数器
u1:
CNT10PORTMAP(FX=>FIN,ENA=>ENABL,RST=>CLR,OUTY=>DOUT(3downto0),COUT=>x);
u2:
CNT10PORTMAP(FX=>x,ENA=>ENABL,RST=>CLR,OUTY=>DOUT(7downto4),COUT=>y);
u3:
CNT10PORTMAP(FX=>y,ENA=>ENABL,RST=>CLR,OUTY=>DOUT(11downto8),COUT=>z);
u4:
CNT10PORTMAP(FX=>z,ENA=>ENABL,RST=>CLR,OUTY=>DOUT(15downto12));
ENDARCHITECTUREfd1;
5、十进制加法计数器
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.all;
USEIEEE.STD_LOGIC_UNSIGNED.all;
ENTITYCNT10IS
PORT(RST:
INSTD_LOGIC;--清零端
FX:
:
INSTD_LOGIC;--时钟信号
ENA:
INSTD_LOGIC;--使能端
OUTY:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);--输出计数结果
COUT:
OUTSTD_LOGIC);--输出信号用于进位
ENDENTITYCNT10;
ARCHITECTUREbehavOFCNT10IS
BEGIN
process(RST,ENA,FX)
variableCQI:
STD_LOGIC_VECTOR(3downto0);--定义变量CQI
begin
if(RST='1')thenCQI:
=(others=>'0');
elsif(FX'EVENTandFX='1')then--在时钟信号FX的上升沿
ifENA='1'then--使能端为1,让信号从0--9进行计数
ifCQI<9thenCQI:
=CQI+1;COUT<='0';
elsifCQI=9thenCQI:
=(others=>'0');COUT<='1';--超出9时进位
ENDIF;
ELSIFENA='0'THENCQI:
=(others=>'0');--使能端置0输出为0
ENDIF;
endif;
OUTY<=CQI;
endprocess;
ENDbehav;
友情提示:
本资料代表个人观点,如有帮助请下载,谢谢您的浏览!