Verilog_RTL 설계

[Verilog_RTL]_4BIT_ALU

juniha 2025. 6. 14. 21:06

Symbol

 

[그림 1] 4bit_ALU

 

 

사용 코드_case 문 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
module alu_4bit (iA, iB, ilNST, oRESULT);
 
    // 연산 종류를 나타내는 localparam 상수 (명령어 코드)
    localparam  ADD = 4'h0,      // 덧셈
                SUB = 4'h1,      // 뺄셈
                MUL = 4'h2,      // 곱셈
                DIV = 4'h3,      // 나눗셈
                MOD = 4'h4,      // 나머지
                BIT_NOT = 4'h5,  // 비트 반전
                BIT_AND  = 4'h6, // 비트 AND
                BIT_OR  = 4'h7,  // 비트 OR
                BIT_XOR = 4'h8,  // 비트 XOR
                BIT_XNOR = 4'h9, // 비트 XNOR
                RED_AND = 4'ha,  // reduction AND
                RED_OR  = 4'hb,  // reduction OR
                RED_NAND = 4'hc, // reduction NAND
                RED_XOR = 4'hd,  // reduction XOR
                RSHFT = 4'he,    // 우측 시프트
                LSHFT = 4'hf;    // 좌측 시프트
 
    input  [3:0] iA, iB;         // 연산에 사용되는 4비트 입력 A, B
    input  [3:0] ilNST;          // 연산 선택 코드
    output [7:0] oRESULT;        // 8비트 출력 결과
 
    reg [7:0] result;            // always 블록에서 연산 결과를 저장 (reg 타입)
 
    always @(iA or iB or ilNST) begin
        case (ilNST)
            ADD      : result = iA + iB;     // 덧셈
            SUB      : result = iA - iB;     // 뺄셈
            MUL      : result = iA * iB;     // 곱셈
            DIV      : result = iA / iB;     // 나눗셈
            MOD      : result = iA % iB;     // 나머지 연산
            BIT_NOT  : result = ~iA;         // 비트 반전
            BIT_AND  : result = iA & iB;     // 비트 AND
            BIT_OR   : result = iA | iB;     // 비트 OR
            BIT_XOR  : result = iA ^ iB;     // 비트 XOR
            BIT_XNOR : result = iA ~^ iB;    // 비트 XNOR
            RED_AND  : result = &iA;         // reduction AND
            RED_OR   : result = |iA;         // reduction OR
            RED_NAND : result = ~&iA;        // reduction NAND
            RED_XOR  : result = ^iA;         // reduction XOR
            RSHFT    : result = iA >> iB;    // 오른쪽 시프트
            LSHFT    : result = iA << iB;    // 왼쪽 시프트
            default  : result = 8'h0;        // 기본값 (Latch 방지)
        endcase
    end
 
    assign oRESULT = result;     // 연산 결과를 출력에 연결
 
endmodule
cs

사용 코드_Testbench

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
module tb_alu;
  reg      [3:0] iA, iB, iINST;     // ALU의 4비트 입력 피연산자 iA, iB 와 4비트 명령어 iINST
  wire     [7:0] oRESULT;           // ALU의 8비트 연산 결과 출력
  
  integer  i;                       // 루프 카운터용 정수형 변수
 
  // ALU 모듈 인스턴스화 (이름에 의한 포트 매핑)
  alu U0 (
    .iA      (iA),                  // 4비트 입력 iA
    .iB      (iB),                  // 4비트 입력 iB
    .iINST   (iINST),               // 4비트 명령어 입력
    .oRESULT (oRESULT)              // 8비트 결과 출력
  );
 
  // 초기 입력 신호 생성 및 테스트 진행
  initial begin
    iA = 4'hb;        // iA = 1011 (16진수 b = 10진수 11)
    iB = 4'h2;        // iB = 0010 (16진수 2 = 10진수 2)
    iINST = 4'h0;     // 명령어 초기값: 0000
 
    // iINST를 0부터 15까지 1씩 증가시키며 테스트 (모든 ALU 연산 코드 적용)
    for (i = 0; i <= 15; i = i + 1) begin
      #100;           // 100ns 대기 후
      iINST = iINST + 1;  // iINST를 1씩 증가 (다음 연산 명령어로 변경)
    end
  end    
 
endmodule
cs

 

Schematic

[그림 2] 4bit_ALU_Schematic

 

'Verilog_RTL 설계' 카테고리의 다른 글

[Verilog_RTL]_10-to-2_ENCODER  (0) 2025.06.16
[Verilog_RTL]_Binary_BCD 변환기  (0) 2025.06.14
[Verilog_RTL]_LOGIC_GATE  (0) 2025.06.14
[Verilog_RTL]_DECODER  (0) 2025.06.14
[Verilog]_4BIT_ADDER/SUBTRACTOR  (0) 2025.06.14