|
|
大家知道,高端的FPGA中都有为数不少的DSP块,里边主要包括一些18X18的乘法器,以及加法器等单元,相邻的DSP往往可以通过专用的连线互连,从而实现滤波器的级联设计,提高滤波器的运行速度。Xilinx和Altera的DSP块有所差别,Xilinx的DSP模块可以做18X18乘法,18X18乘累加运算,18X18乘加运算等,其中累加器可以到48位宽,厂家标称的最高速度位500MHz。Altera的DSP块可以分解成为8X8, 16X16, 32X32块,可以完成乘法,乘累加,乘加等运算,厂家标称的最高速度为450MHz。
? 下面的表格给出了一些综合结果。
?
| FPGA Platform | FPGA Type | Speed (MHz) | Speed (MHz) | FPGA Type | FPGA Platform | | Stratix II | EP2S90F1020C3 | 313 | 165 | xc4vsx35-ff668-12 | Virtex 4 | | EP2S90F1020C4 | 282 | 154 | xc4vsx35-ff668-11 | | EP2S90F1020C5 | 240 | 124 | xc4vsx35-ff668-10 | ?
| FPGA Platform | FPGA Type | Speed (MHz) | Speed (MHz) | FPGA Type | FPGA Platform | | Stratix II | EP2S90F1020C3 | 195 | 109 | xc4vsx35-ff668-12 | Virtex 4 | | EP2S90F1020C4 | 169 | 101 | xc4vsx35-ff668-11 | | EP2S90F1020C5 | 141 | 88 | xc4vsx35-ff668-10 | ?
1.? Xilinx之所以速度比Altera慢一个原因可能是ISE综合时可能需要加一些约束才可以达到最佳状态,就这件事情我曾经咨询过Xilinx的应用工程师,她给了我一个使用Synplify综合的结果,速度明显比我使用ISE的好不少。
2.? 有关Xilinx的DSP Block,我还试了不少其他的模块,包括简单的乘法器等,但是都不能达到器标称的500MHz,另外,ISE不能支持随意的写法,对代码的风格有一定的要求,比如,需要写成同步reset,这样才能被综合到DSP Block当中。
? 附件是相应的VHDL代码,欢迎大家讨论。
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity NoiseFilterD is
? port(
??? aReset : in std_logic;
??? Clk??? : in std_logic;
???
??? cDin?? : in std_logic_vector(7 downto 0);
??? cDout? : out std_logic_vector(7 downto 0));
end NoiseFilterD;
architecture rtl of NoiseFilterD is
<span style="font-size: 10.5pt; font-family: 宋体">? constant kNumCoes : positive := 57;
?
? type IntegerArray is array (natural range ) of integer;
? constant kCoe : IntegerArray(kNumCoes-1 downto 0) := (
???????????????????????????????????? -5,?? 6,??? 10,?? 0,??? -16,? -11,? 16,?? 31,
???????????????????????????????????? -1,?? -48,? -34,? 45,?? 84,?? -2,?? -120, -84,
???????????????????????????????????? 105,? 193,? -4,?? -272, -194, 241,? 463,? -5,
???????????????????????????????????? -742, -618, 952,? 3092, 4095, 3092, 952,? -618,
???????????????????????????????????? -742, -5,?? 463,? 241,? -194, -272, -4,?? 193,
???????????????????????????????????? 105,? -84,? -120, -2,?? 84,?? 45,?? -34,? -48,
???????????????????????????????????? -1,?? 31,?? 16,?? -11,? -16,? 0,??? 10,?? 6,
???????????????????????????????????? -5);
???????????????????????????????????????????????
? type SignedArray is array (natural range ) of signed(7 downto 0);
? signal cDelayData : SignedArray(kNumCoes-1 downto 0);??
?
? type ProdArray is array (natural range ) of signed(20 downto 0);
? signal cProd : ProdArray(kNumCoes-1 downto 0);
?
? type SumArray is array (natural range ) of signed(22 downto 0);
? signal cSumL1 : SumArray(13 downto 0);
? signal cSumL2 : SumArray(3 downto 0);
? signal cSumL3 : SumArray(0 downto 0);
???????????????????????????????????????????????
begin??????????????????????????????????????????
?
? cDout |
|