2015-06-27 172 views
0

我必須在VHDL中創建一個只有併發語句的4位幅度比較器(no if/else或case/when)。4位幅度比較器VHDL

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 

entity Exercise is 
port ( A : in std_logic_vector (3 downto 0); 
     B : in std_logic_vector (3 downto 0); 
     Ag : out std_logic; 
     Bg : out std_logic; 
     AeqB: out std_logic 
     ); 
end Exercise; 

architecture Comparator of Exercise is 

begin 
    Ag <= '1'when (A>B) else '0'; 
    Bg <= '1' when (B>A) else '0'; --Problem: Here if i sumulate B="ZZZZ", Bg is 1, asi if B>A 
    AeqB<= '1' when (A=B) else '0'; 
end Comparator; 

的問題是,我需要在計算STD_LOGIC的所有其他值(U,X,Z,W,L,H, - ),我知道有是others,但不能弄明白如何使with/select聲明的比較器。

感謝

+0

如果你的幅度定義是通常的算術定義,那麼你最好使用numeric_std,它將把你的向量當作數值數據。然後你必須決定它們是否是有符號或無符號數,並分別聲明它們是'signed'或'unsigned'(或將類型轉換爲適當的形式)。 –

+0

通常可以使用package numeric_std_unsigned(-2008)將std_logic_vector視爲未簽名,該函數使用包含關係運算符的各種運算符進行unsigned的類型轉換的numeric_std調用。這是元值與二進制值之間的衝突,如果任一操作數包含元值,則numeric_std將解析爲FALSE。默認的運算符(本例中爲IEEE Std 1076-2008 9.2.3關係運算符)在枚舉的std_ulogic類型定義中是純粹的位置順序,而'Z'的位置高於'1'或'0'。 – user1155120

+1

許多工具(包括Xilinx)仍然缺乏VHDL2008支持,因此您可能不想使用numeric_std_unsigned。 –

回答

0

一般來說,你可以「轉換」的各種成要麼01使用to_01功能STD_LOGIC可以取的值。我認爲它在包numeric_std

0
library IEEE; 

    use IEEE.STD_LOGIC_1164.ALL; 
    use IEEE.STD_LOGIC_ARITH.ALL; 
    use IEEE.STD_LOGIC_UNSIGNED.ALL; 

    entity comp_4 is 
    port ( A:IN STD_LOGIC_VECTOR(0 to 3); 
     B:IN STD_LOGIC_VECTOR(0 to 3); 
     ET:OUT STD_LOGIC; 
     GT:OUT STD_LOGIC; 
     LT:OUT STD_LOGIC); 

    end comp_4; 

    architecture dataflow of comp_4 is 

    begin 
    with A-B(0 to 3) select 

    ET <= '1' when "0000", 
     '0' when others; 

    with A > B select 

    GT <= '1' when true, 
     '0' when others; 

    with A < B select 

    LT <= '1' when true, 
     '0' when others; 

    end dataflow; 
+0

請嘗試解釋代碼的作用。 – loki

+0

我寫的代碼試圖使用with - select - when語句對4位比較器進行建模。實體定義非常簡單。 – anonymous