Lattice MXO2: 計(jì)時(shí)控制
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
本文引用地址:http://cafeforensic.com/article/202311/452858.htm計(jì)時(shí)控制
在之前的實(shí)驗(yàn)中我們掌握了如何進(jìn)行時(shí)鐘分頻、如何進(jìn)行數(shù)碼管顯示與按鍵消抖的處理,那么在本節(jié)實(shí)驗(yàn)之中,我們將會(huì)實(shí)現(xiàn)一個(gè)籃球賽場(chǎng)上常見(jiàn)的24秒計(jì)時(shí)器。
硬件說(shuō)明
在之前的實(shí)驗(yàn)中我們?yōu)樽x者詳細(xì)介紹過(guò)小腳丫MXO2板卡上的按鍵、數(shù)碼管、LED等硬件外設(shè),在此不再贅述。本節(jié)將實(shí)現(xiàn)由數(shù)碼管作為顯示模塊,按鍵作為控制信號(hào)的輸入(包含復(fù)位信號(hào)和暫停信號(hào)),Lattice MXO2 4000HC作為控制核心的籃球讀秒系統(tǒng),實(shí)現(xiàn)框圖如下:
Verilog代碼
// ******************************************************************** // >>>>>>>>>>>>>>>>>>>>>>>>> COPYRIGHT NOTICE <<<<<<<<<<<<<<<<<<<<<<<<< // ******************************************************************** // File name : counter.v // Module name : counter // Author : STEP // Description : // Web : // // -------------------------------------------------------------------- // Code Revision History : // -------------------------------------------------------------------- // Version: |Mod. Date: |Changes Made: // V1.0 |2017/03/02 |Initial ver // -------------------------------------------------------------------- // Module Function:24秒倒計(jì)時(shí)計(jì)數(shù)器 module counter( clk , //時(shí)鐘 rst , //復(fù)位 hold , //啟動(dòng)暫停按鍵 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時(shí)鐘 wire hold_pulse; //按鍵消抖后信號(hào) reg hold_flag; //按鍵標(biāo)志位 reg back_to_zero_flag ; //計(jì)時(shí)完成信號(hào) reg [6:0] seg [9:0]; reg [3:0] cnt_ge; //個(gè)位 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 // 啟動(dòng)/暫停按鍵進(jìn)行消抖 debounce U2 ( .clk(clk), .rst(rst), .key(hold), .key_pulse(hold_pulse) ); // 用于分出一個(gè)1Hz的頻率 divide #(.WIDTH(32),.N(12000000)) U1 ( .clk(clk), .rst_n(rst), .clkout(clk1h) ); //按鍵動(dòng)作標(biāo)志信號(hào)產(chǎn)生 always @ (posedge hold_pulse) if(!rst==1) hold_flag <= 0; else hold_flag <= ~hold_flag; //計(jì)時(shí)完成標(biāo)志信號(hào)產(chǎn)生 always @ (*) if(!rst == 1) back_to_zero_flag <= 0; else if(cnt_shi==0 && cnt_ge==0) back_to_zero_flag <= 1; else back_to_zero_flag <= 0; //24秒倒計(jì)時(shí)控制 always @ (posedge clk1h or negedge rst) begin if (!rst == 1) begin cnt_ge <= 4'd4; cnt_shi <= 4'd2; end else if(hold_flag == 1)begin cnt_ge <= cnt_ge; cnt_shi <= cnt_shi; end else if(cnt_shi==0 && cnt_ge==0) begin cnt_shi <= cnt_shi; cnt_ge <= cnt_ge; end else if(cnt_ge==0)begin cnt_ge <= 4'd9; cnt_shi <= cnt_shi-1;end else cnt_ge <= cnt_ge -1; end //計(jì)時(shí)完成點(diǎn)亮led always @ ( back_to_zero_flag)begin if (back_to_zero_flag==1) led = 8'b0; else led = 8'b11111111; end assign seg_led_1[8:0] = {2'b00,seg[cnt_ge]}; assign seg_led_2[8:0] = {2'b00,seg[cnt_shi]}; endmodule
引腳分配
設(shè)置好復(fù)位鍵可消抖的按鍵,編譯完成后下載,通過(guò)按鍵就可以翻轉(zhuǎn)LED。你也可以定義多個(gè)按鍵控制多個(gè)LED,還可以比較不加按鍵消抖情況下實(shí)際的效果對(duì)比如何。
信號(hào) | 引腳 |
---|---|
clk | C1 |
rst | L14 |
hold | M13 |
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é)
本實(shí)驗(yàn)主要介紹了計(jì)時(shí)器的實(shí)現(xiàn)方式,并且包含了復(fù)位與暫停功能,讀者可自行修改程序內(nèi)部的時(shí)鐘參數(shù)來(lái)調(diào)節(jié)計(jì)時(shí)時(shí)間。下一節(jié)將介紹PWM調(diào)制技術(shù)的應(yīng)用呼吸燈。
評(píng)論