Verilog实现流水灯(野火)- 移位问题

本文介绍了一种使用Verilog实现LED流水灯的时序设计方法。通过设置计数器并结合条件判断,实现了从4'b1110到4'b0111的循环左移。代码中包含三个always块,分别处理计数器更新、标志位更新和LED输出的更新。在测试平台tb_water_led.v中,使用时钟和复位信号对模块进行测试。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Verilog中的移位问题

时序图(野火)

在这里插入图片描述

代码

water_led.v文件

module  water_led
#(
    parameter   CNT_MAX = 28'd24_999
)
(
    input       wire            sys_clk     ,
    input       wire            sys_rst_n   ,
    
    output      reg     [3:0]   led_out
);

reg     [27:0]  cnt;
reg             cnt_flag;

always@(posedge sys_clk or negedge sys_rst_n)
    if(sys_rst_n == 1'b0)
        cnt <= 28'd0;
    else    if(cnt == CNT_MAX)
        cnt <= 28'd0;
    else
        cnt <= cnt + 28'd1;

always@(posedge sys_clk or negedge sys_rst_n)
    if(sys_rst_n == 1'b0)
        cnt_flag <= 1'b0;
    else    if(cnt == CNT_MAX - 1'd1)
        cnt_flag <= 1'b1;
    else
        cnt_flag <= 1'b0;


always@(posedge sys_clk or negedge sys_rst_n)
    if(sys_rst_n == 1'b0)
        led_out <= 4'b1110;
    else    if(led_out == 4'b0111 && cnt_flag == 1'b1)
        led_out <= 4'b1110;
    else    if(cnt_flag == 1'b1)
        led_out <= (led_out << 1) + 1'd1;
    else
        led_out <= led_out;
        
endmodule

实现 led_out 信号的变换,给低电平时,led点亮,假定实现4个流水灯

4‘b1110 -> 4‘b1101 -> 4‘b1011 -> 4‘b0111 

1.野火的实现方式 , 设置一个 led_out_reg 变量,让 led_out_reg 实现不带进位的左移

4‘b0001 -> 4‘b0010 -> 4‘b0100 -> 4‘b1000 

然后取反即可

assgin	led_out = ~led_out_reg; 

2.即上图的实现
在给定好初始 4‘b1110 和 4‘b0111之后,左移的时候直接 加1

 led_out <= (led_out << 1) + 1'd1;

3.直接取反,左移,再取反

led_out <= ~((~led_out)<<1)

下面这个还没理解

 led_out <= { led_out[2:0],led_out[3] }//循环左移就好了

tb_water_led.v文件

`timescale  1ns/1ns
module  tb_water_led();

//声明变量
reg     sys_clk;
reg     sys_rst_n;
wire    [3:0]   led_out;



//初始化
initial
    begin 
        sys_clk = 1'b0;
        sys_rst_n <= 1'b0;
        #20
        sys_rst_n <= 1'b1;
        
    end

//初始化系统时钟
always #10 sys_clk = ~sys_clk;


//实例化
water_led
#(
    .CNT_MAX    (28'd24)
)
water_led_inst
(
    .sys_clk    (sys_clk),
    .sys_rst_n  (sys_rst_n),

    .led_out    (led_out)
);

endmodule

vivado时序
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值