2017-09-23 88 views
1

enter image description here串聯STD_LOGIC到測試平臺內STD_LOGIC_VECTOR在VHDL

這是我4比1 MUX的簡單示意圖。和我連接LOGIC到LOGIC_VECTOR時遇到問題...

這裏是我的測試臺代碼。我只是想展示MUX的所有可能輸入的性能。它編譯得很好,但它不像我預期的那樣工作。 我猜新聲明的矢量「X」和「我」是不是與原理的實際輸入鏈接

LIBRARY ieee; 
USE ieee.std_logic_1164.ALL; 
use ieee.std_logic_unsigned.all; 
USE ieee.numeric_std.ALL; 
LIBRARY UNISIM; 
USE UNISIM.Vcomponents.ALL; 
ENTITY MUX_SCHE_MUX_SCHE_sch_tb IS 
END MUX_SCHE_MUX_SCHE_sch_tb; 
ARCHITECTURE behavioral OF MUX_SCHE_MUX_SCHE_sch_tb IS 

    COMPONENT MUX_SCHE 
    PORT(X3 : IN STD_LOGIC; 
      X2 : IN STD_LOGIC; 
      X1 : IN STD_LOGIC; 
      X0 : IN STD_LOGIC; 
      I0 : IN STD_LOGIC; 
      I1 : IN STD_LOGIC; 
      Y : OUT STD_LOGIC); 
    END COMPONENT; 

    SIGNAL X3 : STD_LOGIC := '0'; 
    SIGNAL X2 : STD_LOGIC := '0'; 
    SIGNAL X1 : STD_LOGIC := '0'; 
    SIGNAL X0 : STD_LOGIC := '0'; 
    SIGNAL I0 : STD_LOGIC := '0'; 
    SIGNAL I1 : STD_LOGIC := '0'; 
    SIGNAL Y : STD_LOGIC; 

    ---------- New Variable ---------- 
    SIGNAL X : STD_LOGIC_VECTOR(3 downto 0); 
    SIGNAL I : STD_LOGIC_VECTOR(1 downto 0); 
    SIGNAL j : integer := 0; 
    SIGNAL k : integer := 0; 

BEGIN 

    X <= X3 & X2 & X1 & X0; 
    I <= I1 & I0; 
    UUT: MUX_SCHE PORT MAP(
     X3 => X3, 
     X2 => X2, 
     X1 => X1, 
     X0 => X0, 
     I0 => I0, 
     I1 => I1, 
     Y => Y 
    ); 

-- *** Test Bench - User Defined Section *** 
    tb : PROCESS 
    BEGIN 
    X <= "0000"; 
    I <= "00"; 
     while(j<4) loop 
      while(k<8) loop 
       X <= X + '1'; WAIT FOR 10 NS; 
      end loop; 
      I <= I + '1'; WAIT FOR 10 NS; 
     end loop; 

    END PROCESS; 
-- *** End Test Bench - User Defined Section *** 

END; 
+1

您對X和I的分配似乎是錯誤的方式,使DUT端口沒有值。簡單地刪除信號X3等並將端口映射爲'X => X(3),'等等 –

回答

1

由於布賴恩注意到X(和I)的分配是不正確的。

還有的情況是,X總是'X的,有兩個驅動程序。併發信號分配給X和未標記過程中的分配。此外,未標記的進程將不會成功初始化X,因爲在第一次賦值爲「0000」和內部while循環中的第一次賦值之間沒有中斷該進程的中止。

你也可以注意到,沒有分配給J和K這意味着你將永遠不會結束內部while循環,並提供一

克服本測試平臺的問題,還可能涉及簡化不同的值:

library ieee; 
use ieee.std_logic_1164.all; 

entity mux_sche_tb is 
end entity mux_sche_tb; 

architecture foo of mux_sche_tb is 
    use ieee.numeric_std.all; 
    component mux_sche 
     port ( 
      x3: in std_logic; 
      x2: in std_logic; 
      x1: in std_logic; 
      x0: in std_logic; 
      i0: in std_logic; 
      i1: in std_logic; 
      y: out std_logic 
     ); 
    end component; 

    -- signal x3:  std_logic := '0'; 
    -- signal x2:  std_logic := '0'; 
    -- signal x1:  std_logic := '0'; 
    -- signal x0:  std_logic := '0'; 
    -- signal i0:  std_logic := '0'; 
    -- signal i1:  std_logic := '0'; 
    signal y: std_logic; 

    -- ---------- new variable ---------- 
    signal x: unsigned(3 downto 0); 
    signal i: unsigned(1 downto 0); 
    -- signal j: integer := 0; 
    -- signal k: integer := 0; 

begin 

    -- x <= x3 & x2 & x1 & x0; 
    -- i <= i1 & i0; 

uut: 
    mux_sche 
     port map (
      x3 => x(3), 
      x2 => x(2), 
      x1 => x(1), 
      x0 => x(0), 
      i0 => i(0), 
      i1 => i(1), 
      y => y 
     ); 

tb: 
    process 
    begin 
    -- x <= "0000"; 
    -- i <= "00"; 
     wait for 10 ns; -- show initial state 
     for j in 0 to 3 loop 
      I <= to_unsigned(j, 2); 
      for k in 0 to 15 loop 
       X <= to_unsigned(k, 4); 
       wait for 10 ns; 
      end loop; 
     end loop; 
     wait; 
     -- while(j < 4) loop 
     --  while(k < 8) loop 
     --   x <= x + '1'; 
     --   wait for 10 ns; 
     --  end loop; 
     --  i <= i + '1'; 
     --  wait for 10 ns; 
     -- end loop; 

    end process; 
end architecture; 

而不是while循環語句中使用while循環迭代方案。 布賴恩的分配X的元素的建議擴展到I,並且只提供一個分配給任一元素,以消除多個驅動程序。

使包中的ieee.numeric_std中的聲明可見的use子句移動到允許分析原始體系結構的體系結構(並且它是允許在Synopsys軟件包中找到聲明的use子句ieee.std_logic_unsigned被移動到它的體系結構聲明區域)。

for循環迭代器是在循環語句迭代方案中隱式聲明的變量,並將其默認類型的整數轉換爲無符號X和I.

未簽名的X和I的元素與mux_sche的std_logic正式端口具有相同的基本類型,並且可以用作實際值(正如Brian所建議的那樣)。

提供必須提供Minimal, Complete and Verifiable example兼容mux_sche:

library ieee; 
use ieee.std_logic_1164.all; 

entity mux_sche is 
    port (
     X3: in std_logic; 
     X2: in std_logic; 
     X1: in std_logic; 
     X0: in std_logic; 
     I0: in std_logic; 
     I1: in std_logic; 
     Y: out std_logic 
    ); 
end entity; 

architecture foo of mux_sche is 

begin 
    process (X3, X2, X1, X0, I0, I1) 
    variable I: std_logic_vector (1 downto 0); 
    begin 
     I := TO_X01(I1 & I0); 
     case I is 
      when "00" => 
       Y <= TO_X01(X0); 
      when "01" => 
       Y <= TO_X01(X1); 
      when "10" => 
       Y <= TO_X01(X2); 
      when "11" => 
       Y <= TO_X01(X3); 
      when others => 
       Y <= 'X'; 
     end case; 
    end process; 
end architecture; 

如果是這樣的測試設計前分析和測試平臺進行了分析,闡述和模擬,我們結束了:

changed.png

顯示沒有X's並增加了X和I.

這個測試臺版本依賴於numeric_std包to_unsigned自然範圍整數的轉換,注意到X和我有循環迭代方案隱式聲明中指定的範圍。

是否可以使用原始測試臺?不適用於j和k的閾值測試。什麼將發生是k將經過8次迭代之後J到4次迭代打算:

enter image description here

使用而具有信號迭代循環比使用具有可變迭代循環強硬一點。

0

有在你的代碼的兩個問題:第一,X <= X3 & X2 & X1 & X0;會連接到X3X0分配結果X 。在tb的過程中,您再次分配到X,創建通常稱爲「多個驅動程序」的內容,即。代碼的多個部分驅動(可能不同)值到相同的信號。在編寫良好的VHDL代碼中,這很少是您想要的。

VHDL通過使用分辨率函數處理多個驅動程序:將函數應用於驅動到信號的所有值,然後將其輸出寫入信號;請參閱this以瞭解所使用的分辨率表。

我反對使用解決類型stronly建議,如std_logicstd_logic_vector,去他們的懸而未決的吊墜std_ulogicstd_ulogic_vector(注意u);如果你已經使用過這些,那麼在闡述過程中就會發現你的錯誤。

第二,如評論中所述,X3X0從未被分配任何值,保留爲U