Initial commit
This commit is contained in:
		| @@ -0,0 +1,479 @@ | ||||
| LIBRARY Common_test; | ||||
|   USE Common_test.testUtils.all; | ||||
|  | ||||
| ARCHITECTURE test OF ahbBeamer_tester IS | ||||
|                                                               -- reset and clock | ||||
|   constant clockPeriod: time := (1.0/clockFrequency) * 1 sec; | ||||
|   signal clock_int: std_uLogic := '1'; | ||||
|   signal reset_int: std_uLogic; | ||||
|                                                              -- test information | ||||
|   signal testSeparator : string(1 to 80) := (others => '-'); | ||||
|   signal errorTopSeparator : string(1 to 80) := (others => '#'); | ||||
|   signal bottomSeparator : string(1 to 80) := (others => '.'); | ||||
|   signal indentation : string(1 to 2) := (others => ' '); | ||||
|   signal noteInformation : string(1 to 9) := (others => ' '); | ||||
|   signal errorInformation : string(1 to 10) := (others => ' '); | ||||
|   signal failureInformation : string(1 to 12) := (others => ' '); | ||||
|   signal testInformation : string(1 to 50) := (others => ' '); | ||||
|                                                           -- register definition | ||||
|   constant controlRegisterAddress: natural := 0; | ||||
|   constant controlRun: natural := 2#001#; | ||||
|   constant controlUpdatePattern: natural := 2#010#; | ||||
|   constant controlInterpolateLinear: natural := 2#100#; | ||||
|   constant speedRegisterAddress: natural := 1; | ||||
|   constant xFifoRegisterAddress: natural := 2; | ||||
|   constant yFifoRegisterAddress: natural := 3; | ||||
|   signal updatePeriod: natural := 1; | ||||
|   signal patternLength: natural := 32; | ||||
|                                                               -- AMBA bus access | ||||
|   constant registerWriteDelay: time := 4*clockPeriod; | ||||
|   signal registerAddress: natural; | ||||
|   signal registerDataOut, registerDataIn: integer; | ||||
|   signal registerWrite: std_uLogic; | ||||
|   signal registerRead: std_uLogic; | ||||
|                                                                   -- UART access | ||||
|   constant baudPeriodNb: positive := 4; | ||||
|   signal uartData: integer; | ||||
|   signal uartSend: std_uLogic; | ||||
|                                                                     -- functions | ||||
|   function clearBits (word, bits : natural) return natural is | ||||
|     variable andMask: unsigned(hRData'range); | ||||
|   begin | ||||
|     andMask := not(to_unsigned(bits, hRData'length)); | ||||
|     return to_integer(to_unsigned(word, hRData'length) and andMask); | ||||
|   end clearBits;  | ||||
|  | ||||
| BEGIN | ||||
|   ------------------------------------------------------------------------------ | ||||
|                                                               -- reset and clock | ||||
|   reset_int <= '1', '0' after 2*clockPeriod; | ||||
|   hReset_n <= not(reset_int); | ||||
|   reset <= reset_int; | ||||
|  | ||||
|   clock_int <= not clock_int after clockPeriod/2; | ||||
|   hClk <= transport clock_int after clockPeriod*9.0/10.0; | ||||
|   clock <= transport clock_int after clockPeriod*9.0/10.0; | ||||
|  | ||||
|   ------------------------------------------------------------------------------ | ||||
|                                                                 -- test sequence | ||||
|   testSequence: process | ||||
|   begin | ||||
|     selSinCos <= '0'; | ||||
|     registerAddress <= 0; | ||||
|     registerDataOut <= 0; | ||||
|     registerWrite <= '0'; | ||||
|     registerRead <= '0'; | ||||
|     uartSend <= '0'; | ||||
|     wait for 100 ns; | ||||
|     print(cr & cr & cr & cr); | ||||
|  | ||||
|     ---------------------------------------------------------------------------- | ||||
|                                                         -- test control register | ||||
|     wait for 1 us - now; | ||||
|     testInformation <= pad("Testing control register", testInformation'length); | ||||
|     wait for 0 ns; | ||||
|     print(testSeparator & cr & testInformation); | ||||
|                                                     -- set control register bits | ||||
|     wait until rising_edge(clock_int); | ||||
|     registerAddress <= controlRegisterAddress; | ||||
|     registerDataOut <= controlRun + controlUpdatePattern + controlInterpolateLinear; | ||||
|     registerWrite <= '1', '0' after clockPeriod; | ||||
|     wait for registerWriteDelay; | ||||
|                                                     -- readback control register | ||||
|     wait until rising_edge(clock_int); | ||||
|     registerAddress <= controlRegisterAddress; | ||||
|     registerRead <= '1', '0' after clockPeriod; | ||||
|     wait for 3*clockPeriod; | ||||
|     assert(registerDataIn = controlRun + controlUpdatePattern + controlInterpolateLinear) | ||||
|       report "Control register write / readback error" | ||||
|       severity error; | ||||
|     wait for registerWriteDelay; | ||||
|                                               -- stop running and pattern update | ||||
|     wait until rising_edge(clock_int); | ||||
|     registerAddress <= controlRegisterAddress; | ||||
|     registerRead <= '1', '0' after clockPeriod; | ||||
|     wait for 3*clockPeriod; | ||||
|     registerDataOut <= clearBits(registerDataIn, controlRun + controlUpdatePattern); | ||||
|     registerWrite <= '1', '0' after clockPeriod; | ||||
|     wait for registerWriteDelay; | ||||
|  | ||||
|     ---------------------------------------------------------------------------- | ||||
|                                                           -- test speed register | ||||
|     wait for 2 us - now; | ||||
|     testInformation <= pad("Testing speed register", testInformation'length); | ||||
|     wait for 0 ns; | ||||
|     print(testSeparator & cr & testInformation); | ||||
|                                                         -- set speed count value | ||||
|     wait until rising_edge(clock_int); | ||||
|     registerAddress <= speedRegisterAddress; | ||||
|     registerDataOut <= updatePeriod; | ||||
|     registerWrite <= '1', '0' after clockPeriod; | ||||
|     wait for registerWriteDelay; | ||||
|                                                          -- readback speed count | ||||
|     wait until rising_edge(clock_int); | ||||
|     registerAddress <= speedRegisterAddress; | ||||
|     registerRead <= '1', '0' after clockPeriod; | ||||
|     wait for 3*clockPeriod; | ||||
|     assert(registerDataIn = updatePeriod) | ||||
|       report "Speed register write / readback error" | ||||
|       severity error; | ||||
|     wait for registerWriteDelay; | ||||
|  | ||||
|     ---------------------------------------------------------------------------- | ||||
|                                             -- write sinewave data points to RAM | ||||
|     wait for 3 us - now; | ||||
|     testInformation <= pad("Writing sinewaves to RAM", testInformation'length); | ||||
|     wait for 0 ns; | ||||
|     print(testSeparator & cr & testInformation); | ||||
|                                                          -- start pattern update | ||||
|     wait until rising_edge(clock_int); | ||||
|     registerAddress <= controlRegisterAddress; | ||||
|     registerDataOut <= controlUpdatePattern; | ||||
|     registerWrite <= '1', '0' after clockPeriod; | ||||
|     wait for registerWriteDelay; | ||||
|                                                           -- write X FIFO values | ||||
|     wait until rising_edge(clock_int); | ||||
|     registerAddress <= xFifoRegisterAddress; | ||||
|     registerDataOut <= 16#0000#; | ||||
|     registerWrite <= '1', '0' after clockPeriod; | ||||
|     wait for registerWriteDelay; | ||||
|     registerDataOut <= 16#18F9#; | ||||
|     registerWrite <= '1', '0' after clockPeriod; | ||||
|     wait for registerWriteDelay; | ||||
|     registerDataOut <= 16#30FB#; | ||||
|     registerWrite <= '1', '0' after clockPeriod; | ||||
|     wait for registerWriteDelay; | ||||
|     registerDataOut <= 16#471C#; | ||||
|     registerWrite <= '1', '0' after clockPeriod; | ||||
|     wait for registerWriteDelay; | ||||
|     registerDataOut <= 16#5A82#; | ||||
|     registerWrite <= '1', '0' after clockPeriod; | ||||
|     wait for registerWriteDelay; | ||||
|     registerDataOut <= 16#6A6D#; | ||||
|     registerWrite <= '1', '0' after clockPeriod; | ||||
|     wait for registerWriteDelay; | ||||
|     registerDataOut <= 16#7641#; | ||||
|     registerWrite <= '1', '0' after clockPeriod; | ||||
|     wait for registerWriteDelay; | ||||
|     registerDataOut <= 16#7D89#; | ||||
|     registerWrite <= '1', '0' after clockPeriod; | ||||
|     wait for registerWriteDelay; | ||||
|     registerDataOut <= 16#7FFF#; | ||||
|     registerWrite <= '1', '0' after clockPeriod; | ||||
|     wait for registerWriteDelay; | ||||
|     registerDataOut <= 16#7D89#; | ||||
|     registerWrite <= '1', '0' after clockPeriod; | ||||
|     wait for registerWriteDelay; | ||||
|     registerDataOut <= 16#7641#; | ||||
|     registerWrite <= '1', '0' after clockPeriod; | ||||
|     wait for registerWriteDelay; | ||||
|     registerDataOut <= 16#6A6D#; | ||||
|     registerWrite <= '1', '0' after clockPeriod; | ||||
|     wait for registerWriteDelay; | ||||
|     registerDataOut <= 16#5A82#; | ||||
|     registerWrite <= '1', '0' after clockPeriod; | ||||
|     wait for registerWriteDelay; | ||||
|     registerDataOut <= 16#471C#; | ||||
|     registerWrite <= '1', '0' after clockPeriod; | ||||
|     wait for registerWriteDelay; | ||||
|     registerDataOut <= 16#30FB#; | ||||
|     registerWrite <= '1', '0' after clockPeriod; | ||||
|     wait for registerWriteDelay; | ||||
|     registerDataOut <= 16#18F9#; | ||||
|     registerWrite <= '1', '0' after clockPeriod; | ||||
|     wait for registerWriteDelay; | ||||
|     registerDataOut <= 16#0000#; | ||||
|     registerWrite <= '1', '0' after clockPeriod; | ||||
|     wait for registerWriteDelay; | ||||
|     registerDataOut <= -16#18F9#; | ||||
|     registerWrite <= '1', '0' after clockPeriod; | ||||
|     wait for registerWriteDelay; | ||||
|     registerDataOut <= -16#30FB#; | ||||
|     registerWrite <= '1', '0' after clockPeriod; | ||||
|     wait for registerWriteDelay; | ||||
|     registerDataOut <= -16#471C#; | ||||
|     registerWrite <= '1', '0' after clockPeriod; | ||||
|     wait for registerWriteDelay; | ||||
|     registerDataOut <= -16#5A82#; | ||||
|     registerWrite <= '1', '0' after clockPeriod; | ||||
|     wait for registerWriteDelay; | ||||
|     registerDataOut <= -16#6A6D#; | ||||
|     registerWrite <= '1', '0' after clockPeriod; | ||||
|     wait for registerWriteDelay; | ||||
|     registerDataOut <= -16#7641#; | ||||
|     registerWrite <= '1', '0' after clockPeriod; | ||||
|     wait for registerWriteDelay; | ||||
|     registerDataOut <= -16#7D89#; | ||||
|     registerWrite <= '1', '0' after clockPeriod; | ||||
|     wait for registerWriteDelay; | ||||
|     registerDataOut <= -16#7FFF#; | ||||
|     registerWrite <= '1', '0' after clockPeriod; | ||||
|     wait for registerWriteDelay; | ||||
|     registerDataOut <= -16#7D89#; | ||||
|     registerWrite <= '1', '0' after clockPeriod; | ||||
|     wait for registerWriteDelay; | ||||
|     registerDataOut <= -16#7641#; | ||||
|     registerWrite <= '1', '0' after clockPeriod; | ||||
|     wait for registerWriteDelay; | ||||
|     registerDataOut <= -16#6A6D#; | ||||
|     registerWrite <= '1', '0' after clockPeriod; | ||||
|     wait for registerWriteDelay; | ||||
|     registerDataOut <= -16#5A82#; | ||||
|     registerWrite <= '1', '0' after clockPeriod; | ||||
|     wait for registerWriteDelay; | ||||
|     registerDataOut <= -16#471C#; | ||||
|     registerWrite <= '1', '0' after clockPeriod; | ||||
|     wait for registerWriteDelay; | ||||
|     registerDataOut <= -16#30FB#; | ||||
|     registerWrite <= '1', '0' after clockPeriod; | ||||
|     wait for registerWriteDelay; | ||||
|     registerDataOut <= -16#18F9#; | ||||
|     registerWrite <= '1', '0' after clockPeriod; | ||||
|     wait for 10*registerWriteDelay; | ||||
|                                                           -- write Y FIFO values | ||||
|     wait until rising_edge(clock_int); | ||||
|     registerAddress <= yFifoRegisterAddress; | ||||
|     registerDataOut <= 16#7FFF#; | ||||
|     registerWrite <= '1', '0' after clockPeriod; | ||||
|     wait for registerWriteDelay; | ||||
|     registerDataOut <= 16#7D89#; | ||||
|     registerWrite <= '1', '0' after clockPeriod; | ||||
|     wait for registerWriteDelay; | ||||
|     registerDataOut <= 16#7641#; | ||||
|     registerWrite <= '1', '0' after clockPeriod; | ||||
|     wait for registerWriteDelay; | ||||
|     registerDataOut <= 16#6A6D#; | ||||
|     registerWrite <= '1', '0' after clockPeriod; | ||||
|     wait for registerWriteDelay; | ||||
|     registerDataOut <= 16#5A82#; | ||||
|     registerWrite <= '1', '0' after clockPeriod; | ||||
|     wait for registerWriteDelay; | ||||
|     registerDataOut <= 16#471C#; | ||||
|     registerWrite <= '1', '0' after clockPeriod; | ||||
|     wait for registerWriteDelay; | ||||
|     registerDataOut <= 16#30FB#; | ||||
|     registerWrite <= '1', '0' after clockPeriod; | ||||
|     wait for registerWriteDelay; | ||||
|     registerDataOut <= 16#18F9#; | ||||
|     registerWrite <= '1', '0' after clockPeriod; | ||||
|     wait for registerWriteDelay; | ||||
|     registerDataOut <= 16#0000#; | ||||
|     registerWrite <= '1', '0' after clockPeriod; | ||||
|     wait for registerWriteDelay; | ||||
|     registerDataOut <= -16#18F9#; | ||||
|     registerWrite <= '1', '0' after clockPeriod; | ||||
|     wait for registerWriteDelay; | ||||
|     registerDataOut <= -16#30FB#; | ||||
|     registerWrite <= '1', '0' after clockPeriod; | ||||
|     wait for registerWriteDelay; | ||||
|     registerDataOut <= -16#471C#; | ||||
|     registerWrite <= '1', '0' after clockPeriod; | ||||
|     wait for registerWriteDelay; | ||||
|     registerDataOut <= -16#5A82#; | ||||
|     registerWrite <= '1', '0' after clockPeriod; | ||||
|     wait for registerWriteDelay; | ||||
|     registerDataOut <= -16#6A6D#; | ||||
|     registerWrite <= '1', '0' after clockPeriod; | ||||
|     wait for registerWriteDelay; | ||||
|     registerDataOut <= -16#7641#; | ||||
|     registerWrite <= '1', '0' after clockPeriod; | ||||
|     wait for registerWriteDelay; | ||||
|     registerDataOut <= -16#7D89#; | ||||
|     registerWrite <= '1', '0' after clockPeriod; | ||||
|     wait for registerWriteDelay; | ||||
|     registerDataOut <= -16#7FFF#; | ||||
|     registerWrite <= '1', '0' after clockPeriod; | ||||
|     wait for registerWriteDelay; | ||||
|     registerDataOut <= -16#7D89#; | ||||
|     registerWrite <= '1', '0' after clockPeriod; | ||||
|     wait for registerWriteDelay; | ||||
|     registerDataOut <= -16#7641#; | ||||
|     registerWrite <= '1', '0' after clockPeriod; | ||||
|     wait for registerWriteDelay; | ||||
|     registerDataOut <= -16#6A6D#; | ||||
|     registerWrite <= '1', '0' after clockPeriod; | ||||
|     wait for registerWriteDelay; | ||||
|     registerDataOut <= -16#5A82#; | ||||
|     registerWrite <= '1', '0' after clockPeriod; | ||||
|     wait for registerWriteDelay; | ||||
|     registerDataOut <= -16#471C#; | ||||
|     registerWrite <= '1', '0' after clockPeriod; | ||||
|     wait for registerWriteDelay; | ||||
|     registerDataOut <= -16#30FB#; | ||||
|     registerWrite <= '1', '0' after clockPeriod; | ||||
|     wait for registerWriteDelay; | ||||
|     registerDataOut <= -16#18F9#; | ||||
|     registerWrite <= '1', '0' after clockPeriod; | ||||
|     wait for registerWriteDelay; | ||||
|     registerDataOut <= 16#0000#; | ||||
|     registerWrite <= '1', '0' after clockPeriod; | ||||
|     wait for registerWriteDelay; | ||||
|     registerDataOut <= 16#18F9#; | ||||
|     registerWrite <= '1', '0' after clockPeriod; | ||||
|     wait for registerWriteDelay; | ||||
|     registerDataOut <= 16#30FB#; | ||||
|     registerWrite <= '1', '0' after clockPeriod; | ||||
|     wait for registerWriteDelay; | ||||
|     registerDataOut <= 16#471C#; | ||||
|     registerWrite <= '1', '0' after clockPeriod; | ||||
|     wait for registerWriteDelay; | ||||
|     registerDataOut <= 16#5A82#; | ||||
|     registerWrite <= '1', '0' after clockPeriod; | ||||
|     wait for registerWriteDelay; | ||||
|     registerDataOut <= 16#6A6D#; | ||||
|     registerWrite <= '1', '0' after clockPeriod; | ||||
|     wait for registerWriteDelay; | ||||
|     registerDataOut <= 16#7641#; | ||||
|     registerWrite <= '1', '0' after clockPeriod; | ||||
|     wait for registerWriteDelay; | ||||
|     registerDataOut <= 16#7D89#; | ||||
|     registerWrite <= '1', '0' after clockPeriod; | ||||
|     wait for 10*registerWriteDelay; | ||||
|                                                            -- end pattern update | ||||
|     wait until rising_edge(clock_int); | ||||
|     registerAddress <= controlRegisterAddress; | ||||
|     registerDataOut <= 0; | ||||
|     registerWrite <= '1', '0' after clockPeriod; | ||||
|     wait for registerWriteDelay; | ||||
|  | ||||
|     ---------------------------------------------------------------------------- | ||||
|                                                             -- playing waveforms | ||||
|     wait for 7 us - now; | ||||
|     testInformation <= pad("Playing waveforms", testInformation'length); | ||||
|     wait for 0 ns; | ||||
|     print(testSeparator & cr & testInformation); | ||||
|                                                                     -- start run | ||||
|     wait until rising_edge(clock_int); | ||||
|     registerAddress <= controlRegisterAddress; | ||||
|     registerDataOut <= controlRun + patternLength * 2**(hWData'length-patternAddressBitNb); | ||||
|     registerWrite <= '1', '0' after clockPeriod; | ||||
|     wait for registerWriteDelay; | ||||
|                                                             -- run for some time | ||||
|     wait for 250 us - now; | ||||
|                                                                      -- stop run | ||||
|     wait until rising_edge(clock_int); | ||||
|     registerAddress <= controlRegisterAddress; | ||||
|     registerDataOut <= 0; | ||||
|     registerWrite <= '1', '0' after clockPeriod; | ||||
|     wait for registerWriteDelay; | ||||
|  | ||||
|     ---------------------------------------------------------------------------- | ||||
|                                          -- play data points to RAM for overflow | ||||
|     wait for 300 us - now; | ||||
|     testInformation <= pad( | ||||
|       "Writing waveform to RAM for overflow", testInformation'length | ||||
|     ); | ||||
|     wait for 0 ns; | ||||
|     print(testSeparator & cr & testInformation); | ||||
|                                                          -- start pattern update | ||||
|     wait until rising_edge(clock_int); | ||||
|     registerAddress <= controlRegisterAddress; | ||||
|     registerDataOut <= controlUpdatePattern; | ||||
|     registerWrite <= '1', '0' after clockPeriod; | ||||
|     wait for registerWriteDelay; | ||||
|                                                           -- write X FIFO values | ||||
|     wait until rising_edge(clock_int); | ||||
|     registerAddress <= xFifoRegisterAddress; | ||||
|     registerDataOut <=  16#4000#; | ||||
|     registerWrite <= '1', '0' after clockPeriod; | ||||
|     wait for registerWriteDelay; | ||||
|     registerDataOut <= -16#7000#; | ||||
|     registerWrite <= '1', '0' after clockPeriod; | ||||
|     wait for registerWriteDelay; | ||||
|     registerDataOut <= -16#7000#; | ||||
|     registerWrite <= '1', '0' after clockPeriod; | ||||
|     wait for registerWriteDelay; | ||||
|     registerDataOut <=  16#7000#; | ||||
|     registerWrite <= '1', '0' after clockPeriod; | ||||
|     wait for 10*registerWriteDelay; | ||||
|                                                           -- write Y FIFO values | ||||
|     wait until rising_edge(clock_int); | ||||
|     registerAddress <= yFifoRegisterAddress; | ||||
|     registerDataOut <= -16#4000#; | ||||
|     registerWrite <= '1', '0' after clockPeriod; | ||||
|     wait for registerWriteDelay; | ||||
|     registerDataOut <=  16#7000#; | ||||
|     registerWrite <= '1', '0' after clockPeriod; | ||||
|     wait for registerWriteDelay; | ||||
|     registerDataOut <=  16#7000#; | ||||
|     registerWrite <= '1', '0' after clockPeriod; | ||||
|     wait for registerWriteDelay; | ||||
|     registerDataOut <= -16#7000#; | ||||
|     registerWrite <= '1', '0' after clockPeriod; | ||||
|     wait for 10*registerWriteDelay; | ||||
|                                              -- end pattern update and start run | ||||
|     patternLength <= 4; | ||||
|     wait until rising_edge(clock_int); | ||||
|     registerAddress <= controlRegisterAddress; | ||||
|     registerDataOut <= controlRun + patternLength * 2**(hWData'length-patternAddressBitNb); | ||||
|     registerWrite <= '1', '0' after clockPeriod; | ||||
|     wait for registerWriteDelay; | ||||
|                                                     -- set lower speed execution | ||||
|     updatePeriod <= 9; | ||||
|     wait until rising_edge(clock_int); | ||||
|     registerAddress <= speedRegisterAddress; | ||||
|     registerDataOut <= updatePeriod; | ||||
|     registerWrite <= '1', '0' after clockPeriod; | ||||
|     wait for registerWriteDelay; | ||||
|     ---------------------------------------------------------------------------- | ||||
|                                                            -- sin/cos debug mode | ||||
|     wait for 700 us - now; | ||||
|     testInformation <= pad("Drawing debug mode circle", testInformation'length); | ||||
|     wait for 0 ns; | ||||
|     print(testSeparator & cr & testInformation); | ||||
|     selSinCos <= '1'; | ||||
|     ---------------------------------------------------------------------------- | ||||
|                                                               -- stop simulation | ||||
|     wait for 1 ms - now; | ||||
|     assert false | ||||
|       report "End" & cr & "     --> " & | ||||
|              "End of simulation" | ||||
|       severity failure; | ||||
|   end process testSequence; | ||||
|  | ||||
|   ------------------------------------------------------------------------------ | ||||
|                                                               -- AMBA bus access | ||||
|   busAccess: process | ||||
|     variable writeAccess: boolean; | ||||
|     variable hRData01: std_ulogic_vector(hRData'range); | ||||
|   begin | ||||
|     hAddr <= (others => '-'); | ||||
|     hWData <= (others => '-'); | ||||
|     hTrans <= transIdle; | ||||
|     hSel <= '0'; | ||||
|     hWrite <= '0'; | ||||
|     wait on registerWrite, registerRead; | ||||
|     writeAccess := false; | ||||
|     if rising_edge(registerWrite) then | ||||
|       writeAccess := true; | ||||
|     end if; | ||||
|                                                 -- phase 1: address and controls | ||||
|     wait until rising_edge(clock_int); | ||||
|     hAddr <= to_unsigned(registerAddress, hAddr'length); | ||||
|     hTrans <= transNonSeq; | ||||
|     hSel <= '1'; | ||||
|     if writeAccess then | ||||
|       hWrite <= '1'; | ||||
|     end if; | ||||
|                                                                 -- phase 2: data | ||||
|     wait until rising_edge(clock_int); | ||||
|     hAddr <= (others => '-'); | ||||
|     hTrans <= transIdle; | ||||
|     hSel <= '0'; | ||||
|     hWrite <= '0'; | ||||
|     if writeAccess then | ||||
|       hWData <= std_uLogic_vector(to_signed(registerDataOut, hWData'length)); | ||||
|     else | ||||
|       wait until falling_edge(clock_int); | ||||
|       hRData01 := hRData; | ||||
|       for index in hRData01'range loop | ||||
|         if (hRData01(index) /= '0') and (hRData01(index) /= '1') then | ||||
|           hRData01(index) := '0'; | ||||
|         end if; | ||||
|       end loop; | ||||
|       registerDataIn <= to_integer(unsigned(hRData01)); | ||||
|     end if; | ||||
|     wait until rising_edge(clock_int); | ||||
|   end process; | ||||
|  | ||||
| END ARCHITECTURE test; | ||||
| @@ -0,0 +1,294 @@ | ||||
| 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; | ||||
| @@ -0,0 +1,9 @@ | ||||
| LIBRARY ieee; | ||||
|   USE ieee.std_logic_1164.all; | ||||
|   USE ieee.numeric_std.all; | ||||
|  | ||||
| PACKAGE beamerTest_pck IS | ||||
|  | ||||
|   function trim_X (arg : signed) return signed; | ||||
|  | ||||
| END beamerTest_pck; | ||||
| @@ -0,0 +1,16 @@ | ||||
| PACKAGE BODY beamerTest_pck IS | ||||
|  | ||||
|   function trim_X (arg : signed) return signed is | ||||
|     variable returnVal : signed(arg'range); | ||||
|   begin | ||||
|     for i in arg'range loop | ||||
|       case arg(i) is | ||||
|         when '0' | 'L' => returnVal(i) := '0'; | ||||
|         when '1' | 'H' => returnVal(i) := '1'; | ||||
|         when others    => returnVal(i) := '0'; | ||||
|       end case; | ||||
|     end loop; | ||||
|     return returnVal; | ||||
|   end trim_X; | ||||
|  | ||||
| END beamerTest_pck; | ||||
		Reference in New Issue
	
	Block a user