Altera MAX10: 計時控制
計時控制
在之前的實驗中我們掌握了如何進行時鐘分頻、如何進行數碼管顯示與按鍵消抖的處理,那么在本節(jié)實驗之中,我們將會實現一個籃球賽場上常見的24秒計時器。
====硬件說明====
在之前的實驗中我們?yōu)樽x者詳細介紹過小腳丫MXO2板卡上的按鍵、數碼管、LED等硬件外設,在此不再贅述。本節(jié)將實現由數碼管作為顯示模塊,按鍵作為控制信號的輸入(包含復位信號和暫停信號),Altera MAX10作為控制核心的籃球讀秒系統(tǒng),實現框圖如下:
====Verilog代碼====
// ******************************************************************** // >>>>>>>>>>>>>>>>>>>>>>>>> COPYRIGHT NOTICE <<<<<<<<<<<<<<<<<<<<<<<<< // ******************************************************************** // File name : debounce.v // Module name : debounce // Author : STEP // Description : // // -------------------------------------------------------------------- // Code Revision History : // -------------------------------------------------------------------- // Version: |Mod. Date: |Changes Made: // V1.0 |2017/03/02 |Initial ver // -------------------------------------------------------------------- // Module Function:計時器 module segment_counter( clk , rst , hold , seg_led_1 , seg_led_2 ,); input clk,rst; input hold; output reg [8:0] seg_led_1,seg_led_2; reg clk_divided; reg hold_flag; reg back_to_zero_flag = 0; reg [6:0] seg [9:0]; reg [23:0] cnt; reg [3:0] cnt_ge; reg [3:0] cnt_shi; parameter PERIOD=6000000; //1秒 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 always @ (posedge clk) begin // 用于分出一個1Hz的頻率 if (!rst == 1) begin cnt <= 0; clk_divided <= 0; end else begin if (cnt < PERIOD-1) cnt <= cnt + 1; else begin cnt <= 0; clk_divided <= ~clk_divided; end end end always @ (*) begin if (!rst == 1) back_to_zero_flag <= 1; else if (((cnt_shi*10) + cnt_ge)==24) back_to_zero_flag <= 1; else back_to_zero_flag <= 0; end always @ (posedge hold) hold_flag <= ~hold_flag; always @ (posedge clk_divided or posedge back_to_zero_flag) begin if (back_to_zero_flag == 1) begin cnt_ge <= 0; cnt_shi <= 0; end else if (cnt_ge == 9) begin cnt_ge <= 0; cnt_shi <= cnt_shi + 1; end else if (hold_flag == 1) cnt_ge <= cnt_ge; else cnt_ge <= cnt_ge + 1; end always @ (cnt_ge) begin seg_led_1[8:0] <= {2'b00,seg[cnt_ge]}; end always @ (cnt_shi) begin seg_led_2[8:0] <= {2'b00,seg[cnt_shi]}; end endmodule
====引腳分配====
設置好復位鍵可消抖的按鍵,編譯完成后下載,通過按鍵就可以翻轉LED。你也可以定義多個按鍵控制多個LED,還可以比較不加按鍵消抖情況下實際的效果對比如何。
信號 | 引腳 |
---|---|
clk | J5 |
rst | J9 |
hold | K14 |
segled1[0] | E1 |
segled1[1] | D2 |
segled1[2] | K2 |
segled1[3] | J2 |
segled1[4] | G2 |
segled1[5] | F5 |
segled1[6] | G5 |
segled1[7] | L1 |
segled1[8] | E2 |
segled2[0] | A3 |
segled2[1] | A2 |
segled2[2] | P2 |
segled2[3] | P1 |
segled2[4] | N1 |
segled2[5] | C1 |
segled2[6] | C2 |
segled2[7] | R2 |
segled2[8] | B1 |
====小結====
本實驗主要介紹了計時器的實現方式,并且包含了復位與暫停功能,讀者可自行修改程序內部的時鐘參數來調節(jié)計時時間。下一節(jié)將介紹PWM調制技術的應用 呼吸燈。
評論