轉(zhuǎn)載自https://blog.csdn.net/Reborn_Lee/article/details/80377207
簡易數(shù)字頻率計(jì)原理:數(shù)字頻率計(jì)的原理十分簡單,簡單的就是一句話和一幅圖而已,。 一句話:測(cè)量被測(cè)信號(hào)的頻率,,要清楚頻率的定義,一言以蔽之,,就是1s中信號(hào)的周期數(shù),,這不就是周期的倒數(shù)嗎,? 根據(jù)頻率的定義,我們測(cè)量被測(cè)信號(hào)1s中變化的次數(shù)即可,,即1s中的周期數(shù),。 首先我們?cè)O(shè)置一個(gè)基準(zhǔn)時(shí)鐘信號(hào),頻率為1Hz,,從第一個(gè)上升沿開始計(jì)數(shù)(被測(cè)信號(hào)的上升沿?cái)?shù)),,直到下一個(gè)上升沿到達(dá)時(shí)停止計(jì)數(shù),對(duì)數(shù)據(jù)進(jìn)行鎖存,,再到達(dá)下一個(gè)上升沿時(shí),,對(duì)計(jì)數(shù)器進(jìn)行清零,準(zhǔn)備下一次的測(cè)量,。 一幅圖: 本圖是簡易頻率計(jì)的工作時(shí)序圖,,從圖中 可以看出: 基準(zhǔn)信號(hào)的第一個(gè)上升沿到達(dá)時(shí),計(jì)數(shù)使能信號(hào)有效,,計(jì)數(shù)器開始計(jì)數(shù),; 第二上升沿到達(dá)時(shí),計(jì)數(shù)結(jié)束,,鎖存使能有效,,計(jì)數(shù)數(shù)據(jù)開始鎖存; 第三個(gè)上升沿到達(dá)時(shí),,清零信號(hào)有效,,對(duì)計(jì)數(shù)器的輸出清零,準(zhǔn)備下一次的測(cè)量,。 一個(gè)測(cè)量過程需要3 sec(重要),。 下面是數(shù)字頻率計(jì)的原理圖: 由此原理圖可以清晰的理解下面的verilog HDL程序: //簡易頻率計(jì)設(shè)計(jì) module freDetect(clk_1Hz, fin, rst, d0, d1, d2, d3, d4, d5, d6, d7); input clk_1Hz;//1Hz基準(zhǔn)頻率 input fin; //待測(cè)信號(hào) input rst; //復(fù)位信號(hào) output[3:0] d0, d1, d2, d3, d4, d5, d6, d7; //8位顯示測(cè)量數(shù)據(jù) wire[3:0] q0, q1, q2, q3, q4, q5, q6, q7; //中間數(shù)據(jù) wire[3:0] d0, d1, d2, d3, d4, d5, d6, d7; //控制模塊實(shí)例 control u_control(.clk_1Hz(clk_1Hz), .rst(rst), .count_en(count_en), .latch_en(latch_en), .clear(clear)); //計(jì)數(shù)器模塊實(shí)例 counter_10 counter0(.en_in(count_en), .clear(clear), .rst(rst), .fin(fin), .en_out(en_out0), .q(q0)); counter_10 counter1(.en_in(en_out0), .clear(clear), .rst(rst), .fin(fin), .en_out(en_out1), .q(q1)); counter_10 counter2(.en_in(en_out1), .clear(clear), .rst(rst), .fin(fin), .en_out(en_out2), .q(q2)); counter_10 counter3(.en_in(en_out2), .clear(clear), .rst(rst), .fin(fin), .en_out(en_out3), .q(q3)); counter_10 counter4(.en_in(en_out3), .clear(clear), .rst(rst), .fin(fin), .en_out(en_out4), .q(q4)); counter_10 counter5(.en_in(en_out4), .clear(clear), .rst(rst), .fin(fin), .en_out(en_out5), .q(q5)); counter_10 counter6(.en_in(en_out5), .clear(clear), .rst(rst), .fin(fin), .en_out(en_out6), .q(q6)); counter_10 counter7(.en_in(en_out6), .clear(clear), .rst(rst), .fin(fin), .en_out(en_out7), .q(q7)); //鎖存器模塊實(shí)例 latch u_latch(.clk_1Hz(clk_1Hz), .rst(rst), .latch_en(latch_en), .q0(q0), .q1(q1), .q2(q2), .q3(q3), .q4(q4), .q5(q5), .q6(q6), .q7(q7), .d0(d0), .d1(d1), .d2(d2), .d3(d3), .d4(d4), .d5(d5), .d6(d6), .d7(d7)); endmodule //控制模塊 //控制模塊產(chǎn)生計(jì)數(shù)使能信號(hào)、鎖存使能信號(hào)和計(jì)數(shù)器清零信號(hào) module control(clk_1Hz, rst, count_en, latch_en, clear); input clk_1Hz; input rst; output count_en; output latch_en; output clear; reg[1:0] state; //狀態(tài)信號(hào),,用于控制各種使能信號(hào) reg count_en; reg latch_en; reg clear; always @(posedge clk_1Hz or negedge rst) if(!rst) //復(fù)位信號(hào)有效 begin //各種使能信號(hào)清零 state <= 2’d0; count_en <= 1’b0; latch_en <=1’b0; clear <= 1’b0; end else //遇到基準(zhǔn)信號(hào)的下一個(gè)上升沿,,狀態(tài)變化一次,每次變化后狀態(tài)持續(xù)1s begin case(state) 2’d0: begin //第一個(gè)上升沿到達(dá),,開始計(jì)數(shù),,計(jì)數(shù)1個(gè)基準(zhǔn)信號(hào)周期內(nèi)待測(cè)信號(hào)的上升沿個(gè)數(shù),此個(gè)數(shù)即為待測(cè)信號(hào)的頻率 count_en <= 1’b1; //計(jì)數(shù)使能信號(hào)有效 latch_en <=1’b0; clear <= 1’b0; state <= 2’d1; end 2’d1: begin //第二個(gè)上升沿到達(dá),,計(jì)數(shù)完成,,鎖存使能信號(hào)有效,測(cè)得頻率鎖存至鎖存器中 count_en <= 1’b0; latch_en <=1’b1; clear <= 1’b0; state <= 2’d2; end 2’d2: begin //第三個(gè)上升沿到達(dá),,清零使能信號(hào)有效,,計(jì)數(shù)器清零,,為下一次計(jì)數(shù)做準(zhǔn)備 count_en <= 1’b0; latch_en <=1’b0; clear <= 1’b1; state <= 2’d0; //狀態(tài)清零,,進(jìn)入下一次測(cè)量 end default: begin count_en <= 1’b0; latch_en <=1’b0; clear <= 1’b0; state <= 2’d0; end endcase end endmodule //計(jì)數(shù)模塊 //模10計(jì)數(shù)器,,當(dāng)計(jì)數(shù)使能時(shí)計(jì)數(shù)開始,當(dāng)計(jì)數(shù)器到達(dá)4’b1001,,即9時(shí),,輸出下一模式計(jì)數(shù)器的使能信號(hào)并將計(jì)數(shù)器清零 module counter_10(en_in, rst, clear, fin, en_out, q); input en_in; //輸入使能信號(hào) input rst; //復(fù)位信號(hào) input clear; //清零信號(hào) input fin; //待測(cè)信號(hào) output en_out; //輸出使能,用于控制下一個(gè)計(jì)數(shù)器的狀態(tài),,當(dāng)輸出使能有效時(shí),,下一個(gè)模10計(jì)數(shù)器計(jì)數(shù)加1 output[3:0] q; //計(jì)數(shù)器的輸出,4位BCD碼輸出 reg en_out; reg[3:0] q; always@ (posedge fin or negedge rst) //輸入待測(cè)信號(hào)的上升沿作為敏感信號(hào) if(!rst) //復(fù)位信號(hào)有效,,計(jì)數(shù)器輸出清零 begin en_out <= 1’b0; q <= 4’b0; end else if(en_in) //進(jìn)位輸入使能信號(hào)有效 begin if(q == 4’b1001) //若q = 4’b1001的話,,q清零,同時(shí)進(jìn)位輸出使能有效,,即en_out 賦值為1’b1 begin q <= 4’b0; en_out <= 1’b1; end else //若q未達(dá)到4’b1001時(shí),,每到達(dá)待測(cè)信號(hào)的一個(gè)上升沿,q加1,,同時(shí)輸出進(jìn)位清零 begin q <= q + 1’b1; en_out <=1’b0; end end else if(clear) //若清零信號(hào)有效,,計(jì)數(shù)器清零,主要用于為下一次測(cè)量準(zhǔn)備 begin q <= 4’b0; en_out <= 1’b0; end else begin q <= q; en_out <=1’b0; end endmodule //鎖存器模塊 //當(dāng)鎖存使能時(shí),,鎖存器將8個(gè)模10計(jì)數(shù)器的輸出值鎖存并輸出 module latch(clk_1Hz, latch_en, rst, q0, q1, q2, q3, q4, q5, q6, q7, d0, d1, d2, d3, d4, d5, d6, d7); input clk_1Hz, latch_en, rst; input[3:0] q0, q1, q2, q3, q4, q5, q6, q7; output[3:0] d0, d1, d2, d3, d4, d5, d6, d7; reg[3:0] d0, d1, d2, d3, d4, d5, d6, d7; always@ (posedge clk_1Hz or negedge rst) if(!rst) //復(fù)位信號(hào)有效時(shí)輸出清零 begin d0 <= 4’b0; d1 <= 4’b0; d2 <= 4’b0; d3 <= 4’b0; d4 <= 4’b0; d5 <= 4’b0; d6 <= 4’b0; d7 <= 4’b0; end else if(latch_en) //鎖存信號(hào)有效時(shí),,將計(jì)數(shù)器的輸出信號(hào)鎖存至鎖存器 begin d0 <= q0; d1 <= q1; d2 <= q2; d3 <= q3; d4 <= q4; d5 <= q5; d6 <= q6; d7 <= q7; end else //上面兩種情況均未發(fā)生時(shí),輸入不變 begin d0 <= d0; d1 <= d1; d2 <= d2; d3 <= d3; d4 <= d4; d5 <= d5; d6 <= d6; d7 <= d7; end endmodule
測(cè)試文件為: `timescale 1ns/1ps //測(cè)試模塊 module freDetect_tb; parameter CLK_1HZ_DELAY = 5_0000_0000; //1Hz基準(zhǔn)信號(hào) parameter FIN_DELAY = 100; //5MHz待測(cè)信號(hào) reg clk_1Hz; reg fin; reg rst; wire[3:0] d0, d1, d2, d3, d4, d5, d6, d7; initial begin rst =1’b0; #1 rst = 1’b1; end initial begin fin = 1’b0; forever #FIN_DELAY fin = ~fin; end initial begin clk_1Hz = 1’b0; forever #CLK_1HZ_DELAY clk_1Hz = ~clk_1Hz; end freDetect freDetect1(.clk_1Hz(clk_1Hz), .rst(rst), .fin(fin), .d0(d0), .d1(d1), .d2(d2), .d3(d3), .d4(d4), .d5(d5), .d6(d6), .d7(d7)); endmodule
在Modelsim中仿真得到的波形圖為:
看不清,,再截一張:
|