【发布时间】:2012-01-14 22:29:25
【问题描述】:
我正在尝试使用 Pong P. Chu 的书来学习 Verilog。我有一个关于如何评估和实施 always 块的问题。作者代码中的一种风格让我感到困惑。
在这个例子中,他用两个输出寄存器“y1”和“y2”编写了一个 FSM。我感到困惑的部分是 NEXT STATE LOGIC AND 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
【问题讨论】:
标签: verilog