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