2016-04-10 88 views
0

我是Verilog的新手。當我嘗試編寫有限狀態機的代碼時。我得到: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表示一個4位二進制數等於N + 3。LSB S的將被輸出第一

當第四比特的輸入發生時,V = 1,如果N + 3是太大而 由4位表示;否則,V = 0.

在接收到X的第四位後,電路總是復位。假設時序電路採用以下 狀態表來實現。

輸出是(S,V)。所有狀態改變都發生在時鐘脈衝的下降沿。

如果我的代碼有問題以獲得所需的結果,請指出。謝謝!

+0

「reg v」聲明後(之前總是)沒有分號? – happydave

+0

@happydave哦,謝謝你指出這個錯誤!但總是存在錯誤。 Vivado表示「合成器不支持[Synth 8-434]混合電平敏感和邊緣觸發事件控制」我對寫入always @()語句的條件的理解有限 – Jiang

回答

2

基本上每個塊總是描述一組觸發器,一組鎖存器或一個組合電路塊。

在您的代碼中,您使用'negedge clock'和'x'混合了邊緣和水平靈敏度。如果你的FSM只對時鐘的下降沿敏感,那麼從總是阻止的靈敏度列表中刪除'x'。

水平和邊緣的混合敏感列表是不可綜合的,因爲觸發器不能同時邊緣觸發和電平觸發。 檢查這個鏈接: Synthesis of `always` blocks