1
0
SEm-Labos/06-07-08-09-SystemOnChip/SystemOnChip_test/hdl/beamerSoc_tester_test.vhd
github-classroom[bot] d212040c30
Initial commit
2024-02-23 13:01:05 +00:00

295 lines
12 KiB
VHDL

ARCHITECTURE test OF beamerSoc_tester IS
-- clock and reset
constant clockPeriod: time := (1.0/clockFrequency) * 1 sec;
signal sClock: std_uLogic := '1';
signal sReset: std_uLogic := '1';
-- register definition
constant beamerBaseAddress: natural := 16#20#;
constant beamerControlRegisterAddress: natural := beamerBaseAddress + 0;
constant beamerControlRun: natural := 2#001#;
constant beamerControlUpdatePattern: natural := 2#010#;
constant beamerControlInterpolateLinear: natural := 2#100#;
constant beamerControlsizeBase: natural := 16#80#;
constant beamerSpeedRegisterAddress: natural := beamerBaseAddress + 1;
constant beamerXFifoRegisterAddress: natural := beamerBaseAddress + 2;
constant beamerYFifoRegisterAddress: natural := beamerBaseAddress + 3;
-- microprocessor bus access
constant registerWriteDelay: time := 4*clockPeriod;
signal registerAddress: natural;
signal registerDataOut, registerDataIn: integer;
signal registerWrite, registerRead, registerDone: std_uLogic;
-- UART access
-- constant uartFrequency: real := 115200.0;
constant uartDataBitNb: positive := 8;
constant uartFrequency: real := 1.0E6;
constant uartPeriod: time := (1.0/uartFrequency) * 1 sec;
constant uartDataSpan: time := 10*uartPeriod;
constant uartWriteReplySpan: time := 5*uartDataSpan;
constant uartReadReplySpan: time := 10*uartDataSpan;
signal uartRxData, uartTxData: integer;
signal uartSend, uartDone: std_uLogic;
signal uartTxShiftRegister: unsigned(2*uartDataBitNb-1 downto 0);
signal uartTxDataWord: integer;
BEGIN
------------------------------------------------------------------------------
-- clock and reset
sClock <= not sClock after clockPeriod/2;
clock <= transport sClock after clockPeriod*9/10;
reset <= '1', '0' after 2*clockPeriod;
------------------------------------------------------------------------------
-- test sequence
process
begin
io <= (others => 'Z');
selSinCos <= '0';
wait for 1 ns;
assert false
report cr & cr & cr & cr &
"----------------------------------------" &
"----------------------------------------" &
"----------------------------------------"
severity note;
----------------------------------------------------------------------------
-- initialization by microprocessor
wait for 100 ns - now;
assert false
report "Init" & cr & " --> " &
"Letting the microprocessor initialize the peripherals"
severity note;
----------------------------------------------------------------------------
-- test GPIOs
wait for 400 ns - now;
assert false
report "GPIOs" & cr & " --> " &
"Testing the GPIOs"
severity note;
io(7 downto 4) <= x"5";
wait for 1 ns;
assert io = x"5A"
report "GPIO error"
severity error;
----------------------------------------------------------------------------
-- set speed count value
wait for 3*uartPeriod - now;
assert false
report "Beamer init" & cr & " --> " &
"Setting drawing speed"
severity note;
registerAddress <= beamerSpeedRegisterAddress;
registerDataOut <= 2;
--registerAddress <= 16#1234#;
--registerDataOut <= 16#5678#;
registerWrite <= '1', '0' after clockPeriod;
wait for uartPeriod;
wait until registerDone = '1';
wait for uartWriteReplySpan;
----------------------------------------------------------------------------
-- start updating pattern
assert false
report "Beamer init" & cr & " --> " &
"Writing y-pattern to beamer RAM"
severity note;
registerAddress <= beamerControlRegisterAddress;
registerDataOut <= beamerControlUpdatePattern;
registerWrite <= '1', '0' after clockPeriod;
wait for uartPeriod;
wait until registerDone = '1';
wait for uartWriteReplySpan;
----------------------------------------------------------------------------
-- write y-FIFO
registerAddress <= beamerYFifoRegisterAddress;
registerDataOut <= -16#4000# + 16#10000#;
registerWrite <= '1', '0' after clockPeriod;
wait for uartPeriod;
wait until registerDone = '1';
wait for uartWriteReplySpan;
registerDataOut <= 16#7000#;
registerWrite <= '1', '0' after clockPeriod;
wait for uartPeriod;
wait until registerDone = '1';
wait for uartWriteReplySpan;
registerDataOut <= 16#7000#;
registerWrite <= '1', '0' after clockPeriod;
wait for uartPeriod;
wait until registerDone = '1';
wait for uartWriteReplySpan;
registerDataOut <= -16#7000# + 16#10000#;
registerWrite <= '1', '0' after clockPeriod;
wait for uartPeriod;
wait until registerDone = '1';
wait for uartWriteReplySpan;
----------------------------------------------------------------------------
-- start run
assert false
report "Beamer play" & cr & " --> " &
"Launching pattern drawing (setting pattern size and run flag)"
severity note;
registerAddress <= beamerControlRegisterAddress;
registerDataOut <= beamerControlRun + beamerControlsizeBase * 4;
registerWrite <= '1', '0' after clockPeriod;
wait for uartPeriod;
wait until registerDone = '1';
wait for uartWriteReplySpan;
----------------------------------------------------------------------------
-- readback control register
assert false
report "Beamer test" & cr & " --> " &
"Reading back control register"
severity note;
registerAddress <= beamerControlRegisterAddress;
registerRead <= '1', '0' after clockPeriod;
wait for uartPeriod;
wait until registerDone = '1';
wait for uartReadReplySpan;
assert uartTxDataWord = beamerControlRun + beamerControlsizeBase * 4
report "Beamer register readback error"
severity error;
----------------------------------------------------------------------------
-- stop simulation
wait for 1.5 ms - now;
assert false
report "End" & cr & " --> " &
"End of simulation"
severity failure;
end process;
--============================================================================
-- microprocessor bus access
busAccess: process
variable writeAccess: boolean;
-- variable packetId: natural := 0;
variable packetId: natural := 16#1D#;
variable checksum: natural;
begin
registerDone <= '1';
uartSend <= '0';
uartRxData <= 16#AA#;
wait on registerWrite, registerRead;
registerDone <= '0';
writeAccess := false;
if registerWrite = '1' then
writeAccess := true;
end if;
-- send header
uartSend <= '1', '0' after uartPeriod;
wait for uartPeriod;
wait until uartDone = '1';
checksum := uartRxData;
-- send packet id
uartRxData <= packetId;
packetId := (packetId + 1) mod 2**8;
uartSend <= '1', '0' after uartPeriod;
wait for uartPeriod;
wait until uartDone = '1';
checksum := (checksum + uartRxData) mod 2**8;
-- send command
if writeAccess then
uartRxData <= 16#03#;
else
uartRxData <= 16#04#;
end if;
uartSend <= '1', '0' after uartPeriod;
wait for uartPeriod;
wait until uartDone = '1';
checksum := (checksum + uartRxData) mod 2**8;
-- send data length
if writeAccess then
uartRxData <= 4;
else
uartRxData <= 2;
end if;
uartSend <= '1', '0' after uartPeriod;
wait for uartPeriod;
wait until uartDone = '1';
checksum := (checksum + uartRxData) mod 2**8;
-- send addresss low
uartRxData <= registerAddress mod 2**8;
uartSend <= '1', '0' after uartPeriod;
wait for uartPeriod;
wait until uartDone = '1';
checksum := (checksum + uartRxData) mod 2**8;
-- send addresss high
uartRxData <= registerAddress / 2**8;
uartSend <= '1', '0' after uartPeriod;
wait for uartPeriod;
wait until uartDone = '1';
checksum := (checksum + uartRxData) mod 2**8;
-- send data low
if writeAccess then
uartRxData <= registerDataOut mod 2**8;
uartSend <= '1', '0' after uartPeriod;
wait for uartPeriod;
wait until uartDone = '1';
checksum := (checksum + uartRxData) mod 2**8;
-- send data high
uartRxData <= registerDataOut / 2**8;
uartSend <= '1', '0' after uartPeriod;
wait for uartPeriod;
wait until uartDone = '1';
checksum := (checksum + uartRxData) mod 2**8;
end if;
-- send checksum
uartRxData <= checksum;
uartSend <= '1', '0' after uartPeriod;
wait for uartPeriod;
wait until uartDone = '1';
end process;
------------------------------------------------------------------------------
-- UART access
sendByte: process
variable serialData: unsigned(7 downto 0);
begin
-- send stop bit
uartDone <= '1';
RxD <= '1';
-- get new word
wait until rising_edge(uartSend);
uartDone <= '0';
serialData := to_unsigned(uartRxData, serialData'length);
-- send start bit
RxD <= '0';
wait for uartPeriod;
-- send data bits
for index in serialData'reverse_range loop
RxD <= serialData(index);
wait for uartPeriod;
end loop;
-- send stop bits
RxD <= '1';
wait for 4*uartPeriod;
end process sendByte;
------------------------------------------------------------------------------
-- UART access
receiveByte: process
variable serialData: unsigned(uartDataBitNb-1 downto 0);
begin
-- wait for stat bit
wait until falling_edge(TxD);
-- jump to middle of first data bit
wait for 1.5 * uartPeriod;
-- read data bits
for index in serialData'reverse_range loop
if Is_X(TxD) then
serialData(index) := '0';
else
serialData(index) := TxD;
end if;
wait for uartPeriod;
end loop;
-- write data to signal
uartTxData <= to_integer(serialData);
uartTxDataWord <= to_integer(uartTxShiftRegister);
uartTxShiftRegister <= shift_right(uartTxShiftRegister, serialData'length);
uartTxShiftRegister(
uartTxShiftRegister'high downto
uartTxShiftRegister'high-serialData'length+1
) <= serialData;
end process receiveByte;
END ARCHITECTURE test;