FPGA学习笔记(1):使用Verilog实现常见的加法器

这篇具有很好参考价值的文章主要介绍了FPGA学习笔记(1):使用Verilog实现常见的加法器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

使用Verilog实现常见的加法器

本文使用VerilogHDL实现一些简单的加法器,本人水平有限,希望大佬能够多指证

开发环境与仿真环境

  1. Quartus Prime(18.0)
  2. Modelsim

第一种加法器件:半加器

半加器可以用于计算两个单比特二进制数的和,C表征进位输出,S表述计算的结果。

半加器的真值表

FPGA学习笔记(1):使用Verilog实现常见的加法器
化简以后的逻辑表达式可以表达为:
s = a’b+ab’
c = ab

Verilog 代码块

module half_adder 
(
	input 	IN_a,
	input 	IN_b,
	output 	s,
	output  C_o
);

assign s    = IN_a ^ IN_b ;
assign C_o  = IN_a & IN_b ;

endmodule

第二种加法器件:全加器

全加器相比于半加器考虑到了进位输入的情况,输入端口变为了a,b,cin,输入仍然是进位输出C_o以及加法运算结果s。

逻辑真值表

FPGA学习笔记(1):使用Verilog实现常见的加法器
化简以后的逻辑表达式为
S = A ^ B ^ Cin
C_o = AB + Cin(A ^ B)

Verilog程序实现

// 全加器
module full_adder 
(
	input 	IN_a,
	input 	IN_b,
	input 	IN_Ci,
	output 	s,
	output  C_o
);

assign s    = IN_a ^ IN_b ^ IN_Ci;
assign C_o  = (IN_a & IN_b) | (IN_a & IN_Ci) | (IN_b & IN_Ci);

endmodule

进行仿真测试,编写测试用例

`timescale 1 ns/ 1 ps
module full_adder_vlg_tst();
// constants                                           
// general purpose registers

// test vector input registers
reg IN_Ci;
reg IN_a;
reg IN_b;
// wires                                               
wire C_o;
wire s;

// assign statements (if any)                          
full_adder i1 (
// port map - connection between master ports and signals/registers   
	.C_o(C_o),
	.IN_Ci(IN_Ci),
	.IN_a(IN_a),
	.IN_b(IN_b),
	.s(s)
);
initial                                                
begin                                                  
// code that executes only once                        
// insert code here --> begin                          
IN_a=0;IN_b=0;IN_Ci=0;
#20;
IN_a=0;IN_b=1;IN_Ci=0;
#20;
IN_a=1;IN_b=1;IN_Ci=0;
#20;
IN_a=1;IN_b=0;IN_Ci=0;
#20;
IN_a=1;IN_b=0;IN_Ci=1;
#20;
IN_a=1;IN_b=1;IN_Ci=1;
#20; 
$stop;                                                      
// --> end                                             
                      
end                                                    
                                              
endmodule

仿真波形如下图所示:
FPGA学习笔记(1):使用Verilog实现常见的加法器
可以看出在我们设计用例下完美的满足了全加器的设计要求

第三种加法器:RCA(行波进位加法器)

以上的文章介绍了单bit加法器的实现,将每个全加器的输出进位Cout接入到下一个全加器的Cin端即可实现多Bit加法器的实现。下图展示的式16bit的行波进位加法器的结构。
FPGA学习笔记(1):使用Verilog实现常见的加法器
由上图可以看出得到进位c16的结果依赖于c15,c14,c13,…,c2,c1,c0,对于32-bit,64-bit,128-bit等加法器,进位链将显得更加长。所以,行波进位加法器设计简单,只需要级联全加器即可,但它的缺点在于超长的进位链,限制了加法器的性能。

Verilog 实现

module RCA #
(
	parameter integer width = 4 
)
(
	input  [width-1:0] A,
    input  [width-1:0] B,
    output [width-1:0] S,
     
    input  C_i,
    output C_o
);
wire [width:0] c;
genvar i;
generate
	for (i = 0; i < width; i=i+1) 
	begin :my_rca
		full_adder my_addr
		(
			.IN_a(A[i]),
			.IN_b(B[i]),
			.IN_Ci(c[i]),
			.s(S[i]),
			.C_o(c[i+1])
		);
	end
endgenerate
assign c[0]= C_i;
assign C_o = c[width];
endmodule

编写测试用例进行仿真测试

`timescale 1 ns/ 1 ps
module RCA_vlg_tst();
reg [3:0] A;
reg [3:0] B;
reg C_i;
// wires                                               
wire C_o;
wire [3:0]  S;                       
RCA i1 (
	.A(A),
	.B(B),
	.C_i(C_i),
	.C_o(C_o),
	.S(S)
);
initial                                                
begin                                                                           
A=7;B=8;C_i=0;
#20;
A=1;B=8;C_i=0;
#20;
A=1;B=2;C_i=1;
#20;
A=9;B=9;C_i=1;
#20;  
A=15;B=15;C_i=1;
#20; 
$stop;                                                                                                                
end                                                    
                                            
