1의 보수, 2의 보수

✅ 1. Half Adder

image.png

Synthesis common

Synthesis common

Sim

Sim

// Half Adder Behavioral
// 두개의 1비트를 입력 (a, b)
// 합(s), 자리올림(c) 출력하는 반가산기
module Half_adder_behavioral (
    input a,        // 1bit 입력 a
    input b,        // 1bit 입력 b
    output reg s,   // 합(sum)을 저장할 레지스터 타입의 출력
    output reg c    // 자리올림(carry)을 저장할 레지스터 타입의 출력
    );

    // a 또는 b의 변화가 생길때 마다 always블록 실행 
    always @(a, b) begin
        case ({a, b})
            2'b00 : begin   // a = 0, b = 0 -> sum = 0, carry = 0
                s = 0;
                c = 0;
            end
            2'b01 : begin   // a = 0, b = 1 -> sum = 1, carry = 0
                s = 1;
                c = 0;
            end
            2'b10 : begin   // a = 1, b = 0 -> sum = 1, carry = 0
                s = 1;
                c = 0;
            end
            2'b11 : begin   // a = 1, b = 1 -> sum = 1, carry = 1
                s = 1;
                c = 1;
            end            
        endcase
    end
endmodule

🔹 Behavioral

Elaborated

Elaborated

// behavioral와 simulation 결과 같음
module half_adder_structual (
    input a, b,
    output s, c
    );

    and (c, a, b);
    xor (s, a, b);
endmodule

module half_adder_dataflow (
    input a, b,
    output s, c
    );

    // a와 b의 합을 저장할 2bit wire
    // 최대값은 1 + 1 = 2 (2'b10)이므로 2bit 필요 
    wire [1:0]  sum_value;

    // verilog에서 '+'연산자는 벡터를 생성해서 결과를 sum_value에 저장
    // ex) a = 1, b = 1 -> sum_value = 2'b10 
    assign sum_value = a + b;

    // sum_value의 최하위비트(LSB)인 sum_value[0]를 s에 할당
    // 결과값은 XOR 연산결과와 같음 
    assign s = sum_value[0];    // sum

    // sum_value의 상위비트(MSB)인 sum_value[1]를 c에 할당
    // 결과값은 AND 연산결과와 같음 (둘다 1인 경우에만 carry 발생)
    assign c = sum_value[1];    // carry
endmodule

🔹 Structual

Elaborated

Elaborated

module half_adder_dataflow (
    input a, b,
    output s, c
    );

    // a와 b의 합을 저장할 2bit wire
    // 최대값은 1 + 1 = 2 (2'b10)이므로 2bit 필요 
    wire [1:0]  sum_value;

    // verilog에서 '+'연산자는 벡터를 생성해서 결과를 sum_value에 저장
    // ex) a = 1, b = 1 -> sum_value = 2'b10 
    assign sum_value = a + b;

    // sum_value의 최하위비트(LSB)인 sum_value[0]를 s에 할당
    // 결과값은 XOR 연산결과와 같음 
    assign s = sum_value[0];    // sum

    // sum_value의 상위비트(MSB)인 sum_value[1]를 c에 할당
    // 결과값은 AND 연산결과와 같음 (둘다 1인 경우에만 carry 발생)
    assign c = sum_value[1];    // carry
endmodule

Sim

Sim

🔹 Dataflow

Elaborated

Elaborated

✅ 2. N bit Half Adder

// N bit half_adder
module half_adder_N_bit # (parameter N = 8)(    // N의 기본값 8bit
    input inc,                  // 더할 값
    input [N-1:0] load_data,    // 입력 데이터 (N비트)
    output [N-1:0] sum          // 출력 합계 결과 (N비트)
    );
    
    wire [N-1:0] carry_out;     // 각 자리의 carry 출력을 저장할 배열

    half_adder_dataflow ha0(    // 첫번째 bit(LSB)는 inc와 load_data[0]을 half_adder로 연산
        .a(inc),
        .b(load_data),
        .s(sum[0]),
        .c(carry_out[0])
    );

    genvar i;   // generate문을 위한 변수 선언 
    generate
        for(i = 1;i < N;i = i + 1) begin : hagen    // Labe를 "hagen"으로 블록 지정
            half_adder_dataflow ha(
                .a(carry_out[i - 1]),   // 이전 자리의 carry 입력
                .b(load_data[i]),       // 현재 자리의 입력 bit 
                .s(sum[i]),             // 현재 자리의 합 출력
                .c(carry_out[i])        // 다음 자리로 전달될 carry 출력
            );
            
        end
    endgenerate
endmodule

Sim

Sim

🔹 Elaborated