9.FPGA_Verilog 流水呼吸灯

功能:使呼吸灯达到流水的效果
描述:定义一个3位计数器,计前8次“呼”和“吸”过程的次数
每一个“呼”和“吸”的过程组合为一组,通过每一组”呼吸”使led达到移位的效果。

代码:

module  liushui_breath_led(

input       wire                sclk            ,
input       wire                rst_n           ,

output      reg     [ 3:0]      led     

);

parameter   max_us  =           49              ;
parameter   max_ms  =           999             ;
parameter   max_s   =           999             ;

//cnt_us
reg         [ 5:0]              cnt_us          ;
always@(posedge sclk or negedge rst_n)
if(!rst_n)
    cnt_us          <=          0               ;
else if(cnt_us==max_us)
    cnt_us          <=          0               ;
else
    cnt_us          <=          cnt_us+1'b1     ;

//cnt_ms    
reg         [ 9:0]              cnt_ms          ;
always@(posedge sclk or negedge rst_n)
if(!rst_n)
    cnt_ms          <=          0               ;
else if(cnt_us==max_us&&cnt_ms==max_ms)
    cnt_ms          <=          0               ;
else if(cnt_us==max_us)
    cnt_ms          <=          cnt_ms+1'b1     ;

//cnt_s
reg         [ 9:0]              cnt_s           ;
always@(posedge sclk or negedge rst_n)
if(!rst_n)
    cnt_s           <=          0               ;
else if(cnt_us==max_us&&cnt_ms==max_ms&&cnt_s==max_s)
    cnt_s           <=          0               ;
else if(cnt_ms==max_ms&&cnt_us==max_us)
    cnt_s           <=          cnt_s+1'b1      ;

//flag
reg                             flag            ;
always@(posedge sclk or negedge rst_n)
if(!rst_n)
    flag            <=          0               ;
else if(cnt_us==max_us&&cnt_ms==max_ms&&cnt_s==max_s)
    flag            <=          ~flag          ;

//pwm   
reg                             pwm             ;
always@(posedge sclk or negedge rst_n)
if(!rst_n)
    pwm             <=          0               ;
else if(flag==0&&cnt_s>=cnt_ms)
    pwm             <=          1               ;
else if(flag==1&&cnt_s<=cnt_ms)
    pwm             <=          1               ;
else
    pwm             <=          0               ;

//cnt_8
reg         [3:0]               cnt_8           ;   
always@(posedge sclk or negedge rst_n)
if(!rst_n)
    cnt_8           <=          0               ;
else if(cnt_us==max_us&&cnt_ms==max_ms&&cnt_s==max_s&&cnt_8==11)
    cnt_8           <=          0               ;
else if(cnt_us==max_us&&cnt_ms==max_ms&&cnt_s==max_s)
    cnt_8           <=          cnt_8+1'b1      ;

//led
always@(posedge sclk or negedge rst_n)
if(!rst_n)
        led             <=          0                   ;
else if(cnt_8==0||cnt_8==1)
        led             <=      {1'b0,1'b0,1'b0,pwm}    ;
else if(cnt_8==2||cnt_8==3||cnt_8==10||cnt_8==11)
        led             <=      {1'b0,1'b0,pwm,1'b0}    ;
else if(cnt_8==4||cnt_8==5||cnt_8==8||cnt_8==9)
        led             <=      {1'b0,pwm,1'b0,1'b0}    ;
else if(cnt_8==6||cnt_8==7)
        led             <=      {pwm,1'b0,1'b0,1'b0}    ;

endmodule

仿真 :
9.FPGA_Verilog 流水呼吸灯_第1张图片

你可能感兴趣的:(9.FPGA_Verilog 流水呼吸灯)