Synthesis common
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
// 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
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
🔹 Dataflow
Elaborated
// 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
🔹 Elaborated