总是

时间:2016-04-10 01:50:05

标签: verilog vivado

我是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.   
  3. 时钟输入(CLK)
  4.   
  5. 两个1位输出(S和V)
  6.         

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

         

    S表示等于N + 3的4位二进制数.S的LSB将首先输出

         

    当第四位输入发生时,如果N + 3太大而不是V = 1   以4位表示;否则,V = 0.

         接收到X的第四位后,

    电路始终复位。假设顺序电路用以下实现   州表。

         

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

如果我的代码有问题需要获得所需的结果,请指出。谢谢!

1 个答案:

答案 0 :(得分:2)

基本上每个总是用块来描述一组触发器,一组锁存器或一组组合电路。

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

水平和边缘的混合敏感列表不可合成,因为触发器不能同时被边缘触发和电平触发。 检查此链接: Synthesis of `always` blocks