2013-03-26 48 views
2

我學習Verilog的失敗,我覺得有東西,我不能明白關於總是@ *始終(@posedge CLK,...)的Verilog總是@(posedge)在UART

這裏是一個一段代碼應該通過uart發送位。它在合成時失敗。 錯誤是 「邏輯與已知的FF或Latch模板不匹配,當前軟件版本不支持描述樣式來描述寄存器或鎖存器。」 (以及其他3個錯誤) 如果我總是通過@ *更改always @(...),則在下一步(「實現設計」)中事情失敗,因爲事情沒有連接。

在我的書中,他們實現了一個fsmd,其狀態爲always(posedge clk),而其他邏輯始終爲@ *,但我不明白爲什麼這不起作用。

在另一個論壇上,我讀到錯誤可能來自過於複雜的條件。但我也簡化了一些東西(不是在這裏編寫代碼,但基本上我刪除了case(狀態)和ifs以單行分配?:或二進制條件,但它也沒有工作)

我有在我寫的其他代碼片段中看到過這個錯誤,但是我沒有深入到底部,所以如果你能幫助我理解一般問題(用這個例子作爲對具體例子的支持),我會非常高興。 感謝 托馬斯

PS:使用im賽靈思Spartan 3E入門套件和Xilinx ISE 14.4

module UART_out #(parameter [3:0] NUM_BITS = 8) 
(
input wire baud_clk, 
input wire send_tick, 
input wire[NUM_BITS-1:0] data_in, 
output wire tx, 
output wire debug_done 
); 
localparam 
     IDLE = 0, 
     TRANSMIT = 1; 
reg[NUM_BITS:0] bits_to_send; 
reg state; 
reg out_bit; 
reg[4:0] cnt; 

always @(posedge baud_clk, posedge send_tick) 
begin 
    case (state) 
    IDLE: 
     if (send_tick) 
     begin 
      bits_to_send <= {data_in, 0}; 
      state <= TRANSMIT; 
      cnt <= 0; 
     end 
    TRANSMIT: 
     begin 
      if (cnt < NUM_BITS) 
       cnt <= cnt + 1; 
      else 
       state <= IDLE; 
      bits_to_send <= {1, bits_to_send[NUM_BITS:1]}; 
      out_bit <= bits_to_send[0]; 
     end 
    endcase 
end 

assign tx = (state == IDLE ? 1 : out_bit); 
assign debug_done = (state == IDLE);  
endmodule 

回答

4

錯誤:

The logic for does not match a known FF or Latch template. The description style you are using to describe a register or latch is not supported in the current software release. 

指的是一個事實,即綜合工具不具備任何與您的描述相匹配的硬件單元。

你想從什麼硬件:

always @(posedge baud_clk, posedge send_tick) 

這看起來像你想的觸發器與使能信號。使能信號(send_tick)應該是1個時鐘週期寬。然後這用於選擇時鐘邊沿的邏輯路徑。不是作爲替代觸發器。

我認爲這是你真正需要的:

always @(posedge baud_clk) begin 
    case (state) 
    IDLE: 
     if (send_tick) begin 
     //... 
     end 
    //... 
    endcase 
end 

如果send_tick是從另一個時鐘域,那麼你就需要做一些跨時鐘域到它把它交給一個時鐘寬的脈衝在baud_clk

您可能會對具有多個觸發器的塊感到困惑,它們通常是一個clk並重置。通常會添加negedge reset_nposedge reset以進行重置(初始化)條件。

如果添加復位:

always @(posedge baud_clk or negedge reset_n) begin 
    if (~reset_n) begin 
    //reset conditions 
    state <= IDLE; 
    //... 
    end 
    else begin 
    // Standard logic 
    end 
end 

你會發現,這裏有一個非常明確的結構,如果重置否則......綜合工具認識到這是一個觸發器具有異步復位。復位條件中的數據也是靜態的,通常將所有內容設置爲零。