上海大学verilog设计32位浮点加法器设计
VLSI电路系统与设计_32bit移位相加乘法器
《VLSI电路系统与设计》课程设计报告——32bit_32bit移位相加乘法器A 移位相加乘法器原理无符号二进制移位相加乘法器的基本原理是通过逐项移位相加来实现相乘的,从被乘数的最低为开始,若为1,则乘法左移后与上一次的和相加;若为0,左移后以全零相加,直至被乘数的最高位。
以下以4位二进制数为例进行说明:图1 移位相加乘法器原理图如图所示,就可以实现4位二进制数的相乘。
B 电路结构方案根据移位相加乘法器的基本原理,可以将整个电路划分为四个部分:32右移寄存器,32位加法器,乘1模块,64位锁存器。
原理框图如下所示:图2 移位相加乘法器原理框图在上图中,START信号的上跳沿及其高电平有两个功能,即32位寄存器清零和被乘数A[32:0]向移位寄存器SREG32B加载;它的低电平则作为乘法使能信号。
CLK为乘法时钟信号。
当被乘数被加载于32位右移寄存器SREG32B后,随着每一时钟节拍,最低位在前,由低位至高位逐位移出。
当为1时,与门ANDARITH打开,32位乘数B[32:0]在同一节拍进入32位加法器,与上一次锁存在64位锁存器REG16B中的高32位进行相加,其和在下一时钟节拍的上升沿被锁进此锁存器。
而当被乘数的移出位为0时,与门全零输出。
如此往复,直至32个时钟脉冲后,乘法运算过程中止。
此时REG64B的输出值即为最后的乘积。
此乘法器的优点是节省芯片资源,它的核心元件只是一个32位加法器,其运算速度取决于输入的时钟频率。
一、32位加法器模块的设计加法器模块是由8个四位全加器构成的,4位全加器是采用1位全加器构成的。
对于1位全加器,采用门级描述语言,使用了3个异或门和2个与门来实现的。
(1)1位加法器是采用门级描述语言,生成的库文件如图:仿真结果:图1 功能仿真图2 时序仿真(2)32位全加器32位全加器是采用8个4位全加器构成的,其电路原理图如下:图3-32位全加器原理图仿真结果:图4 功能仿真图5 时序仿真由以上的仿真结果可以看出,所设计电路在在功能上能满足要求,在时序上存在一定的时间延迟。
32位浮点加法器设计
32位浮点加法器设计32位浮点加法器是一种用于计算机中的算术逻辑单元(ALU),用于执行浮点数的加法运算。
它可以将两个32位浮点数相加,并输出一个32位的结果。
设计一个高效的32位浮点加法器需要考虑多个方面,包括浮点数的表示形式、运算精度、舍入方式、运算逻辑等。
下面将详细介绍32位浮点加法器的设计。
1.浮点数的表示形式:浮点数通常采用IEEE754标准进行表示,其中32位浮点数由三个部分组成:符号位、阶码和尾数。
符号位用来表示浮点数的正负,阶码用来表示浮点数的指数,尾数用来表示浮点数的小数部分。
2.运算精度:在浮点数加法运算中,精度是一个重要的考虑因素。
通常,浮点数加法器采用单精度(32位)进行设计,可以处理较为广泛的应用需求。
如果需要更高的精度,可以考虑使用双精度(64位)浮点加法器。
3.舍入方式:浮点数加法运算中,结果通常需要进行舍入处理。
常见的舍入方式有以下几种:舍入到最近的偶数、舍入向上、舍入向下、舍入到零。
具体的舍入方式可以根据应用需求来确定。
4.运算逻辑:浮点数加法运算涉及到符号位、阶码和尾数的加法。
首先,需要判断两个浮点数的阶码大小,将较小的阶码移到较大的阶码对齐,并相应调整尾数。
然后,将尾数进行相加并进行规格化处理。
最后,根据求和结果的大小,进行溢出处理和舍入操作。
在32位浮点加法器的设计中,还需要考虑到性能和效率。
可以采用流水线技术来提高运算速度,将加法运算划分为多个阶段,并在每个阶段使用并行处理来加速运算。
此外,还可以使用硬件加速器和快速逻辑电路来优化运算过程。
总结起来,设计一个高效的32位浮点加法器需要考虑浮点数的表示形式、运算精度、舍入方式、运算逻辑以及性能和效率。
在实际设计中,还需要根据具体应用需求进行功能扩展和优化。
通过合理的设计和调优,可以实现高性能的浮点加法器,满足不同应用场景的需求。
基于Verilog HDL的32位分频计数器的设计
分频计数器的基本原理
• 选择合适频率的晶振,然后对其分频,得到 系统需要的时钟频率,再对这一频率时钟进行计 数据。一般的计数器都有输入时钟信号,这里以 晶振的输出时钟作为分频计数据器的输入时钟 CLK。复位信号对各信号进行复位。片选信号用 于选通芯片,以备读写计数值。写信号用于写计 数初始值。读信号用于读取计数值。地址信号 ADDR决定读写计数值的高位还是低位。CLKl为 分频输出的时钟信号。c为输出的进位信号。 DATA为双向数据信号+当系统为分频计数器写 入初始值时是输入,当系统读取计数值时是输出。
基于Verilog HDL的32位分频计 数器的设计
微电子 高翔
Verilog HDL的优点
• Verilog HDL是一种通用的硬件描述语言,易 • 学易用
• Verilog HDL允许在同一个电路模型内进行不 • 同抽象层次的描述
• Verilog HDL 绝大多数流行的综合工具都支持
• 所有的制造厂商都提供用于Verilog HDL综合 • 之后的逻辑仿真的元件库
原理图
实现功能综合
程序仿真
总结
• 首先本文介绍了硬件描述语言的发展状况,并对国内发展 提出了建议,然后对本
• 文要用的硬件语言VerilogHDL进行了详细介绍,并对仿真 所用的软件进行了介
•
绍。
• 其次介绍了32位分频器计数器的原理,并介绍了其它的 分频器,讨论了优缺点,
• 并且详细介绍了本文所用的分频计数器的原理和介绍、分 析。
HDL语言的发展。基于Verilog HDL的优越性,IEEE于
计算机设计与实践——32位先行进位加法器
input [4:1]g;
input c0;
output [4:1]c;
assign c[1]=g[1]|p[1]&c0;
assign c[2]=g[2]|p[2]&g[1]|p[2]&p[1]&c0;
assign c[3]=g[3]|p[3]&g[2]|p[2]&p[3]&g[1]|p[3]&p[2]&p[1]&c0;
wire [4:1]p;
wire [4:1]g;
jiafaqi_4 alu_4_来自(g[1],p[1],f16[4:1],x16[4:1],y16[4:1],cii);
jiafaqi_4 alu_4_2(g[2],p[2],f16[8:5],x16[8:5],y16[8:5],c[1]);
jiafaqi_4 alu_4_3(g[3],p[3],f16[12:9],x16[12:9],y16[12:9],c[2]);
assign c[4]=g[4]|p[4]&g[3]|p[4]&p[3]&g[2]|p[4]&p[3]&p[2]&g[1]|p[4]&p[3]&p[2]&p[1]& c0;
endmodule
精选2021版课件
6
测试代码:
module test;
reg [32:1] x32;
reg [32:1] y32;
精选2021版课件
3
module alu_16(gmm,pmm,f16,x16,y16,cii);//16位加法器先行进位加法器
input [16:1]x16;
input [16:1]y16;
上海大学verilog设计32位浮点加法器设计
32位浮点加法器设计摘要:浮点数具有数值范围大,表示格式不受限制的特点,因此浮点数的应用是非常广泛的。
浮点数加法运算比较复杂,算法很多,但是为了提高运算速度,大部分均是基于流水线的设计结构。
本文介绍了基于IEE754标准的用Verilog 语言设计的32位浮点加法器,能够实现32位浮点数的加法运算。
虽然未采用流水线的设计结构但是仍然对流水线结构做了比较详细的介绍。
关键字:浮点数,流水线,32位浮点数加法运算,Verilog 语言设计32-bit floating point adder designCao Chi,Shen Jia- qi,Zheng Yun-jia(School of Mechatronic Engineering and Automation, Shanghai University, Shanghai ,China ) Abstract://沈佳琪搞定Key words :float; Assembly line; 32-bit floating-point adder 浮点数的应用非常广泛,无论是在计算机还是微处理器中都离不开浮点数。
但是浮点数的加法运算规则比较复杂不易理解掌握,而且按照传统的运算方法,运算速度较慢。
因此,浮点加法器的设计采用了流水线的设计方法。
32位浮点数运算的摄入处理采用了IEE754标准的“0舍1入”法。
1. 浮点数的介绍在处理器中,数据不仅有符号,而且经常含有小数,即既有整数部分又有小数部分。
根据小数点位置是否固定,数的表示方法分为定点表示和浮点表示。
浮点数就是用浮点表示法表示的实数。
浮点数扩大了数的表示范围和精度。
浮点数由阶符、阶码E 、数符、尾数N 构成。
任意一个二进制数N 总可以表示成如下形式:N=。
通常规定:二进制浮点数,其尾数数字部分原码的最高位为1,叫作规格化表示法。
因此,扩大数的表示范围,就增加阶码的位数,要提高精度,就增加尾数的位数。
基于与非门和D触发器的32位加法器的FPGA设计
基于与非门和D触发器的32位加法器【摘要】这次的课程设计的任务是设计一个输入范围为-(230-1)~(230-1)的加法器。
利用拨码开关输入二进制补码,再将二进制补码转化为串行信号,经过一位全加器后得到计算结果,再将计算结果转化为并行信号输出,并利用LED灯显示计算结果的二进制补码。
本次设计通过开关的闭合和断开来代表电平的高低,继而代表代表1和0来输入所要计算的十进制数的补码。
将并行输入转化为串行输出的模块和将串行输入转化为并行输出的模块是由与非门和D触发器构成的移位寄存器。
但是,这样并不能保证输出的稳定,所以我们在串入并出的移位寄存器的每个输出后面各加了一个D触发器,只有当32位补码全部并出时,D触发器才会触发,将结果显示,其余时候D触发器将保持上一个输出结果。
这样就能确保计算结果的稳定显示。
而控制并入串出信号的加载和最后结果稳定显示的控制电路是由与非门和D触发器构成的模32计数器,每次计32个时钟上升沿时便会产生一个上升沿。
用来控制移位寄存器移位动作和计数器的时钟信号,是由NE555电路产生的1KHz的脉冲信号。
【关键词】32位加法器:移位寄存器;计数器;NE555一、设计目的与要求1、设计目的1)掌握计数器、移位寄存器的电路设计与工作原理。
2)学会分析各模块之间的时延关系,并调节各个模块之间的时延关系。
3)掌握信号并入串出和串入并出的工作原理。
4)了解时钟信号的产生。
2、设计要求设计一个输入范围为-(230-1)~(230-1)的加法器。
具体要求如下:1)只能使用与非门和D触发器。
2)用两组拨码开关分别输入两个加数的二进制补码。
3)用二极管稳定显示计算结果的二进制补码。
4)利用Multisim设计仿真。
二、设计思路我们将加法器可以分为3级:第一级是并入串出模块;第二级是加法运算模块(一位全加器);第三级是串入并出模块。
第一级模块负责将拨码快关的并行输入转化为串行输出,作为第二级输入,输入到第二级加法运算模块,得到一个串行输出的计算结果,将该结果作为第三级输入,再由第三级模块转化为并行输出,最后由LED显示。
数字系统设计32位进位选择加法器设计
1、12进位选择加法器原理图32位进位选择加法器原理图仅仅是将12位进位选择加法器原理图中虚线框内的模块再向后重复5次,这就构成了32位进位选择加法器原理图。
2、Verilog模块根据上图可以将进位选择加法器在结构上分为四个模块:①四位先行进位加法器adder_4bits②四位数据选择器mux_2to1③高四位选择加法器(虚线框内部分)adder_high_4bits④顶层设计32位进位选择加法器adder_32_bits3、Verilog代码# 四位先行进位加法器module adder_4bits(a,b,s,ci,co);parameter N=4;input[N-1:0] a;input[N-1:0] b;input ci;output[N-1:0] s;output co;wire [N-1:0] c;wire [N-1:0] g;wire [N-1:0] p;assign g=a&b;assign p=a|b;assign c[0]=g[0]||(p[0]&&ci);assign c[1]=g[1]||(p[1]&&g[0])||(p[1]&&p[0]&&ci);assign c[2]=g[2]||(p[2]&&g[1])||(p[2]&&p[1]&&g[0])||(p[2]&&p[1]&&p[0]&&ci);assignc[3]=g[3]||(p[3]&&g[2])||(p[3]&&p[2]&&g[1])||(p[3]&&p[2]&&p[1]&&g[0])||(p[3]&&p[2]&&p[1]&&p[0]&&ci);assign s[0]=p[0]&~g[0]^ci;assign s[1]=p[1]&~g[1]^c[0];assign s[2]=p[2]&~g[2]^c[1];assign s[3]=p[3]&~g[3]^c[2];assign co=c[3];endmodule# 四位数据选择器module mux_2to1 (out,in0,in1,sel);parameter N=4;output[N:1] out;input[N:1] in0,in1;input sel;assign out=sel?in1:in0;endmodule# 高四位选择加法器module adder_high_4bits(a,b,ci,co,s);parameter N=4;input[N-1:0] a;input[N-1:0] b;input ci;output[N-1:0] s;output co;wire [N-1:0] sum1,sum0;wire co1,co0,cand;adder_4bits #(4) adder_1(.a(a),.b(b),.s(sum1),.ci(1'b1),.co(co1)); adder_4bits #(4) adder_2(.a(a),.b(b),.s(sum0),.ci(1'b0),.co(co0)); mux_2to1 #(4) mux1(.in0(sum0),.in1(sum1),.sel(ci),.out(s)); and G1(cand,ci,co1);or G2(co,cand,co0);endmodule# 顶层设计32位进位选择加法器module adder_32bits(a,b,s,ci,co);parameter N=32;input [N-1:0] a;input [N-1:0] b;input ci;output [N-1:0] s;output co;wire co1,co2,co3,co4,co5,co6,co7;adder_4bits #(4) adder1(.a(a[3:0]),.b(b[3:0]),.ci(ci),.s(s[3:0]),.co(co1));adder_high_4bits #(4) adder2(.a(a[7:4]),.b(b[7:4]),.ci(co1),.s(s[7:4]),.co(co2));adder_high_4bits #(4) adder3(.a(a[11:8]),.b(b[11:8]),.ci(co2),.s(s[11:8]),.co(co3));adder_high_4bits #(4) adder4(.a(a[15:12]),.b(b[15:12]),.ci(co3),.s(s[15:12]),.co(co4));adder_high_4bits #(4) adder5(.a(a[19:16]),.b(b[19:16]),.ci(co4),.s(s[19:16]),.co(co5));adder_high_4bits #(4) adder6(.a(a[23:20]),.b(b[23:20]),.ci(co5),.s(s[23:20]),.co(co6));adder_high_4bits #(4) adder7(.a(a[27:24]),.b(b[27:24]),.ci(co6),.s(s[27:24]),.co(co7));adder_high_4bits #(4) adder8(.a(a[31:28]),.b(b[31:28]),.ci(co7),.s(s[31:28]),.co(co)); endmodule4、仿真结果①四位先行进位加法器进行仿真,结果如下如图所示,a=0101,b=1010,ci=1;sum=0000,cout=1;仿真正确。
用Verilog+HDL语言设计分频器和32位计数器
i<i+1l
end
cs)∥有片选信号
end endrnodule
begin if(addr)
aceuh<2data}
该模块已通过软件仿真,符合设计要求。并已将程序下载到FPGA芯片,在电路板上与 系统进行联调,已证明设计达到预期功能,正式投入使用。
参 考 文 献
1夏宇闻.复杂数字电路与系统的VerilogHDL设计技术.北京t北京航空航天大学出版杜,1999.1—86 2阎石鼓字电子技术基础.北京:高等教育出版社.1 997.224--295 3束万焘·罗 车,吴顺军.CPI,D技术及其盥用西安:西安电子科技大学出版社,1999.30】oo
end end
output
elkl.c}//输出时钟和计数进位信号
j
wirte[15
reg
பைடு நூலகம்
O]data—reg·dataI
c,clkl{
if(i>=119) 计数值的高16位数和低
begin
∥对输人时钟进行J20分频
reg[1 5:O]aceub.aecul;
1
6位数
j<=0; clkl<=~clkl;
第23卷第6期 2002年1 1月
微计算机应用
MICROCOMPUTER APPLICATIONS
Vol
23.N。.6
Nov-,2002
用Ver|log
HDL语言设计分频器和32位计数器
谈艳云 罗志强
100083)
仍局
(北京航空航天大学电子工程东北京
擅要t介绍一种软件实现分频器和32位计数器的设计思路.即采用大规模可编程逻辑芯片.
+PLUS
II仿真正是一种实用的EDA软件,它具有原理图输入和文本输入(采用硬件描述语
32位浮点加法器设计
32位浮点加法器设计一、基本原理浮点数加法运算是在指数和尾数两个部分进行的。
浮点数一般采用IEEE754标准表示,其中尾数部分采用规格化表示。
浮点加法的基本原理是将两个浮点数的尾数对齐并进行加法运算,再进行规格化处理。
在加法运算过程中,还需考虑符号位、指数溢出、尾数对齐等特殊情况。
二、设计方案1. 硬件实现方案:采用组合逻辑电路实现浮点加法器,以保证运算速度和实时性。
采用Kogge-Stone并行加法器、冒泡排序等技术,提高运算效率。
2.数据输入:设计32位浮点加法器,需要提供两个浮点数的输入端口,包括符号位、指数位和尾数位。
3.数据输出:设计32位浮点加法器的输出端口,输出相加后的结果,包括符号位、指数位和尾数位。
4.控制信号:设计合适的控制信号,用于实现指数对齐、尾数对齐、规格化等操作。
5.流程控制:设计合理的流程控制,对各个部分进行并行和串行处理,提高加法器的效率。
三、关键技术1. Kogge-Stone并行加法器:采用Kogge-Stone并行加法器可以实现多位数的并行加法运算,提高运算效率。
2.浮点数尾数对齐:设计浮点加法器需要考虑浮点数尾数的对齐问题,根据指数大小进行右移或左移操作。
3.溢出判断和处理:浮点加法器需要判断浮点数的指数是否溢出,若溢出需要进行调整和规格化。
4.符号位处理:设计浮点加法器需要考虑符号位的处理,确定加法结果的符号。
四、性能评价性能评价是衡量浮点加法器设计好坏的重要指标。
主要从以下几个方面进行评价:1.精度:通过与软件仿真结果进行比较,评估加法器的运算精度,误差较小的加法器意味着更高的性能。
2.速度:评估加法器的运行速度,主要考虑延迟和吞吐量。
延迟越低,意味着加法器能够更快地输出结果;吞吐量越高,意味着加法器能够更快地处理多个浮点加法运算。
3.功耗:评估加法器的功耗情况,低功耗设计有助于提高整个系统的能效。
4.面积:评估加法器的硬件资源占用情况,面积越小意味着设计更紧凑,可用于片上集成、嵌入式系统等场景。
verilog-32位浮点加法器程序及代码解释
verilog-32位浮点加法器程序及代码解释module flowadd(ix, iy, clk, a_en, ost,oz);input ix, iy, clk, a_en;output oz, ost;wire[31:0] ix,iy;reg[31:0] oz;wire clk,ost,a_en;reg[25:0] xm, ym, zm;reg[7:0] xe, ye, ze;reg[2:0] state;parameter start=3'b000,zerock=3'b001,exequal=3'b010,addm=3'b011,infifl=3'b100,over =3'b110; assign ost = (state == over) ? 1 : 0; /*后端处理,输出浮点数*/always@(posedge ost)beginif(a_en)oz <= {zm[25],ze[7:0],zm[22:0]};endalways@(posedge clk) //状态机begincase(state)start: //前端处理,分离尾数和指数,同时还原尾数beginxe <= ix[30:23];xm <= {ix[31],1'b0,1'b1,ix[22:0]};ye <= iy[30:23];ym <= {iy[31],1'b0,1'b1,iy[22:0]};state <= zerock;endzerock:beginif(ix == 0)begin{ze, zm} <= {ye, ym};state <= over;endelseif(iy == 0)begin{ze, zm} <= {xe, xm};state <= over;endelsestate <= exequal;endexequal: //指数处理,使得指数相等beginif(xe == ye)state <= addm;elseif(xe > ye)beginye <= ye + 1;ym[24:0] <= {1'b0, ym[24:1]};if(ym == 0)beginzm <= xm;ze <= xe;state <= over;endelsestate <= exequal;endelsebeginxe <= xe + 1;xm[24:0] <= {1'b0,xm[24:1]};if(xm == 0)beginzm <= ym;ze <= ye;state <= over;endelsestate <= exequal;endendaddm: //带符号位和保留进位的尾数相加beginif ((xm[25]^ym[25])==0)beginzm[25] <= xm[25];zm[24:0] <= xm[24:0]+ym[24:0];endelseif(xm[24:0]>ym[24:0])beginzm[25] <= xm[25];zm[24:0] <=xm[24:0]-ym[24:0];endelsebeginzm[25] <= ym[25];zm[24:0] <=ym[24:0]-xm[24:0];endze <= xe;state <= infifl;endinfifl: //尾数规格化处理beginif(zm[24]==1)beginzm[24:0] <= {1'b0,zm[24:1]};ze <= ze + 1;state <= over;endelseif(zm[23]==0)beginzm[24:0] <= {zm[23:0],1'b0};ze <= ze - 1;state <= infifl;endelsestate <= over;endover:beginstate<= start;enddefault:beginstate<= start; end endcase end endmodule。
基于RISC指令系统的32位浮点加减法运算器设计
基于RISC指令系统的32位浮点加减法运算器设计摘要:浮点运算部件一直是限制微处理器性能的一个关键因素。
在分析了浮点运算器的结构和算法,提出了一种支持IEEE-754标准的浮点加减法运算器的实现方案,并详细介绍了该运算器的结构和算法。
方案采用了四级流水线的结构,即:0操作数检查、对阶、尾数运算、结果规格化及舍入处理。
每个步骤可以单独作为一个模块,在每个模块之间增加了寄存器,利用这些寄存器可以为下一个操作准备正确的数据。
关键词:流水线,IEEE-754标准,警戒位,舍入法32 bit Floating-Point Addition and Subtraction ALU Design Based onRISC StructureABSTRACT:Floating-Point arithmetic unit is always key factor of restricting microprocessor performance.This paper analyses structure and algorithm of Floating-Point ALU and brings forward a scenario about Floating-Point addition and subtraction ALU which supports IEEE-754 standard. The scenario adopts 4-Level pipelining structure: 0 operation numbers check、match exponent、fraction arithmetic、result normalization and rounding. Each step can be act as a single module. Among these modules, there are some registers which can prepare correct data for next operation.Keywords: pipelining, IEEE-754 Standard, Guard Digit, Rounding Method1 引言随着SOC技术、IP技术以及集成电路技术的发展,RISC软核处理器的研究与开发设计开始受到了人们的重视。
基于FPGA的32位浮点FFT处理器的设计
文章编号:1001-893X(2003)06-0073205基于FPG A的32位浮点FFT处理器的设计3Ξ赵忠武,陈 禾,韩月秋(北京理工大学电子工程系,北京100081)摘 要:介绍了一种基于FPG A的1024点32位浮点FFT处理器的设计。
采用改进的蝶形运算单元,减小了系统的硬件消耗,改善了系统的性能。
详细讨论了32位浮点加法器/减法器、乘法器的分级流水技术,提高了系统性能。
浮点算法的采用使得系统具有较高的处理精度。
关键词:数字信号处理;快速傅里叶变换;浮点加法器/减法器;浮点乘法器;分级流水;可编程门阵列;设计中图分类号:T N91117 文献标识码:AFPGA-based Design of a32Bit Floating-pointFFT ProcessorZH AO Zhong-wu,CHEN He,H AN Yue-qiu(Department of Electronic Engineering,Beijing Institute of T echnology,Beijing100081,China)Abstract:An FPG A-based design of a32bit floating-point FFT process or used to com pute1024points FFT is presented.Because of the utilization of im proved butterfly process or,hardware consum ption is reduced and the performance is im proved.The pipelining technique of32bit floating-point adder/subtracter and multiplier is introduced in detail,which can enhance the performance of the FFT process or.High precision is achieved due to the inherence of the floating-point alg orithm.K ey w ords:Digital signal processing;FFT;Floating-point adder/subtracter;Floating-point multiplier;Pipelining;FPG A;Design一、引 言1965年快速傅里叶变换(FFT)的提出,根本地改变了傅里叶变换的地位。
基于FPGA的32位浮点FFT处理器的设计
基于FPGA的32位浮点FFT处理器的设计
赵忠武;陈禾;韩月秋
【期刊名称】《电讯技术》
【年(卷),期】2003(043)006
【摘要】介绍了一种基于FPGA的1024点32位浮点FFT处理器的设计.采用改进的蝶形运算单元,减小了系统的硬件消耗,改善了系统的性能.详细讨论了32位浮点加法器/减法器、乘法器的分级流水技术,提高了系统性能.浮点算法的采用使得系统具有较高的处理精度.
【总页数】5页(P73-77)
【作者】赵忠武;陈禾;韩月秋
【作者单位】北京理工大学,电子工程系,北京,100081;北京理工大学,电子工程系,北京,100081;北京理工大学,电子工程系,北京,100081
【正文语种】中文
【中图分类】TN911.7
【相关文献】
1.基于FPGA的高速浮点FFT/IFFT处理器设计与实现 [J], 苏斌;刘畅;潘志刚;
2.基于FPGA的高速浮点FFT/IFFT处理器设计与实现 [J], 苏斌;刘畅;潘志刚
3.基于FPGA的新型浮点FFT处理器设计 [J], 范展;梁国龙;刘洋
4.基于FPGA的高速浮点FFT处理器设计 [J], 钟小艳;刘浩
5.Xilinx FPGA处理器解决方案为嵌入式系统设计人员提供强大的性能优势独立测
试结果再次肯定了Xilinx业界最全面的基于FPGA的32位嵌入式处理解决方案的领先地位 [J],
因版权原因,仅展示原文概要,查看原文内容请购买。
32位浮点加法器设计[整理版]
32位浮点加法器设计
苦行僧宫城
摘要:运算器的浮点数能够提供较大的表示精度和较大的动态表示范围,浮点 运算已成为现代计算程序中
不可缺少的部分。浮点加法运算是浮点运算中使用频率最高的运算。因此,浮 点加法器的性能影响着整个
CPU勺浮点处理能力。文中基于浮点加法的原理,采用Verilog硬件描述语言
设计32位单精度浮点数加法
f)规格化移位:对尾数加减结果进行移位,消除尾数的非有效位,使其最高位为
1。Байду номын сангаас
g)舍入:有限精度浮点表示需要将规格化后的尾数舍入到固定结果。 由以上 基本算法可见,它包含2个全长的移位即对阶移位和规格化移位,还要包括3个全 长的有效加法,即步骤c、d、g。由此可见,基本算法将会有很大的时延。
2 32位浮点加法器设计与实现
器,并用modelsim对浮点加法器进行仿真分析,从而验证设计的正确性和可 行性。
关键词:浮点运算 浮点加法器Verilog硬件描述语言
Studying on Relation of Technology and Civilization苦行僧宫城
(School of Mechatronic Engineering and Automation, Shanghai
University, Shanghai,China)
Abstract: The floating-point arithmetic provides greater precision and greater dynamic representation indication range, with floating point calculations have become an indispensable part of the program.Floatingpoint adder is the most frequently used floating point arithmetic. Therefore, the performance of floating point adder affecting the entire CPU floating point processing capabilities. In this paper the principlebased floating-point addition, Verilog hardware description language
一种基于FPGA的32位快速加法器设计
由此可 以看到先行进位加法器 的结 构由两部分组 成 ,进 位计算模块和本位和计算模块。由式 (7),容易求 出 8位先 行进位加法器的公式 ,得到内部 的设计结构如 图 1所示 。
1 4级流 水 线 结 构 的 32位 加 法 器
图 1 8位 先 行 进位 加 法 器 内部 设 计 结构
并 对 这 个 流 水线 结 构 进 行 了分 析改 进 ,设 计 了一 个 两 级 流水 线 结 构 的 32位加 法 器 。
关 键 词 :流水 线 ;an法 器 ;先 行 进位
中图 分 类号 :TP23
文 献 标 识 码 :A
文 章 编 号 :1006—0707(2011)07—0078—04
刘 昌锦 (1958一 ),男 ,教授 ,硕士生导师 ,主要从事通信与信息系统研究 。
岳伟 甲 ,等 :一 种基 于 FPGA 的 32位 快速 加 法器设计
79
器 平 均 每 个 系 统 时 钟 完 成 一 次 32位 加 运 算 ,但 是 系 统 的 延 时较 大 为 4个 系 统 时 钟 。不 能 满 足 对 于 转 换 速 度 要 求 较 高 的场合 。因此采用一种新的方式 ,综合 流水线技术 和先行进
第 32卷 第 7期 【自动化 技术 】
四 川 兵 工 学 报
2011年 7月
一 种 基 于 FPGA 的 32位 快 速 加 法 器 设 计
岳 伟 甲 ,刘 昌锦
(炮 兵 学 院 ,合 肥 230031)
摘要 :针对采用流水线结构设计的 32位 加法器系统延迟 时间长 的问题 ,设计 了一个 4级流水线结构 的 32位加法器 ,
2 对流水线结构 的改进
g +∑ (gl-m-l I I PJ) +c0 B
基于Verilog HDL语言的FPGA浮点数加减法运算的实现
工艺与技术!Gongyi yu Jishu基于Verilog HDL语言的FPGA浮点数加减法运算的实现谢文彬(淮安生物工程高等职业学校,江苏淮安223200)摘要#针对数控系统中刀具补偿、插补计算常采用浮点运算的问题,基于F P G A技术特点,采用V e r i l o g H D L语言实现32位浮点数 的加减法运算,并通过仿真,验证其正确性。
关键词'浮点运算g Verilog H D L语言;现场可编程门阵列;仿真0引言浮点运算方式较定点运算有计数范围宽、有效精度高的 特点,是目前大多数计算机系统采用的表 式,是数控系统中刀具补偿、插补计算常采用的运算方法。
目前比较 的方法是用D S P数 实现浮点运算。
浮点表结构复杂,完全使用D S P软件实现™定程度D S P的运算度文主要研宄利用Verilog H D L语言进行F P G A浮点运算 加减法方法的实现。
Verilog H D L是基于C语言的硬件描述语 言,对数 有 特的优势。
1浮点数加减法运算的实现过程文浮点数的运算 基于 精度 ,位、阶码位、尾码位组成(以上由I E E E754[1]标准定义)。
在符合 I E E E754 的浮点数加减运算过程中,减法运算也可 '加法运算,数的 可。
浮点数加法可 较 对等。
其加减法运算 [2]女(1) 是加法运算是减法运算。
(2) 1较 浮点数 的3 对 位,加 位(4 对阶完浮点数的尾码需要进行求和或求差。
5用F P G A实现浮点数加减法运算的模块结构如图1所示。
图1浮点数加减法基本算法模块结构在规格化模块中要对结果进行前导1检测、初次规格化、尾数 结果,表 多的有效数且用 数 ,时 大于等于1/2小于1,高位为1,一位,一称为“右规”,左移一位,阶码减™称为“左规”,规格化可增加有效数的位数,提高运算结精度[3]。
根据浮点数运算器 可得到使用硬件描述语言设计运算 的端口定 表1所表1浮点运算模块端口输输名称位数名称位数c l k501S11r s t n1S21Y132E18Y232E28F123F223Y32y i c h u f l a t1Y E8Y_F23F o u t25在输入端口信号中,clk50为50 M H z时钟信号;rst_n为模块复 位,低电平有效;Y1为被加数或被减数;Y2加数减数。
32位双重快速跳跃进位链六级流水线加法器Verilog的实现
32位双重快速跳跃进位链六级流水线加法器Verilog的实现DLUT-SOFTWARE-0819Mr Xie2011/6/28`timescale 1ns / 1ps //定义时间单位为1ns,时间精度为1ps////////////////////////////////////////////////////////////////////////////////// //模块名: fullAdder32//端口说明: clk: 输入的时钟A:输入的32加数B:输入的32位被加数Cin:输入的最低位进位Cout:输出的最高位进位Sum:两个数相加的和//目标器件: Veritex4系列的XC4VSX35//工具版本: Xilinx-ISE10.1、ISE Simulator(VHDL/Verilog)、Synplify Pro9.6.2 //依懒关系: 不依懒于其它模块//创建日期: 08:43:38 06/21/2011//创建人:////////////////////////////////////////////////////////////////////////////////// module fullAdder32(clk,A,B,Cin,Cout,Sum);input clk; //声明clk为1位的线网型输入变量input [31:0] A; //声明A为32位的线网型输入变量input [31:0] B; //声明B为32位的线网型输入变量,input Cin; //声明Cin为1位的线网型输入变量output Cout; //声明Cout为1位的线网型输出变量output [31:0] Sum; //声明Sum为32位的线网型输出变量reg [31:0] Sum; //对Sum进行重新声明为寄存器型reg Cout; //对Cout进行重新声明为寄存器型reg [30:0] C; //每一位相加时产生的进位reg [30:0]tmpC1, tmpC2, tmpC3; //临时变量,对进位作一个暂存reg [31:0]d; //小组的本地进位reg [31:0]tmpd1, tmpd2, tmpd3;//临时变量,对本地进位作一个暂存reg [31:0]t; //小组的传递进位reg [31:0]tmpt1, tmpt2, tmpt3;//临时变量,对传递进位作一个暂存reg [8:1]D; //大组的本地进位reg [8:1]tmpD1; //临时变量,对大组的本地进位作一个暂存reg [8:1]T; //大组的传递进位reg [8:1]tmpT1; //临时变量,对大组的传递进位作一个暂存reg [31:0]tmpA1, tmpA2, tmpA3, tmpA4, tmpA5;//对输入变量A作暂存reg [31:0]tmpB1, tmpB2, tmpB3, tmpB4, tmpB5; //对输入变量B作暂存reg tmpCin1, tmpCin2, tmpCin3, tmpCin4, tmpCin5;//对输入变量Cin作暂存reg tmpCout1, tmpCout2;//对输出变量Cout作一个暂存//////////////////第一个时钟周期//////////////////////////////////计算小组的本地进位d和传递进位t//对输入的加数A,被加数B,低位进位Cin作一级暂存always @(posedge clk) begind <= A&B;t <= A|B;tmpA1 <= A;tmpB1 <= B;tmpCin1 <= Cin;end//////////////////第二个时钟周期/////////////////////////////////对输入的加数A,被加数B,低位进位Cin作二级暂存//对小组的本地进位d,传递进位t作一级暂存//计算进位C[0],C[1],C[2]//计算大组的本地进位D、传递进位Talways @(posedge clk) begintmpd1 <= d;tmpt1 <= t;tmpA2 <= tmpA1;tmpB2 <= tmpB1;tmpCin2 <= tmpCin1;C[0] <= d[0] | t[0]&tmpCin1;C[1] <= d[1] | t[1]&d[0] | t[1]&t[0]&tmpCin1;C[2] <= d[2] | t[2]&d[1] | t[2]&t[1]&d[0] | t[2]&t[1]&t[0]&tmpCin1;D[1] <= d[3] | &{t[3],d[2]} | &{t[3:2],d[1]} | &{t[3:1],d[0]};T[1] <= &t[3:0]; //t[3]&t[2]&t[1]&t[0];D[2] <= d[7] | &{t[7],d[6]} | &{t[7:6],d[5]}| &{t[7:5],d[4]};T[2] <= &t[7:4]; //t[3]&t[2]&t[1]&t[0];D[3] <= d[11] | &{t[11],d[10]} | &{t[11:10],d[9]}| &{t[11:9],d[8]};T[3] <= &t[11:8]; //t[11]&t[10]&t[9]&t[8];D[4] <= d[15] | &{t[15],d[14]} | &{t[15:14],d[13]}| &{t[15:13],d[12]};T[4] <= &t[15:12]; //t[15]&t[14]&t[13]&t[12];D[5] <= d[19] | &{t[19],d[18]} | &{t[19:18],d[17]}| &{t[19:17],d[16]};T[5] <= &t[19:16]; //t[19]&t[18]&t[17]&t[16];D[6] <= d[23] | &{t[23],d[22]} | &{t[23:22],d[21]}| &{t[23:21],d[20]};T[6] <= &t[23:20]; //t[23]&t[22]&t[21]&t[20];D[7] <= d[27] | &{t[27],d[26]} | &{t[27:26],d[25]}| &{t[27:25],d[24]};T[7] <= &t[27:24]; //t[27]&t[26]&t[25]&t[24];D[8] <= d[31] | &{t[31],d[30]} | &{t[31:30],d[29]}| &{t[31:29],d[28]};T[8] <= &t[31:28]; //t[31]&t[30]&t[29]&t[28];end////////////////////////t第三个时钟周期///////////////////////////对输入的加数A,被加数B,低位进位Cin作三级暂存//对小组的本地进位d,传递进位t作二级暂存//对大组的本地进位D,传递进位T作一级暂存//对进位部分进位C作二级暂存//计算进位C[3],C[7],C[11],C[15]always @ (posedge clk) begintmpd2 <= tmpd1;tmpt2 <= tmpt1;tmpA3 <= tmpA2;tmpB3 <= tmpB2;tmpCin3 <= tmpCin2;tmpD1 <= D;tmpT1 <= T;tmpC1[2:0] <= C[2:0];tmpC1[3] <= D[1] | T[1]&tmpCin2;tmpC1[7] <= D[2] | T[2]&tmpCin2;tmpC1[11] <= D[3] | T[3]&tmpCin2;tmpC1[15] <= D[4] | T[4]&tmpCin2;end////////////////////////t第四个时钟周期///////////////////////// //对输入的加数A,被加数B,低位进位Cin作四级级暂存//对小组的本地进位d,传递进位t作三级暂存//对进位部分进位C作二级暂存//计算进位C[6:4],C[10:8],C[14:12],C[19:16],C[23],C[27]//计算最高进位Coutalways @ (posedge clk) begintmpd3 <= tmpd2;tmpt3 <= tmpt2;tmpA4 <= tmpA3;tmpB4 <= tmpB3;tmpCin4 <= tmpCin3;tmpC2[0] <= tmpC1[0];tmpC2[1] <= tmpC1[1];tmpC2[2] <= tmpC1[2];tmpC2[3] <= tmpC1[3];tmpC2[7] <= tmpC1[7];tmpC2[11] <= tmpC1[11];tmpC2[15] <= tmpC1[15];tmpC2[4] <= tmpd2[4] | tmpt2[4]&tmpC1[3];tmpC2[5] <= tmpd2[5] | tmpt2[5]&tmpd2[4] | tmpt2[5]&tmpt2[4]&tmpC1[3];tmpC2[6] <= tmpd2[6] | tmpt2[6]&tmpd2[5] |tmpt2[6]&tmpt2[5]&tmpt2[4]&tmpC1[3];tmpC2[8] <= tmpd2[8] | tmpt2[8]&tmpC1[7];tmpC2[9] <= tmpd2[9] | tmpt2[9]&tmpd2[8] | tmpt2[9]&tmpt2[8]&tmpC1[7];tmpC2[10]<=tmpd2[10] | tmpt2[10]&tmpd2[9]| tmpt2[10]&tmpt2[9]&tmpt2[8]&tmpC1[7];tmpC2[12] <= tmpd2[12] | tmpt2[12]&tmpC1[11];tmpC2[13] <= tmpd2[13] | tmpt2[13]&tmpd2[12]| tmpt2[13]&tmpt2[12]&tmpC1[11];tmpC2[14] <= tmpd2[14] | tmpt2[14]&tmpd2[13]|tmpt2[14]&tmpt2[13]&tmpt2[12]&tmpC1[11];tmpC2[16] <= tmpd2[16] | tmpt2[16]&tmpC1[15];tmpC2[17] <= tmpd2[17] | tmpt2[17]&tmpd2[16]| tmpt2[17]&tmpt2[16]&tmpC1[15];tmpC2[18]<=tmpd2[18] | tmpt2[18]&tmpd2[17]| tmpt2[18]&tmpt2[17]&tmpt2[16]&tmpC1[15];tmpC2[19] <= tmpD1[5] | tmpT1[5]&tmpC1[15];tmpC2[23] <= tmpD1[6] | tmpT1[6]&tmpC1[15];tmpC2[27] <= tmpD1[7] | tmpT1[7]&tmpC1[15];tmpCout1 <= tmpD1[8] | tmpT1[8]&tmpC1[15];end////////////////////////t第五个时钟周期///////////////////////////对输入的加数A,被加数B,低位进位Cin作五级级暂存//对进位部分进位C作三级暂存//对最高进位Cout作一级暂存//计算进位C[22:20],C[26:24],C[30:28]always @ (posedge clk) begintmpA5 <= tmpA4;tmpB5 <= tmpB4;tmpCin5 <= tmpCin4;tmpC3[19:0] <= tmpC2[19:0];tmpC3[23] <= tmpC2[23];tmpC3[27] <= tmpC2[27];tmpCout2 <= tmpCout1;tmpC3[20] <= tmpd3[20] | tmpt3[20]&tmpC2[19];tmpC3[21] <= tmpd3[21] | tmpt3[21]&tmpd3[20]| tmpt3[21]&tmpt3[20]&tmpC2[19];tmpC3[22] <= tmpd3[22] | tmpt3[22]&tmpd3[21]| tmpt3[22]&tmpt3[21]&tmpd3[20]| tmpt3[22]&tmpt3[21]&tmpt3[20]&tmpC2[19];tmpC3[24] <= tmpd3[24] | tmpt3[24]&tmpC2[23];tmpC3[25] <= tmpd3[25] | tmpt3[25]&tmpd3[24]| tmpt3[21]&tmpt3[20]&tmpC2[23];tmpC3[26] <= tmpd3[26] | tmpt3[26]&tmpd3[25]| tmpt3[26]&tmpt3[25]&tmpd3[23]| tmpt3[26]&tmpt3[25]&tmpt3[24]&tmpC2[23];tmpC3[28] <= tmpd3[28] | tmpt3[28]&tmpC2[27];tmpC3[29] <= tmpd3[29] | tmpt3[29]&tmpd3[28]| tmpt3[29]&tmpt3[28]&tmpC2[27];tmpC3[30] <= tmpd3[30] | tmpt3[30]&tmpd3[29]| tmpt3[30]&tmpt3[29]&tmpd3[28]| tmpt3[30]&tmpt3[29]&tmpt3[28]&tmpC2[27]; end////////////////////////第六个时钟周期///////////////////////////所有的进位已经产生//计算A、B两个数的和Sum//输出最高进位always @ (posedge clk) beginSum <= tmpA5^tmpB5^{tmpC3[30:0],tmpCin5};Cout <= tmpCout2;endendmodule// module fullAdder32(clk,A,B,Cin,Cout,Sum);测试代码如下:`timescale 1ns / 1ps //定义时间单为及时间精度//////////////////////////////////////////////////////////////////////////////////模块名: test.v//输入输出端口:无//目标器件: Veritex4系列的XC4VSX35//工具版本: Xilinx-ISE10.1、ISE Simulator(VHDL/Verilog)、Synplify Pro9.6.2 //创建日期: 08:44:52 06/23/2011//创建人://////////////////////////////////////////////////////////////////////////////// module test;// 输入信号reg clk;reg [31:0] A;reg [31:0] B;reg Cin;//输出信号wire Cout;wire [31:0] Sum;// 实例化要测试的模块fullAdder32 uut (.clk(clk),.A(A),.B(B),.Cin(Cin),.Cout(Cout),.Sum(Sum));initial begin// 初始化输入信号clk = 1;A = 32'd1112111;B = 32'd2221222;Cin = 0;//下面为仿真激励信号foreverfork#20 A <= A + 1; //加数每隔一个时钟周期加1#20 B <= B + 1; //被加数每隔一个时钟周期加1joinendalways#10 clk <= ~clk; //时钟周期为20nsendmodule1.加法器的仿真仿真时序波形如下所示:2.加法器的综合Technology Hierarchical View如下图所示:。
计算机设计与实践——32位ALU设计ppt课件
if(Sub==1) alu_db_mux=alu_db_n; else alu_db_mux=alu_db;
8
end alu_32 alu_32_1(alu_add,alu_da,alu_db_mux,Sub,c2); assign overflow=alu_da[31]&alu_db_mux[31]&~alu_add[31]|~alu_da[31]&~alu_db_mux[31]&alu_add[31]; assign
6
21:alu_srl<=alu_da>>21; 22:alu_srl<=alu_da>>22; 23:alu_srl<=alu_da>>23; 24:alu_srl<=alu_da>>24; 25:alu_srl<=alu_da>>25; 26:alu_srl<=alu_da>>26; 27:alu_srl<=alu_da>>27; 28:alu_srl<=alu_da>>28; 29:alu_srl<=alu_da>>29; 30:alu_srl<=alu_da>>30; 31:alu_srl<=alu_da>>31; default:alu_srl<=alu_da; endcase end always@(*) begin case(alu_shift) 0:alu_sra<=alu_da; 1:alu_sra<={{alu_da[31]},alu_da[31:1]}; 2:alu_sra<={{2{alu_da[31]}},alu_da[31:2]}; 3:alu_sra<={{3{alu_da[31]}},alu_da[31:3]}; 4:alu_sra<={{4{alu_da[31]}},alu_da[31:4]}; 5:alu_sra<={{5{alu_da[31]}},alu_da[31:5]}; 6:alu_sra<={{6{alu_da[31]}},alu_da[31:6]}; 7:alu_sra<={{7{alu_da[31]}},alu_da[31:7]}; 8:alu_sra<={{8{alu_da[31]}},alu_da[31:8]}; 9:alu_sra<={{9{alu_da[31]}},alu_da[31:9]}; 10:alu_sra<={{10{alu_da[31]}},alu_da[31:10]}; 11:alu_sra<={{11{alu_da[31]}},alu_da[31:11]}; 12:alu_sra<={{12{alu_da[31]}},alu_da[31:12]};
用verilog编写的32位超前进位加法器代码
//超前进位加法器`define word_size 32`define word [`word_size-1:0]`define n 4`define slice [`n-1:0]`define s0 (1*`n)-1:0*`n`define s1 (2*`n)-1:1*`n`define s2 (3*`n)-1:2*`n`define s3 (4*`n)-1:3*`n`define s4 (5*`n)-1:4*`n`define s5 (6*`n)-1:5*`n`define s6 (7*`n)-1:6*`n`define s7 (8*`n)-1:7*`nmodule c_adder (a,b,cin,s,cout); //顶层模块input`word a,b;input cin;output`word s;output cout;wire[7:0] gg,gp,gc; //wire[3:0] ggg,ggp,ggc; //wire gggg,gggp; ////first levelbitslice i0(a[`s0],b[`s0],gc[0],s[`s0],gp[0],gg[0]); bitslice i1(a[`s1],b[`s1],gc[1],s[`s1],gp[1],gg[1]); bitslice i2(a[`s2],b[`s2],gc[2],s[`s2],gp[2],gg[2]); bitslice i3(a[`s3],b[`s3],gc[3],s[`s3],gp[3],gg[3]); bitslice i4(a[`s4],b[`s4],gc[4],s[`s4],gp[4],gg[4]); bitslice i5(a[`s5],b[`s5],gc[5],s[`s5],gp[5],gg[5]); bitslice i6(a[`s6],b[`s6],gc[6],s[`s6],gp[6],gg[6]); bitslice i7(a[`s7],b[`s7],gc[7],s[`s7],gp[7],gg[7]); //second levelcla c0(gp[3:0],gg[3:0],ggc[0],gc[3:0],ggp[0],ggg[0]); cla c1(gp[7:4],gg[7:4],ggc[1],gc[7:4],ggp[1],ggg[1]); assign ggp[3:2]=2'b11;assign ggg[3:2]=2'b00;//third levelcla c2(ggp,ggg,cin,ggc,gggp,gggg);assign cout=gggg|(gggp&cin);endmodule//求和并按输出a,b,cin分组module bitslice(a,b,cin,s,gp,gg);input`slice a,b;input cin;output`slice s;output gp,gg;wire`slice p,g,c;pg i1(a,b,p,g);cla i2(p,g,cin,c,gp,gg);sum i3(a,b,c,s);endmodule//计算传播值和产生值的PG模块module pg(a,b,p,g);input`slice a,b;output `slice p,g;assign p=a|b;assign g=a&b;endmodule//计算sum值的sum模块module sum(a,b,c,s);input`slice a,b,c;output`slice s;wire`slice t=a^b;assign s=t^c;endmodule//n-bit 超前进位模块module cla (p,g,cin,c,gp,gg);input`slice p,g; //输出的propagate bit (传送值)和generate bit(生成值)input cin; //进位输入output`slice c; //为每一位产生进位output gp,gg; //传播值和进位制function [99:0] do_cla; //该函数内将为每个位计算其进位值input `slice p,g;input cin;begin: labelinteger i;reg gp,gg;reg`slice c;gp=p[0];gg=g[0];c[0]=cin;for (i=1;i<`n;i=i+1)begin//C0=G0+P0C_1//C1=G1+P1C0=(G1+P1G0)+P1P0C_1 gp=gp&p[i];gg=(gg&p[i])|g[i];c[i]=(c[i-1]&p[i-1])|g[i-1]; enddo_cla={c,gp,gg};endendfunctionassign {c,gp,gg}=do_cla(p,g,cin); endmodule。
一种32位高速浮点乘法器设计
一种32位高速浮点乘法器设计
周德金;孙锋;于宗光
【期刊名称】《电子与封装》
【年(卷),期】2008(8)9
【摘要】文章介绍一种32位浮点乘法器软IP的设计,其部分积缩减部分采用修正Booth算法,部分积加法采用4-2压缩树结构,最终carry,sum形式部分积采用进位选择加法器完成,乘法器可以进行32位浮点数或24位定点数的乘法运算.采用VerilogHDL RTL级描述,采用SMIC 0.18μm工艺库进行综合,门级仿真结果表明乘法器延时小于4.05ns.
【总页数】4页(P35-38)
【作者】周德金;孙锋;于宗光
【作者单位】江南大学信息工程学院,江苏,无锡,214036;中国电子科技集团公司第五十八研究所,江苏,无锡,214035;江南大学信息工程学院,江苏,无锡,214036;中国电子科技集团公司第五十八研究所,江苏,无锡,214035;江南大学信息工程学院,江苏,无锡,214036;中国电子科技集团公司第五十八研究所,江苏,无锡,214035
【正文语种】中文
【中图分类】TN702
【相关文献】
1.基于改进型选择进位加法器的32位浮点乘法器设计 [J], 刘容;赵洪深;李晓今
2.32位并行浮点乘法器设计 [J], 张菁
3.一种高性能32位浮点乘法器的ASIC设计 [J], 赵忠武;陈禾;韩月秋
4.32位高速浮点乘法器优化设计 [J], 周德金;孙锋;于宗光
5.32位高性能浮点乘法器芯片设计研究 [J], 黄宁;朱恩
因版权原因,仅展示原文概要,查看原文内容请购买。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
32位浮点加法器设计摘要:浮点数具有数值范围大,表示格式不受限制的特点,因此浮点数的应用是非常广泛的。
浮点数加法运算比较复杂,算法很多,但是为了提高运算速度,大部分均是基于流水线的设计结构。
本文介绍了基于IEE754标准的用Verilog 语言设计的32位浮点加法器,能够实现32位浮点数的加法运算。
虽然未采用流水线的设计结构但是仍然对流水线结构做了比较详细的介绍。
关键字:浮点数,流水线,32位浮点数加法运算,Verilog 语言设计32-bit floating point adder designCao Chi,Shen Jia- qi,Zheng Yun-jia(School of Mechatronic Engineering and Automation, Shanghai University, Shanghai ,China ) Abstract://沈佳琪搞定Key words :float; Assembly line; 32-bit floating-point adder 浮点数的应用非常广泛,无论是在计算机还是微处理器中都离不开浮点数。
但是浮点数的加法运算规则比较复杂不易理解掌握,而且按照传统的运算方法,运算速度较慢。
因此,浮点加法器的设计采用了流水线的设计方法。
32位浮点数运算的摄入处理采用了IEE754标准的“0舍1入”法。
1. 浮点数的介绍在处理器中,数据不仅有符号,而且经常含有小数,即既有整数部分又有小数部分。
根据小数点位置是否固定,数的表示方法分为定点表示和浮点表示。
浮点数就是用浮点表示法表示的实数。
浮点数扩大了数的表示范围和精度。
浮点数由阶符、阶码E 、数符、尾数N 构成。
任意一个二进制数N 总可以表示成如下形式:N=。
通常规定:二进制浮点数,其尾数数字部分原码的最高位为1,叫作规格化表示法。
因此,扩大数的表示范围,就增加阶码的位数,要提高精度,就增加尾数的位数。
浮点数表示二进制数的优势显而易见。
(阶符)(阶码)(数符)(尾数)31 30 23 22 0 32位浮点数:64位浮点数:在IEEE754标准格式表示的32位浮点数中,S 表示浮点数的符号位,0表示正数,1表示负数;M 表示尾数,共23位,用小数表示,小数点放在尾数域的最前面;E 表示阶码,共8位,采用移码方式表示正负指数。
移码方法对两个指数的大小的比较和对阶操作比较方便。
采用这种方式时,浮点数的指数真值e 变成阶码E 时,应将指数e 加上一个固定的偏移地址127(二进制数01111111),即E=e+127。
在IEEE754标准中,一个规格化的32位浮点数X 的真值可表示为X =(-1)s×(1.M)×2E-127e =E-127一个规格化的64位浮点数x的真值为S E M S E MX=(-1)s×(1.M)×2E-1023e=E-1023为提高数据的精度,当尾数的值不为0时,尾域的最高有效位为1,否则修改阶码同时左右移动小数点,使其变成规格化表示的浮点数。
这一过程称之为规格化表示。
当浮点数的尾数为零时,不论阶码为何值或者阶码的值遇到比它所能表示的最小值还小时,不管其尾数为何值,计算机都把该浮点数当做零值。
原码非0值浮点数的尾数值最高位必定为1,在保存浮点数时,通过尾数左移(小数点向右移动)把该位去掉,用同样多的位数能多存一位二进制数,有利于提高数据表示精度,这种处理方案称之为隐藏位技术。
32位浮点数的表示范围有限,超过该范围的浮点数会产生溢出。
溢出分为正上溢和负上溢。
2.32位浮点数加法运算浮点数的加法运算与二进制数直接进行加法运算区别是很大的。
浮点数的加法运算分为以下几个步骤:(1)0操作数的检查;(2)比较阶码大小并完成对阶;(3)尾数进行加法运算;(4)结果进行规格化处理;(5)舍入处理;(6)溢出处理。
0操作数的检查是判断两个数据是否为零,若有一个数据为0则直接输出结果;比较两个数据的阶码大小,并通过尾数的移动来改变阶码使其相等。
对阶的过程要遵循阶码小的向阶码大的数对齐,小阶的尾数右移,每右移一位,阶码加一。
尾数求和运算与一般二进制数的加法运算相同;在尾数相加后得到的数可能不是规格化的数,为了提供运算的精度,就必须对求和的结果进行规格化处理。
当运算结果溢出时,进行右归。
左归时阶码做减法,右归时阶码做加法。
在IEEE754标准中,舍入处理提供了四种方法:(1)就近舍入:实质上就是通常所说的“四舍五入”。
(2)朝0舍入:朝数轴原点方向舍入,就是简单的截尾。
无论尾数是正数还是负数,截尾都使取值的绝对值比原值的绝对值小。
(3)朝+∞舍入:对正数来说,只要多余位不全为0则向最低有效位进1;对负数来说则是简单的截尾。
(4)朝—∞舍入:处理方法与朝+∞舍入情况相反。
对正数来说只要多余位不全为0则简单截尾;对负数来说,向最低有效位进1。
(5)与一般二进制数的加法运算相似,浮点数的加法运算也要是否溢出。
尾数之和出现01.xxxx或10.xxxx时,并不表示溢出,只有将此数进行右归后,再根据阶码来判断浮点运算结果是否溢出。
一般说浮点是否溢出均是指上溢(正上溢、下上溢)。
因此,浮点数是否溢出可由阶码来决定。
从以上加法的运算过程可以看出,浮点数加法运算步骤较多,体系结构相对比较复杂,目前比较常见的浮点加法器的结构有标准算法结构、LOP算法结构、双通道算法结构。
一般的标准算法结构首先比较阶数,得到阶差,根据阶差进行尾数的移位,然后送入定点加法器进行尾数相加,规格化单元对结果进行规格化,在规格化单元里有一个前导1检测电路,可检测出尾数中第一个1的位置,后移位器根据此位置对尾数进行左移,同时减去相应的值。
LOP算法与标准算法的区别在于它采用前导1预测电路代替了前导1检测电路代替了前导1检测电路。
LOP电路可以与尾数加法并行执行,这样减少整个系统的延迟。
双通道算法的结构有两个并行的数据通道,当指数差大于1时,选择far通道,指数对阶分配较长时间,尾数运算结果规范化时的移位分配较少的时间,否则选择close通道,此时尾数最多移一位,甚至不用移位,这样可以去掉前移位器。
在以上3种算法中,一般的标准算法延迟较大,但占用资源最少;双通道算法虽然延迟较小,但占用资源最多。
在进行后续的流水线设计时,由于结构复杂,因而不利于流水线寄存器的插入和流水级数的划分,从而导致了时序速度的下降。
LOP算法的速度和面积介于两者之间。
综合比较以上三种算法以及自己知识的局限性,因此采用一般的标准算法来进行32浮点数运算加法器的设计。
3.流水线设计结构流水线处理是高速设计中的一个常用设计手段。
如果某个设计的处理流程分为若干个步骤,而且是整个数据处理是“单流向”的,即没有反馈或者是迭代运算,前一个步骤的输出是下一个步骤的输入则可以考虑采用流水线设计方法提系统的工作频率。
流水线设计的结构如图所示:其基本结构为:将适当划分的单个操作步骤单流向串联起来。
流水线操作的特点和要求是,从时间上看数据流在各个步骤的处理是连续的。
如果将每个操作步骤简化假设为通过一个D触发器,那么流水线操作就类似一个移位寄存器组,数据流依次流经D触发器,完成每个步骤的操作。
流水线时序设计如下图:Step1 Step2 Step3a1 a2Step1 Step2 Step3b1 b2 a3Step1 Step2 Step3c1 c2 c3 a4流水线设计的关键在于整个设计时序的合理安排。
要求每个操作步骤的划分合理。
如果前级操作时间恰好等于后级操作时间,设计最为简单,前级的输出直接汇入后级的输入即可。
如果前级操作时间大于后级的操作时间,则需要对前级的输出数据适当缓存,才能汇入后级的输入端。
如果前级操作时间恰好小于后级的操作时间,则必须通过复制逻辑,将数据分流,或者在前级对数据采用存储、后处理方式,否则会造成后级数据溢出。
流水线的处理方式相当于复制了处理模块,所以通过这种方式设计的芯片频率较高。
在本文中32位浮点加法器的设计虽然没有采用流水线的设计结构,但是仍然从中得到了启发。
4.32位浮点加法器的Verilog设计在进行Verilog语言设计32位浮点加法器时,要先画出流程图。
在画流程图之前,要理顺32位浮点加法器的顺序步骤,在此基础上画出其程图如图:从流程图可以看出,浮点加法运算器的完成可以分成阶码和尾数两部分。
阶码只有加减运算(左右移位),而尾数则有加减乘除4种运算。
因此,浮点加法运算器主要由两个定点运算部件组成,一个是阶码运算部件来完成阶码加减,以及控制对阶时小阶的尾数右移次数和规格化时对阶码的调整;另一个是尾数运算部件来完成尾数的加减运算并判断尾数是否已规格化。
除了这两个主要的运算部件之外,还需要一个溢出电路来判断是否溢出。
根据以上的流程图和分析,可以大致画出运算电路的结构图:两个操作数的阶码部分,分别放在寄存器E1和E2中,它们与并行加法器相连可以计算E1±E2。
阶码比较是通过E1-E2来实现的,相减结果放在计数器E。
然后按E的符号来决定哪一个阶码较大,并用E来控制其中一个尾数的移位次数。
E每递减1次,相应的尾数右移一位,直到E=0为止。
一旦尾数调整完毕,就可按通常的加、减方法处理,并将其结果的阶码放入E寄存器中。
在画出浮点加法运算器的内部电路后,就可以用Verilog语言来编写程序了。
在编写的程序中使用的是同步有限状态机来实现电路的功能的。
同步有限状态机的编写在理顺了浮点加法运算的运算步骤之后,很容易可以得到电路的几个状态,以及各个状态之间相互跳并的条件。
在弄清楚各个状态之间的跳并条件之后很容易就可以画出有限状态机的状态迁移图。
通过有限状态机的迁移图,可以比较方便的写出状态机的Verilog语言描述。
再结合电路结构框图,把电路的各部分功能加以实现填充到状态机中就完成了32位浮点加法器的Verilog语言设计。
此时,可以用软件进行仿真测试,得到仿真波形如下图:图中ix,iy为数据输入信号clk为时钟信号,reset为复位信号,oz为数据输出信号,ofw 为判断是否溢出的信号输出。
同步有限状态机的源代码和测试程序代码如下://同步有限状态机代码----------------------module floatadder(clk,reset,ix,iy,oz,ofw);//定义模块端口;input clk,reset;//时钟、复位信号;input[31:0]ix, iy;//输入信号;output[31:0]oz;//输出信号;output ofw; //溢出位信号;reg[31:0]oz;reg[23:0]xm,ym,zm;//定义尾数;reg[7:0]xe,ye,ze; //定义阶码reg zs;//定义输出信号符号位reg mc;//尾数相加溢出位reg[2:0] state,nextstate;//状态parameter start =3'b000,zerock=3'b001,exequal=3'b010,addm =3'b011,infifl=3'b100,zerofl=3'b101,over=3'b110;assign ofw=(state==over)?1:0;//判断溢出位 //每一个时钟产生一个可能的状态变化always@(posedge clk)if(!reset)state<=start;elsestate<=nextstate;//产生下一个状态的组合逻辑always@(state)case(state)start:beginxe<=ix[30:23];xm<={1'b1,ix[22:0]};ye<=iy[30:23];ym<={1'b1,iy[22:0]};nextstate<= zerock;end//操作数检查,判断操作数是否为0;zerock:begin if(xm==0)begin{ze,zm}<={ye,ym};nextstate<=over;endelseif(ym==0)begin{ze,zm}<={xe,xm};nextstate<=over;endelsenextstate<=exequal;end//对阶操作,使阶码相等;exequal:beginif(xe==ye)nextstate<=addm;elseif(xe>ye)beginye<=ye+1; //阶码左移,阶码加1;ym<={1'b0,ym[23:1]};if(ym==0)beginzm<=xm;ze<=xe;zs<=ix[31];oz<={zs,xe,zm[23:1]};nextstate<=over;endelsenextstate<=exequal;endelsebeginxe<=xe+1; //阶码左移,阶码加1; xm<={1'b0,xm[23:1]};if(xm==0)beginzm<=ym;ze<=ye;zs<=iy[31];oz<={zs,ze,zm[23:1]}; nextstate<=over;endelsenextstate<=exequal;endend//尾数求和运算;addm:beginze<=xe;if(iy[31]){mc,zm}<=xm+(~ym);else{mc,zm}<=xm+ym;if(zm==24'b0)nextstate<=over;elsenextstate<=infifl;end//结果规格化操作;infifl:beginif(mc)beginzm<={mc,zm[23:1]};ze<=ze+1;zs<=ix[31];oz<={zs,ze,zm[22:0]};if(ze==8'b1111_1111) //溢出 nextstate<=over;elsenextstate<=zerofl;end elsenextstate<=zerofl;end//结果做舍入处理;zerofl:beginif(zm[23]==1'b1)beginzm<={1'b0,zm[23:1]};// << 向左移位;ze<=ze-1;zs<=ix[31];oz<={zs,ze,zm[22:0]};nextstate<=zerofl;endelseif(zm[23:22]==2'b0)beginzm<={zm[22:0],1'b0}; // >> 向右移位;ze<=ze+1;zs<=ix[31];oz={zs,ze,zm[22:0]};if(ze==8'b1111_1111)nextstate<=over;elsenextstate<=zerofl;endelsenextstate<=over;endover:beginenddefault:state<=start;endcaseendmodule参考文献:[1]崔云娟.基于FPGA浮点运算器的设计及其在雷达中的应用[D].西安:西安电子科技大学,2007:18-21.[2]吉伟,黄巾,杨靓,黄士坦.基于FPGA的32位浮点加法器的设计[J].微电子学与计算机,2008,25(6):209-211.[3]杨靓,徐伟,黄士坦.FPGA上浮点加/减法器的设计[J].计算机工程与应用,2003,2(24) ,39-41.。