Я пытаюсь изучить 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