mirror of
				https://github.com/Klagarge/Cursor.git
				synced 2025-10-30 21:49:17 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			149 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			VHDL
		
	
	
	
	
	
			
		
		
	
	
			149 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			VHDL
		
	
	
	
	
	
| ARCHITECTURE test OF cursor_tester IS
 | |
| 
 | |
|   constant clockFrequency: real := 66.0E6;
 | |
|   constant clockPeriod: time := 1.0/clockFrequency * 1 sec;
 | |
|   signal sClock: std_uLogic := '1';
 | |
| 
 | |
|   signal testMode_int: std_uLogic;
 | |
| 
 | |
|   constant buttonsPulseWidth : time := 100 us;
 | |
| 
 | |
|   constant pulsesPerTurn: integer := 2000;
 | |
|   constant pwmReadBitNb: positive :=8;
 | |
|   constant pwmLowpassAddBitNb: positive :=8;
 | |
|   constant voltageToSpeedBitNb: positive := 8;
 | |
|   signal side1Acc: unsigned(pwmReadBitNb+pwmLowpassAddBitNb-1 downto 0) := (others => '0');
 | |
|   signal side2Acc: unsigned(pwmReadBitNb+pwmLowpassAddBitNb-1 downto 0) := (others => '0');
 | |
|   signal side1M: unsigned(pwmReadBitNb-1 downto 0);
 | |
|   signal side2M: unsigned(pwmReadBitNb-1 downto 0);
 | |
|   signal position: signed(pwmReadBitNb+voltageToSpeedBitNb-1 downto 0) := (others => '0');
 | |
|   signal stepCount: unsigned(1 downto 0);
 | |
| 
 | |
| BEGIN
 | |
| 
 | |
|   ------------------------------------------------------------------------------
 | |
|   -- clock and reset
 | |
|   --
 | |
|   reset <= '1', '0' after 2*clockPeriod;
 | |
| 
 | |
|   sClock <= not sClock after clockPeriod/2;
 | |
|   clock <= transport sClock after clockPeriod*9/10;
 | |
| 
 | |
| 
 | |
|   ------------------------------------------------------------------------------
 | |
|   -- test sequence
 | |
|   --
 | |
|   process
 | |
|   begin
 | |
| 
 | |
|     testMode_int <= '1';
 | |
| 
 | |
|     restart <= '0';
 | |
|     go1 <= '0';
 | |
|     go2 <= '0';
 | |
|     button4 <= '0';
 | |
| 
 | |
|     sensor1 <= '0';
 | |
|     sensor2 <= '0';
 | |
| 
 | |
|     wait for 0.1 ms;
 | |
|     
 | |
|      ----------------------------------------------------------------------------
 | |
|                                                     -- restart
 | |
|     restart <= '1', '0' after buttonsPulseWidth;
 | |
|     wait for 0.25 ms;
 | |
|     sensor1 <= '1', '0' after buttonsPulseWidth;
 | |
|     wait for 0.25 ms;
 | |
| 
 | |
|     ----------------------------------------------------------------------------
 | |
|                                                   -- advance to first stop point
 | |
|     go1 <= '1', '0' after buttonsPulseWidth;
 | |
|     wait for 2 ms;
 | |
| 
 | |
|     ----------------------------------------------------------------------------
 | |
|                                                  -- advance to second stop point
 | |
|     go2 <= '1', '0' after buttonsPulseWidth;
 | |
|     wait for 2 ms;
 | |
| 
 | |
|     ----------------------------------------------------------------------------
 | |
|                                                   -- go back to first stop point
 | |
|     go1 <= '1', '0' after buttonsPulseWidth;
 | |
|     wait for 2 ms;
 | |
| 
 | |
|     ----------------------------------------------------------------------------
 | |
|                                               -- back to start with sensor reset
 | |
|     restart <= '1', '0' after buttonsPulseWidth;
 | |
|     wait for 0.5 ms;
 | |
|     sensor1 <= '1', '0' after buttonsPulseWidth;
 | |
|     wait for 0.5 ms;
 | |
| 
 | |
|     ----------------------------------------------------------------------------
 | |
|                                                  -- advance to second stop point
 | |
|     go2 <= '1', '0' after buttonsPulseWidth;
 | |
|     wait for 3 ms;
 | |
| 
 | |
|     ----------------------------------------------------------------------------
 | |
|                                               -- back to start with counter stop
 | |
|     restart <= '1', '0' after buttonsPulseWidth;
 | |
|     wait for 2 ms;
 | |
|     sensor1 <= '1', '0' after buttonsPulseWidth;
 | |
|     wait for 1 ms;
 | |
| 
 | |
|     ----------------------------------------------------------------------------
 | |
|                                                                -- quit test mode
 | |
|     testMode_int <= '0';
 | |
| 
 | |
|     ----------------------------------------------------------------------------
 | |
|                                                   -- advance to first stop point
 | |
|     go1 <= '1', '0' after buttonsPulseWidth;
 | |
|     wait for 2 ms;
 | |
| 
 | |
|     wait;
 | |
|   end process;
 | |
| 
 | |
|   testMode <= testMode_int;
 | |
| 
 | |
|   ------------------------------------------------------------------------------
 | |
|   -- PWM lowpass
 | |
|   --
 | |
|   process(sClock)
 | |
|   begin
 | |
|     if rising_edge(sClock) then
 | |
|       if side1 = '1' then
 | |
|         side1Acc <= side1Acc + 2**pwmReadBitNb-1 - shift_right(side1Acc, pwmLowpassAddBitNb);
 | |
|       else
 | |
|         side1Acc <= side1Acc - shift_right(side1Acc, pwmLowpassAddBitNb);
 | |
|       end if;
 | |
|       if side2 = '1' then
 | |
|         side2Acc <= side2Acc + 2**pwmReadBitNb-1 - shift_right(side2Acc, pwmLowpassAddBitNb);
 | |
|       else
 | |
|         side2Acc <= side2Acc - shift_right(side2Acc, pwmLowpassAddBitNb);
 | |
|       end if;
 | |
|     end if;
 | |
|   end process;
 | |
| 
 | |
|   side1M <= resize(shift_right(side1Acc, pwmLowpassAddBitNb), side1M'length);
 | |
|   side2M <= resize(shift_right(side2Acc, pwmLowpassAddBitNb), side2M'length);
 | |
| 
 | |
|   ------------------------------------------------------------------------------
 | |
|   -- motor feedback
 | |
|   --
 | |
|   count: process (sClock)
 | |
|   begin
 | |
|     if motorOn = '1' then
 | |
|       if testMode_int = '0' then
 | |
|         position <= position + to_integer(side1M) - to_integer(side2M);
 | |
|       else
 | |
|         position <= position + (to_integer(side1M) - to_integer(side2M)) * 5;
 | |
|       end if;
 | |
|     end if;
 | |
|   end process count;
 | |
| 
 | |
|   stepCount <= resize(shift_right(unsigned(position), position'length-stepCount'length), stepCount'length);
 | |
| 
 | |
|   encoderA <= stepCount(1);
 | |
|   encoderB <= not stepCount(1) xor stepCount(0);
 | |
|   encoderI <= '1' when stepCount = pulsesPerTurn-1 else '0';
 | |
| 
 | |
| END ARCHITECTURE test;
 |