295 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			VHDL
		
	
	
	
	
	
			
		
		
	
	
			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;
 |