Bcdadd100
2023. 6. 26. 15:17ㆍFPGA/HDLBits
728x90
You are provided with a BCD one-digit adder named bcd_fadd that adds two BCD digits and carry-in, and produces a sum and carry-out.
module bcd_fadd (
input [3:0] a,
input [3:0] b,
input cin,
output cout,
output [3:0] sum );
Instantiate 100 copies of bcd_fadd to create a 100-digit BCD ripple-carry adder. Your adder should add two 100-digit BCD numbers (packed into 400-bit vectors) and a carry-in to produce a 100-digit sum and carry out.
module top_module(
input [399:0] a, b,
input cin,
output cout,
output [399:0] sum );
wire [399:0] cout_tmp;
bcd_fadd fadd(a[3:0], b[3:0], cin, cout_tmp[0], sum[3:0]);
assign cout = cout_tmp[396];
generate
genvar i;
for(i = 4; i<400;i=i+4) begin : add
bcd_fadd fadd(a[i+3:i], b[i+3:i], cout_tmp[i-4], cout_tmp[i], sum[i+3:i]);
end
endgenerate
endmodule
module top_module(
input [399:0] a, b, // 400비트 입력 벡터 a와 b
input cin, // 입력 캐리 비트
output cout, // 출력 캐리 비트
output [399:0] sum // 400비트 출력 벡터 sum
);
wire [399:0] cout_tmp; // 중간 캐리 비트를 저장하는 와이어
// bcd_fadd 모듈을 인스턴스화하여 a와 b의 첫 4비트를 더하고
// 그 결과를 sum[3:0]에 저장하고 캐리 비트를 cout_tmp[0]에 저장.
bcd_fadd fadd(a[3:0], b[3:0], cin, cout_tmp[0], sum[3:0]);
assign cout = cout_tmp[396]; // 가장 상위 비트의 캐리 비트를 cout에 할당.
// 나머지 비트에 대해 추가적인 bcd_fadd 인스턴스를 생성.
generate
genvar i; // generate 변수 i를 선언.
for(i = 4; i < 400; i = i + 4) begin : add
// bcd_fadd 모듈을 인스턴스화하여 a[i+3:i]와 b[i+3:i]를 더한다.
// 이전의 캐리 비트 cout_tmp[i-4]를 사용.
// 결과를 sum[i+3:i]에 저장하고 캐리 비트를 cout_tmp[i]에 저장.
bcd_fadd fadd(a[i+3:i], b[i+3:i], cout_tmp[i-4], cout_tmp[i], sum[i+3:i]);
end
endgenerate
endmodule
module bcd_fadd (
input [3:0] a, // 4비트 입력 벡터 a
input [3:0] b, // 4비트 입력 벡터 b
input cin, // 입력 캐리 비트
output cout, // 출력 캐리 비트
output [3:0] sum // 4비트 출력 벡터 sum
);