2012-12-15 151 views
0

下午好,VHDL 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應該變成二進制數?

P.S.這個例子來自一個分頻器。

+0

哪個庫聲明UNSIGNED?我在問,因爲我不知道非標準的東西是否應該提供一個奇怪的子集。使用numeric_std我看不到有什麼好的理由不說'if count <1'。除非這是一種半預先記錄一個錯誤修復方法,以避免意想不到的錯誤問題,例如計數<2,例如,如果比較移動了一個週期以幫助流水線... –

+0

以下是使用的所有庫:庫IEEE; 使用IEEE.STD_LOGIC_1164.ALL; 使用IEEE.NUMERIC_STD.ALL; – petajamaja

+0

對不起,Drummond先生,請你解釋一下哪一個問題的含義? – petajamaja

回答

3

使用numeric_std我看不到任何好的理由不說if count < 1

也許這是一種半預先記錄一個kludgy修補程序的方法,用於意想不到的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; 

等等......然後移動數字和零到一包,並在所有的模塊,你可以重新使用它們。

+0

非常感謝你!順便說一下,我找到了答案。它只是基於MODULO計數器的分頻器。多麼簡單,多麼恥辱,我以前不明白。 – petajamaja