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