80 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			VHDL
		
	
	
	
	
	
			
		
		
	
	
			80 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			VHDL
		
	
	
	
	
	
| LIBRARY Common_test;
 | |
|   USE Common_test.testUtils.all;
 | |
| 
 | |
| ARCHITECTURE RTL OF uvmRs232Monitor IS
 | |
| 
 | |
|   constant uartDataBitNb: positive := 8;
 | |
|   signal baudPeriod: time;
 | |
|   signal rxWord, txWord: natural;
 | |
|   signal startup, rxReceived, txReceived: std_ulogic;
 | |
| 
 | |
| BEGIN
 | |
|   ------------------------------------------------------------------------------
 | |
|   baudPeriod <= 1.0/baudRate * 1 sec;
 | |
| 
 | |
|   ------------------------------------------------------------------------------
 | |
|                                                                   -- receive RxD
 | |
|   receiveRxD: process
 | |
|     variable rxData: unsigned(uartDataBitNb-1 downto 0);
 | |
|   begin
 | |
|     rxReceived <= '0';
 | |
|                                                                     -- start bit
 | |
|     wait until falling_edge(RxD);
 | |
|     wait for 1.5 * baudPeriod;
 | |
|                                                                     -- data bits
 | |
|     for index in rxData'reverse_range loop
 | |
|       rxData(index) := RxD;
 | |
|       wait for baudPeriod;
 | |
|     end loop;
 | |
|                                                             -- store information
 | |
|     rxWord <= to_integer(rxData);
 | |
|     rxReceived <= '1';
 | |
|     wait for 0 ns;
 | |
|   end process receiveRxD;
 | |
| 
 | |
|   ------------------------------------------------------------------------------
 | |
|                                                                   -- receive RxD
 | |
|   receiveTxD: process
 | |
|     variable txData: unsigned(uartDataBitNb-1 downto 0);
 | |
|   begin
 | |
|     txReceived <= '0';
 | |
|                                                                     -- start bit
 | |
|     wait until falling_edge(TxD);
 | |
|     wait for 1.5 * baudPeriod;
 | |
|                                                                     -- data bits
 | |
|     for index in txData'reverse_range loop
 | |
|       txData(index) := TxD;
 | |
|       wait for baudPeriod;
 | |
|     end loop;
 | |
|                                                             -- store information
 | |
|     txWord <= to_integer(txData);
 | |
|     txReceived <= '1';
 | |
|     wait for 0 ns;
 | |
|   end process receiveTxD;
 | |
| 
 | |
|   --============================================================================
 | |
|                                                               -- monitor acesses
 | |
|   startup <= '1', '0' after 1 ns;
 | |
| 
 | |
|   reportBusAccess: process(startup, rxReceived, txReceived)
 | |
|   begin
 | |
|     if startup = '1' then
 | |
|       monitorTransaction <= pad(
 | |
|         "idle",
 | |
|         monitorTransaction'length
 | |
|       );
 | |
|     elsif rising_edge(rxReceived) then
 | |
|       monitorTransaction <= pad(
 | |
|         reportStart & " sent " & sprintf("%02X", rxWord),
 | |
|         monitorTransaction'length
 | |
|       );
 | |
|     elsif rising_edge(txReceived) then
 | |
|       monitorTransaction <= pad(
 | |
|         reportStart & " received " & sprintf("%02X", txWord),
 | |
|         monitorTransaction'length
 | |
|       );
 | |
|     end if;
 | |
|   end process reportBusAccess;
 | |
| 
 | |
| END ARCHITECTURE RTL;
 |