四位串行加法器:
被加数a,加数b,低位进位ci,和数s,进位co.
Verilog代码:
module cxjfq(a,b,ci,s,co);
input[3:0] a,b;
input ci;
output[3:0] s;
output co;
assign {co,s} = a+b+ci;
endmodule
仿真结果:
//4位串行进位加法器
module cy4
(
input[n-1:0]A,B,//输入端口声明
input Cin,//输入端口声明
output reg[n-1:0]SUM,//输出端口及变量的数据类型声明
output reg Cout//输出端口及变量的数据类型声明
);
parameter n = 4;
reg[n:0] C;
integer k;//声明一个整型变量
always @(A,B,Cin)
begin
C[0] = Cin;
for(k = 0;k < n; k = k + 1)
begin
SUM[k] = A[k] ^ B[k] ^ C[k];//求和
C[k+1] = (A[k] & B[k])|(A[k] & C[k])|(B[k] & C[k]);//求进位
end
Cout = C[n];//输出进位号
end
endmodule

四位串行加法器:
被加数a,加数b,低位进位ci,和数s,进位co.
Verilog代码:
module cxjfq(a,b,ci,s,co);
input[3:0] a,b;
input ci;
output[3:0] s;
output co;assign {co,s} = a+b+ci;
endmodule仿真结果:
转载于:https://www.cnblogs.com/Sagoo/p/3219234.html
Verilog——串行四位加法器和超前四位加法器74HC283
一. 串行四位加法器
设计思路
先设计出一位全加器,在根据分层次分模块设计出四位加法器。
1. 一位全加器
1.1原理
根据全加器真值表进行行为级建模。 真值表如下图所示:
1.2代码实现
1.2.1设计模块
module full_adder( input A,B,Ci, output reg S,Co); /*参数说明: 输入: A,B为一位二进制被加数,Ci为来自低位的进位 输出: S为和,Co为进位 */ always@(*) begin case({A,B,Ci}) 3'b000:begin S=0;Co=0; end 3'b001:begin S=1;Co=0; end 3'b010:begin S=1;Co=0; end 3'b011:begin S=0;Co=1; end 3'b100:begin S=1;Co=0; end 3'b101:begin S=0;Co=1; end 3'b110:begin S=0;Co=1; end 3'b111:begin S=1;Co=1; end endcase end endmodule
1.2.2测试模块
//filename:tb_fulladder.v `timescale 10ns/1ns module tb_fulladder(); reg A,B,Ci; wire S,Co; full_adder U(A,B,Ci,S,Co); initial $monitor($time,"\tA=%b,B=%b,Ci=%b,S=%b,Co=%b",A,B,Ci,S,Co); initial begin A=0;B=0;Ci=0; #5; A=1;B=0;Ci=1; #5; A=1;B=1;Ci=0; #5; $stop; end endmodule
1.3 仿真结果
2.用四个一位全加器串行成四位加法器
2.1原理
串行进位加法器。采用四个全加器构成四位数加法器。其原理图如图所示,将低位的进位输出信号接到高位的进位输出端。
2.2代码
2.2.1设计模块
module full_adder( input A,B,Ci, output reg S,Co); /*参数说明: 输入: A,B为一位二进制被加数,Ci为来自低位的进位 输出: S为和,Co为进位 */ always@(*) begin case({A,B,Ci}) 3'b000:begin S=0;Co=0; end 3'b001:begin S=1;Co=0; end 3'b010:begin S=1;Co=0; end 3'b011:begin S=0;Co=1; end 3'b100:begin S=1;Co=0; end 3'b101:begin S=0;Co=1; end 3'b110:begin S=0;Co=1; end 3'b111:begin S=1;Co=1; end endcase end endmodule module _4adder( input [3:0] A,B, input Ci, output [3:0] S, output Co); /*参数说明: 输入: A,B为四位二进制被加数,Ci为来自低位的进位 输出: S为和,Co为进位 */ wire C0,C1,C2; full_adder U0(A[0],B[0],Ci,S[0],C0); full_adder U1(A[1],B[1],C0,S[1],C1); full_adder U2(A[2],B[2],C1,S[2],C2); full_adder U3(A[3],B[3],C2,S[3],Co); endmodule
2.2.2测试模块
//filename:tb_4adder.v `timescale 10ns/1ns module tb_74HC283(); reg [3:0] A,B; reg Ci; wire [3:0] S; wire Co; /*参数说明: 输入: A,B为一位二进制被加数,Ci为来自低位的进位 输出: S为和,Co为进位 */ _74HC283 U(A,B,Ci,S,Co); initial $monitor($time,"\tA=%b,B=%b,Ci=%b,S=%b,Co=%b",A,B,Ci,S,Co); initial begin A=4'b0000;B=4'b0000;Ci=0; #5; A=4'b0000;B=4'b0000;Ci=1; #5; A=4'b1111;B=4'b1111;Ci=0; #5; A=4'b1111;B=4'b1111;Ci=1; #5; $stop; end endmodule
2.3仿真结果
二.超前四位加法器74HC283
设计思路
行为级建模加法器的功能明晰的,直接列真值表行为级建模,但是在编写过程中发现会出现这样
case({A,B,Ci}) 9'b0000_0000_0:begin S=4'b0000;Co=0; end 9'b0000_0001—0:begin S=4'b0001;Co=0; end ...... endcase
case语句会出现512条语句,显然不可取。
数据流建模:
由于串行进位加法器速度受到进位信号的限制。人们又设计出一种多位数超前进位加法逻辑电路。
定义两个中间变量:产生变量Gi,传输变量Pi。这两个变量都与进位信号无关。通过代换将各位进位信号表达为只含有Gi,Pi与Ci-1的逻辑表达式(如下),所以个位的进位信号都只与两个加数和向最低位的进位信号Ci-1有关,因此它们是可以并行产生的。
难点核心体现在这个超前进位产生电路中,上面我们知道超前进位产生电路输入和输出的逻辑表达式之后,采用数据流建模即可。
1.超前进位产生电路
1.1代码实现
1.1.1设计代码
//filename:ahead_gene_circuit.v module ahead_gene_circuit( input [3:0] P,G, input Ci, output [3:0] C); /*参数说明: 输入: P,G为定义的中间变量,产生变量Gi,传输变量Pi Ci为来自低位的进位 输出: C为各位的进位信号 */ //根据各位进位信号的逻辑表达式,进行数据流建模。 assign C[0]=G[0]|(P[0]&Ci); assign C[1]=G[1]|(P[1]&C[0]); assign C[2]=G[2]|(P[2]&C[1]); assign C[3]=G[3]|(P[3]&C[2]); endmodule
1.1.2测试代码
//filename:tb_ahead_gene_circuit.v `timescale 10ns/1ns module tb_ahead_gene_circuit(); reg [3:0] P,G; reg Ci; wire [3:0] C; ahead_gene_circuit U(P,G,Ci,C); initial $monitor($time,"\tP=%b,G=%b,Ci=%b,C=%b",P,G,Ci,C); initial begin P=4'b0000;G=4'b0000;Ci=0; #5; P=4'b1111;G=4'b1111;Ci=0; #5; P=4'b1010;G=4'b1010;Ci=0; #5; P=4'b1010;G=4'b1010;Ci=1; #5; $stop; end endmodule
1.2 仿真结果
2.应用超前进位产生电路设计出74HC283
2.1代码实现
2.1.1设计模块
//filename:ahead_gene_circuit.v module ahead_gene_circuit( input [3:0] P,G, input Ci, output [3:0] C); /*参数说明: 输入: Pi为传输信号,Gi为产生信号 Ci为对最低位的进位 输出: C为各位的进位信号 */ //根据各位进位信号的逻辑表达式,进行数据流建模。 assign C[0]=G[0]|(P[0]&Ci); assign C[1]=G[1]|(P[1]&C[0]); assign C[2]=G[2]|(P[2]&C[1]); assign C[3]=G[3]|(P[3]&C[2]); endmodule module _74HC283( input [3:0] A,B, input Ci, output [3:0] S, output Co); /*参数说明: 输入:A,B为被加数;Ci为对最低位的进位 输出:S为和,co为产生的进位信号 */ //根据中间变量的定义表示出gi和pi。 wire [3:0] P,G,C; assign P=A^B; assign G=A&B; //应用超前进位产生电路。 ahead_gene_circuit U(P,G,Ci,C); assign Co=C[3]; assign S[3]=C[2]^P[3]; assign S[2]=C[1]^P[2]; assign S[1]=C[0]^P[1]; assign S[0]=Ci^P[0]; endmodule
2.1.2测试模块
`timescale 10ns/1ns module tb2_74HC283(); reg [3:0] A,B; reg Ci; wire [3:0] S; wire Co; _74HC283 U(A,B,Ci,S,Co); initial $monitor($time,"\tA=%b,B=%b,Ci=%b,S=%b,Co=%b",A,B,Ci,S,Co); initial begin A=4'b0000;B=4'b0000;Ci=0; #5; A=4'b1111;B=4'b1111;Ci=0; #5; A=4'b1010;B=4'b1010;Ci=0; #5; A=4'b1010;B=4'b1010;Ci=1; #5; $stop; end endmodule
2.2仿真结果
三.问题与总结
1。对于两个多位二进制数,也可以直接按位或,按位异或等等,不需要对数组一个一个进行或,异或等操作。
2.仿真时,对于多位二进制数进行波形显示时,点击对用变量左侧的加号,将数据波形分开,效果更好。文章图片来自康华光编写的《电子技术基础——数字部分》
(1)计组实验8加法器——32位串行进位加法器
一、实验目的
1.掌握全加器和串行进位加法器的建模方法与验证技术。
2.掌握超前进位加法器的建模与验证技术。二、实验工具
1.Xilinx Vivado 2014.2软件。
2.Windows系统PC机。三、实验要求
1.利用Verilog HDL对全加器和串行进位加法器建模与验证。
2. 利用Verilog HDL对超前进位加法器建模与验证。四、实验内容
32位串行进位加法器:
五、代码
【试用Verilog HDL对其进行建模,编写Testbench进行仿真,进行RTL分析查看其原理图,综合后查看原理图、获得最大功耗、资源消耗和最大延迟】
1.建模如下:
module CRA_32(A,B,Cin,S,Cout); parameter N=32; input wire [N-1:0] A; input wire [N-1:0] B; input wire Cin; output wire [N-1:0] S; output wire Cout; wire [N-2:0]C; FullAdder FA0 (A[0],B[0],Cin,S[0],C[0]); FullAdder FA1 (A[1],B[1],C[0],S[1],C[1]); FullAdder FA2 (A[2],B[2],C[1],S[2],C[2]); FullAdder FA3 (A[3],B[3],C[2],S[3],C[3]); FullAdder FA4 (A[4],B[4],C[3],S[4],C[4]); FullAdder FA5 (A[5],B[5],C[4],S[5],C[5]); FullAdder FA6 (A[6],B[6],C[5],S[6],C[6]); FullAdder FA7 (A[7],B[7],C[6],S[7],C[7]); FullAdder FA8 (A[8],B[8],C[7],S[8],C[8]); FullAdder FA9 (A[9],B[9],C[8],S[9],C[9]); FullAdder FA10 (A[10],B[10],C[9],S[10],C[10]); FullAdder FA11 (A[11],B[11],C[10],S[11],C[11]); FullAdder FA12 (A[12],B[12],C[11],S[12],C[12]); FullAdder FA13 (A[13],B[13],C[12],S[13],C[13]); FullAdder FA14 (A[14],B[14],C[13],S[14],C[14]); FullAdder FA15 (A[15],B[15],C[14],S[15],C[15]); FullAdder FA16 (A[16],B[16],C[15],S[16],C[16]); FullAdder FA17 (A[17],B[17],C[16],S[17],C[17]); FullAdder FA18 (A[18],B[18],C[17],S[18],C[18]); FullAdder FA19 (A[19],B[19],C[18],S[19],C[19]); FullAdder FA20 (A[20],B[20],C[19],S[20],C[20]); FullAdder FA21 (A[21],B[21],C[20],S[21],C[21]); FullAdder FA22 (A[22],B[22],C[21],S[22],C[22]); FullAdder FA23 (A[23],B[23],C[22],S[23],C[23]); FullAdder FA24 (A[24],B[24],C[23],S[24],C[24]); FullAdder FA25 (A[25],B[25],C[24],S[25],C[25]); FullAdder FA26 (A[26],B[26],C[25],S[26],C[26]); FullAdder FA27 (A[27],B[27],C[26],S[27],C[27]); FullAdder FA28 (A[28],B[28],C[27],S[28],C[28]); FullAdder FA29 (A[29],B[29],C[28],S[29],C[29]); FullAdder FA30 (A[30],B[30],C[29],S[30],C[30]); FullAdder FA31 (A[31],B[31],C[30],S[31],Cout); endmodule module FullAdder(A,B,CarryIn,Sum,CarryOut); input wire A; input wire B; input wire CarryIn; output wire Sum; output wire CarryOut; assign Sum=A^B^CarryIn; assign CarryOut=(A&B)|(A&CarryIn)|(B&CarryIn); endmodule
2.Testbench测试文件如下:
module test; reg clk; reg [31:0] A; reg [31:0] B; reg Cin; wire Cout; wire [31:0] S; CRA_32 cra_32_0(A,B,Cin,S,Cout);//实例化 always #10 clk=~clk; initial begin clk=1'b0; A=32'h232234;B=32'h3013121;Cin=1'b0; #100;A=32'h543;B=32'h171234;Cin=1'b0; #100;A=32'h2554;B=32'h18122;Cin=1'b0; #100;A=32'h3456;B=32'h193112;Cin=1'b0; #100;A=32'h4765;B=32'h20321;Cin=1'b0; #100;A=32'h5784;B=32'h30412;Cin=1'b1; #100;A=32'h622;B=32'h40421;Cin=1'b1; #100;A=32'h7999;B=32'h5032;Cin=1'b1; #100;A=32'h8532;B=32'h630;Cin=1'b1; //其他测试用例 $finish; end endmodule
3、功能仿真波形
4、RTL分析如图
5、综合如图
6、功耗分析如表
7、资源消耗如表
8、延迟分析如表
六、总结
链接:添加链接描述
提取码:ahnu
打开文件夹里的后缀为.xpr的文件即可