2021-11-24 09:50:51 +00:00
|
|
|
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
|
2022-01-21 15:03:10 +00:00
|
|
|
--testMode_int <= '0';
|
2021-11-24 09:50:51 +00:00
|
|
|
|
|
|
|
----------------------------------------------------------------------------
|
|
|
|
-- 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;
|