VHDL if语句 - 奇怪的价值

时间:2012-12-15 12:54:30

标签: if-statement vhdl unsigned

下午好,

你认为你可以向我解释 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...

我遇到的问题是部分

如果计数&lt; (2-1)

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

P.S。此示例来自分频器。

1 个答案:

答案 0 :(得分:3)

使用numeric_std我看不出有任何理由不说if count < 1

也许这是一种半文档修复针对预期的if count < 2的意外的逐个问题的方法,例如,如果比较早一个周期移动以帮助管道?

“off-by-one”问题也称为fencepost问题,可能是需求混乱的地方。但它也可能发生在流水线设计中,其中对管道进行了更改。当管道中的一个阶段太慢时,您必须中断该阶段的一部分并在之前或之后的某个周期执行 - 而不更改最终结果。因此,如果您需要“当count = 2”时执行某些操作,但提前将其移动一段时间,您现在可能需要调整比较“count”的值。

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

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

更好的是:

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

SIGNAL count : Digit := ZERO;

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