2014-01-08 22 views
2

我嘗試寫像一些代碼(用Verilog):VERILOG產生的if/else

parameter N = 128; 

    if (encoder_in[0] == 1) begin 
23  binary_out = 1; 
24 end else if (encoder_in[1] == 1) begin 
25  binary_out = 2; 
26 end else if (encoder_in[2] == 1) begin 
27  binary_out = 3; 
28 end else if (encoder_in[3] == 1) begin 
29  binary_out = 4; 
30 end else if (encoder_in[4] == 1) begin 
31  binary_out = 5; 
32 end else if (encoder_in[5] == 1) begin 
33  binary_out = 6; 
34 end else if (encoder_in[6] == 1) begin 
35  binary_out = 7; 
36 end else if (encoder_in[7] == 1) begin 
37  binary_out = 8; 
...... 
...... 
36 end else if (encoder_in[127] == 1) begin 
37  binary_out = 8; 
     end 

我想我可以改變N到我想要的任何值,它仍然有效。 「生成」將在這裏工作?像這樣:

parameter N = 128; 

if (encoder_in[0] == 1) begin 
binary_out = 1; 
generate for (i=1; i<N; i=i+1) begin 
    end else if (encoder_in[i] == 1) begin 
    binary_out = i+1; 
end endgenarate 

end 

如果不是,我該怎麼辦? 非常感謝!

+1

試試吧,讓我們知道它是否有效。 – toolic

回答

5

生成塊不能在另一個語句中使用。我仍然在尋找IEEE std 1800-2012中的確切參考。

如果你想用更高的優先級方式的解碼器LSB,那麼下面的工作沒有使用生成塊:

parameter N = 128; 
integer i; 
... 
always @* begin 
    binary_out = 0; // default value 
    ... 
    for(i=N-1; i>=0; i=i-1) begin 
     if (encoder_in[i]==1'b1) begin 
      binary_out = i+1; 
     end 
    end 
end 

注意,這是用倒計數的循環。計數會優先考慮MSB。

+0

+1。您可以使用條件生成語句而不總是阻止,但條件應該是常量,例如參數。在這種情況下,encoder_in不能被使用,因爲它是一個輸入,並且你的解決方案是正確的。 – Ari

+0

謝謝!!,我會試試看。 – user2683458

+0

@ user2683458,如果此答案有用,請點擊接受。如果不是,還需要哪些附加信息? – Greg