[RTLLM-p018] Arithmetic/Other Units/fixed_point_subtractor
參數化定點數減法器
題目說明
請設計一個名為 fixed_point_subtractor 的參數化 Verilog 模組,用於計算兩個具有相同精度的定點數之差:
c = a - b
本題中的定點數使用符號-數值表示法(Sign-Magnitude Representation):
- 最高位元
N-1為符號位元。 - 符號位元為
0時表示非負數。 - 符號位元為
1時表示負數。 - 其餘
N-1個位元表示數值的絕對值。 - 絕對值欄位中的低
Q個位元為小數部分。 a、b與c使用相同的定點數精度。
由於兩個輸入使用相同的 Q,它們的二進位小數點位置相同,因此不需要額外進行位元對齊。
模組參數
| 參數 | 說明 |
|---|---|
Q |
小數部分的位元數 |
N |
定點數總位元數,包含一個符號位元 |
參數必須滿足:
N >= 2
0 <= Q <= N-1
模組介面
| 埠 | 方向 | 位元寬度 | 說明 |
|---|---|---|---|
a |
input | N |
被減數,採用符號-數值格式 |
b |
input | N |
減數,採用符號-數值格式 |
c |
output | N |
a - b 的定點數結果 |
運算規則
1. 相同符號
當 a 與 b 的符號相同時,減法等價於兩個絕對值相減。
例如:
(+A) - (+B)
(-A) - (-B)
此時必須比較兩個輸入的絕對值。
若 |a| > |b|:
- 結果絕對值為
|a| - |b|。 - 結果符號為
a的符號。
若 |b| > |a|:
- 結果絕對值為
|b| - |a|。 - 結果符號為
a符號的反相。
若 |a| == |b|:
- 結果為正零。
2. 不同符號
當 a 與 b 的符號不同時,減法等價於將兩個絕對值相加。
例如:
(+A) - (-B) = +(A+B)
(-A) - (+B) = -(A+B)
結果符號與 a 的符號相同。
零的處理
符號-數值格式可以同時表示正零與負零:
0_000...000
1_000...000
本題要求所有零結果都正規化為正零:
c = {N{1'b0}}
不可輸出負零。
溢位處理
當不同符號的兩個輸入進行絕對值相加,且結果超過 N-1 個 magnitude bits 可表示的範圍時,只保留低 N-1 個位元。
本題不需要額外輸出 overflow 訊號。
若截斷後的 magnitude 為零,輸出必須正規化為正零。
設計要求
- 模組名稱必須為
fixed_point_subtractor。 - 必須支援參數
Q與N。 - 使用組合邏輯完成設計。
- 輸入與輸出皆採用符號-數值表示法。
- 正確實作
c = a - b。 - 不可輸出負零。
Q只決定二進位小數點的位置,不改變加減法的位元運算方式。
程式設計模板
module fixed_point_subtractor #(
parameter Q = 15,
parameter N = 32
) (
input [N-1:0] a,
input [N-1:0] b,
output [N-1:0] c
);
// Write your code here
endmodule
評論