要求:1.未按建則所有led全黑;
2.按k1按鈕,則用前8個led燈二進位制顯示25;
3.按k2按鈕,則12只led合併顯示流水燈效果,3個led點亮並向右流水。
注:是hr-240b fpga 創新實驗系統,其核心板的核心晶元為 epm240t100c5n 。
分析:led是共陰極,所以點亮led需要高電平;
有兩個按鍵k1和k2,所以需要按鍵消抖;
按下k1,用前8個led顯示二進位制25,也就是00011001;
按下k2,用12個led燈,3個led燈點亮,向右流水,也就是迴圈右移。
系統時鐘是50mhz,
整個程式,除了按鍵消抖有點需要思考,其他還是很簡單實現的。
系統時鐘50mhz,也就是週期為20ns,按鍵抖動時間一般為15ms,如下圖(按鍵未按下時為高電平,按下後為低電平):
但是,在按鍵按下或者釋放的時候都會出現乙個不穩定的抖動時間,如果不處理好這個抖動時間,我們就無法正確採集到正確有效的按鍵值,所以我們的設計中必須有效消除按鍵抖動。
消除按鍵抖動的原理是檢測到按鍵值變化後,不能立即取樣,而是需要計數15ms之後取樣按鍵值。
根據上述分析,給出verilog設計**:
單個按鍵消抖模組:
module one_key (
input clk, // clock
input rst_n, // asynchronous reset active low
input key_in1,
output reg key_out1 );
reg [19 : 0] count;
reg key_in1_r;
reg key_in1_rr;
//對按鍵值進行兩拍寄存,為了後面檢測按鍵變化
always @(posedge clk or negedge rst_n) begin
if(~rst_n) begin
key_in1_r <= 1;
key_in1_rr <= 1;
end
else begin
key_in1_r <= key_in1 ;
key_in1_rr <= key_in1_r;
endend
wire edge_l, edge_h;
assign edge_h = ~key_in1_rr & key_in1_r; //上公升沿檢測
assign edge_l = ~key_in1_r & key_in1_rr; //下降沿檢測
//按鍵值變化後,edge_en有效
wire edge_en;
assign edge_en = edge_l | edge_h;
reg [19 : 0] cnt;
always @(posedge clk or negedge rst_n) begin
if(~rst_n) begin
cnt <= 0;
end
else if(edge_en) begin
cnt <= 0;
endelse begin
cnt <= cnt + 1;
endend
always @(posedge clk or negedge rst_n) begin
if(~rst_n) begin
key_out1 <= 1;
end
else if(cnt == 20'd7000_000) begin
key_out1 <= key_in1;
endelse ;
end
endmodule
在下面模組中例化按鍵消抖模組:
module key_ctrl_led (
input clk, // clock
input rst_n, // asynchronous reset active low
input [1 : 0] key_in, //key_in[0] represents k1, key_in[1] represents k2;
output [11 : 0] led //led[0] represents first led,... );
wire [1 : 0] key_out;
one_key inst_one_key1 (.clk(clk), .rst_n(rst_n), .key_in1(key_in[0]), .key_out1(key_out[0]));
one_key inst_one_key2 (.clk(clk), .rst_n(rst_n), .key_in1(key_in[1]), .key_out1(key_out[1]));
reg [1 : 0] mode;
reg [11 : 0] led_reg;
always @(posedge clk or negedge rst_n) begin
if(~rst_n) begin
mode <= 0;
end
else if(~key_out[0]) begin
mode <= 2'b01;
endelse if(~key_out[1]) begin
mode <= 2'b10;
led_reg <= 12'b1110_0000_0000;
endelse ;
endalways @(posedge clk or negedge rst_n) begin
if(~rst_n) begin
led_reg <= 0;
end
else if(mode == 2'b01) begin
led_reg <= 12'b0000_10011000; //(前8個燈顯示25,也即00011001,led燈的約束按照大對大,小對小)
endelse if(mode == 2'b10) begin
led_reg <= ;
endend
assign led = led_reg;
endmodule
思路是這樣子的,很簡單,但是由於時間原因還未上板子驗證,請自行驗證。
引腳約束按照高對高,低對低約束。
注意,這裡的復位採用的是低電平復位,如果你的板子是高電平復位,需要稍微修改下**。
藍橋杯 獨立按鍵控制LED燈及消抖
按鍵在閉合或斷開時,觸點會有抖動現象,大部分是通過軟體處理,也可用硬體處理。include unsigned char num 0 unsigned char flag 0 標記值 bit s7 0,s6 0,s5 0,s4 0 bit 的取值範圍為1 10 void delayms int ms ...
中斷 按鍵控制LED燈
xjp的資源 初始化函式 init.c 進行一些初始化 include s3c24xx.h led1,led2,led4對應gpf4 gpf5 gpf6 define gpf4 out 1 define gpf5 out 1 define gpf6 out 1 define gpf4 msk 3 d...
Mixly按鍵控制LED燈
include include rfid rfid 10,5 unsigned char rc size unsigned char blockaddr 選擇操作的塊位址0 63 unsigned char i,tmp unsigned char status unsigned char str m...