数字频率计
if((cnt3==4'b1001)&&(cnt2==4'b1001)&&(cnt1==4'b1001)&&(cnt0==4'b1001))begin cnt0<=4'b0000; cnt1<=4'b0000; cnt2<=4'b0000; cnt3<=4'b0000; cnt4<=4'b0001+cnt4; cnt5<=cnt5; cnt6<=cnt6; end else begin
if((cnt2==4'b1001)&&(cnt1==4'b1001)&&(cnt0==4'b1001)) begin cnt0<=4'b0000; cnt1<=4'b0000; cnt2<=4'b0000; cnt3<=4'b0001+cnt3; cnt4<=cnt4; cnt5<=cnt5; cnt6<=cnt6;
end else begin if((cnt1==4'b1001)&&(cnt0==4'b1001)) begin cnt0<=4'b0000; cnt1<=4'b0000; cnt2<=4'b0001+cnt2; cnt3<=cnt3; cnt4<=cnt4; cnt5<=cnt5; cnt6<=cnt6; end else begin if((cnt0==4'b1001)) begin cnt0<=4'b0000; cnt1<=4'b0001+cnt1; cnt2<=cnt2; cnt3<=cnt3; cnt4<=cnt4; cnt5<=cnt5; cnt6<=cnt6; end else begin
cnt0<=4'b0001+cnt0; cnt1<=cnt1; cnt2<=cnt2; cnt3<=cnt3; cnt4<=cnt4; cnt5<=cnt5; cnt6<=cnt6; end end end end end end end else begin if(counter6==2'b01) begin cnt0<=4'b0000; cnt1<=4'b0000; cnt2<=4'b0000; cnt3<=4'b0000; cnt4<=4'b0000; cnt5<=4'b0000; cnt6<=4'b0000; end else begin counter6<=counter6+1; cnte0<=cnt0; cnte1<=cnt1; cnte2<=cnt2;cnte3<=cnt3; cnte4<=cnt4; cnte5<=cnt5; cnte6<=cnt6; end end end end endmodule
频率计数器的仿真工作时序如图所示:
图 3-7 频率计数器的仿真结果图
4.4 锁存器
如果计数器输出直接与译码器相连接,那么在计数过程中输出端则随输入脉冲数的增加而不断跳变,那么显示数码管则也会不断闪烁跳变,让人不能看到稳定的输出,设锁存器后,则不再跳变,便可清晰读出计数结果。其生成的功能模块如图所示:
11
数字频率计
图 3-7 锁存器模块
这模块实现了对七位计数结果的锁存功能。程序很简单如下所示: module latch(reset,clk_1hz,cnte0,cnte1,cnte2,cnte3,cnte4,cnte5,cnte6, cn0,cn1,cn2,cn3,cn4,cn5,cn6); input reset,clk_1hz;
input [3:0] cnte0,cnte1,cnte2,cnte3,cnte4,cnte5,cnte6; output reg [3:0] cn0,cn1,cn2,cn3,cn4,cn5,cn6; always @(posedge clk_1hz or negedge reset) begin if(!reset) begin cn0<=4'b0000; cn1<=4'b0000; cn2<=4'b0000; cn3<=4'b0000;
cn4<=4'b0000; cn5<=4'b0000; cn6<=4'b0000; end else begin cn0<=cnte0; cn1<=cnte1; cn2<=cnte2; cn3<=cnte3; cn4<=cnte4; cn5<=cnte5; cn6<=cnte6; end end endmodule
4.5 扫描显示控制译码系统
本模块在扫描信号的scan_for的控制下,对多路选择器进行扫描,实现对实现对六位已经锁存的计数结果的扫描输出,由于人眼的视觉暂留效应,每支数码管只需大于25Hz的扫描频率即可实现动态扫描,所以我们用1KHz的扫描信号足以。其生成的功能模块如图所示:
12
数字频率计
图 3-7 频率计数器的仿真结果图
本模块还实现了高位的无意义的消隐,即高位若值为零且无意义时,相应的数码管将不会显示。输出信号over通过最高位cnt6是否有值来判断结果是否溢出,如果溢出则over输出结果为低 ,led_khz为单位标志,如果led_khz 为有效时,显示结果的单位为KHz ,dot实现了小数点的显示。其源程序较多,可以附录中查看,此模块的仿真结果如下所示:
图 3-7 频率计数器的仿真结果图
第四章 顶层电路及总体仿真
4.1 顶层电路
顶层电路如下图所示:
13
数字频率计
图 4-1顶层电路图
4.2 总体仿真结果
为了验证我们的设计是否正确,我们用ModelSim对以上设计进行了仿真,
仿真精度达到ps级,基准时钟clk用20883ns,结果如下所示,在1Hz到10000Hz中仿真结果与理论值相等,在输入为100000Hz时出现了3Hz的误差,当输入被测信号为1000000Hz时,出现了26Hz的误差。
仿真结果波形如下图所示:
图 4-2被测信号为10 Hz的仿真结果
图 4-3测信号为100 Hz的仿真结果
图 4-3 被测信号为1000 Hz的仿真结果
10 000 Hz:
图 4-4 被测信号为10000 Hz的仿真结果
100 000 Hz:
14
数字频率计
图 4-5 被测信号为100000 Hz的仿真结果
1000 000 Hz:
图 4-6 被测信号为1000000 Hz的仿真结果
4.3 测试结果
在成功下载并运行后,为评估该设计系统的实际测量效果,做了一次对比实验,选用频率可调的函数发生器,同时用示波器做同步的跟踪。测得的数据较为精确,最低频率可以测到10Hz,当输入信号不大于10KHz时,显示结果跟函数发生器以及示波器的显示全吻合,当输入信号频率达到100KHz时,测得的结果和显波器的显示出现了3Hz的差值,当输入信号频率达到1000KHz时,测得的结果和显波器的显示出现了27Hz的差值,由于所使用的函数发生器最大只能产生41MHz的信号,所以我们最高只测到41MHz。
15
数字频率计
16