endmodule

仿真图像
FPGA学习笔记(1):使用Verilog实现常见的加法器

第四种加法器:超前进位加法器

对于宽度较宽的加法器来说,行波进位加法器这一加法器设计思路的缺点就显得尤为突出,因为行波进位加法器的进位输出依赖于前一级的进位,造成
有较长时间的延迟,限制了加法器的性能,对于高速处理器等将是个极大的瓶颈。所以,下面介绍的超前进位加法器优化改进行波进位器。
设计思路:
令:
FPGA学习笔记(1):使用Verilog实现常见的加法器
然后有:
FPGA学习笔记(1):使用Verilog实现常见的加法器
对于4位的LCA可以得知:
FPGA学习笔记(1):使用Verilog实现常见的加法器
根据此公式进行Verilog硬件设计:

// 生成传播信号(P)和生成信号(G)
module pg_gen 
(
	input 	A,
	input 	B,
	output  P,
	output  G
);
assign P = A ^ B;
assign G = A & B;
endmodule


module LCA #
(
	parameter integer width = 4
)
(
	input 	[width-1:0] IN_a,
	input 	[width-1:0] IN_b,
	input  				C_i, 
	output	[width-1:0] Sum,
	output  			C_o
);



wire [width-1:0] G;
wire [width-1:0] P;
wire [width:0] C;

genvar i;
generate
for (i = 0; i < width; i=i+1) 
	begin:my_lca
		pg_gen u_pg_gen
		(
			.A(IN_a[i]) ,
			.B(IN_b[i]) ,
			.P(P[i])    ,
			.G(G[i])
		);
	end
endgenerate


assign C[0] = C_i;
assign C[1] = G[0] + (C[0]&P[0]);
assign C[2] = G[1] + (G[0]&P[1]) + (C[0] & P[1] & P[0]);
assign C[3] = G[2] + (G[1]&P[2]) + (G[0] & P[2] & P[1]) + (C[0] & P[2] & P[1] & P[0]);
assign C[4] = G[3] + (G[2]&P[3]) + (G[1] & P[3] & P[2]) + (G[0] & P[3] & P[2] & P[1]) + (C[0] & P[3] & P[2] & P[1] & P[0]); 

assign C_o = C[width];


genvar k;
generate
	for( k=0; k<width; k=k+1) 
	begin:my_result
		 assign Sum[k] = P[k] ^ C[k];
	end
endgenerate

endmodule

使用的tb测试集

