본문 바로가기
verilog/실습

[Verilog] 조합회로(Combinational logic) : ALU(산술 논리 장치)

by 씐 2025. 3. 4.
728x90

산술 논리 장치란?

  • 명령어에 따라 산술연산, 논리연산, 시프트연산 등의 기능을 수행할 수 있는 조합논리회로
  • ALU(Arithmatic Logic Unit)라고 부른다.
  • CPU에서 가장 중요한 요소

 

회로(4bit ALU)

 

 

ALU의 명령어와 연산

명령어 연산 의미
산술연산 0000 a + b 덧셈
0001 a - b 뺄셈
0010 a x b 곱셈
0011 a / b 나눗셈
0100 a % b 나머지
비트 단위 논리연산 0101 ~a 비트 NOT
0110 a & b 비트 AND
0111 a | b 비트 OR
1000 a ^ b 비트 XOR
1001 a ~^ b 비트 XNOR
비트단항 논리연산 1010 & a 비트단항 AND
1011 | a 비트단항 OR
1100 ~& a 비트단항 NAND
1101 ^ a 비트단항 XOR
시프트 연산 1110 a >> b a를 b비트 우측 이동
1111 a << b a를 b비트 좌측 이동

 

verilog 코드

// ALU 설계

module alu (a, b, inst, result);
  
  input [3:0] a, b, inst;
  output reg [7:0] result;
  
  parameter ADD = 4'h0;
  parameter SUB = 4'h1;
  parameter MUL = 4'h2;
  parameter DIV = 4'h3;
  parameter MOD = 4'h4;
  parameter BitNOT = 4'h5;
  parameter BitAND = 4'h6;
  parameter BitOR = 4'h7;
  parameter BitXOR = 4'h8;
  parameter BitNOR = 4'h9;
  parameter RedAND = 4'ha;
  parameter RedOR = 4'hb;
  parameter RedNAND = 4'hc;
  parameter RedXOR = 4'hd;
  parameter RSHT = 4'he;
  parameter LSFT = 4'hf;

  always@(a or b or inst) begin
    case(inst)
      ADD : result = a + b;
      SUB : result = a - b;
      MUL : result = a * b;
      DIV : result = a / b;
      MOD : result = a % b;
      BitNOT : result = ~ a;
      BitAND : result = a & b;
      BitOR : result = a | b;
      BitXOR : result = a ^ b;
      BitNOR : result = a ~^ b;
      RedAND : result = & a;
      RedOR : result = | a;
      RedNAND : result = ~& a;
      RedXOR : result = ^ a;
      RSHT : result = a >> b;
      LSFT : result = a << b;
      default : result = 8'hz;
    endcase
  end
    
endmodule

 

테스트벤치

// 4비트 ALU tb

`timescale 1ns/10ps

module tb_alu;
  
  reg [3:0] a, b, inst;
  wire [7:0] result;
  
  integer i;
  
  alu U0 (.a(a), .b(b), .inst(inst), .result(result));
  
  initial begin
    
    $dumpfile("dump.vcd");
    $dumpvars(0);
    
    a = 4'hb; // 4'b1011 
    b = 4'h2; // 4'b0010
    
  end
  
  initial begin 
    
    inst = 4'h0;
    
    for(i = 0; i <= 15; i = i + 1) begin
      #100; inst = inst + 1;
    end
    
  end
  
endmodule

 

Waveform

  • inst의 값이 for문을 돌면서 100ns마다 4'h0부터 4'hf까지의 값을 가지게 됨.