FPGA:递增还是递减?


11

我正在学习使用FPGA(Papilio开发板,使用vhdl具有xilinx spartan3e)。

我需要将输入脉冲除以(硬编码)数字。

我可以看到3个选项-大致为伪代码(以10个计数为例):

  1. 初始化为0,在输入上升沿加1,则为10;如果相等,则重置为0并触发输出脉冲
  2. 初始化为10,在输入上升沿减小1,则为0;否则,为0。如果相等,则重置为10并触发输出脉冲
  3. 初始化为9,但请确保至少有1个前导“ 0”位,这是我的输出位。在输入上升沿减小1。在输出位的上升沿,复位。

占空比并不重要。

其中之一比其他更好吗?有没有我没有想到的更好的方法?

有没有一种“标准”的方法可以使编译器有最佳的优化机会?


3
那只是三个选项:-) ...但是,很重要的是,在FPGA中,这实际上并不重要。各个逻辑元素足够通用,以至于无论采用哪种方式,它都占用相同数量的资源并为您提供相同的性能。决定取决于数字在设计中的其他位置是否有用或有用。
Dave Tweed

2
第四个选项:10位循环移位寄存器,装载了“ 1000000000”并在上升沿移位。将移位寄存器的一位用作您正在做的事情的使能。
林肯

1
附带说明-完成工作后,您的编译器/安装程序GUI工具应具有一个选项,向您显示在各种抽象级别创建的实际电路,直到门为止,因此您应该能够看到该工具如何适合您的电路并然后您可以对源进行适当的更改。
匿名

Answers:


12

优化到这个水平会伤您的心。结果可能会由于您所使用的FPGA的技术,FPGA中的其他因素而有所变化,也可能由于您无法控制的因素(包括钳工的随机数种子)而有所不同。

话虽如此,我认为备选案文3将是最好的。选项1和2在计数器之间有一个比较器/或门,以便可以用信号通知已达到目标编号。选项2可能比1快一点,因为它们都可以直接进行“或”运算而无需任何反相器,但是您又遇到了较小的技术差异,在这些差异中,与AND或XOR相比可能更快。

选项3跳过比较,以降低计数器中额外一位的成本。除非您在触发器中受到严格限制,否则这应该是值得的。

关于计数器的一个有趣的事实是,它们往往被分组为一个逻辑块中特定于设备的大小,如果这一额外的位将您赶出了该组,您将看到时序变化超出预期。


+1,除非时钟速度限制了该技术的局限性,否则应该让时序报告指导其时序优化。在无原因的情况下,在Spartan 3e或任何FPGA上追逐数百皮秒通常是浪费时间。
jalalipop

4

另一种选择是将计数器初始化为6(= 2 4-10),计数,然后在进位输出激活时(即FF全为1)复位。

这样做的好处是不需要额外的FF,并且许多FGPA具有专用的辅助逻辑,可以加快计数器或加法器电路中这种进位运算的速度。


3

依靠。例如:0→1和1→0的触发器传播延迟可以不同,因此000→001和001→000的计数器转换延迟可以略有不同。取决于FPGA中使用的cmos技术,它可能更高或更低。因此,您必须综合并找出哪个具有更好的计时性能。


3

从编译器作者的角度来看:如果使用integer,则内部表示形式是未定义的,并且编译器可以自由选择最有效的实现。

如果您强制使用特定的内部表示,则优化器仍将尝试对其进行改进,但它将从稍差的有利位置开始。

ñ-1个

除非您知道内部结构,否则分配给其他逻辑的资源(许多FPGA具有专用的浮点乘法加法逻辑,如果您有剩余单元,也可以用来实现计数器),并且完全确定不会进行切换对于不同的模型,答案是“不要考虑”。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.