名稱:Quartus簡易等精度頻率計設(shè)計verilog代碼
軟件:Quartus
語言:Verilog
代碼功能:
簡易等精度頻率計設(shè)計
二)要求
被測信號:TTL方波;
A.頻率測量范圍:100HZ~MHz;
B.測試誤差:≤0.1%(全量程);
C.時鐘頻率:50kI1z;
D.預(yù)閘門時間:0.1s;
E.系統(tǒng)時鐘頻率:50MHz;
F.頻率計算:保留1位小數(shù);
G.頂層設(shè)計采用圖形輸入,各模塊可以用功能模塊或HDL語言等設(shè)計。
評價標準
(一)提交設(shè)計過程和實驗仿真等照片及大作業(yè)報告的電子文檔,正文不得少于3000字符,網(wǎng)絡(luò)復(fù)制率需小于40%,報告中的圖片需清晰無水印
(二)細則。
1、頻率測量誤差分析(10%);
2、分潁電路設(shè)計(10%);
3、閘門電路設(shè)計(10%);
4、計數(shù)電路設(shè)計(10%);
5、計算電路設(shè)計(10%);
6、仿真等驗證(30%);
7、格式規(guī)范等(20%)。
FPGA代碼Verilog/VHDL代碼資源下載:www.hdlcode.com
演示視頻:
設(shè)計文檔:
等精度頻率計結(jié)題報告
1.?設(shè)計要求
本設(shè)計為等精度頻率計,頻率計指標要求如下:
1.頻率測量范圍:100Hz~1MHz;
2.被測信號為TTL方波;
3.測試誤差:小于等于0.1%(全量程);
4.時鐘頻率:50KHz;
5.預(yù)閘門時間:0.1s;
6.系統(tǒng)時鐘頻率:50MHz;
7.頻率計算:保留1位小數(shù);
2.?設(shè)計原理
等精度測頻方法是在直接測頻方法的基礎(chǔ)上發(fā)展起來的。它的閘門時間不是固定的值,而是被測信號周期的整數(shù)倍,即與被測信號同步,因此,避除了對被測信號計數(shù)所產(chǎn)生的1個時鐘誤差,并且達到了在整個測試頻段的等精度測量。等精度測量的核心思想在于如何保證在實際測量門閘內(nèi)被測信號為整數(shù)個周期,這就需要在設(shè)計中讓實際測量門閘信號與被測信號建立一定的關(guān)系?;谶@種思想,設(shè)計中以被測信號的上升沿作為開啟門閘和關(guān)閉門閘的驅(qū)動信號,只有在被測信號的上升沿才將圖1中預(yù)置的“閘門”的狀態(tài)鎖存,因此在“實際閘門”內(nèi)被測信號的個數(shù)就能保證整數(shù)個周期,這樣就避免普通測量方法中被測信號的±1的誤差,但會產(chǎn)生高頻的標準頻率信號的±1周期誤差,由于標準頻率的頻率遠高于被測信號,因此它產(chǎn)生的±1周期誤差對測量精度的影響十分有限,特別是在中低頻測量的時候,相較于傳統(tǒng)的頻率測量和周期測量方法,可以大大提高測量精度。
其測頻原理如圖2.1所示。在測量過程中,有兩個計數(shù)器分別對標準信號和被測信號同時計數(shù)。首先給出閘門開啟信號(預(yù)置閘門上升沿),此時計數(shù)器并不開始計數(shù),而是等到被測信號的上升沿到來時,計數(shù)器才真正開始計數(shù)。然后預(yù)置閘門關(guān)閉信號,下降沿到時,計數(shù)器并不立即停止計數(shù),而是等到被測信號的上升沿到來時才結(jié)束計數(shù),完成一次測量過程??梢钥闯?,實際閘門時間t與預(yù)置閘門時間t1并不嚴格相等,但差值不超過被測信號的一個周期。
3.?測量誤差分析
等精度測頻的實現(xiàn)方法可簡化為圖2.2所示。CNT1和CNT2是兩個可控計數(shù)器,標準頻率信號從CNT1的時鐘輸入端CLK輸入;經(jīng)整形后的被測信號從CNT2的時鐘輸入端CLK輸入。當(dāng)預(yù)置門控信號為高電平時,經(jīng)整形后的被測信號的上升沿通過D觸發(fā)器的Q端同時啟動CNT1和CNT2。CNT1、CNT2同時對標準頻率信號和經(jīng)整形后的被測信號進行計數(shù),分別為Ns與Nx。當(dāng)預(yù)置門信號為低電平的時候,后而來的被測信號的上升沿將使兩個計數(shù)器同時關(guān)閉,所測得的頻率為(Fs/Ns)*NX。則等精度測量方法測量精度與預(yù)置門寬度的標準頻率有關(guān),與被測信號的頻率無關(guān)。在預(yù)置門時間和常規(guī)測頻閘門時間相同而被測信號頻率不同的情況下,等精度測量法的測量精度不變。
首先,被測信號頻率fx的相對誤差與被測信號的頻率無關(guān);其次,增大測量時間段“軟件閘門”或提高標準頻率,可以減小相對誤差,提高測量精度;最后,由于一般提供標準頻率的石英晶振穩(wěn)定性很高,所以標準信號的相對誤差很小,可忽略。假設(shè)標準信號的頻率為50 KHz,只要實際閘門時間大于或等于0.1s,就可使測量的精度達到1/5 KHz。
4.?工作原理
根據(jù)上述設(shè)計思想,對等精度頻率計進行具體設(shè)計,整體設(shè)計框圖如下圖所示。
整體設(shè)計電路圖
包括分頻電路模塊(clk_div),閘門電路模塊(div_doors),計數(shù)電路模塊(count_cal),運算電路模塊(latch_buf),數(shù)碼管顯示模塊(display)等,分頻電路將時鐘50M分頻為50KHz作為標準時鐘控制其他模塊,閘門電路實現(xiàn)0.1s的閘門信號,計數(shù)電路按閘門時間分別采用標準時鐘和被測信號進行計數(shù),并將計數(shù)結(jié)果輸入到運算電路模塊,最終通過運算電路的計算得到頻率結(jié)果,顯示模塊將最終的頻率結(jié)果顯示到數(shù)碼管上。
各個模塊具體功能介紹如下:
4.1 分頻電路設(shè)計
分頻模塊用于將系統(tǒng)時鐘50MHz分頻為50KHz,本設(shè)計將50KHz作為標準頻率信號。分頻方法為計數(shù)法,即50M除以50K等于1000,則分頻系數(shù)為1000.因此使用計數(shù)器對50MHz進行計數(shù),當(dāng)計數(shù)到1000后回0。計數(shù)值前500輸出高電平,后500輸出低電平,最終得到的輸出信號就是50KHz。
分頻模塊框圖
4.2 閘門電路設(shè)計
閘門信號產(chǎn)生模塊用于產(chǎn)生周期為0.1s的閘門信號,并將閘門信號同步于被測信號,使閘門寬度為被測信號周期的整數(shù)倍。50KHz要得到0.1s的信號即10Hz,故分頻系數(shù)為50K/10=5000。也使用計數(shù)法產(chǎn)生,計數(shù)2500后信號翻轉(zhuǎn),得到的就是一共計數(shù)5000的周期信號。得到的閘門周期則為0.1s,其中高電平時間就是閘門開啟時間,為0.05秒。
閘門電路框圖
4.2 計數(shù)電路設(shè)計
計數(shù)模塊使用標準頻率和被測頻率分別對閘門進行計數(shù),得到2個計數(shù)值。使用CNT1計數(shù)標注頻率信號,使用CNT2計數(shù)被測信號,然后將兩個計數(shù)信號輸出。計數(shù)CNT1使用clk_in作為計數(shù)時鐘,當(dāng)door_1s為1時開始計數(shù),door_1s為0時計數(shù)清零。CNT2使用signal_in作為計數(shù)時鐘,當(dāng)door_1s為1時開始計數(shù),door_1s為0時計數(shù)清零。
計數(shù)電路框圖
4.2 計算電路設(shè)計
運算鎖存模塊接收2個計數(shù)值,依據(jù)頻率計算公式計算被測信號的頻率。CNT1和CNT2得到后需要將數(shù)據(jù)鎖存,以便于進行后續(xù)的頻率計算,鎖存信號為閘門信號的下降沿。閘門信號的下降沿獲取方法是先將doors_open信號在clk_in時鐘下打一拍得到door_1s_buf信號,再將door_1s_buf與上doors_open的非。
鎖存后依據(jù):待測頻率=CNT2_buf*50000*10/CNT1_buf的計算公式進行計算,得到的頻率值包含一位小數(shù)點。
運算電路框圖
4.2 數(shù)碼管顯示電路設(shè)計
數(shù)碼管顯示模塊用于控制數(shù)碼管將被測頻率顯示出來。數(shù)碼管顯示使用動態(tài)掃描的方式,依次顯示頻率的不同位。使用8段數(shù)碼管顯示,每個數(shù)碼管輸入為8位,對應(yīng)下圖中的abcdefg7段加上小數(shù)點dp,當(dāng)輸入0時對應(yīng)的段點亮,當(dāng)輸入為1時,對應(yīng)的段滅。
根據(jù)上圖可以觀察到,若要顯示數(shù)字0,需要DP滅,G滅,ABCDEF亮,也就是對應(yīng)編碼為“11000000”,其中從左到右依次對應(yīng)DP-GFEDCBA。以此類推可以得到0~9的所有編碼。一共有8個數(shù)碼管,8個數(shù)碼管共用一組段選信號(seg_select),因此為了同時顯示8個數(shù)碼管,需要對8個數(shù)碼管依次切換,控制位選信號(bit_select)按順序循環(huán)選通,低電平時對應(yīng)數(shù)碼管點亮。
部分代碼展示:
//?Copyright?(C)?1991-2013?Altera?Corporation //?Your?use?of?Altera?Corporation's?design?tools,?logic?functions? //?and?other?software?and?tools,?and?its?AMPP?partner?logic? //?functions,?and?any?output?files?from?any?of?the?foregoing? //?(including?device?programming?or?simulation?files),?and?any? //?associated?documentation?or?information?are?expressly?subject? //?to?the?terms?and?conditions?of?the?Altera?Program?License? //?Subscription?Agreement,?Altera?MegaCore?Function?License? //?Agreement,?or?other?applicable?license?agreement,?including,? //?without?limitation,?that?your?use?is?for?the?sole?purpose?of? //?programming?logic?devices?manufactured?by?Altera?and?sold?by? //?Altera?or?its?authorized?distributors.??Please?refer?to?the? //?applicable?agreement?for?further?details. //?PROGRAM"Quartus?II?64-Bit" //?VERSION"Version?13.0.1?Build?232?06/12/2013?Service?Pack?1?SJ?Full?Version" //?CREATED"Wed?Jun?15?23:50:45?2022" module?frequency_detect( reset_p, signal_in, clk_50M, dataout, en ); input?wirereset_p; input?wiresignal_in; input?wireclk_50M; output?wire[7:0]?dataout; output?wire[7:0]?en; wireSYNTHESIZED_WIRE_9; wireSYNTHESIZED_WIRE_10; wire[31:0]?SYNTHESIZED_WIRE_4; wire[31:0]?SYNTHESIZED_WIRE_7; wire[31:0]?SYNTHESIZED_WIRE_8; count_calb2v_inst( .clk_in(SYNTHESIZED_WIRE_9), .signal_in(signal_in), .doors_open(SYNTHESIZED_WIRE_10), .CNT1_buf(SYNTHESIZED_WIRE_7), .CNT2_buf(SYNTHESIZED_WIRE_8)); div_doorsb2v_inst1( .clk_in(SYNTHESIZED_WIRE_9), .reset_p(reset_p), .signal_in(signal_in), .doors_open(SYNTHESIZED_WIRE_10)); defparamb2v_inst1.count_1s?=?32'b00000000000000000110000110101000; displayb2v_inst2( .clk(SYNTHESIZED_WIRE_9), .display_frequency(SYNTHESIZED_WIRE_4), .dataout(dataout), .en(en)); latch_bufb2v_inst3( .clk_in(SYNTHESIZED_WIRE_9), .doors_open(SYNTHESIZED_WIRE_10), .CNT1_buf(SYNTHESIZED_WIRE_7), .CNT2_buf(SYNTHESIZED_WIRE_8), .total_frequency(SYNTHESIZED_WIRE_4)); clk_divb2v_inst4( .clk_50M(clk_50M), .clk_50K(SYNTHESIZED_WIRE_9)); endmodule
點擊鏈接獲取代碼文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=411