[RTLLM-p037] Miscellaneous/RISC-V/alu
32 位元 MIPS ALU
請設計一個名為 alu 的 32 位元算術邏輯單元。輸入 a 與 b 為兩個 32 位元運算元,輸入 aluc 用來選擇要執行的運算。
ALU 必須輸出 32 位元運算結果 r,並產生 zero、carry、negative、overflow 與 flag 狀態訊號。
模組名稱
alu
輸入埠
| 埠名稱 | 位元寬度 | 說明 |
|---|---|---|
a |
32 | 第一個運算元 |
b |
32 | 第二個運算元 |
aluc |
6 | ALU 運算控制碼 |
輸出埠
| 埠名稱 | 位元寬度 | 說明 |
|---|---|---|
r |
32 | ALU 運算結果 |
zero |
1 | 當 r 為 0 時輸出 1 |
carry |
1 | 加減法產生的進位或無借位訊號 |
negative |
1 | 等於結果 r 的最高位元 |
overflow |
1 | 有號加減法的溢位訊號 |
flag |
1 | SLT 或 SLTU 的比較結果;其他操作輸出高阻抗 |
支援的運算
| 指令 | aluc |
運算 |
|---|---|---|
ADD |
6'b100000 |
有號加法 a + b |
ADDU |
6'b100001 |
無號加法 a + b |
SUB |
6'b100010 |
有號減法 a - b |
SUBU |
6'b100011 |
無號減法 a - b |
AND |
6'b100100 |
a & b |
OR |
6'b100101 |
a | b |
XOR |
6'b100110 |
a ^ b |
NOR |
6'b100111 |
~(a | b) |
SLT |
6'b101010 |
有號比較 a < b |
SLTU |
6'b101011 |
無號比較 a < b |
SLL |
6'b000000 |
將 b 向左移動 a 位 |
SRL |
6'b000010 |
將 b 邏輯右移 a 位 |
SRA |
6'b000011 |
將 b 算術右移 a 位 |
SLLV |
6'b000100 |
將 b 向左移動 a[4:0] 位 |
SRLV |
6'b000110 |
將 b 邏輯右移 a[4:0] 位 |
SRAV |
6'b000111 |
將 b 算術右移 a[4:0] 位 |
LUI |
6'b001111 |
將 a[15:0] 放入結果高 16 位元 |
狀態訊號
Zero
當結果全部為 0 時:
zero = 1'b1;
否則:
zero = 1'b0;
Carry
加法時,carry 表示第 32 位元的進位輸出。
減法使用二補數加法完成:
a - b = a + ~b + 1
此時 carry = 1 表示減法沒有借位。
Negative
negative 直接取結果的最高位元:
negative = r[31];
Overflow
overflow 只針對有號 ADD 與 SUB 計算。
有號加法發生溢位的情況:
- 兩個正數相加得到負數。
- 兩個負數相加得到正數。
有號減法發生溢位的情況:
a與b符號不同。- 結果符號與
a不同。
Flag
執行 SLT 或 SLTU 時,flag 為比較結果:
1:a 小於 b
0:a 不小於 b
執行其他操作時:
flag = 1'bz;
程式模板
module alu (
input [31:0] a,
input [31:0] b,
input [5:0] aluc,
output [31:0] r,
output zero,
output carry,
output negative,
output overflow,
output flag
);
// Write your code here
endmodule
評論