本文梳理了三种写法,直接上代码
第一种:
module adder(
input [7:0] num1,//输入的加数num1
input [7:0] num2,//输入的加数num2
input cin ,//第0位进位输入
output cout,//第7位进位输出
output [7:0] s ,//8位的本位的和
output [8:0] sum //当num1=8'b1111_1111;num2=8'b1111_1111;
);
wire [8:0] cin_temp;//定义一个进位信号cin_temp
assign cin_temp[0] = cin;
//generate:当需要去循环调用实例化模块的时候使用generate-endgenerate;generate中整形变量用genvar去定义
genvar i;//定义一个整形变量i
generate
for(i=0;i<8;i=i+1)begin : my_adder
full_add u_full_add(
/*input */.x (num1[i] ),
/*input */.y (num2[i] ),
/*input */.cin (cin_temp[i] ),//上一位的进位
/*output */.c (cin_temp[i+1] ),//本位进位
/*output */.s (s[i] ) //本位和
);
end
endgenerate
//输出
assign cout = cin_temp[8];
assign sum = {cout,s};
endmodule
第二种:
module adder(
input [7:0] num1,//输入的加数num1
input [7:0] num2,//输入的加数num2
input cin ,//第0位进位输入
output cout,//第7位进位输出
output [7:0] s ,//8位的本位的和
output [8:0] sum //当num1=8'b1111_1111;num2=8'b1111_1111;
);
wire [8:0] cin_temp;
//第一个全加器(第0位)
assign cin_temp[0] = cin;
assign {cin_temp[1],s[0]} = num1[0] + num2[0] + cin_temp[0];//第1个全加器
assign {cin_temp[2],s[1]} = num1[1] + num2[1] + cin_temp[1];//第2个全加器
assign {cin_temp[3],s[2]} = num1[2] + num2[2] + cin_temp[2];//第3个全加器
assign {cin_temp[4],s[3]} = num1[3] + num2[3] + cin_temp[3];//第4个全加器
assign {cin_temp[5],s[4]} = num1[4] + num2[4] + cin_temp[4];//第5个全加器
assign {cin_temp[6],s[5]} = num1[5] + num2[5] + cin_temp[5];//第6个全加器
assign {cin_temp[7],s[6]} = num1[6] + num2[6] + cin_temp[6];//第7个全加器
assign {cin_temp[8],s[7]} = num1[7] + num2[7] + cin_temp[7];//第8个全加器
//输出
assign cout = cin_temp[8];
assign sum = {cout,s};
endmodule
第三种
module adder(
input [7:0] num1,//输入的加数num1
input [7:0] num2,//输入的加数num2
input cin ,//第0位进位输入
output cout,//第7位进位输出
output reg [7:0] s ,//8位的本位的和
output [8:0] sum //当num1=8'b1111_1111;num2=8'b1111_1111;
);
reg [8:0] cin_temp;
integer j;
always @(*) begin
cin_temp[0] = cin;
for ( j=0 ;j<=7;j=j+1) begin
{cin_temp[j+1],s[j]} = num1[j] + num2[j] + cin_temp[j];
end
end
assign cout = cin_temp[8];
assign sum = {cout,s};
endmodule
TESTBENCH
`timescale 1ns/1ns
module adder_tb();
//激励信号定义
reg [7:0] num1;
reg [7:0] num2;
reg cin ;
//输出信号定义
wire cout;
wire [7:0] s ;
wire [8:0] sum ;
//模块例化
adder adder_inst(
/*input [7:0] */.num1(num1 ),//输入的加数num1
/*input [7:0] */.num2(num2 ),//输入的加数num2
/*input */.cin (cin ),//第0位进位输入
/*output */.cout(cout ),//第7位进位输出
/*output [7:0] */.s (s ),//8位的本位的和
/*output [8:0] */.sum (sum ) //当num1=8'b1111_1111;num2=8'b1111_1111;
);
initial begin
#20;
num1 = 8'd0;//8'b0000_0000
num2 = 8'd0;
cin = 'd0;
#50;
repeat(100) begin
num1 = {$random}%256;
num2 = {$random}%256;
cin = 0;
#100;
end
num1 = 8'd0;//8'b0000_0000
num2 = 8'd0;
cin = 'd0;
#1000;
end
endmodule