一开始没看IP使用手册,心想这么简单的累加器还不是手到擒来,没想到在使用中发现不少坑,记录一下
使用Xilinx2020.2版本中的Accumulator(12.0)及DSP Macro(1.0)。设计目的是用Accumulator实现256个连续有效数据的累加。另外,使用DSP Macro是实现256个连续有效数据的累乘加。
Accumulator
Accumulator设定输入数据为无符号8bit,累加后16bit,使能CE与SCLR端口,输出延迟2 Latency,设置如下图所示:
测试时为简单起见,令输入数据保持8’d1;CE信号使用数据有效信号,在1~256时钟内置1,257时钟及之后置0;SCLR信号在256+2时钟置1,其他时间置0;未测试前想当然的以为在256+2个时钟就会输出累加值256,结果在255+2与256+2时钟输出255,之后被清除。
经过测试发现,因为Accumulator有2拍延迟,CE信号需要在1~257时钟内置1,258时钟及之后置0。SCLR信号仍然保持不变。结果会在256+2时钟输出256,之后被清除。
DSP Macro
DSP Macro设定两输入皆为8bit,累加后的结果选择全精度48bit(其他宽度是从48bit向下截取),同样启用CE与SCLR信号,输出延迟4 Latency。设置如下图所示:
测试时为简单起见,令两个输入数据都保持8’d1;CE信号使用数据有效信号,在1~256时钟内置1,257时钟及之后置0;SCLR信号在256+4时钟置1,其他时间置0;结果在253+4 ~ 256+4时钟输出253,之后被清除。
经过测试发现,因为DSP Macro有4拍延迟,CE信号需要在1~259时钟内置1,260时钟及之后置0。SCLR信号仍然保持不变。结果会在256+4时钟输出256,之后被清除。
总结
在使用累加或者累加乘之类输出需要重新参与输入运算的IP核时,如果使用CE接口,IP延迟为n Latency,则CE信号需要延长有效n-1个时钟;或者不启用CE接口,在前级控制数据在valid=0时为0。推荐后者,不过要注意在仿真时初始化此类IP核的输入为0,不然会导致累加x,输出x的现象。