gpt4 book ai didi

verilog 始终、开始和结束评估

转载 作者:行者123 更新时间:2023-12-02 14:14:43 28 4
gpt4 key购买 nike

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

在此示例中,他编写了一个具有两个输出寄存器“y1”和“y2”的 FSM。我感到困惑的部分是在下一个状态逻辑和输出逻辑总是阻塞,在开始语句和always@*之后y1和y0被设置为0。我似乎无论状态如何, y1 和 y0 将在每个时钟周期和信号变化时切换为 0。根据书中的状态图,在状态0或1时,reg y1应该等于1。

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

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

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

在组合逻辑 block 内,您应该使用所谓的阻塞赋值。这些看起来像大多数编程语言中的常规变量赋值并使用单个等于。您分配给组合逻辑 block 内的变量(reg)的值对于同一组合逻辑 block 中的其他语句和表达式立即发生,但不会传播到该组合逻辑之外阻止直到到达终点。在 block 外部看到任何更改之前,always block 必须到达末尾。 Paul S 是对的,每当执行always block 时,您都希望始终为变量分配某些东西,否则您将推断内存。

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

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com