0

下午好,

您认为您可以向我解释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应该变成二进制?

PS这个例子来自一个分频器。

4

1 回答 1

3

使用 numeric_std 我看不出有什么好的理由不说if count < 1.

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

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

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

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

更好的是:

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

SIGNAL count : Digit := ZERO;

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

于 2012-12-15T13:59:04.097 回答