FPGA:向上计数还是向下计数?

电器工程 FPGA 视频文件 赛灵思 凤蝶
2022-01-10 01:19:56

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

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

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

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

占空比并不重要。

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

是否有一种“标准”方式可以为编译器提供最佳优化机会?

4个回答

优化到这个水平会让你心碎。结果可能会因您使用的 FPGA 技术、FPGA 中的其他因素以及您无法控制的因素(包括装配者的随机数种子)而发生变化。

话虽如此,我相信选项 3 将是最好的。选项 1 和 2 在计数器之间有一个比较器/或门,以便它可以发出已达到目标数的信号。选项 2 可能比 1 稍微快一些,因为它可以在没有任何反相器的情况下直接进行 OR'd 运算,但是再次遇到小的技术差异,它可能更快地进行 AND 或 XOR。

选项 3 跳过了对计数器中额外一位的低成本的比较。这应该是值得的,除非你在人字拖方面受到严格限制。

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

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

这样做的好处是它不需要额外的 FF,而且许多 FGPA 都有专用的辅助逻辑来加速计数器或加法器电路中的这种进位操作。

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

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

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

一些 FPGA 具有“预加载”功能,其中寄存器可以初始化为任意值,在这种情况下初始化为 \$N-1\$,倒计时并使用最高进位作为输出和复位(在下一个周期中)更多比同时实现加法器和比较器更有效。如果没有预加载,加法器可能会更好。

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