2015-09-02 145 views
0

你好我必須做一個rs232驅動程序協議連接到nexys 2,我用3個模塊,frecuency除數,Tx,Rx代碼,但現在我必須看看我的代碼是否工作在測試臺上,我知道如何創建測試臺模塊,但不知道爲了使其工作而必須放置哪些東西。測試臺RS232協議VHDL

以下是測試臺我做了,但我不知道我要補充那裏,以我的RS232 UART炒鍋

-- VHDL Test Bench Created by ISE for module: UART 
LIBRARY ieee; 
USE ieee.std_logic_1164.ALL; 

-- Uncomment the following library declaration if using 
-- arithmetic functions with Signed or Unsigned values 
--USE ieee.numeric_std.ALL; 

ENTITY TB_RS232 IS 
END TB_RS232; 

ARCHITECTURE behavior OF TB_RS232 IS 

-- Component Declaration for the Unit Under Test (UUT) 

COMPONENT UART 
PORT(
    Rx : IN std_logic; 
    clk : IN std_logic; 
    Data_in : IN std_logic_vector(7 downto 0); 
    send : IN std_logic; 
    Tx : OUT std_logic; 
    Data_out : OUT std_logic_vector(7 downto 0); 
    ready : OUT std_logic 
    ); 
END COMPONENT; 


    --Inputs 
    signal Rx : std_logic := '0'; 
    signal clk : std_logic := '0'; 
    signal Data_in : std_logic_vector(7 downto 0) := (others => '0'); 
    signal send : std_logic := '0'; 

--Outputs 
    signal Tx : std_logic; 
    signal Data_out : std_logic_vector(7 downto 0); 
    signal ready : std_logic; 

    -- Clock period definitions 
    constant clk_period : time := 10 ns; 

BEGIN 

    -- Instantiate the Unit Under Test (UUT) 
    uut: UART PORT MAP (
     Rx => Rx, 
     clk => clk, 
     Data_in => Data_in, 
     send => send, 
     Tx => Tx, 
     Data_out => Data_out, 
     ready => ready 
    ); 

    -- Clock process definitions 
    clk_process :process 
    begin 
    clk <= '0'; 
    wait for clk_period/2; 
    clk <= '1'; 
    wait for clk_period/2; 
    end process; 


    -- Stimulus process 
    stim_proc: process 
    begin  
    -- hold reset state for 100 ns. 
    wait for 100 ns; 

    wait for clk_period*10; 

    -- insert stimulus here 

    wait; 
    end process; 

END; 

這裏是Frecuency除數:

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 
use ieee.std_logic_unsigned.all; 

entity DivFrec is 
Port (clk : in STD_LOGIC; 
     clk_div : out STD_LOGIC); 
end DivFrec; 

architecture Behavioral of DivFrec is 

signal contador : std_logic_vector(8 downto 0):=(others=>'0'); 

begin 
process(clk) 
begin 
if(rising_edge(clk))then 
    clk_div<='0'; 
    if(contador<433)then microsegundos 
     contador<=contador+1; 
    else 
     clk_div<='1'; 
     contador<=(others=>'0'); 
    end if; 
end if; 
end process; 

end Behavioral; 
+0

在刺激部分,您需要修改UUT的輸入信號,並在預期的時間延遲上使用一些測試值,然後驗證輸出是否包含預期值(斷言...報告對此有好處) –

回答

1

通常,我爲我的設計爲每個單獨/獨立界面編寫一個「刺激過程」。我看到了驅動RX信號所需的過程。一個單獨的進程來處理data_out並做好準備。這個過程也可以處理data_in和發送,如果它們是由同一個源驅動的(例如內部CPU或者狀態機),否則就是data_in和send的獨立過程。然後,也許有一個額外的過程來檢查德克薩斯州的價值 - 或者在下面我提出了這個捷徑。

Test1:基本UART接收測試: 驅動Rx端口上的許多字到UUT。使用子程序將8位數據轉換爲UART格式,以便在信號RX上進行驅動。你的子程序接口可能如下:

procedure UartSend ( 
    constant Data : in unsigned(7 downto 0) ; 
    signal RX : out std_logic 
) is 
    begin 
    ... 
    end procedure UartSend ; 

那麼你的測試是通過調用UartSend構造:

UartSend(X"4A", RX) ; 
    UartSend(X"4B", RX) ; 

for in in 1 to 26 loop 
    UartSend(X"4A"+i, RX) ; 
end loop ; 

在一個單獨的進程,檢查的話都收到正確地在內部並行接口上。

測試2:檢查UART錯誤恢復 如果您的UART處理奇偶校驗和停止位錯誤,請在您的 測試平臺中生成這些錯誤。這可能意味着在程序中添加額外的初始化參數,以指示是否注入這些錯誤。

在內部接口上,驗證您的設計是否正確發出錯誤信號。我注意到內部接口看起來像沒有處理這些的能力。

Test3:基本的UART發送測試 在內部接口上,生成要傳送出UART接口的值。

如果我要爲每個獨立接口進行一個進程,我將創建一個UART接收子程序,該子程序將處理來自TX線路的中央採樣UART位值並使用它來接收值,然後檢查它們是否相同由處理內部接口的進程傳輸。由於您已經測試過您的UART接收器,因此在此測試平臺中,我可能會採取快捷方式並將UART TX連接至RX線 (環回模式),然後驗證是否正確值在內部接口上被接收。在這種情況下,我會使用通用控制的if語句將TX分配給RX。

這應該至少讓你開始。

順便說一句,如果你花時間學習如何使用一個過程來傳輸UART數據,那麼從長遠來看將節省時間 - 這是非常值得的。