2012-10-26 38 views
0

我有一個關於VHDL代碼,我試圖寫一個ADC逐次逼近寄存器的問題。VHDL - 逐次逼近寄存器

在下面顯示的代碼,將DigitalOutTemp是連續更新整個for循環?或者它只會在流程結束時收到OutTemp的價值?

我想我可能有邏輯錯誤的,但我試圖做的是有DigitalOutTemp經歷一個數字模擬轉換器,然後與我的測量模擬信號的比較。比較器然後將反饋到寄存器中。  

LIBRARY ieee; 
USE  ieee.std_logic_1164.all; 

ENTITY SARegister IS 
PORT (
    Comparator, Clock      : IN std_logic; 
    DigitalOutFinal, DigitalOutTemp : OUT std_logic_vector (13 downto 0) 
); 
END; 

ARCHITECTURE Behavioural OF SARegister IS 
BEGIN 

PROCESS (CompIn, Clock) 
    VARIABLE OutTemp : std_logic_vector (13 downto 0); 
BEGIN 
    IF (rising_edge(Clock)) THEN 
     OutTemp := "10000000000000"; 

     FOR i IN 13 downto 0 LOOP 

      IF (Comparator = '0') THEN 
       OutTemp(i) := '0'; 
      END IF; 

      IF (i > 0) THEN 
       OutTemp(i - 1) := '1'; 
      END IF; 

      DigitalOutTemp <= OutTemp; 

     END LOOP; 

     DigitalOutFinal <= OutTemp; 

    END IF; 

END PROCESS; 
END; 

回答

0

我不清楚您的轉換,您的代碼太奇怪了。但是我會指出你的代碼中有什麼問題。 它沒有回答因爲評論是兩個窄寫。希望能讓你的代碼更好。

PROCESS (CompIn, Clock) 

這個敏感的名單可能會導致一些我不知道,因爲我看不到CompIn信號再在你的代碼。如果你希望它是一個寄存器,請把只有這個名單上clocksetreset信號(或enable帶有時鐘門控。

VARIABLE OutTemp : std_logic_vector (13 downto 0); 
BEGIN 
    IF (rising_edge(Clock)) THEN 
    OutTemp := "10000000000000"; 

    FOR i IN 13 downto 0 LOOP 

     IF (Comparator = '0') THEN 
      OutTemp(i) := '0'; 
     END IF; 

     IF (i > 0) THEN 
      OutTemp(i - 1) := '1'; 
     END IF; 

兩個if不會導致更好的結果,因爲第二次將首先覆蓋。我確信OutTemp用得到這個(甚至循環)畢竟1111..11

 DigitalOutTemp <= OutTemp; 

請不要把這個分配新建分配FY在這個循環。即使你分配給它無限的時間,這個過程只運行時的時鐘rising_eadge。

END LOOP; 

    DigitalOutFinal <= OutTemp; 

END IF; 
END PROCESS; 

我可以肯定你的代碼不能編譯,因爲缺少CompIn。即使你加CompIn,結果DigitalOut...總會1111...1(所有的)。

0

在下面顯示的代碼中,DigitalOutTemp會在整個for循環中不斷更新 ?還是隻能在流程結束時收到OutTemp 的值?

每次寫入DigitalOutTemp信號會得到安排新的價值時間進行更新。然而,更新將不會發生,直到當前增量循環結束(即所有進程觸發完成後)。

直到那一點,如果讀出的信號(在同一進程中或在任何其他處理)可以保證讀取相同(起始)值。