verilog - 即使条件成立,我的代码也不会进入下一个状态

标签 verilog system-verilog hardware fpga hdl

我必须在 7 段 LED 上显示一条消息和一个计时器。因此,我通过使用多路复用器来管理此操作,并在一种状态下显示消息“Hi”,然后一段时间后,当计数器达到 7500 时,它应该停止显示“Hi”并开始显示计时器。

问题是它只显示“Hi”并且不会从那里向前移动。

localparam [1:0]
                    idle = 2'b00,
                    starting = 2'b01,
                    time_it = 2'b10,
                    done = 2'b11;

reg state_reg, state_next;
reg [12:0] count_reg, count_next; //**change for simulation

always @ (posedge clock or posedge reset)
begin
    if(reset)
        begin 
            state_reg <= idle;
            count_reg <= 0;
        end
    else
        begin
            state_reg <= state_next;
            count_reg <= count_next;
        end
end
always @ (*)
begin
state_next = state_reg; //default state stays the same
count_next = count_reg;

case(state_reg)
    idle:
        begin
            //DISPLAY HI HERE
            sel = 2'b00;
            if(start)
            begin
                count_next = random; //get the random number from LFSR module
                state_next = starting;
            end
        end
    starting:
        begin
            if(count_next == 7500) 
            begin                           //and starting from 'rand' ensures a random delay
                outled = 1'b1; //turn on the led 
                state_next = time_it; //go to next state
            end

            else
                count_next = count_reg + 1; 
        end     
    time_it:
        begin
                sel = 2'b01; //start the timer
                state_next = done;                  
        end

    done:
        begin
            if(stop)
                begin
                    sel = 2'b10; //stop the timer
                    outled = 1'b0;
                end
        end

    endcase

case(sel)
    2'b00: //hi
    begin
        go_start = 0; //make sure timer module is off
        regd0 = 4'd12; 
        regd1 = 4'd10;
        regd2 = 4'd11;
        regd3 = 4'd12;
    end

    2'b01: //timer
    begin

        go_start = 1'b1; //enable start signal to start timer
        regd0 = reg_d0; //get values from stopwatch module
        regd1 = reg_d1; //get values from stopwatch module
        regd2 = reg_d2; //get values from stopwatch module
        regd3 = reg_d3; //get values from stopwatch module
    end

    2'b10: //stop timer
    begin
        go_start = 1'b0;
    end

    default:
    begin
        regd0 = 4'bx;
        regd1 = 4'bx;
        regd2 = 4'bx;
        regd3 = 4'bx;
    end
endcase         
end

现在在模拟中,case 保持在 00 并且不会改变,即使它被告知在 time_it 状态下这样做。由于 sel 不会改变,因此 go_start 未启用,这就是计时器从未打开的原因。为什么它保留在 sel=00 中?

最佳答案

将状态寄存器从 1 位宽更改为 2 位宽:

reg [1:0] state_reg, state_next;

关于verilog - 即使条件成立,我的代码也不会进入下一个状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15149202/

相关文章:

properties - 我可以在一个循环中生成多个 SystemVerilog 属性吗?

verilog - ALU NOOP 案例推断出一个锁存器 0x​​104567911

constraints - 为什么这个约束在不同的模拟器上表现不同?

verilog - 综合 Verilog 代码时如何消除敏感列表警告?

verilog - 无法理解 D 触发器代码中的错误

algorithm - 通过 bit twiddling 在循环调度中找到下一个

floating-point - 前导零计数器

embedded - 使用高级语言开始硬件编程有哪些好的选择?

performance - 编译性能的硬件环境

debugging - 可以从操作系统中禁用/配置英特尔 PT(处理器跟踪)吗?