| | 26 | このALUでは下に示す6種類の演算をサポートします。第5版上巻p.251参照。 |
| | 27 | |
| | 28 | || ALU制御入力 || 機能 || |
| | 29 | || 0b0000 || AND || |
| | 30 | || 0b0001 || OR || |
| | 31 | || 0b0010 || 加算 || |
| | 32 | || 0b0110 || 減算 || |
| | 33 | || 0b0111 || Set on less than || |
| | 34 | || 0b1100 || NOR || |
| | 35 | |
| | 36 | ANDは2つの入力の各ビットの論理積、ORは論理和を実行することを意味します。 |
| | 37 | Set on less than は比較命令で利用される演算で、2つの入力の大小関係によって 0 または 1 を次の表のように出力します。 |
| | 38 | |
| | 39 | || || ALUの出力 || |
| | 40 | || A < B || 0x00000001 || |
| | 41 | || A ≧ B || 0x00000000 || |
| | 42 | |
| | 43 | 今回作成するプロセッサでは、加算、減算実行時にはオーバフローは想定しません。 |
| | 44 | オーバフローが発生した場合でも、下位のbitは正しい値が出力されるように設計します。 |
| | 45 | |
| | 46 | == ALUモジュールの作成 == |
| | 47 | ALUは3つの入力A,B,ALUoperation、2つの出力ALUresultとZeroをもちます。 |
| | 48 | |
| | 49 | 以下は、ALUモジュールのVerilog HDL記述です。 |
| | 50 | {{{ |
| | 51 | module ALU(A,B,ALUoperation,ALUresult,Zero); |
| | 52 | |
| | 53 | input [31:0] A; |
| | 54 | input [31:0] B; |
| | 55 | input [3:0] ALUoperation; |
| | 56 | output [31:0] ALUresult; |
| | 57 | output Zero; |
| | 58 | |
| | 59 | reg [31:0] ALUresult; |
| | 60 | wire [32:0] tmp; |
| | 61 | |
| | 62 | // Output Zero is defined by assign statement |
| | 63 | assign Zero = (ALUresult == 0)? 1'b1 : 1'b0; |
| | 64 | |
| | 65 | // tmp is the result of A - B, in 33bit |
| | 66 | assign tmp = {A[31], A} - {B[31], B}; |
| | 67 | |
| | 68 | // Output ALUresult is defined by always statement |
| | 69 | always @(A or B or ALUoperation or tmp) |
| | 70 | begin case( ALUoperation ) |
| | 71 | 4'b0000 : ALUresult <= A & B; |
| | 72 | 4'b0001 : ALUresult <= A | B; |
| | 73 | 4'b0010 : ALUresult <= A + B; |
| | 74 | 4'b0110 : ALUresult <= A - B; |
| | 75 | 4'b0111 : ALUresult <= {31'b0, tmp[32]}; |
| | 76 | 4'b1100 : ALUresult <= (~A) & (~B); |
| | 77 | default : ALUresult <= 32'b0; |
| | 78 | endcase |
| | 79 | end |
| | 80 | |
| | 81 | endmodule |
| | 82 | }}} |
| | 83 | VerilogHDLの記述方法は、参考図書を参考にしてください。 |
| | 84 | この記述では、抽象度の高いBehaviorレベルでの設計が行われています。 |
| | 85 | |
| | 86 | 加減算における入力AとBは2の補数で表された符号付き32bitデータです。 |
| | 87 | 下位31ビットが数をあらわし、最上位ビットが符号を表します。 |
| | 88 | |
| | 89 | このALU記述では、assign文とalways文を用いています。 |
| | 90 | 両方をalways文で設計することもできます. |
| | 91 | 加減算、大小比較は、VerilogHDLの算術演算を用いて実現しています。 |
| | 92 | |
| | 93 | 上記のVerilog HDL記述をファイル名「ALU.v」として保存してください。 |
| | 94 | |
| | 95 | 以降の演習では、ファイル名は「(モジュール名).v」としてください。また、1つのファイルには1つのモジュールを定義します。 |
| | 96 | |
| | 97 | |
| | 98 | |