2013-09-22 89 views
-1

我剛剛開始學習一些verilog,遇到了一個通常會在其他語言中使用for循環解決的問題。簡單的「分配」功能

s2 s1 s0 m 
0 0 0 u 
0 0 1 v 
0 1 0 w 
0 1 1 x 
1 0 0 y 
1 0 1 z 

這是S2,S1,S0是開關,(U,V,W,X,Y,Z)是輸入及如果某些交換機被設置時,輸出(米問題的真值表)將被設置爲其中一個輸入。但是,這隻有1位寬,我們可以將每個m指定爲以下輸入之一,前提是s0,s1,s2匹配。如果它是3位寬的輸入和輸出,例如:(u0,u1,u2),(m0,m1,m2),但是每個變量仍然遵循相同的邏輯(例如:u0,u1,u2都將是輸出m0,m1,m2,條件是所有開關都是0)如何縮短我的代碼。我是否允許這樣做:

assign m[3:0] = (~s0&~s1&~s2&u[3:0]) 

回答

0

不,這不是一個好的解決方案。在執行&操作之前,Verilog會將您的選擇信號擴展爲與m相同的寬度,默認行爲是在左側添加零以擴展信號。如果你宣佈選擇信號被簽名,它可能會工作,但我認爲你可以做得更好。

此外,您提供的示例僅處理真值表的第一行。對於s0s1s2的其他七種組合,您應將全部零分配給m。如果你想在一個單一的組合任務中做到這一點,那麼你需要8個邏輯表達式,比如你所擁有的邏輯表達式,所有的邏輯表達式都會得到最終結果。

更簡單的方法是在always塊中使用if-then-elsecase語句。

0

嘗試case語句:

always @* begin 
    case ({s2,s1,s0}) 
    3'b000 : m = u; 
    3'b001 : m = v; 
    3'b010 : m = w; 
    3'b011 : m = x; 
    3'b100 : m = y; 
    3'b101 : m = z; 
    default: m = 0; /* <-- catch all */ 
    endcase 
end 

注意:使用default如果真值表是不完整的。否則會推斷一個鎖存器。

工作示例:http://www.edaplayground.com/s/6/187