2013-07-19 21 views
2

聲明和assiging線新建Verilog和試圖找出assiging基於組合邏輯線的基本知識。如果用Verilog

我有:

wire val; 
wire x; 
wire a; 
wire b; 

always @* 
begin 

if(val == 00) 
I want to assign x = a 
if(val == 01) 
I want to assign x = b 

end 

其中a和b是與電線值 - 和x是去到一個寄存器的導線。

如果你能指點我正確的方向,我需要改變,這將不勝感激。

謝謝。

回答

4

首先要問的是:你想用這些線輸入?或者你使用那些作爲連接?第二件事:你想要一個可合成的代碼嗎? 你不能指定一個always塊裏面的電線,則必須使用REG

因此,一個觀點是:

//************************************************************************************** 
module(a, b, out); //You have to define an interface, and all Verilog modules starts with module 
input val[1:0]; //you have to use [] in order to indicate the length. In this case 2 bits, since you want to ask for 00; 
input a; 
input b; 
output out; 

reg x; 

always @* //NOTE: You are describing combo logic, since there is no clock signal 
begin 

     if(val == 2'b00) 
     x = a; 
     else if(val == 2'b01) 
     x = b; 
     else 
     x = 0; //If you are describing combo logic, you have to cover ALL val cases, in      order to evade latches 

end 

assign out = x; //This is how you assign values in Verilog 

endmodule 
+5

我只想宣佈了作爲一個reg類型,而不是使用中間X。 – Morgan

6

wire s只能通過assign語句,不能與if語句中使用被分配。 如果更改xreg類型,那麼你就可以把它分配在一個總是塊。

這將合成完全一樣,一個常見的誤解是reg類型變量意味着一個寄存器,但它只是改變了值分配的方式。

或者,您也可以使用賦值語句與三元運營商?:,如果你想讓它繼續作爲導線類型:

assign x = (val==0) ? a : 
      (val==1) ? b : 
         'bx ; 
+0

謝謝........ –

1

首先,我沒有發現任何輸入輸出端口在你的模塊中。我也沒有注意到有開始結束適當的模塊聲明。

然而,假設你的模塊被定義如下,其中輸入 A,B,和val和輸出 X:

module myfirstmodule (
    input  a, 
    input  b, 
    input [1:0] val, 
    output  x 
); 

// Assign a or b to x based upon val 
assign x = (val == 2'b00) ? a : 
      (val == 2'b01) ? b : 
      0; // Since val can take on values 00,01,10, and 11, we define all possible cases 

endmodule 

分配語句用作條件塊像一個如果聲明你可能習慣在流行的編程語言,如C或C++。

分配運營商可以作爲這樣的:

  1. 我值分配給基於如果滿足某些條件的其他值。

上面分配操作者的工作原理如下:

如果 VAL == 2'b00,分配x到a的值。

否則如果 val == 2'01,則將x賦值爲b的值。

否則 VAL = 0