212 lines
6.3 KiB
VHDL
212 lines
6.3 KiB
VHDL
|
ARCHITECTURE test OF serialPortFIFO_tester IS
|
||
|
-- reset and clock
|
||
|
constant clockPeriod: time := (1.0/clockFrequency) * 1 sec;
|
||
|
signal clock_int: std_uLogic := '1';
|
||
|
-- RS232 speed
|
||
|
constant rs232Frequency: real := baudRate;
|
||
|
constant rs232Period: time := (1.0/rs232Frequency) * 1 sec;
|
||
|
constant rs232WriteInterval: time := 10*rs232Period;
|
||
|
-- RS232 Rx test
|
||
|
signal rs232OutString : string(1 to 32);
|
||
|
signal rs232SendOutString: std_uLogic;
|
||
|
signal rs232SendOutDone: std_uLogic;
|
||
|
signal rs232OutByte: character;
|
||
|
signal rs232SendOutByte: std_uLogic;
|
||
|
signal rs232OutByteReturned: std_ulogic_vector(rxData'range);
|
||
|
-- RS232 Tx test
|
||
|
signal rs232InString : string(1 to 32);
|
||
|
signal rs232SendInString: std_uLogic;
|
||
|
signal rs232SendInDone: std_uLogic;
|
||
|
signal rs232InByte: character;
|
||
|
signal rs232InByteReturned: character;
|
||
|
|
||
|
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;
|
||
|
|
||
|
------------------------------------------------------------------------------
|
||
|
-- RS232 Rx test
|
||
|
process
|
||
|
begin
|
||
|
rs232SendOutString <= '0';
|
||
|
wait for 4*rs232Period;
|
||
|
|
||
|
rs232OutString <= "test 1 ";
|
||
|
rs232SendOutString <= '1', '0' after 1 ns;
|
||
|
wait until rs232SendOutDone = '1';
|
||
|
wait for rs232WriteInterval;
|
||
|
|
||
|
rs232OutString <= "test 2 ";
|
||
|
rs232SendOutString <= '1', '0' after 1 ns;
|
||
|
wait until rs232SendOutDone = '1';
|
||
|
wait for rs232WriteInterval;
|
||
|
|
||
|
rs232OutString <= "test 3 ";
|
||
|
rs232SendOutString <= '1', '0' after 1 ns;
|
||
|
wait until rs232SendOutDone = '1';
|
||
|
wait for rs232WriteInterval;
|
||
|
|
||
|
rs232OutString <= "test 4 ";
|
||
|
rs232SendOutString <= '1', '0' after 1 ns;
|
||
|
wait until rs232SendOutDone = '1';
|
||
|
wait for rs232WriteInterval;
|
||
|
|
||
|
wait;
|
||
|
end process;
|
||
|
|
||
|
readRxFifo: process
|
||
|
begin
|
||
|
rxRd <= '0';
|
||
|
wait until falling_edge(rxEmpty);
|
||
|
rxRd <= '1';
|
||
|
wait for clockPeriod;
|
||
|
rs232OutByteReturned <= rxData;
|
||
|
end process readRxFifo;
|
||
|
|
||
|
|
||
|
------------------------------------------------------------------------------
|
||
|
-- RS232 Tx test
|
||
|
process
|
||
|
begin
|
||
|
rs232SendInString <= '0';
|
||
|
wait for 4*rs232Period;
|
||
|
|
||
|
rs232InString <= "hello 1 ";
|
||
|
rs232SendInString <= '1', '0' after 1 ns;
|
||
|
wait until rs232SendInDone = '1';
|
||
|
wait for rs232WriteInterval;
|
||
|
|
||
|
rs232InString <= "hello 2 ";
|
||
|
rs232SendInString <= '1', '0' after 1 ns;
|
||
|
wait until rs232SendInDone = '1';
|
||
|
wait for rs232WriteInterval;
|
||
|
|
||
|
rs232InString <= "hello 3 ";
|
||
|
rs232SendInString <= '1', '0' after 1 ns;
|
||
|
wait until rs232SendInDone = '1';
|
||
|
wait for rs232WriteInterval;
|
||
|
|
||
|
rs232InString <= "hello 4 ";
|
||
|
rs232SendInString <= '1', '0' after 1 ns;
|
||
|
wait until rs232SendInDone = '1';
|
||
|
wait for rs232WriteInterval;
|
||
|
|
||
|
wait;
|
||
|
end process;
|
||
|
|
||
|
--============================================================================
|
||
|
-- RS232 send
|
||
|
rsSendSerialString: process
|
||
|
constant rs232BytePeriod : time := 15*rs232Period;
|
||
|
variable commandRight: natural;
|
||
|
begin
|
||
|
|
||
|
rs232SendOutByte <= '0';
|
||
|
rs232SendOutDone <= '0';
|
||
|
|
||
|
wait until rising_edge(rs232SendOutString);
|
||
|
|
||
|
commandRight := rs232OutString'right;
|
||
|
while rs232OutString(commandRight) = ' ' loop
|
||
|
commandRight := commandRight-1;
|
||
|
end loop;
|
||
|
|
||
|
for index in rs232OutString'left to commandRight loop
|
||
|
rs232OutByte <= rs232OutString(index);
|
||
|
rs232SendOutByte <= '1', '0' after 1 ns;
|
||
|
wait for rs232BytePeriod;
|
||
|
end loop;
|
||
|
|
||
|
rs232OutByte <= cr;
|
||
|
rs232SendOutByte <= '1', '0' after 1 ns;
|
||
|
wait for rs232BytePeriod;
|
||
|
|
||
|
rs232SendOutDone <= '1';
|
||
|
wait for 1 ns;
|
||
|
|
||
|
end process rsSendSerialString;
|
||
|
|
||
|
rsSendSerialByte: process
|
||
|
variable txData: unsigned(7 downto 0);
|
||
|
begin
|
||
|
RxD <= '1';
|
||
|
|
||
|
wait until rising_edge(rs232SendOutByte);
|
||
|
txData := to_unsigned(character'pos(rs232OutByte), txData'length);
|
||
|
|
||
|
RxD <= '0';
|
||
|
wait for rs232Period;
|
||
|
|
||
|
for index in txData'reverse_range loop
|
||
|
RxD <= txData(index);
|
||
|
wait for rs232Period;
|
||
|
end loop;
|
||
|
|
||
|
end process rsSendSerialByte;
|
||
|
|
||
|
rsSendParallelString: process
|
||
|
variable commandRight: natural;
|
||
|
begin
|
||
|
|
||
|
rs232SendInDone <= '0';
|
||
|
txWr <= '0';
|
||
|
|
||
|
wait until rising_edge(rs232SendInString);
|
||
|
|
||
|
commandRight := rs232OutString'right;
|
||
|
while rs232InString(commandRight) = ' ' loop
|
||
|
commandRight := commandRight-1;
|
||
|
end loop;
|
||
|
|
||
|
wait until rising_edge(clock_int);
|
||
|
for index in rs232InString'left to commandRight loop
|
||
|
wait until rising_edge(clock_int);
|
||
|
while txFull = '1' loop
|
||
|
txWr <= '0';
|
||
|
wait until rising_edge(clock_int);
|
||
|
end loop;
|
||
|
rs232InByte <= rs232InString(index);
|
||
|
txWr <= '1';
|
||
|
end loop;
|
||
|
wait until rising_edge(clock_int);
|
||
|
|
||
|
while txFull = '1' loop
|
||
|
txWr <= '0';
|
||
|
wait until rising_edge(clock_int);
|
||
|
end loop;
|
||
|
rs232InByte <= cr;
|
||
|
txWr <= '1';
|
||
|
wait until rising_edge(clock_int);
|
||
|
txWr <= '0';
|
||
|
|
||
|
rs232SendInDone <= '1';
|
||
|
wait for 1 ns;
|
||
|
|
||
|
end process rsSendParallelString;
|
||
|
|
||
|
txData <= std_ulogic_vector(to_unsigned(character'pos(rs232InByte), txData'length));
|
||
|
|
||
|
------------------------------------------------------------------------------
|
||
|
-- RS232 receive
|
||
|
rsReceiveByte: process
|
||
|
variable rxData: unsigned(7 downto 0);
|
||
|
begin
|
||
|
wait until falling_edge(TxD);
|
||
|
|
||
|
wait for 1.5 * rs232Period;
|
||
|
|
||
|
for index in rxData'reverse_range loop
|
||
|
rxData(index) := TxD;
|
||
|
wait for rs232Period;
|
||
|
end loop;
|
||
|
|
||
|
rs232InByteReturned <= character'val(to_integer(rxData));
|
||
|
|
||
|
end process rsReceiveByte;
|
||
|
|
||
|
END ARCHITECTURE test;
|