按键控制流水灯程序

/*按键控制流水灯程序*/
/*当奇数次按下K1[0]键时,左移显示,偶数次按下K1[0]键时右移显示,按下k1[1](复位键)时灯熄灭*/
module light(sys_clk,led,k1);
input sys_clk; /*sys_clk系统时钟20M*/
input [1:0] k1; /*k1为按键k1输入*/
output [7:0]led;
reg [8:0]led_out,led_out2;
reg [1:0] dout1,dout2,dout3;/*寄存器*/
reg [8:0]led_out1;
reg [20:0] count;
reg keyen; /*标志位*/
wire[1:0] key_done;/*按键消抖输出*/
parameter count_top=21'd2500000;
initial
begin
led_out2=9'b101111111;
led_out=9'b111111110;
end
assign key_done=(dout1|dout2|dout3);/*按键消抖输出*/
always @(posedge count[17])
begin
dout1<=k1;
dout2<=dout1;
dout3<=dout2;
end
always @(negedge key_done[0])
begin
keyen=~keyen;/*将按键开关转换为乒乓开关*/
end
always @(posedge sys_clk)
begin
count=count+1;
if(count==count_top)
begin
if(!key_done[1])/*检测是否按下复位键*/
led_out1=9'b111111111;
else if(!keyen)
begin
led_out1=led_out;
led_out=led_out<<1;
led_out=led_out+1;
if(led_out==9'b011111111)
led_out=9'b111111110;
led_out1=led_out;
end
else
begin
led_out1=led_out;
led_out2=led_out2>>1;
led_out2=led_out2+256;/*9'b100000000*/
if(led_out2==9'b111111111)
led_out2=9'b101111111;
led_out1=led_out2;
end
end
end
assign led=led_out1[7:0];
endmodule

相关文档
最新文档