按键作业之控制数码管。视频稍后上传。
代码如下:
module key(clk,rst,key_in,disp_bit,disp_seg);
input clk;
input rst;
input key_in;
output disp_bit;
output disp_seg;
reg [7:0] disp_seg;
wire [7:0]disp_bit;
reg [3:0] key_count;
reg [19:0] delay_count;
reg key_high;
reg key_high_r;
wire key_high2low; // =0 表示下降沿 检测到下降沿说明按键已经按下 =1 表示高电平 说明按键未按下
reg key_low;
reg key_low_r;
wire key_low2high; // =1 表示上升沿 检测到上升沿说明按键已经释放 =0 表示低电平 说明按键未释放
always @ (posedge clk or negedge rst)
begin
if(!rst)
key_high <= 1'b1;
else
key_high <= key_in;
end
always @ (posedge clk or negedge rst)
begin
if(!rst)
key_high_r <= 1'b1;
else
key_high_r <= key_high;
end
assign key_high2low = key_high_r & (~key_high); // 1->0 key_high2low= 1&(~0)=1 1->1 key_high2low= 1&(~1)=0
always @ (posedge clk or negedge rst)
begin
if(!rst)
delay_count <= 20'h0;
else if(key_high2low) // 1->0
delay_count <= 20'h0;
else
delay_count <= delay_count + 1'b1;
end
always @ (posedge clk or negedge rst)
begin
if(!rst)
key_low <= 1'b1;
else if(delay_count <= 20'hffff) // 延时20ms到
key_low <= key_in;
end
always @ (posedge clk or negedge rst)
begin
if(!rst)
key_low_r <= 1'b1;
else
key_low_r <= key_low;
end
assign key_low2high = key_low_r & (~key_low);
always @ (posedge clk or negedge rst)
begin
if(!rst)
key_count <= 4'h0;
else if(key_low2high)
begin
if(key_count == 4'hf)
key_count <= 4'h0;
else
key_count <= key_count + 1'b1;
end
else
key_count <= key_count;
end
always @ (key_count)
begin
case (key_count)
4'h0: disp_seg = 8'hc0;
4'h1: disp_seg = 8'hf9;
4'h2: disp_seg = 8'ha4;
4'h3: disp_seg = 8'hb0;
4'h4: disp_seg = 8'h99;
4'h5: disp_seg = 8'h92;
4'h6: disp_seg = 8'h82;
4'h7: disp_seg = 8'hf8;
4'h8: disp_seg = 8'h80;
4'h9: disp_seg = 8'h90;
4'ha: disp_seg = 8'h88;
4'hb: disp_seg = 8'h83;
4'hc: disp_seg = 8'hc6;
4'hd: disp_seg = 8'ha1;
4'he: disp_seg = 8'h86;
4'hf: disp_seg = 8'h8e;
endcase
end
assign disp_bit = 8'b00000000;
endmodule