按键课程的作业:按键控制数码管0到9显示。开发板上的数码管是共阴的,可能与大家的不同。另外复位脚连接的是开发板最上方的一个拨码开关。
这是实验现象:http://v.youku.com/v_show/id_XNzI0OTkxNTA4.html
/**************************************************************************
*Engineer: superdian*Create Date: 2014/6/11
*Design Name: KEYXIAO
*Module Name: KEYXIAO
*Project Name: KEYXIAO
*Target Devices: EP3CE5E144C8
*Tool versions:
*Description: 按键控制数码管显示0到9.
******************************************************************************/
module KEYXIAO(sys_clk,sys_rstn,key_in,OUT);
input sys_clk;//时钟输入
input sys_rstn;//复位清零
input key_in;//按键输入
output [7:0] OUT;//数码管译码结果,并输出。
reg [19:0] delay_cnt;
reg [7:0] OUT;
reg [3:0] led_out;
wire key_scan;
wire key_low;
reg key_samp;
reg key_samp_r;
reg key_rst;
reg key_rst_r;
always@(posedge sys_clk,negedge sys_rstn)
begin
if(!sys_rstn)
key_samp<=1'b1;
else
key_samp<=key_in;
end
always@(posedge sys_clk,negedge sys_rstn)
begin
if(!sys_rstn)
key_samp_r<=1'b1;
else
key_samp_r<=key_samp;
end
assign key_scan=key_samp_r&(~key_samp);
always@(posedge sys_clk,negedge sys_rstn)
begin
if(!sys_rstn)
delay_cnt<=20'h0;
else if (key_scan)
delay_cnt<=20'h0;
else
delay_cnt<=delay_cnt+1'b1;
end
always@(posedge sys_clk,negedge sys_rstn)
begin
if(!sys_rstn)
key_rst<=1'b1;
else if(delay_cnt==20'hfffff)
key_rst<=key_in;
end
always@(posedge sys_clk or negedge sys_rstn)
begin
if(!sys_rstn)
key_rst_r<=1'b1;
else
key_rst_r<=key_rst;
end
assign key_low=key_rst_r&(~key_rst);
always@(posedge sys_clk or negedge sys_rstn) //按键按下
begin
if(!sys_rstn)
led_out<=4'b0000;
else if(key_low)
led_out<=led_out+1'b1; //按键按下次数记录
else if(led_out==4'b1010)//记录到10清零
led_out<=4'b0000;
else
led_out<=led_out;
end
always@(posedge sys_clk or negedge sys_rstn)//数码管译码,开发板上的数码管为共阴极,段码与讲师的有差异。
begin
case(led_out)
4'h0 : OUT= 8'h3F; // "0"
4'h1 : OUT = 8'h06; // "1"
4'h2 : OUT= 8'h5B; // "2"
4'h3 : OUT = 8'h4F; // "3"
4'h4 : OUT = 8'h66; // "4"
4'h5 : OUT = 8'h6D; // "5"
4'h6 : OUT = 8'h7D; // "6"
4'h7 : OUT= 8'h07; // "7"
4'h8 : OUT = 8'h7F; // "8"
4'h9 : OUT = 8'h6F; // "9"
4'ha : OUT = 8'h77; // "a"
4'hb : OUT = 8'h7C; // "b"
4'hc : OUT = 8'h39; // "c"
4'hd : OUT = 8'h5E; // "d"
4'he : OUT = 8'h79; // "e"
4'hf : OUT = 8'h71; // "f"
endcase
end
endmodule