設計背景:
頻率計又稱為頻率計數器,是一種專門對被測信號頻率進行測量的電子測量儀器。頻率計主要由四個部分構成:時基(T)電路、輸入電路、計數顯示電路以及控制電路。
頻率,即使信號周期的倒數,也就是說,信號每單位時間完成周期的個數,一般去一秒為基本單位時間。
設計原理:
本次的設計主要是一個簡單的二選一數據選擇器,我們的設計主
頻率=1s/T,T=高電平的時間+低電平的時間。時間=周期數*周期。占空比=(高電平的時間/周期)100%。我們的時間單位都是以ns來計算的,所以要把1s換成1_000_000_000ns,驅動時鐘是50MHz的,周期為20ns。計算占空比的時候,我們把周期20ns全部省略了。所以計算公式如下:
freq = 1_000_000_000/(low_time * 20 + high_time * 20);
duty_cycle = (high_time * 100)/(high_time + low_time);
設計架構圖:
設計代碼:
設計模塊
0modulefreq_meter (clk,rst_n,wave,freq,duty_cycle);//端口列表
1
2 inputclk;//時鐘
3 inputrst_n;//復位
4 inputwave;//被測頻率
5 output[25:0]freq;//輸出頻率
6 output[6:0]duty_cycle; //輸出占空比
7
8 reg[25:0]low_cnt;
9 reg[25:0]high_cnt;
10 reg[25:0]low_time;
11 reg[25:0]high_time;
12 regstate;
13
14 localparamhigh_state =1'b0;
15 localparamlow_state =1'b1;
16
17 always@(posedgeclk ornegedgerst_n)
18 begin
19 if(!rst_n)
20 begin
21 low_cnt <=26'd0;
22 high_cnt <=26'd0;
23 low_time <=26'd0;
24 high_time <=26'd0;
25 state <=high_state;
26 end
27 else
28 begin
29 case(state)
30 high_state :begin
31 if(wave ==1'b1)//判斷輸入為高電平
32 begin
33 high_cnt <=high_cnt +1'b1;
34 state <=high_state;
35 end
36 else
37 begin
38 high_cnt <=26'd0;
39 high_time <=high_cnt;
40 state <=low_state;
41 end
42 end
43
44 low_state :begin
45 if(wave ==1'b0)//判斷輸入為低電平
46 begin
47 low_cnt <=low_cnt +1'b1;
48 state <=low_state;
49 end
50 else
51 begin
52 low_cnt <=26'd0;
53 low_time <=low_cnt;
54 state <=high_state;
55 end
56 end
57 default:state <=low_state;
58 endcase
59 end
60 end
61
62 assignfreq =1_000_000_000/(low_time *20+high_time *20);//求頻率
63 assignduty_cycle =(high_time *100)/(high_time +low_time);//求占空比
64
65endmodule
測試模塊
0`timescale1ns/1ps
1modulefreq_meter_tb;
2 regclk;
3 regrst_n;
4 regwave;
5 wire[25:0]freq;
6 wire[6:0]duty_cycle;
7
8 initialbegin
9 clk =1'b1;
10 rst_n =1'b0;
11
12 #200.1
13 rst_n =1'b1;
14 #1_000_000_0//仿真10ms
15 $stop;
16 end
17
18 always#10clk =~clk;
19
20 initialbegin
21 wave =1'b1;
22 foreverbegin//產生占空比為60%,頻率為1KHz的方波
23 #600_000
24 wave =1'b0;
25 #400_000
26 wave =1'b1;
27 end
28 end
29
30 freq_meter freq_meter_dut(
31 .clk(clk),
32 .rst_n(rst_n),
33 .wave(wave),
34 .freq(freq),
35 .duty_cycle(duty_cycle)
36 );
37
38endmodule
仿真圖:
由于在前面沒有測完一個周期出現了不穩定的因素,就出現了不準確的數值,當測試完一個周期以后,測到的數值就比較的準確,基本的沒有什么誤差。
相對的,如果測試的頻率越大,測到的數值就越準確。
-
FPGA
+關注
關注
1630文章
21781瀏覽量
604936 -
頻率計
+關注
關注
8文章
175瀏覽量
44422
發布評論請先 登錄
相關推薦
評論