100个BCD全加器。
难点:
段选:
不能两边都用到变量,而是应该用这样的方式:
a[开始-:位数N]:向下选择N位
a[开始+:位数N]:向上选择N位
要注意大小端关系:
reg [31:0] big_vect;
reg [0:31] little_vect;
big_vect [0 +: 8] // 从0 开始,升序,位宽为8 ======》》》》》
// big_vect [7 : 0]
little_vect [0 +: 8] // 从0 开始,升序,位宽为8 ======》》》》》
// little_vect[0 : 7]
big_vect [15 -: 8] // 从15开始,降序,位宽为8 ======》》》》》
// big_vect [15 : 8]
little_vect [15 -: 8] // 从15开始,降序,位宽为8 ======》》》》》
// little_vect[8 : 15]
生成器 generator
module top_module(
input [399:0] a, b,
input cin,
output cout,
output [399:0] sum );
reg cin2, cout2;
reg [100:0] s;
genvar i;
always @ (*) s[0] = cin;
generate
for (i = 1; i <= 100; i++) begin: gen
bcd_fadd bcd_inst (
.a(a[(i * 4 - 1)-:4]),
.b(b[(i * 4 - 1)-:4]),
.cin(s[i-1]),
.cout(s[i]),
.sum(sum[(i * 4 - 1)-:4])
);
end
endgenerate
always @ (*) cout = s[100];
endmodule