|
FPGA初级实验 verilog let's start (流水灯实验)
module countpro(sys_clk,rst_n,led); //接口定义
input sys_clk,rst_n; //输入:系统时钟50MHz,复位输入
output [2:0] led; //输出:3个led产生流水现象,轮流点亮
reg [25:0] count; //系统时钟频率过高,需要计数的方式来产生延时,使led保持状态一段时间
reg [2:0] led; //led低电平点亮
reg [1:0] flag; //状态转换的入口,发生变化的时候,点亮另外一个led
always @(posedge sys_clk,negedge rst_n)
if(!rst_n) //复位,给寄存器赋初值
begin
flag <= 2'b0;
count <= 26'b0;
end
else //sys_clk上升沿到来
begin
if( count == 26'b11_1111_1111_1111_1111_1111_1110 )
begin
count <= 26'b0; //count归零,便于下次重新开始计数
if(flag == 2'b10) //当flag等于2’b10时,flag归零(实际上,当flag==2’b10时,要在下一次归零,即在flag==2’b11时,马上就变成2’b00,而并非当flag==2’b10时马上变为2’b00;)
flag <= 2'b00;
else //否则flag加一
flag <= flag+2'b01;
end
else
count <= count + 1; //当count没计数到指定值是,count执行加一操作
end
always @(posedge sys_clk)
begin
case(flag) //由于flag会不断变化,并且flag在从一个值变成另一个值的时候,会保持一段很长的时间,我们利用它来产生流水灯现象
2'b00: led <= 3'b011; //点亮第一个灯 低电平点亮
2'b01: led <= 3'b101; //点亮第一个灯 低电平点亮
2'b10: led <= 3'b110; //点亮第一个灯 低电平点亮
default:led <= 3'b111; //一般要设置一个缺省状态,三个led全部灭
endcase
end
endmodule |
|