微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 请教一个卷积器设计的问题

请教一个卷积器设计的问题

时间:10-02 整理:3721RD 点击:

在一个设计中要用到一个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替代吧。软件设计和芯片还是完全不一样的。

学习了~

多谢各位了

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top