名稱:Quartus簡(jiǎn)易等精度頻率計(jì)設(shè)計(jì)verilog代碼
軟件:Quartus
語言:Verilog
代碼功能:
簡(jiǎn)易等精度頻率計(jì)設(shè)計(jì)
二)要求
被測(cè)信號(hào):TTL方波;
A.頻率測(cè)量范圍:100HZ~MHz;
B.測(cè)試誤差:≤0.1%(全量程);
C.時(shí)鐘頻率:50kI1z;
D.預(yù)閘門時(shí)間:0.1s;
E.系統(tǒng)時(shí)鐘頻率:50MHz;
F.頻率計(jì)算:保留1位小數(shù);
G.頂層設(shè)計(jì)采用圖形輸入,各模塊可以用功能模塊或HDL語言等設(shè)計(jì)。
評(píng)價(jià)標(biāo)準(zhǔn)
(一)提交設(shè)計(jì)過程和實(shí)驗(yàn)仿真等照片及大作業(yè)報(bào)告的電子文檔,正文不得少于3000字符,網(wǎng)絡(luò)復(fù)制率需小于40%,報(bào)告中的圖片需清晰無水印
(二)細(xì)則。
1、頻率測(cè)量誤差分析(10%);
2、分潁電路設(shè)計(jì)(10%);
3、閘門電路設(shè)計(jì)(10%);
4、計(jì)數(shù)電路設(shè)計(jì)(10%);
5、計(jì)算電路設(shè)計(jì)(10%);
6、仿真等驗(yàn)證(30%);
7、格式規(guī)范等(20%)。
FPGA代碼Verilog/VHDL代碼資源下載:www.hdlcode.com
演示視頻:
設(shè)計(jì)文檔:
等精度頻率計(jì)結(jié)題報(bào)告
1.?設(shè)計(jì)要求
本設(shè)計(jì)為等精度頻率計(jì),頻率計(jì)指標(biāo)要求如下:
1.頻率測(cè)量范圍:100Hz~1MHz;
2.被測(cè)信號(hào)為TTL方波;
3.測(cè)試誤差:小于等于0.1%(全量程);
4.時(shí)鐘頻率:50KHz;
5.預(yù)閘門時(shí)間:0.1s;
6.系統(tǒng)時(shí)鐘頻率:50MHz;
7.頻率計(jì)算:保留1位小數(shù);
2.?設(shè)計(jì)原理
等精度測(cè)頻方法是在直接測(cè)頻方法的基礎(chǔ)上發(fā)展起來的。它的閘門時(shí)間不是固定的值,而是被測(cè)信號(hào)周期的整數(shù)倍,即與被測(cè)信號(hào)同步,因此,避除了對(duì)被測(cè)信號(hào)計(jì)數(shù)所產(chǎn)生的1個(gè)時(shí)鐘誤差,并且達(dá)到了在整個(gè)測(cè)試頻段的等精度測(cè)量。等精度測(cè)量的核心思想在于如何保證在實(shí)際測(cè)量門閘內(nèi)被測(cè)信號(hào)為整數(shù)個(gè)周期,這就需要在設(shè)計(jì)中讓實(shí)際測(cè)量門閘信號(hào)與被測(cè)信號(hào)建立一定的關(guān)系。基于這種思想,設(shè)計(jì)中以被測(cè)信號(hào)的上升沿作為開啟門閘和關(guān)閉門閘的驅(qū)動(dòng)信號(hào),只有在被測(cè)信號(hào)的上升沿才將圖1中預(yù)置的“閘門”的狀態(tài)鎖存,因此在“實(shí)際閘門”內(nèi)被測(cè)信號(hào)的個(gè)數(shù)就能保證整數(shù)個(gè)周期,這樣就避免普通測(cè)量方法中被測(cè)信號(hào)的±1的誤差,但會(huì)產(chǎn)生高頻的標(biāo)準(zhǔn)頻率信號(hào)的±1周期誤差,由于標(biāo)準(zhǔn)頻率的頻率遠(yuǎn)高于被測(cè)信號(hào),因此它產(chǎn)生的±1周期誤差對(duì)測(cè)量精度的影響十分有限,特別是在中低頻測(cè)量的時(shí)候,相較于傳統(tǒng)的頻率測(cè)量和周期測(cè)量方法,可以大大提高測(cè)量精度。
其測(cè)頻原理如圖2.1所示。在測(cè)量過程中,有兩個(gè)計(jì)數(shù)器分別對(duì)標(biāo)準(zhǔn)信號(hào)和被測(cè)信號(hào)同時(shí)計(jì)數(shù)。首先給出閘門開啟信號(hào)(預(yù)置閘門上升沿),此時(shí)計(jì)數(shù)器并不開始計(jì)數(shù),而是等到被測(cè)信號(hào)的上升沿到來時(shí),計(jì)數(shù)器才真正開始計(jì)數(shù)。然后預(yù)置閘門關(guān)閉信號(hào),下降沿到時(shí),計(jì)數(shù)器并不立即停止計(jì)數(shù),而是等到被測(cè)信號(hào)的上升沿到來時(shí)才結(jié)束計(jì)數(shù),完成一次測(cè)量過程。可以看出,實(shí)際閘門時(shí)間t與預(yù)置閘門時(shí)間t1并不嚴(yán)格相等,但差值不超過被測(cè)信號(hào)的一個(gè)周期。
3.?測(cè)量誤差分析
等精度測(cè)頻的實(shí)現(xiàn)方法可簡(jiǎn)化為圖2.2所示。CNT1和CNT2是兩個(gè)可控計(jì)數(shù)器,標(biāo)準(zhǔn)頻率信號(hào)從CNT1的時(shí)鐘輸入端CLK輸入;經(jīng)整形后的被測(cè)信號(hào)從CNT2的時(shí)鐘輸入端CLK輸入。當(dāng)預(yù)置門控信號(hào)為高電平時(shí),經(jīng)整形后的被測(cè)信號(hào)的上升沿通過D觸發(fā)器的Q端同時(shí)啟動(dòng)CNT1和CNT2。CNT1、CNT2同時(shí)對(duì)標(biāo)準(zhǔn)頻率信號(hào)和經(jīng)整形后的被測(cè)信號(hào)進(jìn)行計(jì)數(shù),分別為Ns與Nx。當(dāng)預(yù)置門信號(hào)為低電平的時(shí)候,后而來的被測(cè)信號(hào)的上升沿將使兩個(gè)計(jì)數(shù)器同時(shí)關(guān)閉,所測(cè)得的頻率為(Fs/Ns)*NX。則等精度測(cè)量方法測(cè)量精度與預(yù)置門寬度的標(biāo)準(zhǔn)頻率有關(guān),與被測(cè)信號(hào)的頻率無關(guān)。在預(yù)置門時(shí)間和常規(guī)測(cè)頻閘門時(shí)間相同而被測(cè)信號(hào)頻率不同的情況下,等精度測(cè)量法的測(cè)量精度不變。
首先,被測(cè)信號(hào)頻率fx的相對(duì)誤差與被測(cè)信號(hào)的頻率無關(guān);其次,增大測(cè)量時(shí)間段“軟件閘門”或提高標(biāo)準(zhǔn)頻率,可以減小相對(duì)誤差,提高測(cè)量精度;最后,由于一般提供標(biāo)準(zhǔn)頻率的石英晶振穩(wěn)定性很高,所以標(biāo)準(zhǔn)信號(hào)的相對(duì)誤差很小,可忽略。假設(shè)標(biāo)準(zhǔn)信號(hào)的頻率為50 KHz,只要實(shí)際閘門時(shí)間大于或等于0.1s,就可使測(cè)量的精度達(dá)到1/5 KHz。
4.?工作原理
根據(jù)上述設(shè)計(jì)思想,對(duì)等精度頻率計(jì)進(jìn)行具體設(shè)計(jì),整體設(shè)計(jì)框圖如下圖所示。
整體設(shè)計(jì)電路圖
包括分頻電路模塊(clk_div),閘門電路模塊(div_doors),計(jì)數(shù)電路模塊(count_cal),運(yùn)算電路模塊(latch_buf),數(shù)碼管顯示模塊(display)等,分頻電路將時(shí)鐘50M分頻為50KHz作為標(biāo)準(zhǔn)時(shí)鐘控制其他模塊,閘門電路實(shí)現(xiàn)0.1s的閘門信號(hào),計(jì)數(shù)電路按閘門時(shí)間分別采用標(biāo)準(zhǔn)時(shí)鐘和被測(cè)信號(hào)進(jìn)行計(jì)數(shù),并將計(jì)數(shù)結(jié)果輸入到運(yùn)算電路模塊,最終通過運(yùn)算電路的計(jì)算得到頻率結(jié)果,顯示模塊將最終的頻率結(jié)果顯示到數(shù)碼管上。
各個(gè)模塊具體功能介紹如下:
4.1 分頻電路設(shè)計(jì)
分頻模塊用于將系統(tǒng)時(shí)鐘50MHz分頻為50KHz,本設(shè)計(jì)將50KHz作為標(biāo)準(zhǔn)頻率信號(hào)。分頻方法為計(jì)數(shù)法,即50M除以50K等于1000,則分頻系數(shù)為1000.因此使用計(jì)數(shù)器對(duì)50MHz進(jìn)行計(jì)數(shù),當(dāng)計(jì)數(shù)到1000后回0。計(jì)數(shù)值前500輸出高電平,后500輸出低電平,最終得到的輸出信號(hào)就是50KHz。
分頻模塊框圖
4.2 閘門電路設(shè)計(jì)
閘門信號(hào)產(chǎn)生模塊用于產(chǎn)生周期為0.1s的閘門信號(hào),并將閘門信號(hào)同步于被測(cè)信號(hào),使閘門寬度為被測(cè)信號(hào)周期的整數(shù)倍。50KHz要得到0.1s的信號(hào)即10Hz,故分頻系數(shù)為50K/10=5000。也使用計(jì)數(shù)法產(chǎn)生,計(jì)數(shù)2500后信號(hào)翻轉(zhuǎn),得到的就是一共計(jì)數(shù)5000的周期信號(hào)。得到的閘門周期則為0.1s,其中高電平時(shí)間就是閘門開啟時(shí)間,為0.05秒。
閘門電路框圖
4.2 計(jì)數(shù)電路設(shè)計(jì)
計(jì)數(shù)模塊使用標(biāo)準(zhǔn)頻率和被測(cè)頻率分別對(duì)閘門進(jìn)行計(jì)數(shù),得到2個(gè)計(jì)數(shù)值。使用CNT1計(jì)數(shù)標(biāo)注頻率信號(hào),使用CNT2計(jì)數(shù)被測(cè)信號(hào),然后將兩個(gè)計(jì)數(shù)信號(hào)輸出。計(jì)數(shù)CNT1使用clk_in作為計(jì)數(shù)時(shí)鐘,當(dāng)door_1s為1時(shí)開始計(jì)數(shù),door_1s為0時(shí)計(jì)數(shù)清零。CNT2使用signal_in作為計(jì)數(shù)時(shí)鐘,當(dāng)door_1s為1時(shí)開始計(jì)數(shù),door_1s為0時(shí)計(jì)數(shù)清零。
計(jì)數(shù)電路框圖
4.2 計(jì)算電路設(shè)計(jì)
運(yùn)算鎖存模塊接收2個(gè)計(jì)數(shù)值,依據(jù)頻率計(jì)算公式計(jì)算被測(cè)信號(hào)的頻率。CNT1和CNT2得到后需要將數(shù)據(jù)鎖存,以便于進(jìn)行后續(xù)的頻率計(jì)算,鎖存信號(hào)為閘門信號(hào)的下降沿。閘門信號(hào)的下降沿獲取方法是先將doors_open信號(hào)在clk_in時(shí)鐘下打一拍得到door_1s_buf信號(hào),再將door_1s_buf與上doors_open的非。
鎖存后依據(jù):待測(cè)頻率=CNT2_buf*50000*10/CNT1_buf的計(jì)算公式進(jìn)行計(jì)算,得到的頻率值包含一位小數(shù)點(diǎn)。
運(yùn)算電路框圖
4.2 數(shù)碼管顯示電路設(shè)計(jì)
數(shù)碼管顯示模塊用于控制數(shù)碼管將被測(cè)頻率顯示出來。數(shù)碼管顯示使用動(dòng)態(tài)掃描的方式,依次顯示頻率的不同位。使用8段數(shù)碼管顯示,每個(gè)數(shù)碼管輸入為8位,對(duì)應(yīng)下圖中的abcdefg7段加上小數(shù)點(diǎn)dp,當(dāng)輸入0時(shí)對(duì)應(yīng)的段點(diǎn)亮,當(dāng)輸入為1時(shí),對(duì)應(yīng)的段滅。
根據(jù)上圖可以觀察到,若要顯示數(shù)字0,需要DP滅,G滅,ABCDEF亮,也就是對(duì)應(yīng)編碼為“11000000”,其中從左到右依次對(duì)應(yīng)DP-GFEDCBA。以此類推可以得到0~9的所有編碼。一共有8個(gè)數(shù)碼管,8個(gè)數(shù)碼管共用一組段選信號(hào)(seg_select),因此為了同時(shí)顯示8個(gè)數(shù)碼管,需要對(duì)8個(gè)數(shù)碼管依次切換,控制位選信號(hào)(bit_select)按順序循環(huán)選通,低電平時(shí)對(duì)應(yīng)數(shù)碼管點(diǎn)亮。
部分代碼展示:
//?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
點(diǎn)擊鏈接獲取代碼文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=411