题目1:通过实例化 100 个完整加法器来创建一个 100 位二进制纹波进位加法器。加法器将两个 100 位数字和一个进位相加,以生成 100 位总和并执行。为了鼓励您实际实例化完整加法器,还要在纹波加法器中输出每个完整加法器的执行。cout[99]是最后一个完整加法器的最终执行,也是您通常看到的执行。
根据题目要求,由于是100位二进制数相加,参数量很大,这道题可用generate语句来实现。
generate语法拓展:
generate语句主要有generate_for,generate_if 和generate_case三种语句。其中generate _if 和generate_case语句所表达的意思是一样的。
- generate_for:首先使用genvar定义一个正整数变量,用来作为for循环中的变量,一般用i来表示。其次将需要复制的语句写到begin...end的模块中去。需要注意到的是begin...end模块必须为有名块,方便在代码中调用。
genvar i;//i为正整数变量
generate for()
begin:eg //begin...end的名字为eg
//需要复制的语句
end
endgenrate
- generate_if和generate_case :这两者的语句不需要定义genvar语句,在电路中相当于判断电路。
generate
if(//判断表达式)
//判断表达式为1的被执行语句
else if(//判断表达式)
//判断表达式为1的被执行语句
else
endgenerate
generate
case(//控制表达式)
值1: 语句块1;
值2: 语句块2;
...
值n: 语句n;
default: 语句n+1;
endcase
endgenerate
根据题目要求可知:该加法器的总和sum为两个100位数字和一个进位相加,cout为高位进位,cin为低位进位。由此可得代码如下:
module top_module(
input [99:0] a, b,
input cin,
output [99:0] cout,
output [99:0] sum );
genvar i;//通过genvar申明for循环需要用到的正整数i
generate for(i=0;i<100;i=i+1)
begin:add100
if(i==0)
assign {cout[0],sum[0]} = a[0] + b[0] + cin;
else
assign {cout[i],sum[i]} = a[i] + b[i] + cout[i-1];
end
endgenerate
endmodule
仿真结果:
题目2:您将获得一个名为 bcd_fadd 的 BCD bit加法器,该加法器将两个 BCD 数字相加并进位,并生成总和并执行。实例化 100 个bcd_fadd,以创建一个 100 位 BCD 纹波加法器。您的加法器应添加两个 100 位 BCD 编号(打包到 400 位向量中)和进位,以生成 100 位总和并执行。
module bcd_fadd (
input [3:0] a,
input [3:0] b,
input cin,
output cout,
output [3:0] sum );
分析:题目给出已经定义好的模块:module bcd_fadd。要求利用该模块实例化100个bcd_fadd,创建一个100位的BCD纹波加法器。根据上面所给的模块可知,输入a和b的位宽都为4,输出sum位宽也为4。
使用generate语句进行循环复制:
module top_module(
input [399:0] a, b,
input cin,
output cout,
output [399:0] sum );
wire [99:0]c1;
genvar i;
generate for(i=0;i<100;i=i+1)
begin:bcdadd100
if(i==0)
bcd_fadd u1(.a(a[3:0]),.b(b[3:0]),.cin(cin),.cout(c1[0]),.sum(sum[3:0]));
else
bcd_fadd u2(.a(a[4*i+3:4*i]),.b(b[4*i+3:4*i]),.cin(c1[i-1]),.cout(c1[i]),.sum(sum[4*i+3:4*i]));
end
assign cout = c1[99];
endgenerate
endmodule
仿真结果: