测试台RS232协议VHDL

时间:2015-09-02 15:51:44

标签: vhdl xilinx

你好我必须制作一个rs232驱动程序协议才能连接到nexys 2,我用3个模块,frecuency divisor,Tx,Rx编写了代码,但是现在我必须看看我的代码是否适用于测试平台,我知道如何创建测试台模块,但不知道我必须放在那里以使其工作。

以下是我制作的测试台,但我不知道我必须添加什么来制作我的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;

1 个答案:

答案 0 :(得分:1)

通常我为我的设计的每个独立/独立界面编写“刺激过程”。我看到了驱动RX信号所需的过程。一个单独的进程来处理data_out并准备就绪。如果它们由相同的源(例如内部CPU或状态机)驱动,则此进程也可以处理data_in并发送,否则,data_in和send的单独进程。然后可能需要另外一个检查TX上的值的过程 - 或者在下面我提出了一个快捷方式。

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处理奇偶校验和停止位错误,请在您的 试验台。这可能意味着在您的过程中添加额外的初始化参数,以指示是否注入这些错误。

在内部接口上,验证您的设计是否正确发出错误信号。我注意到内部界面看起来没有能力处理这些。

测试3:基本UART发送测试 在内部接口上,生成要从UART接口传输的值。

如果我要为每个独立接口继续一个进程,我会创建一个UART接收子程序,它将处理来自TX线的中心采样UART位值并使用它来接收值,然后检查它们是否相同由处理内部接口的进程传输。

OTOH,因为你已经测试了你的UART接收器,在这个测试平台中,我可能倾向于采取捷径并将UART TX连接到RX线 (环回模式),然后验证内部接口上是否收到了正确的值。在这种情况下,我将使用由泛型控制的if generate语句将TX分配给RX。

至少应该让你开始。

顺便说一句,如果你花时间学习如何使用程序来传输UART数据,那么从长远来看你将节省时间 - 这是非常值得的。