频率计程序设计Word文档格式.docx
《频率计程序设计Word文档格式.docx》由会员分享,可在线阅读,更多相关《频率计程序设计Word文档格式.docx(11页珍藏版)》请在冰豆网上搜索。
数字频率计是计算机、通讯设备、音频视频等科研生产领域不可缺少的测量仪器。
随着复杂可编程逻辑器件的广泛应用,以EDA工具作为开发手段,运用VHDL语言,使整个系统大大简化,提高整体的性能和可靠性。
通常状况下,计算每秒内待测信号的脉冲个数,此时我们称闸门时间为1秒。
闸门时间也可以大于或者小于1秒。
闸门时间越长,得到的频率值就越准确,但闸门时间越长则没测一次频率的间隔就越长。
闸门时间越短,测得频率值刷新就越快,但测得的频率精度就受影响。
所以,选择闸门时间也是很重要的。
1.2主要实现的功能
通过VHDL的设计,实现四大模块,包括:
测频控制信号发生器,计数器,锁存器和数码管显示。
设定基准时钟,将要测信号的频率与之相比较,这样就能知道被测信号的频率。
计数器和锁存器中,采用十进制计数,每当锁存使能信号来临,锁存器便将锁存结果读入、锁存。
在译码显示电路和顶层文件的设计中,采用循环扫描方式。
可以将频率计数的结果译成能在数码管上显示相对应的阿拉伯数字,便于读取测量的结果。
在顶层设计中,就是将现成元件的端口号映射成高层次设计电路中的信号。
各模块之间、各元件之间的信号连接都是在顶层文件中连接的。
第2章频率计的设计思想
2.1设计思想
本课程设计是要设计一个8位的数字频率计,主要有4个模块组成,分别是:
测频控制信号发生器、计数器、锁存器、译码、顶层设计。
在系统正常工作时,脉冲发生器提供1HZ的输入信号,经过测频控制信号发生器进行信号的变换,产生计数信号,被测信号通过信号整形电路产生同频率的矩形波,送入计数模块,计数模块对输入的矩形波进行计数,将计数结果送入锁存器中,保证系统可以稳定显示数据,显示译码驱动电路将二进制表示的计数结果转换成相应的能够在七段数码管上可以显示的十进制结果。
在数码显示管上可以看到计数结果。
系统原理图如图2—1。
脉冲发生器
频率控制型号发生器
数码显示
译码驱动电路
锁存器
计数器
信号整形电路
图2—1系统原理图
2.2测频控制信号的设计
频率信号发生器(TESTCTL)的计数使能信号TSTEN能产生一个1s宽的周期信号,并保持其所计的脉冲数在停止计数器件,首先需要一个锁存信号LOAD的上升沿将计数器在前一秒钟的计数值锁存在32位锁存器REG32中,并由外部的7段译码器议出,并稳定显示。
2.3计数器和锁存器的设计
有一时钟使能输入端ENA,用于锁定计数值。
当高电平时允许计数,低电平时禁止计数。
采用十进制计数,遵循“逢10进1”的原则。
每当锁存使能信号来临,锁存器便将锁存结果读入、锁存。
在信号LOAD的上升沿时,立即对模块的输入口的数据锁存到REG32B的内部,并由REG32B的输出端输出,然后,七段译码器可以译码输出。
在这里使用了锁存器,好处是可以稳定显示数据,不会由于周期性的清零信号而不断闪烁。
2.4译码显示电路和顶层的设计
由于小数点由锁存器输出,故在此仅考虑数码管7段驱动。
采用循环扫描方式。
将各个模块做出来之后,我进行连接,形成一个完整的数字频率计,在顶层设计中,我们要将各个端口进行连接,这就要用到端口映射。
就是将现成元件的端口号映射成高层次设计电路中的信号。
各模块之间、各元件之间的信号连接关系就是用这种语句将信号映射来实现的。
第3章频率计的设计说明
3.1测频控制信号发生器
CLK为1HZ测频控制时钟输入端口,TSTEN为计数时钟使能输出端口,CLR_CNT为计数器清零输出端口,LOAD为锁存信号输出端。
在测频控制时钟上升沿有效地时候,将1HZ时钟二分频,在测频控制时钟为低电平有效而且div2clk(二分频)为低电平有效时,产生计数器清零信号,否则不进行清零。
锁存信号输出的是不是两分频,计数时钟使能端输出的是二分频。
仿真波形如
3—1。
图3—1测频控制发生器波形
3.2计数器及锁存器
CLK为计数时钟端口,CLR为清零端口,ENA为计数使能端口,CQ为4位计数结果输出端口,CARRY_OUT为计数进位输出端口。
当清零信号为低电平时,产生计数器异步清零信号,否则,当计数时钟在上升沿时,如果计数器等于九时,计数器清零,计数进位。
否则,不进位。
4位计数结果输出的是信号量count。
波形图如3—2—1。
LOAD为锁存信号输入端口,DIN为32位锁存器的输入端口,DOUT为32位锁存器的输出端口。
若锁存信号为上升沿有效时,锁存器输出地就是输入信号。
其波形图如3—2—2。
图3—2—1计数器波形图
图3—2—2锁存器波形图
3.3译码管及顶层设计说明
SIN为四位输入,DOUT为七位输出。
用CASE语句,当SIN从0变到15时,数码管的显示。
在顶层文件中,要调用之前设计好的模块,这些被调用的模块放在元件库中。
在COMPONENT中,无须对所调用的模块、元件进行行为描述。
在顶层文件中还有端口映射,将现成元件的端口号映射成高层次设计电路中的信号。
其波形图如3—3。
图3—3译码管波形图
参考文献
[l]侯伯亨顾新《vhdl硬件描述语言与数字逻辑硬件》西安电子工科
技出版社2004年
[2]潘松王国栋《vhdl实用教程》电子科技大学出版社出版社2007
[3]乔建良徐源田思张风蕊《EDA技术及应用实践》清华大学出版
2006年
[4]潘松黄继业《EDA技术实用教程》科学出版社2008年
程序代码:
Libraryieee;
—32位锁存器
Useieee.std_logic_1164.all;
Entityreg32bis
Port(load:
instd_logic;
din:
instd_logic_vector(31downto0);
dout:
outstd_logic_vector(31downto0));
Endreg32b;
Architecturebehavofreg32bis
Begin
Process(load,din)
Begin
Ifload'
eventandload='
1'
thendout<
=din;
—锁存输入数据
Endif;
Endprocess;
Endbehav;
译码显示电路
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYLED7SIS
PORT(SIN:
INSTD_LOGIC_VECTOR(3DOWNTO0);
DOUT:
OUTSTD_LOGIC_VECTOR(6DOWNTO0));
ENDLED7S;
ARCHITECTUREbehavOFLED7SIS
BEGIN
PROCESS(SIN)
CASESINIS
WHEN"
0000"
=>
DOUT<
="
0111111"
;
0001"
0000110"
0010"
1011011"
0011"
1001111"
0100"
1100110"
0101"
1101101"
0110"
1111101"
0111"
0000111"
1000"
1111111"
1001"
1101111"
1010"
1110111"
1011"
1111100"
1100"
0111001"
1101"
1011110"
1110"
1111001"
1111"
1110001"
WHENOTHERS=>
0000000"
ENDCASE;
ENDPROCESS;
ENDbehav;
顶层源程序
ENTITYFREQTESTIS
PORT(CLK:
INSTD_LOGIC;
FSIN:
INSTD_LOGIC;
DOUT:
OUTSTD_LOGIC_VECTOR(31DOWNTO0));
ENDFREQTEST;
ARCHITECTUREstrucOFFREQTESTIS
COMPONENTTESTCTL
TSTEN:
OUTSTD_LOGIC;
CLR_CNT:
Load:
OUTSTD_LOGIC);
ENDCOMPONENT;
COMPONENTCNT10
CLR:
ENA:
CQ:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
CARRY_OUT:
OUTSTD_LOGIC);
COMPONENTREG32B
PORT(load:
DIN:
INSTD_LOGIC_VECTOR(31DOWNTO0);
OUTSTD_LOGIC_VECTOR(31DOWNTO0));
SIGNALTSTEN1,CLR_CNT1,load1:
STD_LOGIC;
SIGNALDTO1:
STD_LOGIC_VECTOR(31DOWNTO0);
SIGNALCARRY_OUT1:
STD_LOGIC_VECTOR(6DOWNTO0);
U1:
TESTCTLPORTMAP(CLK=>
CLK,TSTEN=>
TSTEN1,
CLR_CNT=>
CLR_CNT1,load=>
load1);
U2:
REG32BPORTMAP(load=>
load1,DIN=>
DTO1,DOUT=>
DOUT);
U3:
CNT10PORTMAP(CLK=>
FSIN,CLR=>
CLR_CNT1,
ENA=>
TSTEN1,CQ=>
DTO1(3DOWNTO0),CARRY_OUT=>
CARRY_OUT1(0));
U4:
CARRY_OUT1(0),CLR=>
ENA=>
TSTEN1,CARRY_OUT=>
CARRY_OUT1
(1),CQ=>
DTO1(7DOWNTO4));
U5:
CNT10PORTMAP(CLK=>
CARRY_OUT1
(1),CLR=>
CARRY_OUT1
(2),CQ=>
DTO1(11DOWNTO8));
U6:
CARRY_OUT1
(2),CLR=>
CARRY_OUT1(3),CQ=>
DTO1(15DOWNTO12));
U7:
CARRY_OUT1(3),CLR=>
CARRY_OUT1(4),CQ=>
DTO1(19DOWNTO16));
U8:
CARRY_OUT1(4),CLR=>
CARRY_OUT1(5),CQ=>
DTO1(23DOWNTO20));
U9:
CARRY_OUT1(5),CLR=>
CARRY_OUT1(6),CQ=>
DTO1(27DOWNTO24));
U10:
CARRY_OUT1(6),CLR=>
TSTEN1,CQ=>
DTO1(31DOWNTO28));
ENDSTRUC;