2012-06-30 40 views
1

我想在always塊內使用if-elsefor循環。我不希望那些if-else被一次又一次地執行,所以我不想總是連接posedge clknegedge clk在always塊內使用if-else和foor循環

我希望它們只能執行一次。我不僅想模擬,而且還想合成到Spartan Board以及。

always @ (**what I should add here**) 
    begin 
    if(condition) 

    else 

    end 
+2

你想描述什麼電路? – 2012-06-30 17:49:47

+0

您是否閱讀過您最近兩次提到這個問題的答案? – Tim

+0

我在前面的2個問題中想要問的是事實上的一般情況。我已經閱讀了那裏的答案。我只是問我只想使用if-else語句。沒有使用總是我得到錯誤。這意味着這些陳述必須始終在內部阻止。對??。現在我應該如何執行一次總是阻塞一次。我在前面提出的問題中沒有得到答案。 – user1491918

回答

3

對於模擬執行一些事情,一旦你可以使用initial但這不是一個綜合的:

reg x; 

initial begin 
    if(condition) begin 
    x = 1'b0 ; 
    end 
    else begin 
    x = 1'b1 ; 
    end 
end 

要回答這個一般性問題always @(**what I should add here**)大多數現代Verilog仿真將允許使用的*這將當任何右側參數改變選擇邏輯的任何條件時觸發塊(總是開始結束)。

always @* begin 
    if(condition) 
    x = y ; 
    else 
    x = ~y ; 
end 

舊的模擬器將要求您列出您需要在列表中觸發的變量。 always @(condition, y)

如果只有一個變量被選中,那麼在導線類型上的賦值可能會更好,但這不能侷限於「執行一次」,而是適合您的問題。不知道是否適合FPGA的雖然

wire [3:0] x ; //4 bit wire 
//(condition) ? value if true : value if false ; 
assign x = (condition) ? 4'b1010 : 4'b0100 ; 
1
module oneShot(in, out, enable, reset); 
    input in; 
    input enable; 
    input reset; 
    output reg out; 

    reg once_only; 
    always @ (posedge enable) begin 
      if (reset) begin 
       once_only <= 0; 
      end    
      else if (once_only == 0) begin 
       out <= calc_out; // or whatever processing you want 
       once_only <= 1; 
      end 
    end 

    always @(*) begin 
      // calculate ouput here always 
      calc_out = 1 + 7 +100+ in; 
    end 
endmodule 

你不能讓那些if語句只計算一次。它是硬件,它會一直計算。但是在計算一次後,您可以保持輸出穩定。你仍然試圖編寫一個軟件函數並將其放入硬件,而不是描述能夠解決你的問題的硬件。我看不到你會以這種方式獲得像樣的設計。當然,你可以製作一些小片段並綜合它們(最終),但是一個完整的設計?