2013-08-28 131 views
0

我想用verilog編寫一個16位的ALU。 我的輸入是16位Ain,Bin和16位輸出。關於2的補碼和左循環的Verilog問題

我需要對兩個輸入進行2的補碼加法和減法。因此,我想知道我是否可以只使用'+'和' - '運算符。 Ain+BinAin-Bin

此外,我需要通過我用下面出來一定值N.做A中的位的左旋轉,其中我複製以形成32位,它轉移到由N個左位。但現在問題是我需要再次將其降低到16位,但我該怎麼做?

out <=({A,A}<<N);

回答

0

是的,你可以,如果你想添加或減去兩個號碼使用+-運營商。

如果要將結果截短回16位,只需將結果分配給16位導線/寄存器,它將自動刪除高位並將低16位分配給out。在某些情況下,這可能會創建一個lint警告,因此您可能需要先將結果分配給中間變量,然後再進行明確的零件選擇。

wire [15:0] out; 
wire [15:0] A; 
wire [31:0] A_rotate; 

A_rotate = {A,A} << N; 
out = A_rotate[15:0]; 
+0

確定,所以例如,如果A = 4'b1110,'{A,A}'= 11101110。所以將它左移2位將以10111000結束。因此,如果將此值分配給4位,則out = 4b'1000或4b'1011? – James

+0

它需要較低的4位,所以出來會是'b1000。 – Tim

+0

所以,如果我想獲得高位,我將不得不使用中間值,然後out = A_rotate [31:16]'?實際上有沒有一種方法可以在一個單獨的步驟中完成,而不需要像'out <=({A,A} << N)[31:16]' – James