EDA频率计设计.docx
- 文档编号:27641804
- 上传时间:2023-07-03
- 格式:DOCX
- 页数:21
- 大小:187.31KB
EDA频率计设计.docx
《EDA频率计设计.docx》由会员分享,可在线阅读,更多相关《EDA频率计设计.docx(21页珍藏版)》请在冰豆网上搜索。
EDA频率计设计
八位十六进制频率计设计
摘要
频率计又称为频率计数器,是一种专门对被测信号频率进行测量的电子测量仪器。
可用来测量频率、时间、周期、计数。
该设计是利用VHDL语言实现频率计的功能,频率计主要由四个模块构成:
计数模块、锁存模块显示模块以及控制模块。
对各个部分的设计思路、对各部分电路设计方案的选择、元器件的筛选、以及对它们的调试、对调试结果的分析,最后得到实验结果的方方面面。
关键字:
频率计、VHDL、元件例化。
Abstract
Frequencymeteriscalledforfrequencycounter,whichisaspecializedmeasuringdevicetobeusedformeasuringmeasuredsignalfrequency.
Itcanbeusedtomeasurefrequency,time,period,layoutmakeuseofVHDLlanguagetocometruethefunctionoffrequencymeter,itismadeupoffourblockswhicharecountingblock,registeringblock,showingblockandcurbing,electriccircuitprojectdesign,componentscreen,shakedowntestandanalysingresultofeverypart,finallygettingallaspectsofexperimentingresult.
\
Key:
frequencymeter,VHDL,component.
一.原理
八位十六进制频率计是由TFCTRL的计数使能信号CNT_EN能产生一个1秒脉宽的周期信号,并对频率计中的32位二进制计数器COUNTER32B的ENABL使能进行同步控制。
当CNT_EN高电平时允许计数;低电平时停止计数,并保持其所计的脉冲数。
在停止计数期间,首先需要一个锁存信号LOAD的上跳沿将计数器在前一秒钟的计数值锁存进各锁存器REG32B中,并由八位十六进制7段译码器译出,显示计数值。
设置锁存器的好处是数据显示稳定,不会由于周期性的清零信号而不断闪烁。
锁存信号后,必须有清零信号RST_CNT对计数器进行清零,为下一秒的计数操作作准备。
二.方案论证
用VHDL设计电路系统,可以把任何复杂的电路系统视为一个模块,对应一个设计实体。
在VHDL层次化设计中,它所设计的模块既可以是顶层实体,又可以是较低层实体,但对不同层次模块应选择不同的描述方法。
在系统的底层设计中,采用VHDL进行描述,由于其对系统很强的行为描述能力,可以不必使系统层层细化,从而避开具体的器件结构,从逻辑行为上直接对模块进行描述和设计,之后,EDA软件中的VHDL综合器将自动将程序综合成为具体FPGA/CPLD等目标芯片的网表文件,无疑可使设计大为简化。
VHDL特点:
/
1.能形式化地抽象表示电路的行为和结构;
2.支持逻辑设计中层次与范围地描述;
3.可借用高级语言地精巧结构来简化电路行为和结构;具有电路仿真与验证机制以保证设计的正确性;
4.支持电路描述由高层到低层的综合转换;
5.硬件描述和实现工艺无关;
6.便于文档管理
7.易于理解和设计重用
·
总体框图
三.各模块的实现和功能仿真
1、测频控制模块
设计频率计的关键是设计一个测频率控制信号发生器,产生测量频率的控制时序。
控制时钟信号clk1取为1Hz,2分频后即可查声一个脉宽为1秒的时钟cnt-en,一此作为计数闸门信号。
当cnt-en为高电平时,允许计数;当cnt-en由高电平变为低电平(下降沿到来)时,应产生一个锁存信号,将计数值保存起来;锁存数据后,还要在下次cnt-en上升沿到来之前产生零信号rst_en,将计数器清零,为下次计数作准备。
"
程序:
LIBRARYIEEE;
USEFIC1IS
PORT(CLK1:
INSTD_LOGIC;
CNT:
OUTSTD_LOGIC;
RST:
OUTSTD_LOGIC;
LOAD:
OUTSTD_LOGIC);
ENDFIC1;
/
ARCHITECTUREoneOFFIC1IS
SIGNALM:
STD_LOGIC;
BEGIN
PROCESS(CLK1)
BEGIN
IFCLK1'EVENTANDCLK1='1'THEN
M<=NOTM;
ENDIF;
\
ENDPROCESS;
PROCESS(CLK1,M)
BEGIN
IFCLK1='0'ANDM='0'THENRST<='1';
ELSERST<='0';
ENDIF;
ENDPROCESS;
LOAD<=NOTM;
^
CNT<=M;
ENDone;
仿真结果:
2.计数模块
计数器以待测信号作为时钟,清零信号rst到来时,异步清零;cnt-en为高电平时开始计数。
计数是以十进制数显示,本文设计了一个简单的10kHz以内信号的频率机计,如果需要测试较高的频率信号,则将cout的输出位数增加,当然锁存器的位数也要增加。
程序:
?
LIBRARYIEEE;
USECNT32IS
PORT(CLR:
INSTD_LOGIC;
EN:
INSTD_LOGIC;
FIN:
INSTD_LOGIC;
COUT:
OUTSTD_LOGIC_VECTOR(31DOWNTO0));
ENDCNT32;
ARCHITECTUREtwoOFCNT32IS
]
SIGNALCQI:
STD_LOGIC_VECTOR(31DOWNTO0);
BEGIN
PROCESS(CLR,EN,FIN)BEGIN
IFCLR='1'THENCQI<=(OTHERS=>'0');
ELSIFFIN'EVENTANDFIN='1'THEN
IFEN='1'THENCQI<=CQI+1;
ENDIF;
ENDIF;
、
ENDPROCESS;
COUT<=CQI;
ENDtwo;
仿真结果:
3、锁存模块
当cnt-en下降沿到来时,将计数器的计数值锁存,这样可由外部的七段译码器译码并在数码管显示。
设置锁存器的好处是显示的数据稳定,不会由于周期性的清零信号而不断闪烁。
锁存器的位数应跟计数器完全一样。
程序:
?
LIBRARYIEEE;
ENTITYREG32AIS
PORT(LK:
INSTD_LOGIC;
DIN:
INSTD_LOGIC_VECTOR(31DOWNTO0);
DOUT:
OUTSTD_LOGIC_VECTOR(31DOWNTO0));
ENDREG32A;
ARCHITECTUREthreeOFREG32AIS
BEGIN
`
PROCESS(LK,DIN)
BEGIN
IFLK'EVENTANDLK='1'THENDOUT<=DIN;
ENDIF;
ENDPROCESS;
ENDthree;
仿真结果:
。
4.显示模块
在停止计数期间,首先需要一个锁存信号LOAD的上跳沿将计数器在前一秒钟的计数值锁存进各锁存器REG32B中,并由八位十六进制7段译码器译出,显示计数值。
程序:
LIBRARYIEEE;
USEDECL7SIS
PORT(Q:
INSTD_LOGIC_VECTOR(31DOWNTO0);
LED7S1,LED7S2,LED7S3,LED7S4,LED7S5,LED7S6,
LED7S7,LED7S8:
OUTSTD_LOGIC_VECTOR(6DOWNTO0));
%
ENDENTITYDECL7S;
ARCHITECTUREfourOFDECL7SIS
BEGIN
PROCESS(Q)
VARIABLEQ1:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
Q1:
=Q(0)&Q
(1)&Q
(2)&Q(3);
CASEQ1IS
}
WHEN"0000"=>LED7S1<="0111111";
WHEN"0001"=>LED7S1<="0000110";
WHEN"0010"=>LED7S1<="1011011";
WHEN"0011"=>LED7S1<="1001111";
WHEN"0100"=>LED7S1<="1100110";
WHEN"0101"=>LED7S1<="1101101";
WHEN"0110"=>LED7S1<="1111101";
WHEN"0111"=>LED7S1<="0000111";
<
WHEN"1000"=>LED7S1<="1111111";
WHEN"1001"=>LED7S1<="1101111";
WHEN"1010"=>LED7S1<="1110111";
WHEN"1011"=>LED7S1<="1111100";
WHEN"1100"=>LED7S1<="0111001";
WHEN"1101"=>LED7S1<="1011110";
WHEN"1110"=>LED7S1<="1111011";
WHEN"1111"=>LED7S1<="1110001";
!
WHENOTHERS=>NULL;
ENDCASE;
ENDPROCESS;
PROCESS(Q)
VARIABLEQ2:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
Q2:
=Q(4)&Q(5)&Q(6)&Q(7);
CASEQ2IS
《
WHEN"0000"=>LED7S2<="0111111";
WHEN"0001"=>LED7S2<="0000110";
WHEN"0010"=>LED7S2<="1011011";
WHEN"0011"=>LED7S2<="1001111";
WHEN"0100"=>LED7S2<="1100110";
WHEN"0101"=>LED7S2<="1101101";
WHEN"0110"=>LED7S2<="1111101";
WHEN"0111"=>LED7S2<="0000111";
—
WHEN"1000"=>LED7S2<="1111111";
WHEN"1001"=>LED7S2<="1101111";
WHEN"1010"=>LED7S2<="1110111";
WHEN"1011"=>LED7S2<="1111100";
WHEN"1100"=>LED7S2<="0111001";
WHEN"1101"=>LED7S2<="1011110";
WHEN"1110"=>LED7S2<="1111011";
WHEN"1111"=>LED7S2<="1110001";
…
WHENOTHERS=>NULL;
ENDCASE;
ENDPROCESS;
PROCESS(Q)
VARIABLEQ3:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
Q3:
=Q(8)&Q(9)&Q(10)&Q(11);
CASEQ3IS
-
WHEN"0000"=>LED7S3<="0111111";
WHEN"0001"=>LED7S3<="0000110";
WHEN"0010"=>LED7S3<="1011011";
WHEN"0011"=>LED7S3<="1001111";
WHEN"0100"=>LED7S3<="1100110";
WHEN"0101"=>LED7S3<="1101101";
WHEN"0110"=>LED7S3<="1111101";
WHEN"0111"=>LED7S3<="0000111";
)
WHEN"1000"=>LED7S3<="1111111";
WHEN"1001"=>LED7S3<="1101111";
WHEN"1010"=>LED7S3<="1110111";
WHEN"1011"=>LED7S3<="1111100";
WHEN"1100"=>LED7S3<="0111001";
WHEN"1101"=>LED7S3<="1011110";
WHEN"1110"=>LED7S3<="1111011";
WHEN"1111"=>LED7S3<="1110001";
&
WHENOTHERS=>NULL;
ENDCASE;
ENDPROCESS;
PROCESS(Q)
VARIABLEQ4:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
Q4:
=Q(12)&Q(13)&Q(14)&Q(15);
CASEQ4IS
~
WHEN"0000"=>LED7S4<="0111111";
WHEN"0001"=>LED7S4<="0000110";
WHEN"0010"=>LED7S4<="1011011";
WHEN"0011"=>LED7S4<="1001111";
WHEN"0100"=>LED7S4<="1100110";
WHEN"0101"=>LED7S4<="1101101";
WHEN"0110"=>LED7S4<="1111101";
WHEN"0111"=>LED7S4<="0000111";
·
WHEN"1000"=>LED7S4<="1111111";
WHEN"1001"=>LED7S4<="1101111";
WHEN"1010"=>LED7S4<="1110111";
WHEN"1011"=>LED7S4<="1111100";
WHEN"1100"=>LED7S4<="0111001";
WHEN"1101"=>LED7S4<="1011110";
WHEN"1110"=>LED7S4<="1111011";
WHEN"1111"=>LED7S4<="1110001";
*
WHENOTHERS=>NULL;
ENDCASE;
ENDPROCESS;
PROCESS(Q)
VARIABLEQ5:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
Q5:
=Q(16)&Q(17)&Q(18)&Q(19);
CASEQ5IS
《
WHEN"0000"=>LED7S5<="0111111";
WHEN"0001"=>LED7S5<="0000110";
WHEN"0010"=>LED7S5<="1011011";
WHEN"0011"=>LED7S5<="1001111";
WHEN"0100"=>LED7S5<="1100110";
WHEN"0101"=>LED7S5<="1101101";
WHEN"0110"=>LED7S5<="1111101";
WHEN"0111"=>LED7S5<="0000111";
—
WHEN"1000"=>LED7S5<="1111111";
WHEN"1001"=>LED7S5<="1101111";
WHEN"1010"=>LED7S5<="1110111";
WHEN"1011"=>LED7S5<="1111100";
WHEN"1100"=>LED7S5<="0111001";
WHEN"1101"=>LED7S5<="1011110";
WHEN"1110"=>LED7S5<="1111011";
WHEN"1111"=>LED7S5<="1110001";
(
WHENOTHERS=>NULL;
ENDCASE;
ENDPROCESS;
PROCESS(Q)
VARIABLEQ6:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
Q6:
=Q(20)&Q(21)&Q(22)&Q(23);
CASEQ6IS
$
WHEN"0000"=>LED7S6<="0111111";
WHEN"0001"=>LED7S6<="0000110";
WHEN"0010"=>LED7S6<="1011011";
WHEN"0011"=>LED7S6<="1001111";
WHEN"0100"=>LED7S6<="1100110";
WHEN"0101"=>LED7S6<="1101101";
WHEN"0110"=>LED7S6<="1111101";
WHEN"0111"=>LED7S6<="0000111";
,
WHEN"1000"=>LED7S6<="1111111";
WHEN"1001"=>LED7S6<="1101111";
WHEN"1010"=>LED7S6<="1110111";
WHEN"1011"=>LED7S6<="1111100";
WHEN"1100"=>LED7S6<="0111001";
WHEN"1101"=>LED7S6<="1011110";
WHEN"1110"=>LED7S6<="1111011";
WHEN"1111"=>LED7S6<="1110001";
:
WHENOTHERS=>NULL;
ENDCASE;
ENDPROCESS;
PROCESS(Q)
VARIABLEQ7:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
Q7:
=Q(24)&Q(25)&Q(26)&Q(27);
CASEQ7IS
|
WHEN"0000"=>LED7S7<="0111111";
WHEN"0001"=>LED7S7<="0000110";
WHEN"0010"=>LED7S7<="1011011";
WHEN"0011"=>LED7S7<="1001111";
WHEN"0100"=>LED7S7<="1100110";
WHEN"0101"=>LED7S7<="1101101";
WHEN"0110"=>LED7S7<="1111101";
WHEN"0111"=>LED7S7<="0000111";
WHEN"1000"=>LED7S7<="1111111";
WHEN"1001"=>LED7S7<="1101111";
WHEN"1010"=>LED7S7<="1110111";
WHEN"1011"=>LED7S7<="1111100";
WHEN"1100"=>LED7S7<="0111001";
WHEN"1101"=>LED7S7<="1011110";
WHEN"1110"=>LED7S7<="1111011";
WHEN"1111"=>LED7S7<="1110001";
WHENOTHERS=>NULL;
ENDCASE;
ENDPROCESS;
PROCESS(Q)
VARIABLEQ8:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
Q8:
=Q(28)&Q(29)&Q(30)&Q(31);
CASEQ8IS
?
WHEN"0000"=>LED7S8<="0111111";
WHEN"0001"=>LED7S8<="0000110";
WHEN"0010"=>LED7S8<="1011011";
WHEN"0011"=>LED7S8<="1001111";
WHEN"0100"=>LED7S8<="1100110";
WHEN"0101"=>LED7S8<="1101101";
WHEN"0110"=>LED7S8<="1111101";
WHEN"0111"=>LED7S8<="0000111";
$
WHEN"1000"=>LED7S8<="1111111";
WHEN"1001"=>LED7S8<="1101111";
WHEN"1010"=>LED7S8<="1110111";
WHEN"1011"=>LED7S8<="1111100";
WHEN"1100"=>LED7S8<="0111001";
WHEN"1101"=>LED7S8<="1011110";
WHEN"1110"=>LED7S8<="1111011";
WHEN"1111"=>LED7S8<="1110001";
|
WHENOTHERS=>NULL;
ENDCASE;ENDPROCESS;
ENDfour;
仿真结果:
4.顶层模块
为了达到连接底层元件形成更高层次的电路设计结构,设计中使用了例化语句
程序:
:
LIBRARYIEEE;
USEFRE8IS
PORT(CLK:
INSTD_LOGIC;
fin:
INSTD_LOGIC;
LED7S1,LED7S2,LED7S3,LED7S4,LED7S5,LED7S6,LED7S7,LED7S8:
OUTSTD_LOGIC_VECTOR(6DOWNTO0));
ENDFRE8;
ARCHITECTUREbhv8OFFRE8IS
COMPONENTFIC1
~
PORT(CLK1:
INSTD_LOGIC;
CNT:
OUTSTD_LOGIC;
RST:
OUTSTD_LOGIC;
LOAD:
OUTSTD_LOGIC);
ENDCOMPONENT;
COMPONENTCNT32
PORT(CLR:
INSTD_LOGIC;
EN:
INSTD_LOGIC;
fin:
INSTD_LOGIC;
COUT:
OUTSTD_LOGIC_VECTOR(31DOWNTO0));
ENDCOMPONENT;
COMPONENTREG32A
PORT(LK:
INSTD_LOGIC;
DIN:
INSTD_LOGIC_VECTOR(31DOWNTO0);
DOUT:
OUTSTD_LOGIC_VECTOR(31DOWNTO0));
ENDCOMPONENT;
COMPONENTDECL7S
PORT(Q:
INSTD_LOGIC_VECTOR(31DOWNTO0);
LED7S1,LED7S2,LED7S3,LED7S4,LE
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- EDA 频率计 设计