mirror of
https://github.com/Klagarge/Cursor.git
synced 2024-11-23 18:03:27 +00:00
119 lines
3.3 KiB
VHDL
119 lines
3.3 KiB
VHDL
|
ARCHITECTURE test OF cursor_tester IS
|
||
|
|
||
|
constant clockPeriod: time := 50 ns;
|
||
|
signal sClock: std_uLogic := '1';
|
||
|
|
||
|
constant pulsesPerTurn: integer := 200;
|
||
|
constant stepPeriodNb: positive := 8;
|
||
|
signal stepEn: std_uLogic := '0';
|
||
|
signal direction: std_uLogic;
|
||
|
signal turning: std_uLogic;
|
||
|
signal stepCount: unsigned(10 downto 0) := (others => '0');
|
||
|
|
||
|
BEGIN
|
||
|
|
||
|
------------------------------------------------------------------------------
|
||
|
-- clock and reset
|
||
|
--
|
||
|
reset <= '1', '0' after clockPeriod/4;
|
||
|
|
||
|
sClock <= not sClock after clockPeriod/2;
|
||
|
clock <= sClock after clockPeriod/10;
|
||
|
|
||
|
|
||
|
------------------------------------------------------------------------------
|
||
|
-- test sequence
|
||
|
--
|
||
|
process
|
||
|
begin
|
||
|
|
||
|
testMode <= '1';
|
||
|
|
||
|
restart <= '0';
|
||
|
go1 <= '0';
|
||
|
go2 <= '0';
|
||
|
setPoint <= '0';
|
||
|
|
||
|
sensor1 <= '0';
|
||
|
sensor2 <= '0';
|
||
|
|
||
|
wait for 1 us;
|
||
|
|
||
|
----------------------------------------------------------------------------
|
||
|
-- advance to first stop point
|
||
|
go1 <= '1', '0' after 1 us;
|
||
|
wait for 4 ms;
|
||
|
|
||
|
----------------------------------------------------------------------------
|
||
|
-- advance to second stop point
|
||
|
go2 <= '1', '0' after 1 us;
|
||
|
wait for 4 ms;
|
||
|
|
||
|
----------------------------------------------------------------------------
|
||
|
-- back to start with sensor reset
|
||
|
restart <= '1', '0' after 1 us;
|
||
|
wait for 0.5 ms;
|
||
|
sensor1 <= '1', '0' after 1 us;
|
||
|
wait for 0.5 ms;
|
||
|
|
||
|
----------------------------------------------------------------------------
|
||
|
-- advance to second stop point
|
||
|
go2 <= '1', '0' after 1 us;
|
||
|
wait for 7 ms;
|
||
|
|
||
|
----------------------------------------------------------------------------
|
||
|
-- go back to first stop point
|
||
|
go1 <= '1', '0' after 1 us;
|
||
|
wait for 4 ms;
|
||
|
|
||
|
----------------------------------------------------------------------------
|
||
|
-- back to start with counter stop
|
||
|
restart <= '1', '0' after 1 us;
|
||
|
wait for 4 ms;
|
||
|
sensor1 <= '1', '0' after 1 us;
|
||
|
wait for 1 ms;
|
||
|
|
||
|
wait;
|
||
|
end process;
|
||
|
|
||
|
------------------------------------------------------------------------------
|
||
|
-- motor feedback
|
||
|
--
|
||
|
turning <= motorOn;
|
||
|
|
||
|
findDirection: process(side1, side2)
|
||
|
begin
|
||
|
if (side1 = '1') and (side2 = '0') then
|
||
|
direction <= '1';
|
||
|
elsif (side1 = '0') and (side2 = '1') then
|
||
|
direction <= '0';
|
||
|
end if;
|
||
|
end process findDirection;
|
||
|
|
||
|
stepEn <= not stepEn after (stepPeriodNb/4)*clockPeriod;
|
||
|
|
||
|
count: process (stepEn)
|
||
|
begin
|
||
|
if turning = '1' then
|
||
|
if direction = '1' then
|
||
|
if stepCount < pulsesPerTurn-1 then
|
||
|
stepCount <= stepCount + 1;
|
||
|
else
|
||
|
stepCount <= to_unsigned(0, stepCount'length);
|
||
|
end if;
|
||
|
else
|
||
|
if stepCount > 0 then
|
||
|
stepCount <= stepCount - 1;
|
||
|
else
|
||
|
stepCount <= to_unsigned(pulsesPerTurn-1, stepCount'length);
|
||
|
end if;
|
||
|
end if;
|
||
|
end if;
|
||
|
end process count;
|
||
|
|
||
|
encoderA <= stepCount(1);
|
||
|
encoderB <= not stepCount(1) xor stepCount(0);
|
||
|
encoderI <= '1' when stepCount = pulsesPerTurn-1 else '0';
|
||
|
|
||
|
END test;
|