放寒假之前有打算用FPGA实现JPEG的编解码的,都知道二维DCT变换又是JPEG编解码的核心,于是就试着先用FPGA实现DCT变换。熟悉DCT变换公式的可能都知道图像的DCT变换,实际上就是用一组DCT系数与模板覆盖下的对应像素强度的乘累加。所以我们可以事先将DCT变换系数存在FPGA的ROM里,在做的过程中发现了一个问题那就是建立时间(setup time)得不到满足。经过检查发现,问题就出在DCT变换过程中的加法上,我在求最后的DCT变换结果时,直接将乘的结果送到加法器中,类似于这样的形式:
assign q_sum = q0+(q1<<1)+(q2<<2)+(q3<<3)+(q4<<4)+(q5<<5)+(q6<<6)+(q7<<7)+(q8<<8)+(q9<<9);
这个加法的长度也确实是长了,先忽略当中的移位操作,看看这个加法的RTL视图是有多么的长()
大神看到之后估计会笑喷了,如此长的加法链,如此长的组合逻辑,真实想不满足建立时间都难啊。