行波进位加法器
行波进位加法器
行波进位加法器实验报告
一、实验目的:
1、掌握行波进位加法器的原理
2、熟悉verilog语言
3、了解quartus II的使用方法。
二、实验内容:
用verilog语言实现8位行波进位加法器。
三、实验结果:
方案2中的步骤:
模块add _8(a、b、Cin、Sum、Cout、out );
input [7:0] A,b;
输入CIN;
output [7:0] Sum;
输出计数;
output [7:1] out;
wire [7:0] Sum;
wire Cout;
wire [7:1] out;
addadd1(a[0],B[0],Cin,Sum[0],out[1];
addadd2(a[1]、B[1]、out[1]、Sum[1]、out[2];
addadd3(a[2]、B[2]、out[2]、Sum[2]、out[3];
addadd4(a[3]、B[3]、out[3]、Sum[3]、out[4];
addadd5(a[4]、B[4]、out[4]、Sum[4]、out[5];
addadd6(a[5]、B[5]、out[5]、Sum[5]、out[6];
addadd7(a[6]、B[6]、out[6]、Sum[6]、out[7];
addadd8(a[7]、B[7]、out[7]、Sum[7]、Cout );
最终模块
模块添加(a、b、cin、sum、cout );
输入a,b;
输入CIN;
输出和;
输出计数;
reg sum;
reg cout;
always@(* ) ) )。
比根
if () aBCIN==1)aBCIN==3) )
sum=1'b1;
else sum=1'b0;
(if(aBCIN )=2) ) ) ) ) ) ) ) ) ) ) ) )。
cout=1'b1;
else cout=1'b0;
结束
最终模块
方案2的功能模拟
方案3步骤:
模块添加_8(a、b、Cin、Sum、Cout );
input [7:0] A,b;
输入CIN;
output [7:0] Sum;
输出计数;
reg [7:0] Sum;
reg Cout;
reg [8:0] out;
参数大小=7;
integer i;
always@(* ) ) )。
比根
out[0]=Cin;
for(I=0; i=size; i=i 1)
add(a[I],B[i],out[i],Sum[i],out[i 1];
结束
任务添加;
输入a、b、cin;
输出和,cout;
比根
if () aBCIN==1)aBCIN==3) )
sum=1'b1;
else sum=1'b0;
(if(aBCIN )=2) ) ) ) ) ) ) ) ) ) ) ) )。
cout=1'b1;
else cout=1'b0;
结束
结束任务
always @(out[8] )
Cout=out[8]
最终模块
方案3的功能模拟
四、实验结果分析:
案一,我选择了使用模块嵌套。 也就是说,首先实现了一位全加器add,然后在顶级模块add_8中调用add_8次,经过老师的点击,选择使用for循环调用add。 但是,如果在for循环中调用add次,则必须为每个实例化模块命名,但在verilog语言中还不能使用字符串数组。 所以这个方案没有成功。
因为方案2、方案1无法使用for循环对调用的每个模块进行实例化命名,所以我们认为必须放弃for循环,按顺序写要调用的模块。 毕竟这个方案成功了,但是缺点太复杂了,实现8位的东西也可以勉强写8
个实例化模块,如果
写64位的东西是绝对不可取的。
方案三,我还分析了方案一失败的原因,不能实例化模块调用,要调用task吗? 由于调用task不需要赋予任务生命,因此我们尝试用相应的task调用替换了方案1中的模块调用。 毕竟,这种方法是可取的,而且比方案2更简单,在处理多位全加法器时特别有用,所以我最终选择了方案3。
五、实验心得:
通过这次实验,我得到了贝瑞洛