Lattice MXO2: 計時控制
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://cqxgywz.com/article/202311/452858.htm計時控制
在之前的實驗中我們掌握了如何進行時鐘分頻、如何進行數碼管顯示與按鍵消抖的處理,那么在本節實驗之中,我們將會實現一個籃球賽場上常見的24秒計時器。
硬件說明
在之前的實驗中我們為讀者詳細介紹過小腳丫MXO2板卡上的按鍵、數碼管、LED等硬件外設,在此不再贅述。本節將實現由數碼管作為顯示模塊,按鍵作為控制信號的輸入(包含復位信號和暫停信號),Lattice MXO2 4000HC作為控制核心的籃球讀秒系統,實現框圖如下:

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秒倒計時計數器
module counter(
clk , //時鐘
rst , //復位
hold , //啟動暫停按鍵
seg_led_1 , //數碼管1
seg_led_2 , //數碼管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; //按鍵標志位
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
// 啟動/暫停按鍵進行消抖
debounce U2 (
.clk(clk),
.rst(rst),
.key(hold),
.key_pulse(hold_pulse)
);
// 用于分出一個1Hz的頻率
divide #(.WIDTH(32),.N(12000000)) U1 (
.clk(clk),
.rst_n(rst),
.clkout(clk1h)
);
//按鍵動作標志信號產生
always @ (posedge hold_pulse)
if(!rst==1)
hold_flag <= 0;
else
hold_flag <= ~hold_flag;
//計時完成標志信號產生
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秒倒計時控制
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
//計時完成點亮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引腳分配
設置好復位鍵可消抖的按鍵,編譯完成后下載,通過按鍵就可以翻轉LED。你也可以定義多個按鍵控制多個LED,還可以比較不加按鍵消抖情況下實際的效果對比如何。
| 信號 | 引腳 |
|---|---|
| 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 |
小結
本實驗主要介紹了計時器的實現方式,并且包含了復位與暫停功能,讀者可自行修改程序內部的時鐘參數來調節計時時間。下一節將介紹PWM調制技術的應用呼吸燈。













評論