下午好,
你认为你可以向我解释 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。此示例来自分频器。
答案 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移动到一个包中,您可以在所有模块中重复使用它们。