完整word版量程自动转换数字频率计.docx
- 文档编号:28612568
- 上传时间:2023-07-19
- 格式:DOCX
- 页数:19
- 大小:214.12KB
完整word版量程自动转换数字频率计.docx
《完整word版量程自动转换数字频率计.docx》由会员分享,可在线阅读,更多相关《完整word版量程自动转换数字频率计.docx(19页珍藏版)》请在冰豆网上搜索。
完整word版量程自动转换数字频率计
量程自动转换数字频率计的设计
1.设计目标:
A.设计一个3位十进制数字式频率计,其测量范围为1MHz,量程分10kHz,100kHz和1MHz三档(最大读数分别为9.99kHz,99.9kHz,999kHz)。
被测信号应是一符合CMOS电路要求的脉冲或正弦波。
B.要求量程可根据被测量的频率大小自动转换,即当计数器溢出时,产生一个换挡信号,让整个计数时间减少为原来的1/10,从而实现换挡功能.
C.要求实现溢出报警功能,即当频率高于999kHz时,产生一个报警信号,点亮LED灯,从而实现溢出报警功能.
D.小数点位置随量程变化自动移位。
E.采用记忆显示方式,即计数过程中不显示数据,待计数过程结束后,显示计数结果,并将此显示结果保持到下一次计数结束.显示时间应不小于1秒。
2.设计思路及实现方案:
1.频率计的工作原理:
常用的测量频率的方法有两种,一种是测周期法,一种是测频率法。
测周期法需要有基准系统时钟频率Fs,在待测信号一个周期Tx内,记录基准系统时钟频率的周期数Ns,则被测频率可表示为:
Fx=Fs/Ns
测频率法就是在一定时间间隔Tw(该时间定义为闸门时间)内,测得这个周期性信号的重复变换次数为Nx,则其频率可表示为:
Fx=Nx/Tw
本设计采用的是直接测频率的方法。
2.频率计的原理框图:
频率计的系统设计可分为3位十进制计数模块,闸门控制模块,译码显示模块,可自动换挡模块和分频模块。
其原理框图如下:
→
其中,可自动换挡模块为闸门控制模块提供3个挡,也就是三个测量范围的基准时钟信号,通过计数器的最高位的溢出情况来判定工作在第几挡.
闸门控制模块根据基准时钟信号产生基准时钟信号周期2倍的周期使能信号,随后为锁存器产生一周期性地锁存信号,再然后为计数模块产生一周期性的清零信号。
3位十进制计数模块在使能信号和清零信号的控制下对被测信号的波形变化进行计数,若产生溢出则为自动换挡模块输出一换挡信号。
译码显示模块显示被测信号的频率。
3.设计过程(包括关键模块的仿真结果及贴图)
1.分频模块:
输入信号为4MHZ的高频脉冲,经过分频器后得到1KHZ的脉冲。
分频器的代码如下:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityfenping2is
port(
clk:
instd_logic;
clk_out:
outstd_logic);
endfenping2;
architecturebehavioroffenping2is
begin
process(clk)
variablecount:
integerrange0to1999;
variablex:
std_logic;
begin
ifclk’eventandclk=’1’then
ifcount<1999then
count:
=count+1;
else
count:
=0;
x:
=notx;
endif;
endif;
clk_out〈=x;
endprocess;
endarchitecturebehavior;
模块说明:
clk为4MHZ时钟脉冲输入端,clk_out为1KHZ脉冲输出端。
由于输入为高频信号,不易仿真且代码编译无误,这里没有给出时序波形图.
经软件编译后,得到模块为:
2.3位十进制计数模块:
3位十进制计数模块包含3个级联十进制计数器,用来对施加到时钟脉冲输入端的待测信号产生的脉冲进行计数,十进制计数器具有计数使能、清零控制和进位输出功能.用于计数的时间间隔(计数允许周期T)由闸门控制模块的控制信号发生器所产生的使能信号来控制,计数使能信号也在闸门控制模块中产生。
自动换挡模块决定计数器读数的单位。
1位十进制计数器的VHDL源程序如下:
libraryieee;
useieee。
std_logic_1164。
all;
useieee。
std_logic_unsigned.all;
entitycount10is
port(CLK,RST,EN:
instd_logic;
CQ:
outstd_logic_vector(3downto0);
COUNT:
outstd_logic);
endcount10;
architecturebehavofcount10is
begin
process(CLK,RST,EN)
variableCQ1:
std_logic_vector(3downto0);
begin
ifRST=’1’thenCQ1:
=(others=〉'0’);
elsifCLK’eventandCLK=’1’then
ifEN=’1'then
ifCQ1<9thenCQ1:
=CQ1+1;
elseCQ1:
=(others=〉’0');
endif;
endif;
endif;
ifCQ1=9thenCOUNT<=’1’;
elseCOUNT〈='0';
endif;
CQ〈=CQ1;
endprocess;
endbehav;
以上源程序编译成功后,生成计数器模块如下:
3位十进制计数模块为:
3。
闸门控制模块:
以基准信号的周期为一秒为例,频率测量的基本原理是计算一秒内待测信号的脉冲个数,这就要求能产生一个周期为2秒,占空比为50%的周期信号TSTEN。
用这个信号作为计数器的EN输入端,使其计数时间正好为1秒.当TSTEN为高电平时,计数开始,低电平时,计数停止。
在计数器停止期间,首先要产生一个锁存信号LOAD,用其上升沿控制锁存器REG12将之前的计数结果存入锁存器中,并由显示模块将其显示出来。
设置锁存器是为了让显示稳定,不会因为周期性的清零信号使得数值不断闪烁.锁存之后需有一清零信号CLR_CNT将计数器清零,为下一秒的计数操作做准备。
闸门控制模块的VHDL源程序如下:
libraryieee;
useieee。
std_logic_1164。
all;
useieee.std_logic_unsigned。
all;
entitytestctlis
port(clk:
instd_logic;
clr_cnt:
outstd_logic;
tsten:
outstd_logic;
load:
outstd_logic);
endtestctl;
architecturebehavoftestctlis
signala:
std_logic;
begin
process(clk)
begin
ifclk’eventandclk='1’then
a<=nota;
endif;
endprocess;
process(clk,a)
ifa=’0'andclk=’0’then
clr_cnt<=’1’;
elseclr_cnt〈=’0’;
endif;
endprocess;
load〈=nota;
tsten〈=a;
endbehav;
时序仿真结果如下:
编译后生成的模块为:
其中,clk为基准信号输入端,clr_cnt为清零信号,tsten为计数使能信号,load为锁存允许信号。
4.可自动换挡模块:
本设计通过控制基准时钟信号来实现量程的自动转换。
在第一个计数器的CLK端接一周期为0.001s(1KHz)的时钟信号,其测量范围为100-999000Hz,为2挡;在第一个计数器的COUNT端将会得到周期为0。
01s的信号,即为1挡,其测量范围为10—99900Hz;在第二个计数器的COUNT端将会得到0.1s的信号,即为0挡,其测量范围为0-9990Hz.
这里还需要一个3选1选择器来选择第几个计数器的COUNT端作为基准时钟信号。
3选1选择器可根据3位十进制计数模块的溢出情况来作为选择标准。
3选1选择器的VHDL源程序如下:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned。
all;
entitymux31is
port(a:
instd_logic_vector(3downto0);
y:
outstd_logic;
o:
outstd_logic;
input0:
instd_logic;
input1:
instd_logic;
input2:
instd_logic;);
endmux31;
architecturebehavofmux31is
begin
process(input0,input1,input2,a)
begin
caseais
when”0000"=>y<=input0;o〈=’0’;
when"0001”=〉y〈=input1;o〈=’0';
when"0010"=>y〈=input2;o<=’0’;
whenothers=〉y〈=’0’;o〈=’1’;
endcase;
endprocess;
endbehav;
生成的模块为:
仿真波形为:
当输入为0000时:
当输入为0001时:
当输入为0010时:
当输入为0011时:
可以看到,设计完全符合要求,o端可以作为量程溢出标志.
综上,量程自动转换模块为:
5.译码显示模块:
译码显示模块的设计分为显示锁存器的设计,七段数码显示译码器的设计和小数点显示模块的设计3部分.显示锁存器是在计数结束后,利用load信号的上升沿把最新计数结果保存起来。
其源程序如下:
libraryieee;
useieee。
std_logic_1164.all;
useieee。
std_logic_unsigned.all;
entityreg12is
port(
load:
instd_logic;
din0,din1,din2:
instd_logic_vector(3downto0);
dout0,dout1,dout2:
outstd_logic_vector(3downto0));
endreg12;
architecturebehavofreg12is
begin
process(load)
begin
ifload’eventandload='1’then
dout0〈=din0;
dout1<=din1;
dout2〈=din2;
endif;
endprocess;
endarchitecturebehav;
生成的模块为:
仿真结果为:
七段数码显示译码器的vhdl源程序如下:
libraryieee;
useieee。
std_logic_1164。
all;
entityseg7is
port(dat:
instd_logic_vector(3downto0);
tmp:
outstd_logic_vector(6downto0));
endseg7;
architecturearcofseg7is
begin
process(dat)
begin
casedatis
when”0000"=〉tmp〈=”0000001”;
when”0001”=>tmp<="1001111”;
when”0010”=〉tmp〈=”0010010";
when”0011"=〉tmp<=”0000110”;
when"0100"=>tmp<="1001100";
when"0101”=>tmp<="0100100";
when”0110”=〉tmp〈="0100000”;
when”0111"=>tmp<="0001111”;
when"1000”=>tmp<="0000000";
when”1001"=〉tmp〈=”0000100";
when”1010”=〉tmp<=”0001000”;
when"1011"=〉tmp〈=”1100000”;
when”1100”=〉tmp〈=”0110001";
when"1101"=>tmp<=”1000010”;
when”1110"=〉tmp<=”0110000”;
when”1111”=>tmp〈=”0111000";
endcase;
endprocess;
endarc;
生成的模块为:
小数点显示模块的源程序如下:
libraryieee;
useieee。
std_logic_1164.all;
useieee.std_logic_unsigned。
all;
entitydotis
port(dang_in:
instd_logic_vector(3downto0);
dang:
outstd_logic_vector(2downto0));
enddot;
architectureoneofdotis
begin
process(dang_in)
begin
casedang_inis
when”0000”=>dang<=”100";
when”0001”=>dang〈="010”;
when"0010"=>dang〈="001”;
whenothers=>dang〈=”111";
endcase;
endprocess;
endone;
经编译后生成的模块为:
6.量程自动转换数字频率计顶层文件:
(见附录)
4遇到的问题及解决方案
选择做量程自动转换的数字频率计这个命题,完全是出于个人兴趣,但是一旦开始这方面的考虑时,还是遇到了很多问题的。
其中,我尝试过三种设计思路,最后一种勉强达到了要求,还是倍感欣慰。
下面列出了遇到的问题及解决方案:
(1)由于本次设计的数字频率计有3个挡,需要有3个相应的时基信号与之对应。
刚开始采用的方案是分别用3个分频器产生3种时基信号,但是最终的结果不理想,后来采用先用一个分频器分频得到0。
001s的信号,再依次通过两个十进制计数器分频得到0。
01s,0。
1s的信号的方案,结果比较理想,很好的解决了这个问题。
(2)由于输入为4MHz时钟信号和分频器分频数较大,直接接入电路进行仿真难度很大,且不易得到较准确的仿真结果。
因此仿真时没有接入分频模块,且clk_in(对应0。
001s)端输入和sig端输入也进行了同等比例的缩小,从而很好的解决了仿真遇到的问题。
(3)小数点显示模块的设计也遇到了一些问题,因为电路高度模块化,刚开始没有找到能很好反应小数点变化的敏感量,后来偶尔发现了量程自动转换模块的Mux31对应的敏感量可以很好的解决这个问题,就设计出了小数点显示模块。
从图中可以看到Mux31和dot模块的一端同时连在十进制计数器的计数输出端。
5编程调试(可选)
6综合时序仿真及功能分析:
综合仿真时,为了直观的读出所测频率值,没有加七段数码显示译码器。
为了便于仿真,clk_in端输入为1us(是1ms的0。
001倍),sig输入端也同样变为待测信号的0。
001倍,这样得到的仿真结果仍为待测信号的频率值。
当clk_in端输入1us,sig端输入200ns时(即频率为5KHz):
仿真结果为:
从仿真图中可以看到,dian端输出为4,对应0挡,锁存器输出为5,即5KHz,符合要求。
当clk_in端输入1us,sig端输入40ns时(即频率为25KHz):
仿真结果为:
从仿真图中可以看到,开始是dian端为4,对应0挡,输出为0KHz,量程太小要求换挡;第二个时基后,dian端为2,对应1挡,输出为25KHz,此后就稳定的显示此数值,符合要求。
当clk_in端输入1us,sig端输入4ns时(即频率为250KHz):
仿真结果为:
从仿真图中可以看到,经过两次换挡后,第三个时基后,dian端为1,对应2挡,输出为249KHz,此后就稳定的显示此数值,符合要求。
当clk_in端输入10us,sig端输入4ns时(即频率为2500KHz):
仿真结果为:
从仿真图可以看到,经过三次换挡后,量程都没符合要求,即产生了溢出,此时yichu端产生高脉冲,可作为溢出报警信号。
综上可以看出,频率计的设计完全符合要求.
7小结:
历时两周的设计终于画上了句号,内心也轻松了。
可以说,做这个设计让我遇到了很多的问题,有一段时间想放弃,重新换个题目,但是自动换挡模块的顺利实现还是让我看到了希望,并最终完成了整个设计,这一切对于我来说意义非凡,让我感受到奋斗的喜悦和无人可以商量的苦闷。
通过这次的设计,我系统的查看了各种各样的资料,这样的学习让我加深了对知识的理解和对eda这门学科大概的了解。
在做设计过程中,对仿真软件的操作也很熟练了,掌握了很多时序仿真的技巧和方法,这为以后的进一步学习打下了比较好的基础。
对于我来说,这次更大的收获则是我通过逐步学习和了解,对eda课程产生了浓厚的兴趣,兴趣是可以改变人的奋斗轨迹的。
8对该课程的实施意见及建议:
1.课程安排相对较少,有时候是学习刚入门,课程就结束了,这样不利于系统的学习这方面的知识,所以希望学校能适当的丰富这方面的课程。
2.Eda是一门实践性很强的课程,学校给提供的条件也很不错,但是客观的讲,机房的相关设备仍需要改进,以满足学生更高的要求.
3.由于是初步学习,有很多问题都是第一次遇到,在解决问题的时候,希望老师能给予更多的关切。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 完整 word 量程 自动 转换 数字频率计