所有基本算术运算 (加、减、乘、除) 最终都可归结为加法运算, 所以加法运算的实现显得尤为重要。对于多位加法操作来说, 因为存在进位问题, 使得某一位计算结果的得出与所有低于他的位都相关。为了减少进位传输所耗费的时间, 提高计算速度, 人们设计了多种类型的加法器, 提出了很多实现加法器的设计方法, 如行波进位加法器、快速行波进位加法器、超前进位加法器等。以上提到的都是并行加法器, 此外还有串行加法器, 其具有占用资源少、设计灵活等优点。
1.1 行波法加法器
并行加法器中全加器的位数与操作数的位数相同, 可同时对操作数的各位相加。影响运算速度的主要是传递进位信号的逻辑线路 (进位链)。
N 位行波进位加法器是将N 个1位全加器串联进行2个N 位数的相加, 进位是采用串行进位的方法来实现的,即本级的Cout 作为下一级的Cin 参与下一位的加法运算。
Sumi =Ai Bi Cini Cini=A iB i + Ci (A i B i)
实现代码为:
module adder4(cout,sum,ina,inb,cin); output[3:0] sum; output cout; input[3:0] ina,inb; input cin;
assign {cout,sum}=ina+inb+cin; endmodule
由Test Bench WaveForm添加激励源
仿真波形
1.2 快速行波法加速器
行波进位加法器由于结构最为工整, 占用资源少, 且速度能够满足较多应用的需求, 是最适宜实现的结构形式。与传统的全加器相比, 他在结构上有一些适当的调整, 这样一方面缩短了进位传递的时间(约为组合逻辑输出的10% ) , 另一方面又可以在低级进位到达时, 更快速地输出该位的和运算结果。此外, 在FPGA 内部可配置逻辑块(CLB)中同一列的两个SL ICE 间, 还专门为进位传递保留了一条最短连线。快速传送进位到相邻区。正是基于这样的一种结构, Virtex E器件可以实现快速的行波进位加法器: 16 位的行波进位加法器寄存器输入到输出的响应时间为4.3 ns, 位的行波进位加法器为6.3 ns。
1.3 超前加速器
通常采用分组并行进位来实现, 即把N 位字长分为许多小组 (每组通常4 位) , 在组内实现超前进位, 在组间既可采用行波进位, 也可采用超前进位。一般, 组内采用超前进位、组间行波进位的方式称为单级超前进位加法器; 组内、组间均采用超前进位的方式称为多级超前进位加法器。即小组内并行相加再加进位。
现在普遍使用的并性加法器是超前进位加法器,只是在几个全加器的基础上增加了一个超前进位形成逻辑,以减少由于逐步进位信号的传递所造成的时延。上图给出了一个4位并行加法器的结构示意图。
1.4 高速串行加法器
串行加法器利用多个时钟周期完成一个完整的加法运算, 从而使占用的资源大幅度减少。在数字串行加法器中, 字长为W 的操作数被分为P 个位宽为N (N 能被W 整除, P = W/N ) 的数字, 然后从低位开始相加, 在P 个时钟内完成加法操作。 P 个时钟周期称为一个采样周期。 以N = 2 的数字串行加法器为例, 如果输入操作数的字长为8, 那么串行加法器可以在4个时钟周期内完成加法运算。 这个加法器只用了2个全加器的资源, 比一般的8 b 行波进位加法器小。 数字串行加法器的控制也比较简单, 输入移位寄存器完成并行→串行转换功能, 通过移位操作不断为加法器提供位宽为N 的操作数,输出移位寄存器完成串行→并行转换, 输出计算结果。 对于特定的输入字长, 通过选择不同的N 可以实现速度、 面积不同的数字串行加法器。 这样, 设计者可以根据实际情况加以选择, 提高了设计的灵活性。
1.5 流水线加法器
并行加法器速度快, 只有一级门延时, 对于实现4 位以下的加法器比较合适。FPGA 中每个逻辑单元规模小, 其中实现组合逻辑的为4 到5 变量的查找表 (LU T ) ,当增加并行加法器的位数时, 将受到查找表容量的,但是FPGA 中具有上千个触发器, 资源丰富, 因此可以考虑在FPGA 的设计中采用流水线结构, 充分利用丰富的触发器资源从而大大提高加法器的工作速度。流水线结构将每一步运
算都用寄存器暂存, 尽管单个运算需要多个时钟周期才能得出结果, 但由于操作数是不断加到运算输入端的, 所以总的效果是每个加法运算平均耗费的时间等于锁存时钟的周期, 即加法器的速度只受时钟速度的。
在ISE 中使用Verilog HDL 语言实现了一个8 位加法器, 分别采用了2 级和4 级流水线结构进行设计, 图2 和图3分别给出了8 位加法器的2 级和4 级流水线结构图。
流水深度越大加法器的速度越高, 但速度的提高是以牺牲资源为代价的, 性能 (速度) 和开销 (资源消耗) 是一对矛盾, 如何设计器件以提高性价比才是首要解决的问题。
(例一)流水线加法器设计(Verilog) 流水线4位(4bit)加法器 代码如下: `timescale 1ns / 1ps
module pipeline_add(a,b,cin,cout,sum,clk);
input[3:0] a,b; input clk,cin; output[3:0]sum; output cout;
reg[3:0] tempa,tempb; reg tempci; reg cout; reg firstco; reg[1:0] firstsum;
reg[2:0] firsta,firstb; //空出firsta[2]、firstb[2]放进位 reg[3:0] sum;
always@(posedge clk) begin
tempa=a; //输入数据缓存 tempb=b; tempci=cin; end
always@(posedge clk) begin
{firstco,firstsum}=tempa[1:0]+tempb[1:0]+tempci; //第一级加(低2位)
firsta=tempa[3:2]; //未参加计算的数据缓存 firstb=tempb[3:2]; end
always@(posedge clk) begin
{cout,sum}={firsta[2:0]+firstb[2:0]+firstco,firstsum}; //第二级加(高2位)
end
endmodule
(例二)16位2级流水线加法器的Verilog设计 module adder16_2(cout ,sum ,clk ,cina ,cinb ,cin) ; input [15 :0 ]cina ,cinb ; input clk ,cin ; output [15 :0 ] sum; output cout ; reg cout ; reg cout1 ; reg[7 :0 ] sum1 ; reg[15 :0 ] sum;
always @(posedge clk) begin // 低8 位相加;
{cout1 , sum1} = {cina [7], cina [ 7 : 0 ]} + {cinb[7], cinb [ 7 :
0 ]} +cin ;
end
always @(posedge clk) begin // 高8 位相加,并连成16位 {cout ,sum} = {{cina [15], cina [15 :8 ] }+ {cinb [15], cinb[15 :8]} + cout1 , sum1} ;
end
endmodule
个人总结:从例题的语句{cout1 , sum1} = {cina [7], cina [ 7 : 0 ]} + {cinb[7], cinb [ 7 : 0 ]} +cin ;可以看出八位相加并未提到进位寄存的中间变量,而仿真正确,说明直接相加过程中的进位是通过内部寄存的,拥有二进制全加法器的功能。其中一级流水线就是用到行波法加法器实现的,那么多级流水线就相当于行波法加法器的串联。不同之处在于行波法,N位相加需要N个周期,而流水线加法器实现了多级间同时并行。它和并行加法器的区别在于并行加法器对于实现4 位以下的加法器比较合适实现组合逻辑的为4 到5 变量的查找表 (LUT ) ,当增加并行加法器的位数时, 将受到查找表容量的,就需要使用流水线加法器。
当用户通过原理图或HDL语言描述了一个逻辑电路以后,PLD/FPGA开发软件会自动计算逻辑电路的所有可能结果,并把真值表(即结果)事先写入RAM,
这样,每输入一个信号进行逻辑运算就等于输入一个地址进行查表,找出地址对应的内容,然后输出即可。
由例二可以说明16位二级流水线中八位相加中间的进位也是可以自行进行的,不需要定义中间变量。以此类推,十六位的直接相加也是可以实现的。而区别只在于花费的时钟周期不同,占有的资源开销不同。
原理:从下面的两个图中我们可以看出一个clb可配置逻辑器件中有两个slice,x0y0的cout 即为同一列中 x0y1 的进位 cin。一个slice中主要由4个LUT(查找表),4个触发器,多路开关及进位链等资源。部分slice还包括分布式RAM和32bit移位寄存器,这种slice称为slicem,其它称为slicel,那么上面提到的查找表就存储在其中。CLB内部的两个slice是相互的,各自分别连接(switch matrix),以便与通用布线阵列相连。Cin为进位链的输入,cout为进位链的输入。
乘法器
2.1 移位累加乘法器
移位累加是最基本的硬件乘法器实现方式, 大多数的单片机和微处理器的乘法运算都采用这种方法。 基本原理如图1 所示: 将两个操作数分别以串行和并行模式输入到乘法器的输入端, 用串行输入操作数的每一位依次去乘并行输入的操作数, 每次的结果称之为部分积, 将每次相乘得到的部分积加到累加器里, 形成部分和, 部分和在与下一个部分积相加前要进行移位操作。
传统的移位累加乘法器实现起来相对比较简单, 考虑到二进制乘法中, 两个操作数位宽都为N位时, 其积的位数一般为 2N 位, 所以 8 位乘 8 位的乘法需要一个16 位的移位寄存器和一个16 位的加法器就可以实现。由于这种乘法器需要移位——加两步才能得到一个部分和, 因此若两个操作数位宽都为N , 则整个运算需要2N 个时钟周期。
pxyxk2ky
k0N1当N=8时, 就可以将8位乘8位的运算转换成8个8位乘1位的运算, 式中的每一项都可以通过与门得到。 因此乘法器只需要一个时钟周期就可以完成乘法运算, 理论上讲速度很快。 但是由于使用了多个加法器, 使其占用的片内资源面积较大, 而且使用多个加法器必然会产生一定的延迟, 使得时钟频率不会太高。
加法器是乘法器的基础,通过移位相累加的方法就是传统被称为移位累加乘法器的原理。由上面的加法器讨论可知,移位累加的方式是用到行波法加法器,那么弊端就在于当是比较多位的数字相乘时,用到的加法器比较多占用的资源比较大,延时也会比较大,那么使用的时钟频率就不能太高。
(例三) 用Verilog实现一个8位串行乘法器 module ade(x, y, clk, q); input [7:0] x; input [7:0] y; input clk; output [15:0] q;
reg [15:0] q;
parameter s0=0, s1=1, s2=2; reg [2:0] count; reg [1:0] state;
reg [15:0] p1, t; // 比特位加倍 reg [7:0] y_reg,z;
initial state<=s0;
always @(posedge clk) begin case (state)
s0 : begin // 初始化 y_reg <= y; state <= s1; count <= 0; z=0; p1 <= 0; t <= {z,x}; end
s1 : begin // 处理步骤
if (count == 7) //判断是否处理结束 state <= s2; else begin
if (y_reg[0] == 1) p1 <= p1 + t;
y_reg <= y_reg >> 1; //移位 t <= t << 1; count <= count + 1; state <= s1; end end
s2 : begin q <= p1;
state<=s0;
end endcase end endmodule
从图中的仿真结果可以看出so段初始化之后经历了一个周期,s1阶段移位累加用掉了8个周期,s3阶段将中间变量p1的值赋给q使用一个周期,那么完成8X8移位累加的总共为10个周期。在这些周期之间的x ,y 的变化是无法检测到的。所以做高速运算时需要注意到赋值的周期。我们平时的手动输入的当然就不需考虑这些了。
除法器
所有4种基本运算中除法器是最复杂的。因此除法器也是最耗时间的运算,而且还要实现的最大数量的不同算法的运算。
二进制除法器算法原理
对于给定的被除数N和除数D,除法得到两个结果:商Q和余数R,也就是:
NQD和
R,其中
RD当然,也可以将除法看成是乘法的逆运算,如下面的方程
所示:NDQR
除法在很多方面都与乘法不同,最重要的区别是在乘法中所有的部分乘积都可以并行生成,而在除法中每个商的位都是以一种顺序的过程确定的。
大多数微处理器都是将除法作为乘法的逆过程来处理的,假定分子是一个乘法所得的结果,所以将分母和商的位宽扩大两倍,但是需要检验商是否在有效范围内。我们使用一种通用的方法,其中假设:QN并且RD也就是假设商和分子以及分母和余数的位宽相同。有了这样的位宽假定,就不再需检验商的范围是否有效了(N=0除外)。
最明显的顺序算法就是使用“手工计算”方法变换到二进制算法。我们首先调整分母并加载分子到余数寄存器中。然后从余数中减去调整的分母并将结果存储在余数寄存器中。如果新的余数为正,我们就将商的LSB设置为1,否则商的LSB就设置为0,而且还需要通过加上分母来还原从前的余数值。最后,为下一步我们还要重新调整商和分母。重新计算从前的余数就是我们称之为“restoring除法”的原因。
(例四)8位restoring除法器
8位除法器的verilog描述如下。除法分4个阶段执行。首先,将8位的分子“加载”到余数寄存器中,6位的分母加载并调整(N位的分子采用2N1),将商寄存器重置。在第二和第三阶段s1和s2中进行实际的串行除法。在第四阶段s3中将商和余数传输到输出寄存器,假定分子和商都是8位宽,而分母和余数是6位的数值。
`timescale 1ns / 1ps
////////////////////////////////////////////////////////////////////////////////// // Company: // Engineer: //
// Create Date: 19:46:54 07/05/2009 // Design Name:
// Module Name: chufaqi // Project Name: // Target Devices: // Tool versions: // Description: //
// Dependencies: //
// Revision:
// Revision 0.01 - File Created
// Additional Comments: //
////////////////////////////////////////////////////////////////////////////////// module div_res(clk,n_in,d_in,r_out,q_out); input clk; input[7:0]n_in; input[5:0]d_in; output[5:0]r_out; reg[5:0]r_out; output[7:0]q_out; reg[7:0]q_out;
parameter s0=0,s1=1,s2=2,s3=3; reg[3:0]count; reg[1:0]state;
reg[13:0]r,d;//Double bit width reg[7:0]q;
initial state<=s0;
always@(posedge clk)begin//->Divider in behavioral stylecase(state) case(state)
s0:begin//Initialization step state<=s1; count=0;
q<=0;//Reset quotient register
d<={7'B0,d_in};//Load aligned denumerator r<={6'B0,n_in};//Remainder=nominator end
s1:begin//Processing step r<=r-d;//Subtract denumerator state<=s2; end
s2:begin//Restoring step if(r[13]==1)begin//Check r<0 r<=r+d;//Restore previous remainder q<=q<<1;//LSB=0 and SLL end else
q<=(q<<1)+1;//LSB=1 and SLL count=count+1; d<=d>>1;
if(count==8)//Division ready? state<=s3; else state<=s1; end
s3:begin//Output of result q_out<=q[7:0];
r_out<=r[5:0];state<=s0;//Start next division end endcase end endmodule
从仿真图形中我们可以看出,经so赋值后余数与除数反复比较,直到余数减除数为负时,商确定,余数确定,循环停止。我们可以看到restoring除法的主要缺点是需要两个步骤来确定一个商位。通过分析我们知道restoring除法的主要缺点是需要两个步骤来确定一个商位。我们可以将两个步骤合并起来,采用nonperforming除法器算法,也就是每次当分母大于余数时,就不执行减法。在vetilog中将新步骤写成
t<=r-d;//temporary remainder value if(t>=0)//Nonperforming test begin
r<=t;//Use new denominator q<=q*2+1;//LSB=1 and SLL end else
q<=q*2;//LSB=0 and SLL
这样步骤的数量减少了一半(初始化和结果的传输不计)。
个人总结:基于xilinx公司的FPGA开发板及设计流程,基本可概括为设计输入代码程序,检测,由Test Bench WaveForm添加激励源进行在线仿真。 使用chipscope-Pro 生成相应的核(相应的核是由程序中要利用的到的模块接
口等决定的),将生成的核文件添加到HDL 源程序中,从而将 ICON、ILA等内核插入到设计中,也可以使用 ChipScope Pro内核插入器将 ICON、ILA等内核直接插入到已经综合完成的设计网表中。然后,利用ISE的综合工具进行综合布线,生成配置文件。下一步,用户就可以通过 ChipScope Pro 分析仪软件将配置数据流下载到待测的器件中,进行分析测试。
其中在线仿真的功能和ChipScope Pro 分析仪软件的功能是有着异曲同工之妙的,不同之处在于Test Bench WaveForm修改激励观察现象,ChipScope Pro 分析仪软件可在线修改下载后输入的激励,直接观察到输出的影响。
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- fenyunshixun.cn 版权所有 湘ICP备2023022495号-9
违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务