你好我必须制作一个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;
答案 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数据,那么从长远来看你将节省时间 - 这是非常值得的。