资源描述
Virtex-4 FPGA XtremeDSP 简介及简单使用
前言:
随着应用需求的增加,算法复杂度也提高了.为了处理这些新的算法,需要有高性能的信号处理引擎.典型的固定加构DSP处理器不能独立穷完成处理任务,通常还需要一个DSP协处理器,来处理不断增加的,复杂算法的高性能部分.而FPGA非常适合弥补这些性能的差距.采用革命性_XtremeDSPTM Slice ,Xilinx的Virtex4 FPGA可以为高性能的数字信号处理提供理想的解决方案.
简介:
1. XtremeDSP Slice具有最高的性能、最低的功耗和最佳的经济性;级联逻辑的简单性和有效性;极低的功耗;增加成本效益灵活性;易用性。
2. 每个XtremeDSP tile都包含两个DSP48 slices 来构成一种能用粗精度DSP架构的基础。许多DSP的设计在乘法运算后要进行加法运算,这些功能在V4中都采用专用电路进行支持。
3. DSP48 Slice支持多种独立的功能,包括乘法器、乘累加器(MAC)、后接加法器的乘法器、三输入加法器、桶型移位器、宽总线多路利用器、大小比较器或宽计数器。还支持多个DSP48 Slice的连接以形成多种算术函数、DSP48滤波器以及不使用能用FPGA结构的复数算法。
4. DSP48 Slice是一个18*18位2进制补码乘法器,跟随一个48位符号扩展加法器/减法器/累加器(这是其主要应用)
5. 操作数输入、中间积和累加器输出的可编程流水线操作提高了吞吐量。48位内部总线几乎可以实现DSPSlice的无限制集合。
6. 可以将一个XtremeDSP Slice的输出结果与下一个XtremeDSP Slice的输入级联而无需使用一般的结构布线。该通路为许多具有任意罐头长度的DSP滤波器功能提供了高性能和低功耗的后加法功能。对于多精度算法,该通路可支持右引线移位,故一个XtremeDSP Slice的部分积可以进行右对齐,与下一个相邻的Slice计算的部分积相加。用该技术XtremeDSP Slice可以被设置为支持任意大小的操作数。
Virtex-4 DSP Slice架构亮点:
每个_DSP48 Slice具有一个后接多路复用器的2输入乘法器和一个3输入加法器/减法器。乘法器接受两个18位2进制补码操作数,产生一个36位2进制补码结果。该结果数可符号扩展至48位,并且可以馈至加法/减法器。加法/减法器接受三个48位2进制补码操作数(这其中有级联数据和累加减的结果数据),产生一个48位2进制补码结果。进行级联后还可以支持更高级别的DSP功能(级联B输入总线和DSP48的级联P输出总线提供了级联能力)。主要亮点归纳:
u 18位*18位2进制补码乘法器,具有全精度36位结果,可符号扩展至48位
u 带有寄存式累加反馈的灵活的3输入48位加法/减法器
u 动态的用户控制操作模式(OPMODE),以便在时钟周期改变时调整DSP48的功能
u 级联18位B总线支持输入采样传输
u 级联48位P总线支持部分结果的输出传输
u 支持多精度乘法器和算法,可将17位操作数右移来对齐宽位数乘法器部分积
u 支持对称智能舍入以获取更高的计算精度
u 控制和数据信号的性能增强流水线选项,可在配置位进行设置
u 输入端口C一般情况下用于乘法-加法运算、大型3操作数加法或灵活的舍入模式
u 控制和数据寄存器具有各自的复位和时钟使能
u I/O寄存器在不增加面积成本的情况下可保证最大的时钟性能和可能的最高采样率
u OPMODE多路复用器
下表给出了几种Virtex4器件内DSP48的数量
下图表明了其器件端口图,关于具体的设置将在后面介绍
关于DSP48的常规算术功能:
(累)加减法
DSP48 Slice包含一个加/减法单元,可以在单个DSP Slice上实现不同的加/减逻辑组合。其格式为
Out = Z _ (X + Y +CIN)
公式中的X、Y和Z是多路复用器。可能根据OPMODE的设置来选择X、Y、Z的选择结果。CIN项是加/减法单元的进位输入。确定是加法还是减法是由SUBTRACT输入来控制的,将其设置为0则为加法,为1为减法。下表给出了OPMODE中关于X、Y、Z的设置(OPMODE设置里先后顺序是Z、Y、X)。
注:其中A:B是将A输入的18位和B的18位组合成36位作为一个36位有符号数作为一个输入的。
如果将Y设成01即A*B,则X也应该这样设置。见下面乘累加。
(累加)乘法
将X、Y均设置成01,则可实现乘法。其表达式为
Out = C ± (A × B + CIN)
其他相关参数设置和加法设置相似。
FPGA主要参数设置:
下面给出的是在Verilog编程语句中的一个例化语段格式,真正使用时要做一定修改。
DSP48 #( //各线路流水线寄存器等参数的配置
.AREG(1), // Number of pipeline registers on the A input, 0, 1 or 2
.BREG(1), // Number of pipeline registers on the B input, 0, 1 or 2
.B_INPUT("DIRECT"), // B input DIRECT from fabric or CASCADE from another DSP48
.CARRYINREG(1), // Number of pipeline registers for the CARRYIN input, 0 or 1
.CARRYINSELREG(1), // Number of pipeline registers for the CARRYINSEL, 0 or 1
.CREG(1), // Number of pipeline registers on the C input, 0 or 1
.LEGACY_MODE("MULT18X18S"), // Backward compatibility, NONE, MULT18X18 or MULT18X18S
.MREG(1), // Number of multiplier pipeline registers, 0 or 1
.OPMODEREG(1), // Number of pipeline regsiters on OPMODE input, 0 or 1
.PREG(1), // Number of pipeline registers on the P output, 0 or 1
.SUBTRACTREG(1) // Number of pipeline registers on the SUBTRACT input, 0 or 1
) DSP48_inst ( //这个是例化的名字,下面是一个例化的接口参数设置
.BCOUT(BCOUT), // 18-bit B cascade output
.P(P), // 48-bit product output
.PCOUT(PCOUT), // 48-bit cascade output
.A(A), // 18-bit A data input
.B(B), // 18-bit B data input
.BCIN(BCIN), // 18-bit B cascade input
.C(C), // 48-bit cascade input
.CARRYIN(CARRYIN), // Carry input signal
.CARRYINSEL(CARRYINSEL), // 2-bit carry input select
.CEA(CEA), // A data clock enable input
.CEB(CEB), // B data clock enable input
.CEC(CEC), // C data clock enable input
.CECARRYIN(CECARRYIN), // CARRYIN clock enable input
.CECINSUB(CECINSUB), // CINSUB clock enable input
.CECTRL(CECTRL), // Clock Enable input for CTRL regsiters
.CEM(CEM), // Clock Enable input for multiplier regsiters
.CEP(CEP), // Clock Enable input for P regsiters
.CLK(CLK), // Clock input
.OPMODE(OPMODE), // 7-bit operation mode input
.PCIN(PCIN), // 48-bit PCIN input
.RSTA(RSTA), // Reset input for A pipeline registers
.RSTB(RSTB), // Reset input for B pipeline registers
.RSTC(RSTC), // Reset input for C pipeline registers
.RSTCARRYIN(RSTCARRYIN), // Reset input for CARRYIN registers
.RSTCTRL(RSTCTRL), // Reset input for CTRL registers
.RSTM(RSTM), // Reset input for multiplier registers
.RSTP(RSTP), // Reset input for P pipeline registers
.SUBTRACT(SUBTRACT) // SUBTRACT input
);
要点(注释之外应该注意的部分):
第一个括号内的配置,主要是器件流水线及级联参数的设置
① AREG,BREG的属性值可取0、1或2。 属性值规定了A和B输入通路中流水线寄存器的数量。
② CREG、MREG和PREG的属性值可取0或1。属性值规定了乘法器(MREG)输出端和加法器(PREG)输出端的流水线寄存器数量。CREG的属性用来选择C输入端的流水线寄存器。
③ 如果这些通路中没有流水线寄存器,则CARRYINREG、CARRYINSELREG、OPMODEREG和SUBTRACTREG属性值均取值为0,如果在其中通路中有一个流水线寄存器,则取值为1。(这是为了保证对数据操作的一致性,其实个人认为不必受其约束,如果在初始化时强制加减,则不需要将SUBTRACTREG的属性值也设为1,应该设为0,反而是设为1后会导致不会执行初始化的运算,如初始要其执行减法)
④ B_INPUT属性规定了到B端口的输入是来自于并行输入(DIRECT),还是来自前面Slice的级联输入(CASCADE)。
⑤ LEGACY_MODE的属性具有两个作用。第一个本质上与MREG的属性类似。它规定了实际上是否“直通”乘法器(MULT18*18),或者在乘法器的中间包含一个单独的流水线寄存器(MULT18*18S,与MREG的值(等于1)相同)。MREG的属性和LEGACY_MODE的属性出现任何不一致的设置都将被标记为软件设计规则校验(DRC)错误。属性的第二个作用是告诉时序工具,在时序计算中应该使用通过组合乘法器通路的A和B端口(较慢时序),还是使用时序更快的A:B的X多路复用器旁路通道。由于OPMODE可以动态变化,如果没有属性,时序工具就不能确定这些信息。(NONE时,时序分析/仿真将绕过乘法器,以获得最好的性能,在CEM的输入接地时,通过设定MREG 的值为1,可以获得最低的功耗;MULT18*18时,则时序分析/仿真将使用通过乘法器的组合通路,在此情况下MREG必须设为0,否则会发生DRC错误;MULT18*18S时,时序分析/仿真将使用一个流水线乘法器,此情况下MREG必须设为1,否则会发生DRC错误)
第二个括号内的配置,主要是信号输入输出及计算的操作类型的设置:
信号名称
Direction
位宽
功能
A
I
18
The multiplier's A input. This signal can also be used as the adder's Most Significant Word (MSW) input.
B
I
18
The multiplier's B input. This signal can also be used as the adder's Least Significant Word (LSW) input.
C
I
48
The adder's C input.
OPMODE
I
7
Controls the input to the X, Y, and Z multiplexers in the DSP48 slices (第2页有简要设置,后面也会详述).
SUBTRACT
I
1
0 = add, 1 = subtract.
CARRYIN
I
1
The carry input to the carry select logic.
CARRYINSEL
I
2
Selects carry source (进位来源,后面会给出列表参数).
CEA
I
1
Clock enable: 0 = hold, 1 = enable AREG.
CEB
I
1
Clock enable: 0 = hold, 1 = enable BREG.
CEC
I
1
Clock enable: 0 = hold, 1 = enable CREG.
CEM
I
1
Clock enable: 0 = hold, 1 = enable MREG.
CEP
I
1
Clock enable: 0 = hold, 1 = enable PREG.
CECTRL
I
1
Clock enable: 0 = hold, 1 = enable OPMODEREG, CARRYINSELREG.
CECINSUB
I
1
Clock enable: 0 = hold, 1 = enable SUBTRACTREG and general interconnect carry input.
CECARRYIN
I
1
Clock enable: 0 = hold, 1 = enable (carry input from internal paths).
RSTA
I
1
Reset: 0 = no reset, 1 = reset AREG.
RSTB
I
1
Reset: 0 = no reset, 1 = reset BREG.
RSTC
I
1
Reset: 0 = no reset, 1 = reset CREG.
RSTM
I
1
Reset: 0 = no reset, 1 = reset MREG.
RSTP
I
1
Reset: 0 = no reset, 1 = reset PREG.
RSTCTRL
I
1
Reset: 0 = no reset, 1 = reset SUBTRACTREG, OPMODEREG, CARRYINSELREG.
RSTCARRYIN
I
1
Reset: 0 = no reset, 1 = reset (carry input from general interconnect and internal paths).
CLK
I
1
The DSP48 clock.
BCIN
I
18
The multiplier's cascaded B input. This signal can also be used as the adder's LSW input.
PCIN
I
48
Cascaded adder's Z input from the previous DSP slice.
BCOUT
O
18
The B cascade output.
PCOUT
O
48
The P cascade output.
P
O
48
The product output.
进位输入逻辑:
进位输入逻辑结果是OPMODE控制位和CARRYINSEL的函数。其逻辑电路如下面的图。进位的多种选择性为电路设计提供了更大的操作空间。在某种意义上,X,Y和Z多路复用器功能为进位逻辑电路的进位输入进行了复制。OPMODE和CARRYINSEL都必须正确选择,以保证选择正确的进位输入。(简单电路设计上对CARRYINSEL就直接设置为2’b0,CARRYIN也配置成1’b0)
上图给出了由2位CARRYINSEL控制所选择的四个输入,OPMODE位负责提供附加的控制。第一个输入CARRYIN(CARRYINSEL为二进制00)由通用逻辑电路来驱动。这个选项允许实现基于用户逻辑电路的进位功能。使用时可以随意地对其进行寄存,以便与MREG的流水线延迟相匹配。下一个输入(CARRYINSEL等于二进制01)由输出P或级联输出PCIN的反向MSB驱动。最终选择P或PCIN由OPMODE来确定。第三个输入(CARRYINSEL为二进制10)是A的反向MSB,用于A与B的因令白马将值的舍入,或者A[17]XNOR B[17]的反向驱动。最终选择也是由OPMODE的状态来决定。第四个输入只不过是第三个输入的寄存版本,用于乘法器输出寄存器或MREG时,对进位输入延迟加以调整。
下表给出了不同设置时的进位来源:
CARRYINSEL[1:0]
OPMODE
Carry Source
Comments
00
XXX XX XX
CARRYIN
General fabric carry source (registered or not)
01
Z MUX output = P or Shift(P)
~P[47]
Rounding P or Shift(P)
01
Z MUX output = PCIN or Shift(PCIN)
~PCIN[47]
Rounding the cascaded PCIN or Shift(PCIN) from adjacent slice
10
X and Y MUX output = multiplier partial products
A[17] xnor B[17]
Rounding multiplier (MREG pipeline register disabled)
11
X and Y MUX output = multiplier partial products
A[17] xnor B[17]
Rounding multiplier (MREG pipeline register enabled)
10
X MUX output = A:B
~A[17]
Rounding A:B (not pipelined)
11
X MUX output = A:B
~A[17]
Rounding A:B (pipelined)
另外,进位逻辑支持对称舍入,在此不详述。
组合出来的各种计算情况
(其实这个不重要,只要前面将X、Y、Z的选择情况搞清楚就能组合出来下面的情况了。):
Hex OPMODE
Binary OPMODE
XYZ Multiplexer Outputs and Adder/Subtracter Output
[6:0]
Z Y X
Z
Y
X
Adder/Subtracter Output
0x00
000 00 00
0
0
0
±CIN
0x02
000 00 10
0
0
P
±(P + CIN)
0x03
000 00 11
0
0
A:B
±(A:B + CIN)
0x05
000 01 01
0
Note 1
±(A×B+CIN)
0x0c
000 11 00
0
C
0
±(C + CIN)
0x0e
000 11 10
0
C
P
±(C + P + CIN)
0x0f
000 11 11
0
C
A:B
±(A:B + C + CIN)
0x10
001 00 00
PCIN
0
0
PCIN ± CIN
0x12
001 00 10
PCIN
0
P
PCIN ± (P + CIN)
0x13
001 00 11
PCIN
0
A:B
PCIN ± (A:B + CIN)
0x15
001 01 01
PCIN
Note 1
PCIN ± (A×B+CIN)
0x1c
001 11 00
PCIN
C
0
PCIN ± (C + CIN)
0x1e
001 11 10
PCIN
C
P
PCIN ± (C + P + CIN)
0x1f
001 11 11
PCIN
C
A:B
PCIN ± (A:B + C + CIN)
0x20
010 00 00
P
0
0
P±CIN
0x22
010 00 10
P
0
P
P ± (P + CIN)
0x23
010 00 11
P
0
A:B
P ± (A:B + CIN)
0x25
010 01 01
P
Note 1
P ± (A×B+CIN)
0x2c
010 11 00
P
C
0
P±(C +CIN)
0x2e
010 11 10
P
C
P
P ± (C + P + CIN)
0x2f
010 11 11
P
C
A:B
P ± (A:B + C + CIN)
0x30
011 00 00
C
0
0
C±CIN
0x32
011 00 10
C
0
P
C ± (P + CIN)
0x33
011 00 11
C
0
A:B
C ± (A:B + CIN)
0x35
011 01 01
C
Note 1
C ± (A×B+CIN)
0x3c
011 11 00
C
C
0
C±(C +CIN)
0x3e
011 11 10
C
C
P
C ± (C + P + CIN)
0x3f
011 11 11
C
C
A:B
C ± (A:B + C + CIN)
0x50
101 00 00
Shift (PCIN)
0
0
Shift(PCIN) ± CIN
0x52
101 00 10
Shift (PCIN)
0
P
Shift(PCIN) ± (P + CIN)
0x53
101 00 11
Shift (PCIN)
0
A:B
Shift(PCIN) ± (A:B + CIN)
0x55
101 01 01
Shift (PCIN)
Note 1
Shift(PCIN) ± (A×B+ CIN)
0x5c
101 11 00
Shift (PCIN)
C
0
Shift(PCIN) ± (C + CIN)
0x5e
101 11 10
Shift (PCIN)
C
P
Shift(PCIN) ± (C + P + CIN)
0x5f
101 11 11
Shift (PCIN)
C
A:B
Shift(PCIN) ± (A:B + C + CIN)(2)
0x60
110 00 00
Shift (P)
0
0
Shift(P) ± CIN
0x62
110 00 10
Shift (P)
0
P
Shift(P) ± (P + CIN)
0x63
110 00 11
Shift (P)
0
A:B
Shift(P) ± (A:B + CIN)(2)
0x65
110 01 01
Shift (P)
Note 1
Shift(P) ± (A×B+CIN)
0x6c
110 11 00
Shift (P)
C
0
Shift(P) ± (C + CIN)
0x6e
110 11 10
Shift (P)
C
P
Shift(P) ± (C + P + CIN)
0x6f
110 11 11
Shift (P)
C
A:B
Shift(P) ± (A:B + C + CIN)
0x53
101 00 11
Shift (PCIN)
0
A:B
Shift(PCIN) ± (A:B + CIN)
0x55
101 01 01
Shift (PCIN)
Note 1
Shift(PCIN) ± (A×B+ CIN)
0x5c
101 11 00
Shift (PCIN)
C
0
Shift(PCIN) ± (C + CIN)
0x5e
101 11 10
Shift (PCIN)
C
P
Shift(PCIN) ± (C + P + CIN)
0x5f
101 11 11
Shift (PCIN)
C
A:B
Shift(PCIN) ± (A:B + C + CIN)(2)
0x60
110 00 00
Shift (P)
0
0
Shift(P) ± CIN
0x62
110 00 10
Shift (P)
0
P
Shift(P) ± (P + CIN)
0x63
110 00 11
Shift (P)
0
A:B
Shift(P) ± (A:B + CIN)(2)
0x65
110 01 01
Shift (P)
Note 1
Shift(P) ± (A×B+CIN)
0x6c
110 11 00
Shift (P)
C
0
Shift(P) ± (C + CIN)
0x6e
110 11 10
Shift (P)
C
P
Shift(P) ± (C + P + CIN)
0x6f
110 11 11
Shift (P)
C
A:B
Shift(P) ± (A:B + C + CIN)
Note 1:X、Y设置一样,均为A*B。
主要使用操作:
首先要考虑计算的位数和采用的计算式子,把思路先想好。接下来的操作就是复制Templates里关于DSP的那段语句,然后做相应修改即可。简单使用时修改时主要修改:
l AREG,BREG,CREG,PREG的寄存器的个数。
l 例化名DSP48_inst修改一下。
l 接口参数连接好。如果不需要输出只需要清空相应的输出括号里的原始参数。对于输入,如果没有输入或是输入为0,则输入相应的0,如是18位的,写为18’b0。这里面需要注意各个接口的位数,有18位,48位,7位等。输入时要考虑接口长度,不一致时考虑用连接符号。
l 将需要使用的线路其相应的时钟使能(可将其置为1),相应的复位信号置入复位信号。
l 修改加减法。SUBTRACT置1为减法,置0为加法。如果整个设计是固定加法或减法,要将第一个扩号内的SUBTRACTREG配置为0.
l 设置OPMODE,格式如7’b0010101或引入变量数据。
配置注意事项:
如果在初始化时单一使用加或减,则不能将SUBTRACTREG的属性值也设为1,应该设为0,反而是设为1后会导致不会执行初始化的运算,如初始要其执行减法
如果是拿上次的结果做累加减或累乘加的,则PREG一定要配置为1。否则不能正常编译,可以理解为计算下一结果时要用上一次的结果,则必然要寄存器寄存上一次的结果。
关于PCIN这样的级联输入一定需要用级联输入。否则在编译的时候能正常编译,但是在后面的分配管脚后的后仿真和生成相应的输入到FPGA上代码时不能正常生成。
则一个简单的DSP的例化和配置完成。
另外,其还可以组建更大的乘法器。下图说明了从较小的18*18位乘法器来构成35*35位乘法器的情况。符号“0,B[16:0]”表示B具有一个后随17个位的前导零,从而形成了一个2进制补码正数。
其设计思路如图,具体操作不再详述。
DSP48 Tile
另外,2个DSP48 Slice、一条共用的48位C总线和专用的互连线可组成一个DSP48 Tile。在一个DSP48 Column中,DSP48 Slice是垂直堆叠的。在Virtex-4器件中的DSP48 tile和比Block RAM具有各自独立的布线,这样可以使元件间可用的数据带宽实现加倍。
下图给出了其具体的布线逻辑。
更多DSP48应用:
DSP48基于其特定的逻辑结构,其还有很多实用功能,下面列出其一些高级功能,但由于精力有限,对具体操作不作详述。
l FIR滤波器(基本的FIR滤波器)
l FIR滤波器(多通道FIR滤波器)
l 加法级联与加法树
而在其官方有很多关于DSP48不同设计的例子,VerilogHDL或VHDL语言的都有。笔者已经将其下载下来并附上。其中的一些模型有:
单Slice、多周期、功能使用模型(下表给出了四个单Slice使用模型的设置参数)
Single Slice Mode
Slice Number
Cycle
Inputs
Function and OPMODE[6:0]
Output
A
B
C
35 x 18 Multiply
1
1
0,A[16:0]
B[17:0]
X
Multiply
0x05
P[16:0]
2
A[34:17]
B[17:0]
X
17-Bit Shift Feedback Multiply Add
0x65
P[52:17]
35 x 35 Multiply
1
1
0,A[16:0]
0,B[16:0]
X
Multiply
0x05
P[16:0]
2
A[34:17]
0,B[16:0]
X
17-Bit Shift Feedback Multiply Add
0x65
3
0,A[16:0]
B[34:17]
X
Multiply-Accumulate
0x25
P[33:17]
4
A[34:17]
B[34:17]
X
17-Bit Shift Feedback Multiply Add
0x65
P[69:34]
Complex Multiply
1
1
ARe[17:0]
BRe[17:0]
X
Multiply
0x05
2
AIm[17:0]
BIm[17:0]
X
Multiply-Accumulate
0x25
P (Real)
3
ARe[17:0]
BIm[17:0]
X
Multiply
0x05
4
AIm[17:0]
BRe[17:0]
X
Multiply-Accumulate
0x25
P (Imaginary)
单Slice、35*18乘法器使用模型
单Slice、35*35乘法器使用模型
全流水线型功能使用模型(下表列出了6个全流水线型功能的使用模型)
Multiple Slice Mode
Slice
Inputs
Function and OPMODE[6:0]
Output
A
B
35 x 18 Multiply
1
0,A[16:0]
B[17:0]
X
Multiply
0x05
P[16:0]
2
A[34:17]
B[17:0]
X
17-Bit Shifted Feedback Multiply Add
0x65
P[52:17]
35 x 35 Multiply
1
0,A[16:0]
0,B[16:0]
X
Multiply
0x05
P[16:0]
2
A[34:17]
0,B[16:0]
X
17-Bit Shifted Feedback Multiply Add
0x65
3
0,A[16:0]
B[34:17]
X
Multiply Accumulate
0x25
P[33:17]
4
A[34:17]
B[34:17]
X
17-Bit Shifted
展开阅读全文