Lattice MXO2: 計時控制

 行業(yè)動態(tài)     |      2023-11-15 09:46:31    |      作者

Warning: file_get_contents(https://www.eetree.cn/wiki/_media/%E8%AE%A1%E6%97%B6%E5%99%A8%E6%A1%86%E5%9B%BE.png?w=800&tok=0acdce): failed to open stream: HTTP request failed! HTTP/1.1 403 Forbidden in /var/www/html/www.edw.com.cn/www/rootapp/controllerssitemanage/ManagecmsController.php on line 2057

計時控制


在之前的實驗中我們掌握了如何進(jìn)行時鐘分頻、如何進(jìn)行數(shù)碼管顯示與按鍵消抖的處理,那么在本節(jié)實驗之中,我們將會實現(xiàn)一個籃球賽場上常見的24秒計時器。

硬件說明


在之前的實驗中我們?yōu)樽x者詳細(xì)介紹過小腳丫MXO2板卡上的按鍵、數(shù)碼管、LED等硬件外設(shè),在此不再贅述。本節(jié)將實現(xiàn)由數(shù)碼管作為顯示模塊,按鍵作為控制信號的輸入(包含復(fù)位信號和暫停信號),Lattice MXO2 4000HC作為控制核心的籃球讀秒系統(tǒng),實現(xiàn)框圖如下:

Verilog代碼


//******************************************************************** //>>>>>>>>>>>>>>>>>>>>>>>>>COPYRIGHTNOTICE<<<<<<<<<<<<<<<<<<<<<<<<< //******************************************************************** //Filename:counter.v //Modulename:counter //Author:STEP //Description: //Web: // //-------------------------------------------------------------------- //CodeRevisionHistory: //-------------------------------------------------------------------- //Version:|Mod.Date:|ChangesMade: //V1.0|2017/03/02|Initialver //-------------------------------------------------------------------- //ModuleFunction:24秒倒計時計數(shù)器 modulecounter( clk ,//時鐘 rst ,//復(fù)位 hold ,//啟動暫停按鍵 seg_led_1 ,//數(shù)碼管1 seg_led_2 ,//數(shù)碼管2 led//led); input clk,rst; input hold; output [8:0] seg_led_1,seg_led_2; output reg [7:0] led; wire clk1h;//1Hz時鐘 wire hold_pulse;//按鍵消抖后信號 reg hold_flag;//按鍵標(biāo)志位 reg back_to_zero_flag ;//計時完成信號 reg [6:0]seg [9:0]; reg [3:0] cnt_ge;//個位 reg [3:0] cnt_shi;//十位 initial begin seg[0]=7'h3f; //0 seg[1]=7'h06; //1 seg[2]=7'h5b; //2 seg[3]=7'h4f; //3 seg[4]=7'h66; //4 seg[5]=7'h6d; //5 seg[6]=7'h7d; //6 seg[7]=7'h07; //7 seg[8]=7'h7f; //8 seg[9]=7'h6f; //9/*若需要顯示A-F,解除此段注釋即可 seg[10]=7'hf7; //A seg[11]=7'h7c; //b seg[12]=7'h39;//C seg[13]=7'h5e;//d seg[14]=7'h79;//E seg[15]=7'h71;//F*/ end //啟動/暫停按鍵進(jìn)行消抖 debounceU2( .clk(clk), .rst(rst), .key(hold), .key_pulse(hold_pulse) ); //用于分出一個1Hz的頻率 divide#(.WIDTH(32),.N(12000000))U1( .clk(clk), .rst_n(rst), .clkout(clk1h) ); //按鍵動作標(biāo)志信號產(chǎn)生 always@(posedgehold_pulse) if(!rst==1) hold_flag<=0; else hold_flag<=~hold_flag; //計時完成標(biāo)志信號產(chǎn)生 always@(*) if(!rst==1) back_to_zero_flag<=0; elseif(cnt_shi==0&&cnt_ge==0) back_to_zero_flag<=1; else back_to_zero_flag<=0; //24秒倒計時控制 always@(posedgeclk1hornegedgerst)begin if(!rst==1)begin cnt_ge<=4'd4; cnt_shi<=4'd2; end elseif(hold_flag==1)begin cnt_ge<=cnt_ge; cnt_shi<=cnt_shi; end elseif(cnt_shi==0&&cnt_ge==0)begin cnt_shi<=cnt_shi; cnt_ge<=cnt_ge; end elseif(cnt_ge==0)begin cnt_ge<=4'd9; cnt_shi<=cnt_shi-1;end else cnt_ge<=cnt_ge-1; end //計時完成點亮led always@(back_to_zero_flag)begin if(back_to_zero_flag==1) led=8'b0; else led=8'b11111111; end assignseg_led_1[8:0]={2'b00,seg[cnt_ge]}; assignseg_led_2[8:0]={2'b00,seg[cnt_shi]}; endmodule

引腳分配


設(shè)置好復(fù)位鍵可消抖的按鍵,編譯完成后下載,通過按鍵就可以翻轉(zhuǎn)LED。你也可以定義多個按鍵控制多個LED,還可以比較不加按鍵消抖情況下實際的效果對比如何。

信號引腳
clkC1
rstL14
holdM13
segled1[0]C12
segled1[1]B14
segled1[2]J1
segled1[3]H1
segled1[4]H2
segled1[5]B12
segled1[6]A11
segled1[7]K1
segled1[8]A12
segled2[0]A10
segled2[1]C11
segled2[2]F2
segled2[3]E1
segled2[4]E2
segled2[5]A9
segled2[6]B9
segled2[7]F1
segled2[8]C9

小結(jié)


本實驗主要介紹了計時器的實現(xiàn)方式,并且包含了復(fù)位與暫停功能,讀者可自行修改程序內(nèi)部的時鐘參數(shù)來調(diào)節(jié)計時時間。下一節(jié)將介紹PWM調(diào)制技術(shù)的應(yīng)用呼吸燈。