简易数字频率计(2)

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

简易数字频率计

一、实验目的

测量某一信号的频率,并通过实验箱上的八位数码管显示出来。

二、方案论证与比较

在此方案的前提下,如果能完成1Hz的精密时钟,则数码管显示的结果与被测信号的误差很小,但是在数码管的高位上显示出了不需要的0,则在此基础上加入了清零模块,则最终确定的方案如下:

三、设计步骤

1、1Hz的精密时钟

该模块中,若要得到1Hz精密时钟,则需要经过24M次分频,即将其转化为十六进制为“16E3600”,二进制为“1011011100011011000000000”,那么二进制的位数25即为需要的D触发器个数,因此当计数到等于“16E3600”时,将数据锁存,则输出即为1Hz精密时钟。CLK2为扫描时钟,可直接取计数中的任意时钟,如count14,但要满足>40Hz。则该模块的硬件描述语言如下:(sel-clock.tdf)

subdesign sel_clock

(

clk:input;

clk1,clk2:output;

)

variable

count[24..0]:dff;

s:dff;

begin

count[].clk=clk;

s.clk=clk;

clk1=s;

if count[]==H"16e3600" then

s=VCC;

count[]=0;

else

count[].d=count[].q+1;

s=GND;

end if;

clk2=count14;

end;

2、门控电路

将被测信号与1Hz的时钟经过一个或门,将输出作为计数器的计数时钟,将1Hz的时钟经过一个与门作为计数器的清零时钟,从而实现当1Hz时钟为高电平时,对计数器清零,即不对被测信号计数,而当1Hz时钟为低电平时,计数器对被测信号进行计数,由此1Hz时钟不会对被测信号构成影响。其电路连接如下:

3、清除高位显示的零

该模块用来实现由缓冲模块锁存输出的数据经数码管显示后在高位出现的零,其设计方法为:当输出全为0,则经此模块输出后在数码管上只显示一个0,其它的数码管均不显示,即将输出改为数码管显示不出来的字符,如b;同理,当输出为多于一位时,则将输入的数据直接输出,其它位改为显示不出的字符,如b。则该模块的硬件描述语言如下:(qingling0.tdf)

subdesign qingling0

(

da[31..0]:input;

out[31..0]:output;

)

begin

if da[31..0]==H"00000000" then

out[31..0]=H"bbbbbbb0";

elsif da[31..4]==H"0000000" then

out[31..4]=H"bbbbbbb";

out[3..0]=da[3..0];

elsif da[31..8]==H"000000" then

out[31..8]=H"bbbbbb";

out[7..0]=da[7..0];

elsif da[31..12]==H"00000" then

out[31..12]=H"bbbbb";

out[11..0]=da[11..0];

elsif da[31..16]==H"0000" then

out[31..16]=H"bbbb";

out[15..0]=da[15..0];

elsif da[31..20]==H"000" then

out[31..20]=H"bbb";

out[19..0]=da[19..0];

elsif da[31..24]==H"00" then

out[31..24]=H"bb";

out[23..0]=da[23..0];

elsif da[31..28]==H"0" then

out[31..28]=H"b";

out[27..0]=da[27..0];

end if;

end;

4、数据缓冲

该模块实现数据缓冲,即在每个时钟上升沿到来时用D触发器将此时的数据锁存,直到下一个上升沿到来时更新数据。则该模块的波形仿真如下:

该模块的硬件描述语言如下:(huan-chong0.tdf)

subdesign huan_chong0

(

clk,A[31..0] :input;

out[31..0] :output;

)

variable

count[31..0]:dff;

begin

count[].clk=clk;

count[].d=A[];

out[]=count[].q;

end;

5、数码管扫描显示

上图为cont模块的波形仿真,用于实现数码管的动态扫描;Sel]2..0]接数码管的位选端。

四、原理图如下

五、实验总结

1、假如不用数据锁存的方法,直接用count24得到1.43Hz的时钟作为1Hz时钟使用,则误差很大。

2、注意引脚的绑定:sel1~sel0锁定到Pin132,Pin133,Pin135;被测时钟dsx 锁定到Pin55;

3、对于这样的综合设计实验,我们应采取各个击破的方式,对每个模块做到分析、思考,再去编程,然后将所有的模块组装在一起,就可完成该设计。如果碰到解决不了的问题,不要放弃,从多方面思考,看自己在哪个地方出错,然后做出合理的修改。比如,在我首次做出该实验时,碰到了时钟不精密和高位的0未清除等问题,当时我并不知道怎么去解决,但后来经老师指点知道1Hz时钟可以通过一个精密的算法得到,然后就利用缓冲那块的思想解决了问题,清0就考虑如何将显示0的数码管不显示,当想到有几个状态数码管不显示时,就很开心,然后将该清0模块完成了。所以说,设计实验并不难,只要我们细心的去想和做是一定不会有问题的。

相关文档
最新文档