- LED进阶
module LED
(
CLK_50M,RST_N,
LED1
);
input CLK_50M;
input RST_N;
output LED1;
reg [26:0] time_cnt;
reg [26:0] time_cnt_n;
reg led_reg;
reg led_reg_n;
parameter SET_TIME_1S=27'd50_000_000;
always @ (posedge CLK_50M or negedge RST_N)
begin
if (!RST_N)
time_cnt<= 27'h0;
else
time_cnt<= time_cnt_n;
end
always @(*)
begin
if (time_cnt==SET_TIME_1S)
time_cnt_n=27'h0;
else
time_cnt_n=time_cnt+27'h1;
end
always @ (posedge CLK_50M or negedge RST_N)
begin
if (!RST_N)
led_reg<= 1'h0;
else
led_reg<= led_reg_n;
end
always @(*)
begin
if (time_cnt==SET_TIME_1S)
led_reg_n=~led_reg;
else
led_reg_n=led_reg;
end
assign LED1=led_reg;
endmodule
- 按键进阶
module KEY
(
CLK_50M,RST_N,KEY,LED
);
input CLK_50M;
input RST_N;
input [7:0] KEY;
output [7:0] LED;
reg [20:0] time_cnt;
reg [20:0] time_cnt_n;
reg [7:0] KEY_in_r;//接收按键信号
reg [7:0] KEY_out;//消抖完成输出按键
reg [7:0] KEY_out_n;//KEY_out下一个状态
wire KEY_press; //检测按键没有变化
parameter SET_TIME_20MS=21'd1_000_000;
always @(posedge CLK_50M or negedge RST_N)
begin
if(!RST_N)
KEY_in_r<=8'h00;
else
KEY_in_r<=KEY; //接收键值
end
assign KEY_press=KEY_in_r^KEY; //检测是否有变化
//time_cnt赋值
always @(posedge CLK_50M or negedge RST_N)
begin
if(!RST_N)
time_cnt<=21'h0;
else
time_cnt<=time_cnt_n;
end
always@(*)
begin
if(time_cnt==SET_TIME_20MS||KEY_press)
time_cnt_n=21'h0;
else
time_cnt_n=time_cnt+1'b1;
end
always @(posedge CLK_50M or negedge RST_N)
begin
if(!RST_N)
KEY_out<=8'h00;
else
KEY_out<=KEY_out_n;
end
always@(*)
begin
if(time_cnt==SET_TIME_20MS)
KEY_out_n=KEY_in_r;
else
KEY_out_n=KEY_out;
end
assign LED=~KEY_out;
endmodule