我是Verilog的新手。当我尝试为有限状态机编写代码时。我明白了:
这是我的代码:
module controller1(x, clk, s, v);
input x;
input clk;
output s;
output v;
reg [2:0] state;
reg s;
reg v;
always @ (negedge clk or x) begin
case (state)
3'b0 : begin
state <= x ? 3'b1 : 3'b10;
s = x ? 0 : 1;
v = 0;
end
3'b10 : begin
state <= x ? 3'b11 : 3'b101;
s = x ? 0 : 1;
v = 0;
end
3'b1 : begin
state <= 3'b11;
s = x ? 1 : 0;
v = 0;
end
3'b101 : begin
state <= 3'b100;
s = x ? 1 : 0;
v = 0;
end
3'b11 : begin
state <= x ? 3'b111 : 3'b100;
s = x ? 0 : 1;
v = 0;
end
3'b100 : begin
state <= 3'b0;
s = x ? 1 : 0;
v = 0;
end
3'b111 : begin
state <= 3'b0;
s = x ? 0 : 1;
v = x ? 1 : 0;
end
endcase
end
endmodule
问题是:
顺序电路
- 一个1位输入(X)
- 时钟输入(CLK)
- 两个1位输出(S和V)
醇>X表示4位二进制数N. 4位数将一次输入一位数,并从最低有效位(LSB)开始。
S表示等于N + 3的4位二进制数.S的LSB将首先输出
当第四位输入发生时,如果N + 3太大而不是V = 1 以4位表示;否则,V = 0.
接收到X的第四位后,电路始终复位。假设顺序电路用以下实现 州表。
输出为(S,V)。所有状态变化都发生在时钟脉冲的下降沿。
如果我的代码有问题需要获得所需的结果,请指出。谢谢!
答案 0 :(得分:2)
基本上每个总是用块来描述一组触发器,一组锁存器或一组组合电路。
在你的代码中,你使用'negedge clock'和'x'来混合边缘和水平灵敏度。如果您的FSM仅对时钟的下降沿敏感,则从始终阻止的灵敏度列表中删除“x”。
水平和边缘的混合敏感列表不可合成,因为触发器不能同时被边缘触发和电平触发。 检查此链接: Synthesis of `always` blocks