93 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			VHDL
		
	
	
	
	
	
			
		
		
	
	
			93 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			VHDL
		
	
	
	
	
	
LIBRARY Common_test;
 | 
						|
  USE Common_test.testUtils.all;
 | 
						|
 | 
						|
ARCHITECTURE test OF uvmRs232_tester IS
 | 
						|
                                                              -- reset and clock
 | 
						|
  constant clockPeriod: time := (1.0/clockFrequency) * 1 sec;
 | 
						|
  signal clock_int: std_uLogic := '1';
 | 
						|
                                                                  -- RS232 speed
 | 
						|
  constant rs232Period: time := (1.0/rs232BaudRate) * 1 sec;
 | 
						|
                                                                     -- RS232 Rx
 | 
						|
  signal rs232RxChar : character := ' ';
 | 
						|
                                                                     -- RS232 Tx
 | 
						|
  signal rs232TxString : string(1 to 32);
 | 
						|
  signal rs232SendString: std_uLogic;
 | 
						|
  signal rs232SendDone: std_uLogic;
 | 
						|
 | 
						|
BEGIN
 | 
						|
  ------------------------------------------------------------------------------
 | 
						|
                                                              -- reset and clock
 | 
						|
  reset <= '1', '0' after 2*clockPeriod;
 | 
						|
 | 
						|
  clock_int <= not clock_int after clockPeriod/2;
 | 
						|
  clock <= transport clock_int after clockPeriod*9/10;
 | 
						|
 | 
						|
  ------------------------------------------------------------------------------
 | 
						|
                                                                  -- Tx sequence
 | 
						|
  txSequence : process
 | 
						|
  begin
 | 
						|
    rs232SendString <= '0';
 | 
						|
    rs232TxString <= (others => ' ');
 | 
						|
    wait for 500 us;
 | 
						|
                                                                    -- send 'Hi'
 | 
						|
    rs232TxString <= pad("Hi", rs232TxString'length);
 | 
						|
    rs232SendString <= '1', '0' after 1 ns;
 | 
						|
    wait until rs232SendDone = '1';
 | 
						|
                                                          -- end of transmission
 | 
						|
    wait;
 | 
						|
  end process txSequence;
 | 
						|
 | 
						|
  --============================================================================
 | 
						|
                                                                     -- RS232 Rx
 | 
						|
  storeRxByte: process(clock_int)
 | 
						|
  begin
 | 
						|
    if rising_edge(clock_int) then
 | 
						|
      if dataValid = '1' then
 | 
						|
        rs232RxChar <= character'val(to_integer(unsigned(dataOut)));
 | 
						|
      end if;
 | 
						|
    end if;
 | 
						|
  end process storeRxByte;
 | 
						|
 | 
						|
  ------------------------------------------------------------------------------
 | 
						|
                                                                     -- RS232 Tx
 | 
						|
  rsSendString: process
 | 
						|
    constant rs232CharPeriod : time := 15*rs232Period;
 | 
						|
    variable outStringRight: natural;
 | 
						|
    variable outchar: character;
 | 
						|
  begin
 | 
						|
                                                             -- wait for command
 | 
						|
    send <= '0';
 | 
						|
    dataIn <= (others => '0');
 | 
						|
    rs232SendDone <= '0';
 | 
						|
    wait until rising_edge(rs232SendString);
 | 
						|
                                                           -- find string length
 | 
						|
    outStringRight := rs232TxString'right;
 | 
						|
    while rs232TxString(outStringRight) = ' ' loop
 | 
						|
      outStringRight := outStringRight-1;
 | 
						|
    end loop;
 | 
						|
                                                              -- send characters
 | 
						|
    for index in rs232TxString'left to outStringRight loop
 | 
						|
      outchar := rs232TxString(index);
 | 
						|
      dataIn <= std_ulogic_vector(to_unsigned(
 | 
						|
        character'pos(outchar), dataIn'length
 | 
						|
      ));
 | 
						|
      wait until rising_edge(clock_int);
 | 
						|
      send <= '1', '0' after clockPeriod;
 | 
						|
      wait for rs232CharPeriod;
 | 
						|
    end loop;
 | 
						|
                                                         -- send carriage return
 | 
						|
    outchar := cr;
 | 
						|
    dataIn <= std_ulogic_vector(to_unsigned(
 | 
						|
      character'pos(outchar), dataIn'length
 | 
						|
    ));
 | 
						|
    wait until rising_edge(clock_int);
 | 
						|
    send <= '1', '0' after clockPeriod;
 | 
						|
    wait for rs232CharPeriod;
 | 
						|
                                                        -- signal end of sending
 | 
						|
    rs232SendDone <= '1';
 | 
						|
    wait for 1 ns;
 | 
						|
 | 
						|
  end process rsSendString;
 | 
						|
 | 
						|
END ARCHITECTURE test;
 |