【问题标题】:VHDL if statement - strange valueVHDL if 语句 - 奇怪的值
【发布时间】:2012-12-15 12:54:29
【问题描述】:

下午好,

您认为您可以向我解释 if 语句右侧的值是什么意思吗? 在我不太明白的示例中,有两个声明的无符号向量。

CONSTANT ZERO : UNSIGNED(3 DOWNTO 0) := (OTHERS=>'0); 
SIGNAL count : UNSIGNED(3 DOWNTO 0) := ZERO;

接着是:

IF clk'EVENT AND clk='1' THEN
    if count<(2-1) THEN
         output<='1';
         etc...

我有问题的是部分

如果计数(2-1)

这 2-1 意味着什么?我有几个想法。通过谷歌搜索,我发现 vector_name(n-1 downto 0) 是声明向量的常用方法,其中 n = 位数或总线宽度。但是,这似乎与示例没有任何共同之处。另一种猜测:左边的值是一个无符号二进制信号,那么可能2-n表示比较前的n应该变成二进制?

附:此示例来自分频器。

【问题讨论】:

  • 哪个库声明了 UNSIGNED?我问是因为我不知道非标准是否提供了它应该提供的奇怪子集。使用 numeric_std 我看不出有什么理由不说if count &lt; 1。除非它是一种半记录 kludgy 修复的方法,以解决预期的 if count &lt; 2 的意外问题,例如如果比较提前一个周期移动以帮助管道......
  • 这里是所有用到的库:library IEEE;使用 IEEE.STD_LOGIC_1164.ALL;使用 IEEE.NUMERIC_STD.ALL;
  • 抱歉,Drummond 先生,您能解释一下逐一问题是什么意思吗?

标签: if-statement vhdl unsigned


【解决方案1】:

使用 numeric_std 我看不出有什么理由不说if count &lt; 1

也许这是一种半记录 kludgy 修复的方法,用于解决预期的 if count &lt; 2 的意外问题,例如如果比较提前一个周期来帮助管道?

“逐一”问题也称为fencepost 问题,可能是要求令人困惑的地方。但它也可能发生在对管道进行更改的流水线设计中。当管道中的一个阶段太慢时,您必须中断该阶段的一部分并提前或稍后执行一个循环 - 而不改变最终结果。因此,如果您需要在“当 count = 2”时执行某项操作,但将其提前一个周期,您现在可能需要调整与“count”进行比较的值。

这不是一个确定的答案,您需要在实际代码的上下文中考虑它。

关于为什么有两个“无符号”声明:第一个只是一个命名常量,这是一个好习惯。它可以减少大型设计中的输入,并且更容易理解和维护。

更好的是:

subtype Digit is UNSIGNED(3 DOWNTO 0);
CONSTANT ZERO : Digit := (OTHERS=>'0'); 

SIGNAL count : Digit := ZERO;

等等...然后将数字和零移动到一个包中,您可以在所有模块中重复使用它们。

【讨论】:

  • 真的非常感谢!顺便说一句,我找到了答案。它只是一个基于 MODULO 计数器的除法器。多么简单,多么遗憾我之前没有理解它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多