EDA频率计设计.docx

上传人:b****5 文档编号:27641804 上传时间:2023-07-03 格式:DOCX 页数:21 大小:187.31KB
下载 相关 举报
EDA频率计设计.docx_第1页
第1页 / 共21页
EDA频率计设计.docx_第2页
第2页 / 共21页
EDA频率计设计.docx_第3页
第3页 / 共21页
EDA频率计设计.docx_第4页
第4页 / 共21页
EDA频率计设计.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

EDA频率计设计.docx

《EDA频率计设计.docx》由会员分享,可在线阅读,更多相关《EDA频率计设计.docx(21页珍藏版)》请在冰豆网上搜索。

EDA频率计设计.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1