我想设计一个模块,将16位寄存器移位n次,其中n每次都在动态变化。我想在1个时钟周期内得到结果,并且我正在使用Xilinx Zynq FPGA。我已经知道设计的三种实现,但是我想知道是否存在其他可能的方式:
1-我想到的第一种方法是使用顺序逻辑在每个周期内进行一次移位。在最坏的情况下,我需要16个周期(如果n = 16)来进行此转换。
2-另一种方法是将16种不同的移位组合起来,并将其馈送到多路复用器中,然后使用n选择我想要的移位。在一个周期内,我可以轻松地将输入数字移动任意次数。
3-第三种方法是在我的FPGA中使用基于RAM的移位寄存器
第一种方法显然不能满足我的约束,我想在一个时钟周期内获得结果。如果要扩展设计,第二种方法似乎会消耗很多fpga资源,第三种方法是使用有价值的BRAM。我想知道是否还有其他方法?
答案 0 :(得分:3)
为什么不使用内置的移位运算符?
分配x = y << z;
这将使“ y”移位“ z”个位置,并在LS位上加零。 当然,“ x”必须足够大才能容纳结果。取决于“ z”的最大值。
它构建了一个所谓的桶形移位器,并且综合工具非常擅长提高效率。
您将很难找到更理想的解决方案。