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;
 |