我使用比较匹配功能创建了以下计数器:
图书馆IEEE;使用IEEE.STD_LOGIC_1164.ALL;使用ieee.numeric_std.all;
实体柜台是 通用( N:自然:= 24 …
总的来说,在我看来,这是一个很好的描述。 但是,我想指出一些小问题(这可能是我对你的第一个问题的一些答案)。
1)因为,我现在看到你的计数器不包含任何复位(既不是异步也不是同步)。一般来说,你无法预测计数的起点(即使可能在启动时都是'0')。 在我看来,如果你有一个复位信号,这将是一个更简洁的设计。 我还注意到,无论计数器是否启用,都会激活加载。我对此没有任何评论,因为它可能是您的设计规范。也许您可以通过在“if enable”之外移动“if load”部分来压缩代码(即将顺序更改为比较)。 为了提高可读性(特别是当设计更加复杂时),我建议您标记该过程。这有助于您识别设计的不同部分。 如果您使用emacs的VHDL模式,则可以跳过大量的额外输入。它内置了模板,可以处理与编码相关的“无聊”部分。 我还看到您的输入端口有默认值。在我看来,这不是一个很好的做法;它们会被合成器忽略,导致IP可能与您期望的行为不同。通常,不要对外部信号做出假设(指定的部分)。 最后,我对比较部分发表了评论。 这适用于问题1)和& 2)
1-2) 在比较过程中,您刚刚在sensitivity-list中列出了counter_value。 这意味着该过程将被激活 只要 当counter_value改变时。 由于您将它与作为块输入的信号(compare_match_value)进行比较(因此它可以更改值),因此在灵敏度列表中也更好。否则,当您更改compare_match_value时,比较将不适用(即,不会激活该过程)。 Linting工具和合成器可能会抱怨它(声明警告,如不完整的敏感列表)。事实上,列出组合过程列表中可能发生变化的所有信号是一种很好的做法。
关于比较本身,你描述它的方式是绝对正常的,你不会有发现状态。基本上你已经指定了所有可能的条件,所以没有惊喜。
3) 关于你的第三个问题,既然你的目标是FPGA,你可以“放松”它。 FPGA具有用于快速算术运算的专用结构(并且只要您不使用所有这些),合成器将使用它们来关闭时间。 同样在ASIC中,合成器可能会选择合适的算术结构来关闭时间。 如果您想要安全,可以在比较块的输出处添加一个寄存器。这将阻止创建长组合路径,尤其是在IP必须与其他块集成时。当然,这个额外寄存器会增加一个1个时钟周期的时间,但它会改善你的整体时序。
我希望这些建议对你有用,并且(至少部分地)覆盖你的怀疑。 继续编码:)