我是很新的Verilog的,但想正确地理解它。 目前我对FPGA进行TxRx之上。 我注意到,我的代码是消费逻辑的数额巨大,但它不应该是这样的。 所以,我没有正确写我的代码。 我知道是错,显然我的for循环使表达式(尤其是因为这个for循环嵌套到另一个for循环)的并行化。 什么是编写代码来避免这种正确的方式。 该代码工作,但它是没有效率。 随意发表意见,建议。 我仍然在学习所以每一个建议很可能会好。 先感谢您。
Answer 1:
你的内循环中的每一行对数据的三个乘法和加法运算以及一些其他更小的操作(例如16%)。 该合成器展开循环,并试图合成做在一个时钟周期,这数到6 * 256次乘法所有这些操作的逻辑。 这具有较高的地区和余地很小实现资源共享。
你有一个选择权衡对地区的一些性能。 我会尝试以下方法:
实施循环的每次迭代在一个周期:计算出迭代,保存结果,然后用它下一个下一个时钟周期。 这将减少该地区的256倍,但还需要256个时钟周期才能完成,也就是说,你可以接受新的输入每256个时钟周期。 您可以在一个时钟周期的不同迭代次数的试验。 例如,你可以计算出在一个周期内你的外循环的每个迭代。 这将通过16次降低你的区域,并且每个计算需要16个时钟周期。
如果性能是非常重要的,你可以尝试流水线的电路。 这使你的代码稍微复杂一些,但会显著增加吞吐量。 例如,你可以有256级+的流水线寄存器的面积开销,但你的时钟周期可以是256次短得多。 同样,你可以与具有不同的流水线阶段试验,并选择适合您的需要最好的一个。
下面是一个例子要么在单个时钟周期或多个时钟周期(参见simple_mult模块)执行的迭代算法的。
文章来源: Verilog for loops - synthetization