|
这是参照例程,自己写的代码!但发现很不稳定,尤其是按键的检测!
有时要按很久才能检测到按键,有时根本就检测不了!
module johncount(
clk,rst_n,
key,led);
input clk,rst_n;
input [2:0]key;
output [3:0]led;
reg [23:0]cnt;
always @(posedge clk or negedge rst_n)//计数
if(!rst_n) cnt <= 24'b0;
else cnt <= cnt +1'b1;
reg [2:0] key_low;
always @(posedge clk or negedge rst_n)//第一个时钟周期锁存一次key的值
if(!rst_n) key_low <= 3'b111;
else if(cnt == 24'hfffff)
key_low <= key;
reg [2:0] key_low_r;
always @(posedge clk or negedge rst_n)//第二个时钟周期锁存一次key的值
if(!rst_n) key_low_r <= 3'b111;
else key_low_r <= key_low;
wire [2:0] key_scan = key_low_r&(~key_low);//边缘检测哪个按键按下
reg start_move,led_right;
always @(posedge clk or negedge rst_n)
if(!rst_n)
begin
start_move <= 1'b1;
led_right <= 1'b1;
end
else if(key_scan[2]) start_move <= ~start_move ;
else if(key_scan[1]) led_right <= 1'b1;
else if(key_scan[0]) led_right <= 1'b0;
reg [3:0] led_vaul;
always @(posedge clk or negedge rst_n)
if(!rst_n) led_vaul <=4'b1110;
else if(cnt == 24'h1fffff && start_move)
case (led_right)
1'b1: led_vaul<={led_vaul[2:0],led_vaul[3]};
1'b0: led_vaul<={led_vaul[0],led_vaul[3:1]};
endcase
assign led = ~led_vaul;
endmodule |
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|