fpga简易流水灯

module led_fla(
    output [3:0] led_out,
    input clk,
    input rst_n,
    input key
);

parameter timer = 50_000_000;
reg [26:0] count;
reg [3:0] rled_out;
reg  flag ;

always @(negedge rst_n or negedge key) 
if(!rst_n)
    begin 
    flag <= 1'b1;
    end
else
   flag <= ~flag;

always @(posedge clk or negedge rst_n ) 
 if(!rst_n)
 begin
    count <= 27'b0;
//  if(flag) 
//  rled_out <= 4'b0001;//?????
//  else
    rled_out <= 4'b1000;
 end
else if(count == timer)
begin
    count <= 27'b0;
    if(flag)
    begin
    rled_out <= {rled_out[2:0],rled_out[3]};//使用移位操作
    end
    else
    begin
    rled_out <= {rled_out[0],rled_out[3:1]};//使用移位操作
    end
end
else 
    count <= count +1'b1;
assign led_out = rled_out;
endmodule

心得:
①了解时钟频率,一般需要定义clk,即系统的时钟频率,结合自己定义的计数器count变量,可以完成一个count计数器完成内,只有一个led亮起。
②对于会有按键调整流水灯的方向的问题,之前直接根据key直接读取它的电平信号。就是:按下去是低电平o,松开就是高电平1。所以会出现:按下不放是可以反向,松开就恢复原状态。
解决方法:使用脉冲,检测边沿信号,这与网上的那些记录电平值的原理类似(1-》0-》1 为一个状态你变化,key置0),根据下边沿,设置状态flag,利用flag进行流水灯方向的操作。
③使用移位操作,实现流水灯的效果,节约资源。一般的乘除操作都是用移位。还有case语句也可以实现。
④一般的输出信号的初值需要在处置信号里设置,若在always中设置时,会出现不显示效果的情况。

你可能感兴趣的:(verilog)