初學者在這裏。我試圖在Verilog中編寫一個簡單的16位微處理器,並在Spartan 6上實現它。ALU實現所有已簽名的操作(根本沒有未簽名的操作)。所有的輸入都是連線並被簽名。結果存儲在一個有符號的寄存器中。Verilog中的簽名乘法溢出檢測
我的問題是找到一個明智的方法來檢測溢出。目前,檢測到溢出的速度並不重要,因爲它所做的只是觸發故障並暫停系統。
我相信我已經想通了如何檢測加法和減法的溢出,但我仍然想要保證。
這裏此外,其中O,溢出標誌寄存器:
if((a_in >= 0) && (b_in >= 0) && (res_out < 0)) o <= 1'b1;
else if((a_in < 0) && (b_in < 0) && (res_out >= 0)) o <= 1'b1;
else o <= 1'b0;
這裏的減法:
if((a_in >= 0) && (b_in < 0) && (res_out < 0)) o <= 1'b1;
else if((a_in < 0) && (b_in > 0) && (res_out >= 0)) o <= 1'b1;
else o <= 1'b0;
控制矩陣需要的保持時間A_IN和B_IN的護理,以使溢出檢測可以完成,因爲只有在計算結果後纔會完成(在下一個時鐘週期中)。
我在這裏找了一些東西,我發現的所有東西都是在其他語言(如C或C++)中檢測到溢出。我正在尋找一個在有符號乘法中檢測溢出的示例實現。
輸入a_in和b_in都是有符號線,並且是16位寬。結果寄存器res_out是有符號的,也是16位寬。理想情況下,我會有一個33位寬的結果寄存器,其中溢出不會發生,但這不是一個選項。
幫助表示讚賞。任何更好的方法來檢測加法和減法溢出也是受歡迎的。
這是一個令人難以置信的優雅的解決方案。謝謝。我知道我可以使用一個33位的結果寄存器來進行乘法運算,但是如果不這樣做,效率會更高。但是我可能會使用更大的結果寄存器,它不會改變當前的實現。 –
@ShreyasVinod我已經添加了另一段來嘗試和擴大這一點。沒有使用全寬結果檢測乘法器溢出沒有很好的見解。 – Morgan
我對此並不確定,但我認爲您需要額外的一點來保持標誌。看起來很適合我。 16位×16位將是32d'4294967296。需要多一點的標誌。 –