我正在尝试使用Pong P. Chu的书来学习Verilog。我有一个关于如何评估和实现Always Block的问题。作者代码中的样式使我感到困惑。

在此示例中,他用两个输出寄存器“y1”和“y2”对FSM进行编码。我很困惑的部分是在NEXT STATE LOGIC和OUTPUT LOGIC中始终处于阻塞状态,在begin语句和always@* y1和y0设置为0之后。似乎无论状态如何,y1和y0都将切换为0。时钟周期和信号变化。根据书中的状态图,reg y1在状态0或1时应等于1。

那么y1是否在每个时钟周期都切换为0,然后返回当前状态的值呢?我认为情况并非如此,我只是对如何评估区块感到困惑。有人可以解释代码的那部分在做什么吗。我迷路了。谢谢

module fsm_eg_2_seg
    (
     input wire clk, reset, a, b,
     output reg y0, y1
    );

    //STATE DECLARATION
    localparam [1:0]    s0 =2'b00,
                    s1=2'b01,
                    s2=2'b10;

    // SIGNAL DECLARATION
    reg [1:0] state_reg, state_next ;

    //STATE REGISTER
    always @(posedge clk, posedge reset)
        if (reset)
            state_reg <= s0;
        else
            state_reg <= state_next;

    //NEXT STATE LOGIC AND OUTPUT LOGIC
    always @*
    begin
        state_next = state_reg; // default next state: the same
        y1 = 1'b0;              // default output:  0
        y0 = 1'b0;              // default output:  0
        case (state_reg)
            s0:  begin
                y1 = 1'b1;
                if (a)
                    if(b)
                        begin
                            state_next = s2;
                            y0 = 1'b1;
                        end
                    else
                        state_next = s1;
                end
            s1:  begin
                    y1 = 1'b1;
                    if (a)
                        state_next = s0;
                    end
            s2: state_next = s0;
            default: state_next = s0;
        endcase
    end
endmodule

最佳答案

表达方式

always @* begin : name_of_my_combinational_logic_block
    // code
end

描述组合逻辑。通常,不会从这种类型的Always块内部读取clk和rst信号,因此它们不会像wisemonkey所说的那样出现在灵敏度列表中。最佳实践是将@ *用于组合逻辑的敏感度列表,这样您就不会忘记包含一个信号,该信号会推断出一些内存,并且不再是组合逻辑。

在组合逻辑块内部,应使用称为的块分配。在大多数编程语言中,它们看起来像常规变量分配,并且使用单个等于。您为组合逻辑块内的变量(reg)分配的值相对于同一组合逻辑块中的其他语句和表达式立即 ,但在到达组合逻辑块之前不会传播到该组合逻辑块之外结尾。在块外看不到任何更改之前,always块必须到达末尾。 Paul S是对的,您希望始终在执行always块时始终将某些内容分配给变量,否则您将推断内存。

关于始终使用verilog,开始和结束评估,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8865877/

10-12 19:08