第一课:分频 module clkdiv( clk,rst_n, clk_div ); input clk; //50MHz input rst_n; //低电平复位信号 output clk_div; //分频信号,连接到蜂鸣器 //--------------------------------------------------- reg[19:0] cnt; //分频计数器 always @ (posedge clk or negedge rst_n) //异步复位 if(!rst_n) cnt <= 20'd0; else cnt <= cnt+1'b1; //寄存器cnt 20ms 循环计数 //---------------------------------------------------- reg clk_div_r; //clk_div 信号值寄存器 always @ (posedge clk or negedge rst_n) if(!rst_n) clk_div_r <= 1'b0; else if(cnt == 20'hfffff) clk_div_r <= ~clk_div_r; //每20ms 让clk_div_r 值翻转一次 assign clk_div = clk_div_r; endmodule 第二课:按键 //说明:当三个独立按键的某一个被按下后,相应的LED被点亮; // 再次按下后,LED熄灭,按键控制LED亮灭 module sw_debounce( clk,rst_n, sw1_n,sw2_n,sw3_n, led_d1,led_d2,led_d3 ); input clk; //主时钟信号,50MHz input rst_n; //复位信号,低有效 input sw1_n,sw2_n,sw3_n; //三个独立按键,低表示按下 output led_d1,led_d2,led_d3; //发光二极管,分别由按键控制 //-------------------------------------------------------- reg[2:0] key_rst; always @(posedge clk or negedge rst_n) if (!rst_n) key_rst <= 3'b111; else key_rst <= {sw3_n,sw2_n,sw1_n}; reg[2:0] key_rst_r; //每个时钟周期的上升沿将low_sw信号锁存到low_sw_r中 always @ ( posedge clk or negedge rst_n ) if (!rst_n) key_rst_r <= 3'b111; else key_rst_r <= key_rst; //当寄存器key_rst由1变为0时,led_an的值变为高,维持一个时钟周期 wire[2:0] key_an = key_rst_r & ( ~key_rst); //----------------------------------------------------------------- reg[19:0] cnt; //计数寄存器 always @ (posedge clk or negedge rst_n) if (!rst_n) cnt <= 20'd0; //异步复位 else if(key_an) cnt <=20'd0; else cnt <= cnt + 1'b1; reg[2:0] low_sw; always @(posedge clk or negedge rst_n) if (!rst_n) low_sw <= 3'b111; else if (cnt == 20'hfffff) //满20ms,将按键值锁存...