verilog always, begin and end evaluation

Я пытаюсь изучить Verilog по книге Понга П. Чу. У меня есть вопрос о том, как оценивается и реализуется блок always. Один стиль в коде автора ставит меня в тупик.

В этом примере он кодирует FSM с двумя выходными регистрами 'y1' и 'y2'. Часть, которая меня смущает, находится в блоке NEXT STATE LOGIC AND OUTPUT LOGIC always, где после оператора begin и always@* y1 и y0 устанавливаются в 0. Мне кажется, что независимо от состояния, y1 и y0 будут переключаться в 0 при каждом тактовом цикле и изменении сигнала. Согласно диаграмме состояний в книге reg y1 должен быть равен 1, находясь в состоянии 0 или 1.

Значит, y1 переключается в 0 каждый тактовый цикл, а затем возвращается к своему значению в текущем состоянии? Я предполагаю, что это не так, и что я просто запутался в том, как оценивается блок. Кто-нибудь может объяснить, что делает эта часть кода. Я запутался. Thanks

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
5
задан aqua 14 January 2012 в 23:13
поделиться