按键控制流水灯
module johnsoncont(clk,rst_n,led,sw1_n,sw2_n,sw3_n); input clk; //时钟信号--20MHZ
input rst_n; //复位信号--低电平有效 output [3:0]led; //led 0--灭 1--亮 input sw1_n,sw2_n,sw3_n;
end else begin
if(led_ctrl[0])led_dir=~led_dir ; if(led_ctrl[1]) led_on=~led_on;//如果此位按键按下则 发光二级管取反
end endmodule
神秘地址 yaMrp6xEGO5c
if(!rst_n) cont<= 20'd0;
else cont<=cont+1'b1;//利用计数寄存器加1 延时
reg[3:0] led_r; always@(posedge clk or negedge rst_n)
if(!rst_n) led_r <= 4'b0001;
else if (cont==24'hffffff && led_on) begin if(led_dir) led_r<= {led[2:0],led[3]};//左循环移位 else led_r<= {led[0],led[3:0];
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; always@(posedge clk or negedge rst_n)
reg led_on;// 定义寄存器类型变量 此变量只能在always语句中赋值 1--on 0--off reg led_dir;//定义流水灯方向寄存器变量 1--left 0--right
reg[23:0] cont; always@(posedge clk or negedge rst_n)
if(!rst_n) low_sw_r <= 3'b111;
else low_sw_r <= low_sw;
wire [2:0] led_ctrl = low_sw_r[2:0]&(~low_sw[2:0]);
always@(posedge clk or negedge rst_n) if(!rst_n) begin led_dir=1'b0; led_on=1'b0;
if(!rst_n) key_rst_r <= 3'b111; else key_rst_r <=key_rst; //当寄存器key_rst由1变为0时,key_an的值变为高,维持一个时钟周期 wire [2:0] key_an; assign key_an = key_rst_r&(~key_rst);
单片机控制流水灯
//author:Richard.Kong date : 2012.5.30 PM 20MHZ 一个时钟周期为5ns //功能描述:流水灯开启键led_on 流水灯方向控制键led_dir 只有开启led_on才能控制流动方向 //thanks 特权同学 //learn FPGA together //爱尚FPGA
reg[19:0] cnt;//20位计数器 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将按键值锁存到寄存器low-sw中
low_sw <={sw3_n,sw2_n,sw1_n};
reg[2:0] low_sw_r; always@(posedge clk or negedge rst_n)