ALU (Arithmetic and Logic Unit)
산술/논리 연산 장치
Abtracted ALU
\(\texttt{A, B}\) : Operands (연산 대상, N bits)
\(\texttt{Y}\) : 연산 결과 (N bits)
\(\texttt{F}\) : ALU가 수행할 연산의 종류를 구분짓는 Contorl Signal (3 bits)
※ 32bits MIPS 시스템의 경우, N = 32가 될 것이다.
ALU Details
- 위 Diagram에서 ALU가 출력하는 Zero-Signal은 표현되지 않았다.
- 7개의 연산 종류를 구분짓기 위해 ALU Control Signal(F)은 최소 3bits로 구현되어야 한다.
- 8개의 F코드 중 011은 사용되지 않는다.
- F2(F의 MSB)가 1일 경우, ALU B의 1의 보수를 취하게 된다.(1의 보수는 전 비트를 Toggle시켜 얻을 수 있다.)
- adder의 C-out은 Carry-Out을 의미한다.
- adder ALU는 F2가 0이면 덧셈, F2가 1이면 뺄셈을 수행한다.
Ex. A - B 연산이 ALU 내에서 수행되는 과정
- 뺄셈 연산에 해당되는 Function Code = 110
- 즉, F2 = 1, F[1:0] = 10이다.
- F2 = 1 이므로, adder에는 A와 B'가 Operand로 전달된다.
- adder는 A에 B'에 1을 더하여 2의 보수로 취한 다음 A와 더하여 결과를 출력한다.
- F[1:0] = 10 이므로, 출력값 Y는 adder의 연산 결과(MUX의 2번 라인)와 매칭된다.
Verilog Code for ALU
Input Ports
- \(\texttt{[31:0] a, b}\) : ALU가 연산을 수행할 대상인 두 32bits Operand들이다.
- \(\texttt{alucont[2:0]}\) : ALU가 수행할 연산의 종류를 지정하는 3bits Control 신호이다.
Output Ports
- \(\texttt{reg [31:0] result}\) : ALU의 각종 연산 결과를 출력하는 32bit 포트이다.
- \(\texttt{zero}\) : 두 Operand의 차이가 0일 때, 즉 두 피연산자가 같은 값일 때 1을 출력하는 단일 비트 포트이다.
wires
- \(\texttt{[31:0] b2;}\) :
- \(\texttt{sltu:}\) :
- \(\texttt{[32:0] sum:}\) : Operands들에 대한 연산결과에 더불어 Carry-Out을 더한 값을 저장하기 위해 33bits로 구현한다.(SLTU 연산을 위한 wire이다.)
\(\texttt{assign b2 = alucont[2] ? ~b : b;}\)
- b2에는 ALU Control 신호의 MSB(F2)가 0이면 b를 취하고, 1이면 b를 Toggle 시킨 값(b의 1의 보수)을 취한다.
\(\texttt{assign sum[32:0] = a + b2 + alucont[2];}\)
- SLTU 연산을 수행하는 ALU에서 a와 b2가 더해지면 [31:0]가 1로 설정되고, 여기에 alucont[2]의 값에 해당되는 1이 더해지면 MSB만 1로 설정되고 나머지 32bits는 0으로 설정된다.
\(\texttt{assign sltu = ~sum[32];}\)
- sum의 MSB를 Toggle시켜 sltu에 저장한다.
- 즉,sltu에는 두 피연산자의 값이 같고, F2=1이면 0이 저장되고, 그렇지 않으면 1이 저장된다.
always@(*)
\(\texttt{2'b11: result <= {31'b0, sltu};}\)
- sltu값을 Zero-Extension하여 얻어낸 32bits 값을 result에 저장한다.
- 즉, sltu가 0이면(두 피연산자 값이 같으면), result에는 32'b0이 저장된다.
\(\texttt{assign zero = (result == 32'b0)}\)
- result가 0이면, zero는 1로 설정된다.