|
今天有网友在群里问了我们的图像处理教程之RGB转灰度图像源码里的这样一段代码是什么意思: gray_r <= {sum,6'b000000}+{sum,4'b0000}+ {sum,2'b00} + sum;
并询问这条语句是等同于sum*13么
网友认为是等同于sum*13,应该当成乘法结合律来算了。网友的观点部分正确,实际上这个就是乘法结合律,只不过她错误的理解了每一项中{sum, n'b000}的意义,这个操作属于位拼接,将数据的低位放到高位,然后低位补0,实质就是左移,而左移我们知道相当于乘法,左移n位就是乘以2^(n-1),所以,这个表达式的最终演化过程为:
gray_r <= {sum,6'b000000}+{sum,4'b0000}+ {sum,2'b00} + sum;
gray_r <= sum << 6 + sum << 4+ sum << 2 + sum;
gray_r <= sum *64 + sum * 16+ sum * 4 + sum;
gray_r <= sum*(64+16+4+1);
gray_r <= sum*85;
可以看到,实质就是实现了sum*85。这个考虑是对乘法进行了分解,将乘法使用移位相加的方式代替了。这样在器件中没有乘法器的时候可以加快运算速度。当然,现在的fpga中已经都集成了有乘法器了,所以这个操作在FPGA中教学意义大于实际意义,而在CPLD这样的不含硬件乘法器的器件中,却是非常有价值的。
工程文件包有点大,这里就补上传了,欢迎大家在我们的芯路恒各大FPGA技术QQ群文件下载。
大家在学习这个教程时候,如果有更多疑问,也可以直接在本帖下回复,描述清楚您的疑惑。我们也会及时为您解答。
|
|