`timescale 1 ns/ 1 ps
module LCA_vlg_tst();
// constants                                           
// general purpose registers
// test vector input registers
reg C_i;
reg [3:0] IN_a;
reg [3:0] IN_b;
// wires                                               
wire C_o;
wire [3:0]  Sum;

// assign statements (if any)                          
LCA i1 (
// port map - connection between master ports and signals/registers   
	.C_i(C_i),
	.C_o(C_o),
	.IN_a(IN_a),
	.IN_b(IN_b),
	.Sum(Sum)
);
initial                                                
begin                                                  
// code that executes only once                        
// insert code here --> begin                          
IN_a = 5;IN_b = 5; C_i = 0;
#40;
IN_a = 15;IN_b = 15; C_i = 0;
#40;
IN_a =  9;IN_b = 6; C_i = 1;
#40; 
IN_a =  7;IN_b = 8; C_i = 1;
#40; 
IN_a =  1;IN_b = 2; C_i = 1;
#40;                                                    
// --> end                                             
//$display("Running testbench");                       
end                                                    
                                             
endmodule

仿真波形
FPGA学习笔记(1):使用Verilog实现常见的加法器
可以看出完成了设计需求
参考资料
1.参考资料\超前进位加法器原理与设计文章来源地址https://www.toymoban.com/news/detail-488964.html

到了这里,关于FPGA学习笔记(1):使用Verilog实现常见的加法器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [FPGA]用Verilog写一个简单三位二进制加法器和减法器

    加法器和减法器是数字电路中的基本组件,它们可以对二进制数进行算术运算。加法器可以将两个或多个二进制数相加,得到一个和和一个进位。减法器可以将两个二进制数相减,得到一个差和一个借位。加法器和减法器可以用来实现更高级的运算,例如乘法、除法、移位等

    2024年02月04日
    浏览(36)
  • 【FPGA】Verilog:模块化组合逻辑电路设计 | 半加器 | 全加器 | 串行加法器 | 子模块 | 主模块

    前言: 本章内容主要是演示Vivado下利用Verilog语言进行电路设计、仿真、综合和下载 示例:加法器   ​ 功能特性: 采用 Xilinx Artix-7 XC7A35T芯片  配置方式:USB-JTAG/SPI Flash 高达100MHz 的内部时钟速度  存储器:2Mbit SRAM   N25Q064A SPI Flash(样图旧款为N25Q032A) 通用IO:Switch :

    2024年02月15日
    浏览(34)
  • Verilog实现超前进位加法器

    在CPU等对性能要求较高的电路中,一般都会采用超前进位加法器,因为超前进位加法器的延时相对来说比较小。下面讲述超前进位加法器的原理: 我们知道,一个三输入,二输出的全加器,其逻辑关系为 S = A ⊕ B ⊕ C i n S=Aoplus Boplus C_{in} S = A ⊕ B ⊕ C in ​ C o u t = ( A B ) ∣

    2023年04月08日
    浏览(26)
  • 数字IC经典电路(1)——经典加法器的实现(加法器简介及Verilog实现)

    加法器是数字系统最基础的计算单元,用来产生两个数的和,加法器是以二进制作运算。负数可用二的补数来表示,减法器也是加法器,乘法器可以由加法器和移位器实现。加法器和乘法器由于会频繁使用,因此加法器的速度也影响着整个系统的计算速度。对加法器的设计也

    2024年02月14日
    浏览(38)
  • 各种加法器的比对分析与Verilog实现(1)

            接下来几篇博客,我将介绍常见的几种加法器设计,包括超前进位、Kogge-Stone、brent-kung、carry-skip、Conditional-Sum等加法器的原理及Verilog实现。        本文将介绍行波进位加法器、超前进位加法器的原理及Verilog实现。 1.1 原理        从下方原理图即可看出,

    2024年02月08日
    浏览(34)
  • 各种加法器的比对分析与Verilog实现(2)

          本文将介绍Kogge-Stone加法器和brent-kung加法器的原理,在下一篇博客中我将用Verilog进行实现。 目录 1. 并行前缀加法器(Parallel-Prefix Adder, PPA)  2. Kogge-Stone加法器原理 3. brent-kung加法器原理        为了减少AND门的深度,PPA对CLA进行了进一步优化。不过PPA和CLA进行的计算

    2024年02月07日
    浏览(39)
  • verilog数组的定义、转换和加法器的实现

    看了别人的博客有的人也称reg [31:0] add0[0:12]这样的数组为二维数组,其实中二维数组不是真正意义上的数组,而是由多个寄存器组成的ROM或者RAM。我觉得这样理解好记一点:这个是一维数组,一共有0到12共13组数据,每组数据的宽度是0到31一共32个位宽。 优势:简单易于编程

    2024年02月11日
    浏览(31)
  • FPGA加法器实现与资源消耗-四位数加法器

    测试在实现半加器和全加器的基础上开始实现多位数的加法器 可以按照一位全加器,然后循环实现多位加法器。 相加正确,功能正确。 可能看不太清,但是基本就是按照与、或、异或进行连接,而且是串行实现的。 分析可知,工具使用两个查找表(SUM[0]_INST_0,SUM[1]_INST_0)实

    2024年02月03日
    浏览(34)
  • Verilog 加法器/减法器

    目录 1位加法器 8位加法器 8位补码加减法器  32位补码加减法器       

    2024年02月11日
    浏览(30)
  • 【verilog】6位二进制数加法器

    1:掌握无符号二进制数加法器的设计方法。 2:掌握使用Modelsim对verilog程序进行仿真和验证的方法。 二进制加法器由全加器构成,全加器功能和电路图如下图所示。 全加器对两个1位二进制数和1位来自低位的进位做加法运算,产生1位和和1位向更高位的进位。图中(a)是全加

    2024年02月06日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包