0

我是 Verilog 的新手。当我尝试为有限状态机编写代码时。我得到:

  • [Synth 8-434] 不支持混合电平敏感和边沿触发事件控件进行合成

这是我的代码:

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. 一个 1 位输入 (X)
  2. 时钟输入 (CLK)
  3. 两个 1 位输出(S 和 V)

X 代表一个 4 位二进制数 N。4 位数字将每次输入一个数字,并从最低有效位 (LSB) 开始。

S代表一个等于N+3的4位二进制数,先输出S的LSB

当出现第 4 位输入时,如果 N + 3 太大而不能用 4 位表示,则 V = 1;否则,V = 0。

电路总是在收到 X 的第四位后复位。假设时序电路使用以下状态表实现。

输出为 (S,V)。所有状态变化都发生在时钟脉冲的下降沿。

如果我的代码无法获得所需的结果,请指出。谢谢!</p>

4

1 回答 1

2

基本上每个always块都描述了一组触发器、一组锁存器或一组组合电路。

在您的代码中,您通过使用“negedge clock”和“x”来混合边缘和电平灵敏度。如果您的 FSM 仅对时钟的下降沿敏感,则从始终阻止的敏感度列表中删除“x”。

电平和边沿的混合敏感列表是不可综合的,因为触发器不能同时边沿触发和电平触发。检查此链接: `always` 块的合成

于 2016-04-10T03:19:19.233 回答