Skip to content
Snippets Groups Projects
Commit 209da0df authored by Pascal Engeler's avatar Pascal Engeler
Browse files

Finished unwrapper implementation

parent 00427189
No related branches found
No related tags found
1 merge request!2Resolve "Distance wrapping invalidates lock sum"
...@@ -39,6 +39,7 @@ signal current_state : STATE_T := IDLE_S; ...@@ -39,6 +39,7 @@ signal current_state : STATE_T := IDLE_S;
signal currentDistance : STD_LOGIC_VECTOR(24 downto 0) := (others => '0'); signal currentDistance : STD_LOGIC_VECTOR(24 downto 0) := (others => '0');
signal prevDistance : STD_LOGIC_VECTOR(24 downto 0) := (others => '0'); signal prevDistance : STD_LOGIC_VECTOR(24 downto 0) := (others => '0');
signal latchedDistance : STD_LOGIC_VECTOR(24 downto 0) := (others => '0');
signal distanceInWide : STD_LOGIC_VECTOR(24 downto 0) := (others => '0'); signal distanceInWide : STD_LOGIC_VECTOR(24 downto 0) := (others => '0');
signal calcDelta : STD_LOGIC_VECTOR(24 downto 0) := (others => '0'); signal calcDelta : STD_LOGIC_VECTOR(24 downto 0) := (others => '0');
...@@ -47,6 +48,8 @@ signal corrDelta : STD_LOGIC_VECTOR(24 downto 0) := "0001000000000000000000000"; ...@@ -47,6 +48,8 @@ signal corrDelta : STD_LOGIC_VECTOR(24 downto 0) := "0001000000000000000000000";
signal corrDeltaN : STD_LOGIC_VECTOR(24 downto 0) := "1111000000000000000000000"; signal corrDeltaN : STD_LOGIC_VECTOR(24 downto 0) := "1111000000000000000000000";
signal currentOffset : STD_LOGIC_VECTOR(24 downto 0) := (others => '0'); signal currentOffset : STD_LOGIC_VECTOR(24 downto 0) := (others => '0');
signal newIsLarger : STD_LOGIC := '0';
signal dr_prev : STD_LOGIC := '0'; signal dr_prev : STD_LOGIC := '0';
begin begin
...@@ -54,6 +57,8 @@ begin ...@@ -54,6 +57,8 @@ begin
distanceInWide(20 downto 0) <= distance_in; distanceInWide(20 downto 0) <= distance_in;
distanceInWide(24 downto 21) <= (others => '0'); distanceInWide(24 downto 21) <= (others => '0');
distance_out <= currentDistance;
dr_update: process(clk100) dr_update: process(clk100)
begin begin
...@@ -63,6 +68,7 @@ begin ...@@ -63,6 +68,7 @@ begin
end process; end process;
proc: process(clk100) proc: process(clk100)
begin begin
if rising_edge(clk100) then if rising_edge(clk100) then
...@@ -71,29 +77,80 @@ begin ...@@ -71,29 +77,80 @@ begin
when IDLE_S => when IDLE_S =>
if dr = '1' and dr_prev = '0' then if dr = '1' and dr_prev = '0' then
current_state <= STATE1; current_state <= STATE1;
latchedDistance <= distanceInWide;
--calculate relevant delta distance here --calculate relevant delta distance here
if prevDistance > distanceInWide then if prevDistance > distanceInWide then
newIsLarger <= '0';
calcDelta <= prevDistance - distanceInWide; calcDelta <= prevDistance - distanceInWide;
else else
newIsLarger <= '1';
calcDelta <= distanceInWide - prevDistance; calcDelta <= distanceInWide - prevDistance;
end if;
else else
current_state <= IDLE_S;
latchedDistance <= latchedDistance;
newIsLarger <= newIsLarger;
calcDelta <= calcDelta;
end if; end if;
currentOffset <= currentOffset;
currentDistance <= currentDistance;
dr_out <= '0';
prevDistance <= prevDistance;
when STATE1 => when STATE1 =>
current_state <= STATE2; current_state <= STATE2;
--calculate change to offset here --calculate change to offset here
if calcDelta > maxDelta then
--we have wrapped around
if newIsLarger then
--went negative
currentOffset <= currentOffset + corrDeltaN;
else
--went more positive
currentOffset <= currentOffset + corrDelta;
end if;
else
currentOffset <= currentOffset;
end if;
latchedDistance <= latchedDistance;
newIsLarger <= newIsLarger;
calcDelta <= calcDelta;
currentDistance <= currentDistance;
dr_out <= dr_out;
prevDistance <= prevDistance;
when STATE2 => when STATE2 =>
--calculate output distance, set next prevDistance here
current_state <= STATE3; current_state <= STATE3;
--calculate output distance here currentDistance <= currentOffset + latchedDistance;
latchedDistance <= latchedDistance;
newIsLarger <= newIsLarger;
calcDelta <= calcDelta;
currentOffset <= currentOffset;
dr_out <= dr_out;
prevDistance <= latchedDistance;
when STATE3 => when STATE3 =>
--set output ready here
current_state <= IDLE_S; current_state <= IDLE_S;
--set output ready here dr_out <= '1';
latchedDistance <= latchedDistance;
newIsLarger <= newIsLarger;
calcDelta <= calcDelta;
currentOffset <= currentOffset;
currentDistance <= currentDistance;
prevDistance <= prevDistance;
end case; end case;
else else
currentDistance <= (others => '0'); currentDistance <= (others => '0');
prevDistance <= (others => '0'); prevDistance <= (others => '0');
current_state <= IDLE_S;
latchedDistance <= (others => '0');
newIsLarger <= '0';
calcDelta <= (others => '0');
currentOffset <= (others => '0');
dr_out <= '0';
end if; end if;
end if; end if;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment