请教一个卷积器设计的问题
在一个设计中要用到一个memory, 1024x11bit,
定义成:reg [10:0] mem[1023:0]; 其中的数值为固定值,一直不变。
需要计算mem 和另外一个矢量Vec的卷积,
Vec的长度也是1024,已经确切的知道其中只有五十个非零数值,但是非零值的位置是随机的,
也就是每算完一次卷积后,下一次这五十个非零数值出现的位置会变。
为了节省乘法器,并尽量少占用时钟周期,我最初想把mem搞成寄存器组,使用五十个乘法器,在得到Vec之后,
根据五十个非零值的位置,在每个时钟都同时从mem中读出五十个数据,送给乘法器,乘完后流水累加。
但是在综合的时候出问题了,目标器件选择的是Xilinx V5 330T,综合后SLICEM超了,布线fail掉了。
我想问题应该出在从mem中同时读出50个数据上面,我的写法是 data_i <= mem[addr_i] ; i 从0到49。
请教这个设计是不是没办法实现,还有其他的方法没? 多谢交流
沉底了...
应该不会的,330里面的DSP SLICE有192个,每个有25*18的乘法器,所以资源应该没问题的。
既然memory里面的东西是固定的,为什么不直接用常数呢?
也许信息不全,所以看不出来有任何的原因会资源不够。
memory里面的数也不完全是不变的,当进行了四次卷积运算之后,memory的数据就得更新一次。
我用ISE综合布线,结果确实fail了,报的是slicem超了...
首先定义了一些寄存器
reg [10:0] mem[1023:0];
reg [10:0] data_0 ;
reg [10:0] data_1 ;
...
reg [10:0] data_49 ;
reg [10:0] addr_0 ;
reg [10:0] addr_1 ;
...
reg [10:0] addr_49 ;
然后在always块里面赋值:
data_0<= mem[addr_0] ;
...
data_49<= mem[addr_49] ;
其中addr_0,addr_1...addr_49都是计数器
就这么个东西,就是有问题啊,我也被整晕了,对FPGA我是初学,不知道寄存器组是不是不能这么搞啊?
先把资源需求估算好,再把电路设计好。
最后再谈你的代码。
信综合器的能力,不如信春哥。
这样的代码的确资源使用会比较大,从mem到data的mux的确不得了。
分析一下,这个MUX的输入是mem所有的输出bit,选择信号是12bit的地址线,的确不小。不过对于V5-330来说,肯定够用。
两个建议:
1. 仔细检查一下,是不是综合时器件没有选择对,说不定你操作失误,根本没选择用V5-330。
2. 如果能够简化设计,最好不要用ASIC或者FPGA直接实现1024的卷积器。这种完全不做优化,软件的思维,需要优化到ASIC/FPGA中来, 用pipe line替代吧。软件设计和芯片还是完全不一样的。
学习了~
多谢各位了
