2014-11-14 252 views
0

我正在嘗試爲一個學校項目的實驗室工作。我們應該最終制作一個程序,將有符號的整數值顯示給altera板。這是一路上的步驟之一,我卡住了。我無法弄清楚爲什麼if/else語句不能編譯,我是VHDL的新手,請大家幫忙。VHDL If/Else語句

----------------------------------------------------------------- 
-- circuit for converting a 4-bit signed integer 
-- to a 1-bit sign and a 4-bit absolute value 
----------------------------------------------------------------- 
library ieee; 
use ieee.std_logic_1164.all; 

entity sgnabs4 is 
    port (X : in std_logic_vector(3 downto 0); 
     sgn : out std_logic; 
     Xabs : out std_logic_vector(3 downto 0)); 
end sgnabs4; 

architecture sgnabs4_arch of sgnabs4 is 

    component twos_complement4 is 
     port (A : in std_logic_vector(3 downto 0); 
      T : out std_logic_vector(3 downto 0)); 
    end component twos_complement4; 

     -- you may define internal signals here as you feel necessary 
     signal That: std_logic_vector(3 downto 0); 
     signal Ahat: std_logic_vector(3 downto 0); 

begin 


    twos_complement4_0: twos_complement4 
     port map(T => That, A=> Ahat); 

    sgn <= That(3); 


    if (sgn = '1') then 
    sgn => Xabs(3); 
    Xabs(2) <= not X(2); 
    Xabs(1) <= not X(1); 
    Xabs(0) <= not X(0); 


    else 

    Xabs(3) <= '0'; 
    Xabs(2) <= X(2); 
    Xabs(1) <= X(1); 
    Xabs(0) <= X(0); 

    end if; 

end sgnabs4_arch; 
+1

您需要將if語句放入進程中。另外'sgn => Xabs(3)'在這裏不起作用。 – sebs

回答

2

Andy的回答可能是有效的,但它並不能解釋你的問題。所以:

正如在評論中指出的那樣,您的if聲明需要處於一個過程中。 if語句是連續的;只有併發語句被允許在體系結構體外的進程之外。

雖然指出的兩個修復程序sebs可能允許您的代碼進行編譯(取決於您如何處理另一位,我會在一分鐘內),但它仍然無法工作。

  • 你的組件實例twos_complement4_0已經Ahat映射到映射到其輸出端口的輸入端口和That,但你不值在代碼中的任意位置分配給Ahat,那麼會有什麼That是什麼?可能沒有任何用處。如果您複製並粘貼了該內容,則需要了解它能夠適當修改它的功能。查找教程,特別是組件實例化和端口映射。
  • 你是否也想離開這條線sgn <= That(3);?你不能從多個地方開車sgn。這個過程是一個過程,併發語句似乎是另一個(儘管可能不是很難說)。這不起作用。

它看起來就像你正在試圖做的是:

  • 讓你輸入的二進制補碼。
  • 如果輸入爲負數,請使用二進制補碼,否則請使用原始數字(並在sgn上輸出適當的數值)。

最接近的事你原來的代碼,這是否將是:

architecture sgnabs4_arch of sgnabs4 is 

    component twos_complement4 is 
     port (A : in std_logic_vector(3 downto 0); 
      T : out std_logic_vector(3 downto 0)); 
    end component twos_complement4; 

    signal tmp : std_logic_vector(3 downto 0); 

begin 

    twos_complement4_0 : twos_complement4 
    port map (A => X, T => tmp); 

    sgn <= X(3); 

    process (X, tmp) 
    begin 
    if (X(3) = '1') then 
     Xabs <= tmp; 
    else 
     Xabs <= X; 
    end if; 
    end process; 

end sgnabs4_arch; 

tmpX倒數。如果X爲負數(即其符號位爲'1'),則輸出反碼,否則輸出X。這可能不是完成此任務的最有效方式,正如Andy所暗示的那樣,但它應該有效,並且可能是您的意圖。

+0

他們也可以做一個1班輪,而不是一個進程:'Xabs <= tmp當X(3)='1'else X;' – QuantumRipple

+0

是的,併發任務會更短 - 我的意圖是做一個爲了說明關鍵差異更好一點,從原始代碼中跳躍得更小。 – fru1tbat

1

如果你只需要一個快速的解決方案,你可以採取這樣的:

----------------------------------------------------------------- 
-- circuit for converting a 4-bit signed integer 
-- to a 1-bit sign and a 4-bit absolute value 
----------------------------------------------------------------- 
library ieee; 
use ieee.std_logic_1164.all; 
use ieee.numeric_std.all; 

entity sgnabs4 is 
    port (X : in std_logic_vector(3 downto 0); 
     sgn : out std_logic; 
     Xabs : out std_logic_vector(3 downto 0)); 
end sgnabs4; 

architecture sgnabs4_arch of sgnabs4 is 

begin 

process(X) 

variable tmp : signed(3 downto 0); 

begin 

    tmp := signed(X); 

    if tmp < 0 then 
     sgn  <= '1'; 
     tmp  := -tmp; 
     Xabs <= std_logic_vector(tmp); 
    else 
     sgn  <= '0'; 
     Xabs <= std_logic_vector(tmp); 
    end if; 

end process; 

end sgnabs4_arch; 

如果你更想了解,算術是如何工作的,請參考維基百科第一:

http://en.wikipedia.org/wiki/Two%27s_complement

如果你想學習VHDL,最好的方法是尋找教程,然後提出具體問題。