1 | ----------------------------------------------------------------------------------
|
2 | -- Company: AK development GmbH
|
3 | -- Engineer: A:Kurka
|
4 | --
|
5 | -- Create Date: 31.8.2024
|
6 | -- modif:31.08.24 Version A20
|
7 | -- Design Name: AS21
|
8 | -- Module Name: ITPModul - Behavioral
|
9 | ------------------------------------------------------------------------
|
10 | -- virtuelle Interpolator XYZ von Koordinaten XYZs to XYZe
|
11 | -- Invers-Transformation von XYZ auf Achsen A4..A0
|
12 | -- Achse A6 noch nicht programmiert, wird kundenspezifisch programmiert
|
13 | ----------------------------------------------------------------------------------
|
14 | library IEEE;
|
15 | use IEEE.STD_LOGIC_1164.ALL;
|
16 | use IEEE.STD_LOGIC_ARITH.ALL;
|
17 | --use IEEE.STD_LOGIC_UNSIGNED.ALL;
|
18 | use ieee.std_logic_signed.ALL;
|
19 | --USE ieee.math_real.all;
|
20 | use IEEE.numeric_std.all;
|
21 |
|
22 |
|
23 |
|
24 | entity ITPModul is
|
25 | port (nrst : in std_logic;
|
26 | clk : in std_logic;
|
27 | XS :in std_logic_vector(31 downto 0);-- Startpunkt Koordinate X
|
28 | YS :in std_logic_vector(31 downto 0);-- Startpunkt Koordinate Y
|
29 | ZS :in std_logic_vector(31 downto 0);-- Startpunkt Koordinate Z
|
30 | XT :in std_logic_vector(31 downto 0);-- Koordinate X relativ (XE-XS)
|
31 | YT :in std_logic_vector(31 downto 0);-- Koordinate Y relativ (YE-YS)
|
32 | ZT :in std_logic_vector(31 downto 0);-- Koordinate Z relativ (ZE-ZS)
|
33 | pfrq :in std_logic_vector(23 downto 0);--Bahn-Periode in anzahl CLK
|
34 | L1 :in std_logic_vector(15 downto 0);-- länge Arm1 in mm
|
35 | L2 :in std_logic_vector(15 downto 0);-- länge Arm2 in mm
|
36 | L3 :in std_logic_vector(15 downto 0);-- länge Arm3 in mm
|
37 | ---------------------
|
38 | Xlin :in std_logic_vector(15 downto 0);-- Koord LinStz
|
39 | Ylin :in std_logic_vector(15 downto 0);-- Max.Eingabe +/-327.67
|
40 | ebene :in std_logic_vector(3 downto 0);--interpolationsebene für LinSatz
|
41 | Xactiv :in std_logic;
|
42 | Yactiv :in std_logic;
|
43 | celin :in std_logic;---start interpolation für linstz in einer ebene
|
44 | --------------------------------------
|
45 | stopp :in std_logic;-- stop interpolation,(stopp+) nach Endlage
|
46 | RampRun :in std_logic;-- rampe aktiv =1
|
47 | strimp :in std_logic;-- start interpolation
|
48 | ce :in std_logic;-- start interpolation von kreis oder XYZ Satz : InversTransf
|
49 | -----------------------------
|
50 | calcok :out std_logic:= '0';-- signalisiert alle berechnungen sind fertig
|
51 | XAout :out std_logic_vector(31 downto 0):=X"00000000";--virtuelle aktuelle koordinate
|
52 | YAout :out std_logic_vector(31 downto 0):=X"00000000";
|
53 | ZAout :out std_logic_vector(31 downto 0):=X"00000000";
|
54 | ITPmod :out std_logic_vector(2 DOWNTO 0):="000";--ITP für Status Meldung an CPU
|
55 | oAXdif :out std_logic_vector(95 downto 0):= (OTHERS => '0');--Sollwertdiff(16Bit) von inv.Transfer und Lin
|
56 | oImpLk :out std_logic:='1';--impulse von xyz itp
|
57 | enditp :out std_logic:='0';-- ende von Kontur:=0 (enditp-)
|
58 | itprun :out std_logic:='0';-- =1:interpolator läuft,aktuelle Sollwerte in oAXinkr(6x 32bit)
|
59 | testdata :out std_logic_vector(15 downto 0):= X"0000"
|
60 | );
|
61 | end ITPModul;
|
62 |
|
63 | architecture Behavioral of ITPModul is
|
64 | --==========================================================
|
65 | --Umrechnng Winkel in Rad(FP) in Inkremente gem. AchsnAuflösung
|
66 | -- if InkrAX = 1 achse Inkrementieren,
|
67 | --if IDekrAX = 1 achse Dekrementieren,
|
68 | COMPONENT AxConv is
|
69 | port (
|
70 | nrst : in std_logic;
|
71 | clk : in std_logic;
|
72 | ceConv : in std_logic;
|
73 | AFPinp :in std_logic_vector(31 downto 0);--Input Achsen FP
|
74 | Resol :in std_logic_vector(31 downto 0);--2PI/AchsenAuflösung
|
75 | AchsInkr :out std_logic_vector(31 downto 0);-- Anzahl Inkremene
|
76 | AXgrd :out std_logic_vector(15 downto 0)-- Achsenwinkel In Grd.X
|
77 | );
|
78 | END COMPONENT;
|
79 |
|
80 | -------------------------------------------
|
81 | COMPONENT CosFP is
|
82 | port( nrst : in std_logic;
|
83 | clk : in std_logic;
|
84 | cecos: in std_logic;-- startimpuls ArcCosFP
|
85 | ainp :in std_logic_vector(31 downto 0);-- input X= cos(x), FP format
|
86 | cos :OUT std_logic_vector(31 downto 0)-- output arccos(X), FP format
|
87 | );
|
88 | END COMPONENT;
|
89 |
|
90 | -----------------------------------------------------
|
91 | COMPONENT atanFP is
|
92 | port( nrst : in std_logic;
|
93 | clk : in std_logic;
|
94 | ceatan : in std_logic;-- startimpuls afkt
|
95 | Xinp :in std_logic_vector(31 downto 0);-- input X FP FP format
|
96 | Yinp :in std_logic_vector(31 downto 0);-- input Y FP FP format
|
97 | atanFP :OUT std_logic_vector(31 downto 0):=X"00000000"-- output Winkel(rad) in FP format
|
98 | );
|
99 | END COMPONENT;
|
100 | -----------------------------------------------
|
101 | -- if a > b then result = "0001"
|
102 | COMPONENT cmpgr IS
|
103 | PORT (
|
104 | a : IN STD_LOGIC_VECTOR(31 DOWNTO 0);
|
105 | b : IN STD_LOGIC_VECTOR(31 DOWNTO 0);
|
106 | clk : IN STD_LOGIC;
|
107 | ce : IN STD_LOGIC;
|
108 | result : OUT STD_LOGIC_VECTOR(0 DOWNTO 0)
|
109 | );
|
110 | END COMPONENT;-- cmpgr;
|
111 | -------------------------------------------------------------------------------
|
112 | COMPONENT ArcCosFP is
|
113 | port( nrst : in std_logic;
|
114 | clk : in std_logic;
|
115 | ceacos: in std_logic;-- startimpuls ArcCosFP
|
116 | ainp :in std_logic_vector(31 downto 0);-- input X= cos(x), FP format
|
117 | acos :OUT std_logic_vector(31 downto 0):=X"00000000"-- output arccos(X), FP format
|
118 | );
|
119 | END COMPONENT;
|
120 |
|
121 | ----------------------------------------------------------------
|
122 | COMPONENT mul IS
|
123 | port (
|
124 | clk: IN std_logic;
|
125 | a: IN std_logic_VECTOR(25 downto 0);
|
126 | b: IN std_logic_VECTOR(25 downto 0);
|
127 | ce: IN std_logic;
|
128 | p: OUT std_logic_VECTOR(25 downto 0));
|
129 | END COMPONENT;
|
130 | -----------------------------------------------------------
|
131 | COMPONENT DivAtan is
|
132 | port( nrst : in std_logic;
|
133 | clk : in std_logic;
|
134 | Fa :in std_logic_vector(31 downto 0);--Input FP Divident
|
135 | Fb :in std_logic_vector(31 downto 0);--Input FP Divisor
|
136 | cedivatan :in std_logic;
|
137 | Angle :out std_logic_VECTOR(25 downto 0));
|
138 | end COMPONENT;
|
139 |
|
140 | --===========================================================
|
141 | -----------für initITP-------------------------------------
|
142 | COMPONENT IntToFP IS
|
143 | port (
|
144 | a: IN std_logic_VECTOR(31 downto 0);
|
145 | clk: IN std_logic;
|
146 | ce: IN std_logic;
|
147 | result: OUT std_logic_VECTOR(31 downto 0));
|
148 | END COMPONENT;
|
149 | ------------------------------------------------------------
|
150 | COMPONENT int16ToFP IS
|
151 | PORT (
|
152 | a : IN STD_LOGIC_VECTOR(15 DOWNTO 0);
|
153 | clk : IN STD_LOGIC;
|
154 | ce : IN STD_LOGIC;
|
155 | result : OUT STD_LOGIC_VECTOR(31 DOWNTO 0)
|
156 | );
|
157 | END COMPONENT;
|
158 |
|
159 | ------------------------------------------------------------
|
160 | COMPONENT divFP IS
|
161 | port (
|
162 | a: IN std_logic_VECTOR(31 downto 0);
|
163 | b: IN std_logic_VECTOR(31 downto 0);
|
164 | clk: IN std_logic;
|
165 | ce: IN std_logic;
|
166 | result: OUT std_logic_VECTOR(31 downto 0)
|
167 | );
|
168 | END COMPONENT;
|
169 | ----------------------------------------------------
|
170 | COMPONENT mulFP IS
|
171 | port (
|
172 | a: IN std_logic_VECTOR(31 downto 0);
|
173 | b: IN std_logic_VECTOR(31 downto 0);
|
174 | clk: IN std_logic;
|
175 | ce: IN std_logic;
|
176 | result: OUT std_logic_VECTOR(31 downto 0)
|
177 | );
|
178 | END COMPONENT;
|
179 | ---------------------------------------------
|
180 | COMPONENT addFP IS
|
181 | port (
|
182 | a: IN std_logic_VECTOR(31 downto 0);
|
183 | b: IN std_logic_VECTOR(31 downto 0);
|
184 | clk: IN std_logic;
|
185 | ce: IN std_logic;
|
186 | result: OUT std_logic_VECTOR(31 downto 0));
|
187 | END COMPONENT;
|
188 | -----------------------------------------
|
189 | COMPONENT subFP IS
|
190 | port (
|
191 | a: IN std_logic_VECTOR(31 downto 0);
|
192 | b: IN std_logic_VECTOR(31 downto 0);
|
193 | clk: IN std_logic;
|
194 | ce: IN std_logic;
|
195 | result: OUT std_logic_VECTOR(31 downto 0));
|
196 | END COMPONENT;
|
197 | -----------------------------------------------------
|
198 | COMPONENT sqrtFP IS
|
199 | port (
|
200 | a: IN std_logic_VECTOR(31 downto 0);
|
201 | clk: IN std_logic;
|
202 | ce: IN std_logic;
|
203 | result: OUT std_logic_VECTOR(31 downto 0));
|
204 | END COMPONENT;
|
205 | ----------------------------------------------------
|
206 | COMPONENT FPtoInt32 IS
|
207 | port (
|
208 | a: IN std_logic_VECTOR(31 downto 0);
|
209 | clk: IN std_logic;
|
210 | ce: IN std_logic;
|
211 | result: OUT std_logic_VECTOR(31 downto 0));
|
212 | END COMPONENT;
|
213 | ---------------------------------------------------
|
214 | COMPONENT FPtoInt IS
|
215 | port (
|
216 | a: IN std_logic_VECTOR(31 downto 0);
|
217 | clk: IN std_logic;
|
218 | ce: IN std_logic;
|
219 | result: OUT std_logic_VECTOR(24 downto 0));
|
220 | END COMPONENT;
|
221 | --======================================================
|
222 | COMPONENT FPtoInt16 IS
|
223 | port (
|
224 | a: IN std_logic_VECTOR(31 downto 0);
|
225 | clk: IN std_logic;
|
226 | ce: IN std_logic;
|
227 | result: OUT std_logic_VECTOR(15 downto 0)
|
228 | );
|
229 | END COMPONENT;
|
230 | --==== testfunktionen werden nicht implementiert ====
|
231 | COMPONENT tstCos IS
|
232 | PORT (
|
233 | phase_in : IN STD_LOGIC_VECTOR(15 DOWNTO 0);
|
234 | y_out : OUT STD_LOGIC_VECTOR(15 DOWNTO 0);
|
235 | clk : IN STD_LOGIC;
|
236 | ce : IN STD_LOGIC
|
237 | );
|
238 | END COMPONENT;
|
239 | ---------------------------------------------------------
|
240 | COMPONENT tstSin IS
|
241 | PORT (
|
242 | phase_in : IN STD_LOGIC_VECTOR(15 DOWNTO 0);
|
243 | x_out : OUT STD_LOGIC_VECTOR(15 DOWNTO 0);
|
244 | clk : IN STD_LOGIC;
|
245 | ce : IN STD_LOGIC
|
246 | );
|
247 | END COMPONENT;
|
248 | -----------------------------------------------------------
|
249 | COMPONENT mul16 IS
|
250 | PORT (
|
251 | clk : IN STD_LOGIC;
|
252 | a : IN STD_LOGIC_VECTOR(15 DOWNTO 0);
|
253 | b : IN STD_LOGIC_VECTOR(15 DOWNTO 0);
|
254 | ce : IN STD_LOGIC;
|
255 | p : OUT STD_LOGIC_VECTOR(15 DOWNTO 0)
|
256 | );
|
257 | END COMPONENT;
|
258 | --==========================================================
|
259 | --ATTRIBUTE KEEP : STRING;
|
260 | --ATTRIBUTE KEEP of mul12:SIGNAL is "true";
|
261 | --ATTRIBUTE DONT_TOUCH : string;
|
262 | --ATTRIBUTE DONT_TOUCH of mulFP: COMPONENT is "yes";
|
263 | --------------------------------------------------------------------
|
264 | TYPE STATE_TYPE IS (S0,S1,S2,S3,S4,S5,S6,S7,S8,S9,S10,S11,S12,S13,S14);
|
265 | TYPE T_Param16 IS ARRAY(5 DOWNTO 0) OF std_logic_vector(15 DOWNTO 0);
|
266 | TYPE T_Param18 IS ARRAY(5 DOWNTO 0) OF std_logic_vector(17 DOWNTO 0);
|
267 | TYPE T_AXwert IS ARRAY(3 DOWNTO 0) OF INTEGER RANGE -32768 TO 32767;
|
268 | TYPE T_AXIS IS ARRAY(5 DOWNTO 0) OF INTEGER RANGE -32768 TO 32767;
|
269 | TYPE T_AXInc IS ARRAY(5 DOWNTO 0) OF std_logic_vector(31 DOWNTO 0);
|
270 | TYPE T_AXDif IS ARRAY(5 DOWNTO 0) OF std_logic_vector(15 DOWNTO 0);
|
271 | -----
|
272 | TYPE T_AxFP IS ARRAY(5 DOWNTO 0) OF std_logic_vector(31 DOWNTO 0);
|
273 | TYPE T_Axr IS ARRAY(5 DOWNTO 0) OF std_logic_vector(15 DOWNTO 0);
|
274 | -------------------------------------------------------------------------
|
275 | CONSTANT clkToFP : integer range 0 to 127 := 1;
|
276 | CONSTANT clkTosq : integer range 0 to 127 := 1;
|
277 | CONSTANT clkTomul : integer range 0 to 127 := 1;
|
278 | CONSTANT clkToadd : integer range 0 to 127 := 1;
|
279 | CONSTANT clkTosub : integer range 0 to 127 := 1;
|
280 | CONSTANT clkTosqrt : integer range 0 to 127 := 1;
|
281 | CONSTANT clkTodiv : integer range 0 to 127 := 2;
|
282 | CONSTANT clkFPtoInt : integer range 0 to 127 := 1;
|
283 | CONSTANT clkToAtan : integer range 0 to 127 := 25;
|
284 | CONSTANT clkToAcos : integer range 0 to 127 := 25;
|
285 | CONSTANT clkToCos : integer range 0 to 127 := 25;
|
286 | CONSTANT clkAtan : integer range 0 to 127 := 30;
|
287 | CONSTANT clkAtan32 : integer range 0 to 127 := 11;
|
288 | CONSTANT clkdiv32 : integer range 0 to 127 := 32;
|
289 |
|
290 | CONSTANT clkTosin : integer range 0 to 127 := 1;
|
291 | CONSTANT clkToMuli : integer range 0 to 127 := 2;
|
292 | CONSTANT C2 :std_logic_vector(31 DOWNTO 0):=X"40000000";-- zahl 2 in FP format 32bit
|
293 | CONSTANT C1 :std_logic_vector(31 DOWNTO 0):=X"3F800000";-- zahl 1 in FP format 32bit
|
294 | CONSTANT C0 :std_logic_vector(31 DOWNTO 0):=X"00000000";-- zahl 0 in FP format 32bit
|
295 | CONSTANT PIdiv2 :std_logic_vector(31 DOWNTO 0):=X"3FC90FDB";-- +1.57079632679 PI/2 in FP Format
|
296 | CONSTANT PIndiv2 :std_logic_vector(31 DOWNTO 0):=X"BFC90FDB";-- -1.57079632679 PI/2 in FP Format
|
297 | CONSTANT PI :std_logic_vector(31 DOWNTO 0):=X"40490FDB";-- 3.14159265359 PI in FP Format
|
298 |
|
299 | -------
|
300 | CONSTANT C132 :std_logic_vector(31 DOWNTO 0):=X"20000000";--zahl 1 in format 1Q32 bit
|
301 | CONSTANT C126 :std_logic_vector(25 DOWNTO 0):="01" & X"000000";--zahl 1 in format 1Q26 bit
|
302 | CONSTANT C026 :std_logic_vector(25 DOWNTO 0):="00" & X"000000";-- zahl 0 in FP format 26bit
|
303 | CONSTANT Pihalf :std_logic_vector(25 DOWNTO 0):="001" & "10010010000111111011000";--Pi Half in 2Q26
|
304 | ----------
|
305 | --Anzahl Inkremente / Ummdrehung FP=für 20'000 = X"469c4000"
|
306 | -- Resol = 500 , 2PI / 500 = 0.0125 = 3c4ccccd
|
307 | -- 2PI/1000 =0.00628318531 = 3bcde32e
|
308 | -- 2Pi/2000 =0.00314159265 = 3b4de32e
|
309 | -- 2PI/ 1440 =0.00436332313 = 3b8efa35
|
310 | -- 2PI/ 3600 = 0.00174532925 = 3ae4c388,1 Inkrement in rad FP bei 3600 Inkr pro U
|
311 | -- 2PI/5000 = 0.00125663706 = 3aa4b5be
|
312 | -- 2PI/10000 = 0.00062831853 = 3a24b5be
|
313 | -- 2PI /20000 =0.00031415927= X"39a4b5be" = 1 Inkrement in rad FP bei 20000 Inkr pro U
|
314 | ---------------------------------------------------------------------------------
|
315 | -----------3ae4c388 = 0.00174532923847 = 1 Inkrement in Rad,FP=2Pi/inkr pro U vo Rob Arm
|
316 | --CONSTANT A0res :std_logic_vector(31 DOWNTO 0):=X"37ce3750";--=0.00002458287 rad/inkr
|
317 | --CONSTANT A1res :std_logic_vector(31 DOWNTO 0):=X"37d4f7a6";--=0.00002538769
|
318 | --CONSTANT A2res :std_logic_vector(31 DOWNTO 0):=X"3858f501";--=0.00005172659
|
319 | --CONSTANT A3res :std_logic_vector(31 DOWNTO 0):=X"38532aa6";--=0.00005034604
|
320 | --CONSTANT A4res :std_logic_vector(31 DOWNTO 0):=X"3a548e6e";--=0008108382
|
321 | --CONSTANT A5res :std_logic_vector(31 DOWNTO 0):=X"38b847d0";--=0.0000878718
|
322 | -----------------------------------------------------------------------
|
323 | --CONSTANT C_A0res :std_logic_vector(31 DOWNTO 0):=X"48799a00";--255592 inkr /U
|
324 | --CONSTANT C_A1res :std_logic_vector(31 DOWNTO 0):=X"4871b2c0";--247499 inkr/U
|
325 | --CONSTANT C_A2res :std_logic_vector(31 DOWNTO 0):=X"47ed3e80";--121469 inkr/U
|
326 | --CONSTANT C_A3res :std_logic_vector(31 DOWNTO 0):=X"47f3c000";--124800 inkr/U
|
327 | --CONSTANT C_A4res :std_logic_vector(31 DOWNTO 0):=X"45f22800";--7749 inkr/U
|
328 | --CONSTANT C_A5res :std_logic_vector(31 DOWNTO 0):=X"478ba800";--71504 inkr/U
|
329 | --------------------------------------------------------------------
|
330 | CONSTANT C_A0rad :std_logic_vector(31 DOWNTO 0):=X"471ee6b3";--40678.70 inkr /rad
|
331 | CONSTANT C_A1rad :std_logic_vector(31 DOWNTO 0):=X"4719deae";--39390.68 inkr /rad
|
332 | CONSTANT C_A2rad :std_logic_vector(31 DOWNTO 0):=X"469708c8";--19332.39 inkr /rad
|
333 | CONSTANT C_A3rad :std_logic_vector(31 DOWNTO 0):=X"469b2d0f";--19862.53 inkr /rad
|
334 | CONSTANT C_A4rad :std_logic_vector(31 DOWNTO 0):=X"449a28f6";--1233.28 inkr /rad
|
335 | CONSTANT C_A5rad :std_logic_vector(31 DOWNTO 0):=X"4631d0d7";--11380.21 inkr /rad
|
336 | ---------------------Virtuelle Inkremente-------------------------------------------
|
337 | --CONSTANT C_A0rad :std_logic_vector(31 DOWNTO 0):=X"43fa0000";--10000 inkr /rad:461c4000
|
338 | --CONSTANT C_A1rad :std_logic_vector(31 DOWNTO 0):=X"43fa0000";--5000 inkr/rad:459c4000
|
339 | --CONSTANT C_A2rad :std_logic_vector(31 DOWNTO 0):=X"43fa0000";--3000 inkr/rad:453b8000
|
340 | --CONSTANT C_A3rad :std_logic_vector(31 DOWNTO 0):=X"43fa0000";--1000 inkr/rad:447a0000
|
341 | --CONSTANT C_A4rad :std_logic_vector(31 DOWNTO 0):=X"43fa0000";--500 inkr/rad:43fa0000
|
342 | --CONSTANT C_A5rad :std_logic_vector(31 DOWNTO 0):=X"43fa0000";--200 Inkr/rad:43480000
|
343 | ------------------------------------------------------------------
|
344 | CONSTANT A12res :std_logic_vector(31 DOWNTO 0):=X"3ae4c388";
|
345 | CONSTANT AGres :std_logic_vector(31 DOWNTO 0):= X"3ae4c388";--
|
346 | ------------------Kommt später über Config Darei -------------
|
347 | CONSTANT C_Xs :STD_LOGIC_VECTOR(31 DOWNTO 0):= X"000001F4";-- 500
|
348 | CONSTANT C_Ys :STD_LOGIC_VECTOR(31 DOWNTO 0):= X"FFFFFF38";-- -200
|
349 | CONSTANT C_Zs :STD_LOGIC_VECTOR(31 DOWNTO 0):= X"00000078";-- 120
|
350 | ----------------------wird im TOP gesetzt --------------------
|
351 | --CONSTANT C_pfrq :STD_LOGIC_VECTOR(23 DOWNTO 0):= X"006400";--ITP frqPeriode:25600*10ns=256uS=3.9kHz
|
352 | --CONSTANT C_pfrq :STD_LOGIC_VECTOR(23 DOWNTO 0):= X"000320";--ITP frqPeriode:800*10ns=8uS=125kHz
|
353 | --CONSTANT C_pfrq :STD_LOGIC_VECTOR(23 DOWNTO 0):= X"000190";--ITP frqPeriode:400*10nS=4uS=250KHz
|
354 | --CONSTANT C_pfrq :STD_LOGIC_VECTOR(23 DOWNTO 0):= X"0000C8";--ITP frqPeriode:200*10nS=2uS=500Khz
|
355 | --CONSTANT C_pfrq :STD_LOGIC_VECTOR(23 DOWNTO 0):= X"000064";--ITP frqPeriode:100*10nS=1uS=1Mhz
|
356 |
|
357 | ----------------------------------------------------------
|
358 | --==============================================================================
|
359 | SIGNAL stateIni :integer range 0 to 31:= 0;
|
360 | SIGNAL stateITP :integer range 0 to 31:= 0;
|
361 | SIGNAL staterunX :integer range 0 to 7:= 0;
|
362 | SIGNAL staterunY :integer range 0 to 7:= 0;
|
363 | SIGNAL staterunZ :integer range 0 to 7:= 0;
|
364 | SIGNAL staterunLk :integer range 0 to 7:= 0;
|
365 | SIGNAL stateangle :integer range 0 to 63:= 0;
|
366 | SIGNAL stateLinX :integer range 0 to 7:= 0;
|
367 | SIGNAL stateLinY :integer range 0 to 7:= 0;
|
368 | SIGNAL statechg :integer range 0 to 7:= 0;
|
369 | SIGNAL ITPSTATE :Integer range 0 to 2 := 0;
|
370 | -----------------------------------------------
|
371 | --========= Calc ALL Modul==================================
|
372 | SIGNAL stateAll :STATE_TYPE;
|
373 | --========================================================================
|
374 | --============= LinStz Interpolator Signale ==============================
|
375 | SIGNAL sitprun :std_logic:='0';--itprun für interne gebrauch
|
376 | --======= runLinX,runLinY signale======================================
|
377 | SIGNAL stateLin :STATE_TYPE;
|
378 | SIGNAL stateLinB :STATE_TYPE;
|
379 | SIGNAL linLka :INTEGER:= 0;
|
380 | SIGNAL LinLk :INTEGER:= 0;-- mAXAX für Linstz
|
381 | SIGNAL dLklin :INTEGER:= 0;
|
382 | SIGNAL dXlin :INTEGER:= 0;
|
383 | SIGNAL dYlin :INTEGER:= 0;
|
384 | SIGNAL XlinAbs :std_logic_vector(15 DOWNTO 0):=X"0000";
|
385 | SIGNAL YLinAbs :std_logic_vector(15 DOWNTO 0):=X"0000";
|
386 | SIGNAL Xlina :std_logic_vector(15 DOWNTO 0):=X"0000";
|
387 | SIGNAL YLina :std_logic_vector(15 DOWNTO 0):=X"0000";
|
388 | SIGNAL Xdifa :std_logic_vector(15 DOWNTO 0):=X"0000";
|
389 | SIGNAL Ydifa :std_logic_vector(15 DOWNTO 0):=X"0000";
|
390 | SIGNAL FLinXneg :std_logic:='0';--Flag koord ist negativ
|
391 | SIGNAL FLinYneg :std_logic:='0';--
|
392 | SIGNAL LinITPok :std_logic:='0';--
|
393 | SIGNAL LinRun :std_logic:='0';--
|
394 | SIGNAL ImpLkLin :std_logic:='1';--Lk Impulse von LinITP
|
395 | --=============================================================================
|
396 | SIGNAL lincalcOK :std_logic:='0';--start für RAMP von LinSatz
|
397 | --======== Ende Signale LinStz Verarbeitung =============================
|
398 | SIGNAL XYZcalcOK :std_logic:='0';--start für RAMP von XYZSatz
|
399 | --====================XYZ ITP============================================================
|
400 | -----------iniITPxyz Signale----------------------------------------
|
401 | SIGNAL YXTneg :std_logic:='0';--XT < YT then YXTneg :=1
|
402 | ----------------------
|
403 | ---SIGNAL cefrqFP :std_logic:='0';-- start Int to FP frqPER =>frqFP
|
404 | --SIGNAL frqPER :std_logic_vector(31 DOWNTO 0):=X"00000000";-- FrqPeriode, Steuerung ITP frq
|
405 | --SIGNAL frqFP :std_logic_vector(31 DOWNTO 0):=X"00000000";-- frq FP
|
406 | --------------------
|
407 | SIGNAL FXt :std_logic_vector(31 DOWNTO 0):=(OTHERS => '0');
|
408 | SIGNAL FYt :std_logic_vector(31 DOWNTO 0):=(OTHERS => '0');
|
409 | SIGNAL FZt :std_logic_vector(31 DOWNTO 0):=(OTHERS => '0');
|
410 | SIGNAL FXtabs :std_logic_vector(31 DOWNTO 0):=(OTHERS => '0');-- abs wert für crxdiv usw.
|
411 | SIGNAL FYtabs :std_logic_vector(31 DOWNTO 0):=(OTHERS => '0');
|
412 | SIGNAL FZtabs :std_logic_vector(31 DOWNTO 0):=(OTHERS => '0');
|
413 | ----- state3-----------------------------
|
414 | SIGNAL cesqXYZ :std_logic:='0';-- start sq
|
415 | SIGNAL sqFXt :std_logic_vector(31 DOWNTO 0):=(OTHERS => '0');
|
416 | SIGNAL sqFYt :std_logic_vector(31 DOWNTO 0):=(OTHERS => '0');
|
417 | SIGNAL sqFZt :std_logic_vector(31 DOWNTO 0):=(OTHERS => '0');
|
418 | ---------------state 4 -----------------------
|
419 | SIGNAL ceaddXY :std_logic:='0';-- start Add XY
|
420 | SIGNAL addXY :std_logic_vector(31 DOWNTO 0):=(OTHERS => '0');
|
421 | ---------------state 5 ----------------------
|
422 | SIGNAL ceaddXYZ :std_logic:='0';-- start Add XYZ
|
423 | SIGNAL addXYZ :std_logic_vector(31 DOWNTO 0):=(OTHERS => '0');
|
424 | --------------- state 6--------------------------
|
425 | SIGNAL cesqrtFLk :std_logic:='0';-- start sqrt
|
426 | SIGNAL FLk :std_logic_vector(31 DOWNTO 0):=(OTHERS => '0');--FLk Länge in XT,YT,ZT
|
427 | SIGNAL FLT :std_logic_vector(31 DOWNTO 0):=(OTHERS => '0');--FLT länge in XT,YT
|
428 | SIGNAL XTLTdiv :std_logic_vector(31 DOWNTO 0):=(OTHERS => '0');--XTLTdiv:=FXT/FLT
|
429 | --------state10------------------------
|
430 | SIGNAL ceTgAT :std_logic:='0';-- Start catgAT
|
431 | SIGNAL AZFP :std_logic_vector(31 DOWNTO 0):=(OTHERS => '0');--AZFP= Winkel Strecke ZT
|
432 | -------state 11------------------------------
|
433 | SIGNAL cecmpAT :std_logic:='0';
|
434 | SIGNAL ATgrPI2 :STD_LOGIC_VECTOR(0 DOWNTO 0):=(others => '0');
|
435 | SIGNAL grPI2 :std_logic:='0';
|
436 | SIGNAL ATFP :std_logic_vector(31 DOWNTO 0):=(OTHERS => '0');--ATFP= Winkel Strecke YT XT
|
437 | SIGNAL initITPok :std_logic:='0';--initITP fertig
|
438 | SIGNAL ITPlin :STD_LOGIC_VECTOR(2 DOWNTO 0):= "000";
|
439 | --================== InitITPlin fertig====================================
|
440 | -----------------------------------------------------
|
441 | --==========RUNITP Signale(Interpolator für virtuelle Achsen XYZ )==========
|
442 | SIGNAL ITPxyz :STD_LOGIC_VECTOR(2 DOWNTO 0):= "000";
|
443 | SIGNAL XTabs :std_logic_vector(31 downto 0):=(OTHERS => '0');-- Targetkord(XT= abs
|
444 | SIGNAL YTabs :std_logic_vector(31 downto 0):=(OTHERS => '0');-- Targetkord(YT= abs
|
445 | SIGNAL ZTabs :std_logic_vector(31 downto 0):=(OTHERS => '0');-- Targetkord(ZT= avs
|
446 | SIGNAL fXneg :std_logic:='0';-- negativ Flag X für Xe - Xs
|
447 | SIGNAL fYneg :std_logic:='0';-- negativ Flag X für Ye - Ys
|
448 | SIGNAL fZneg :std_logic:='0';-- negativ Flag X für Ze - Zs
|
449 | SIGNAL ceXYZF :std_logic:='0';-- start für initITPlin
|
450 | SIGNAL runXYZ :std_logic:='0';-- Proc IMpX..IMpZ aktiv
|
451 | SIGNAL ceFlkInt :std_logic:='0';-- Flk to LK
|
452 | SIGNAL XYZok :std_logic:='0';-- XYZbresenham fertig
|
453 | ------------Signale für Bresenham process : brshXYZ ----------------------------
|
454 | SIGNAL statebrsh :INTEGER RANGE 0 TO 7 := 0;
|
455 | SIGNAL dLk :integer:= 0;
|
456 | SIGNAL dX :integer:= 0;
|
457 | SIGNAL dY :integer:= 0;
|
458 | SIGNAL dZ :integer:= 0;
|
459 | SIGNAL Lk :std_logic_vector(31 downto 0):=(OTHERS => '0');--leitkoordinate
|
460 | SIGNAL Lka :integer;-- Aktuelle Virtuelle Koordinate Lk
|
461 | SIGNAL strtITP :std_logic:='0';-- start für XYZ itp
|
462 | ---------------------------------------------------------------------------
|
463 | --------------Signale für impX, generiert Xa---------------------------------
|
464 | SIGNAL Xa :std_logic_vector(31 downto 0):=(OTHERS => '0');-- Aktuelle Koordinate X
|
465 | SIGNAL ImpX :std_logic:='1';-- inkrement Impuls
|
466 | --------------Signale für impY-----generiert Ya----------------------------
|
467 | SIGNAL Ya :std_logic_vector(31 downto 0):=(OTHERS => '0');-- Aktuelle Koordinate Y
|
468 | SIGNAL ImpY :std_logic:='1';-- inkrement Impuls
|
469 | --------------Signale für impZ----generiert Za-----------------------------
|
470 | SIGNAL Za :std_logic_vector(31 downto 0):=(OTHERS => '0');-- Aktuelle Koordinate z
|
471 | SIGNAL ImpZ :std_logic:='1';-- inkrement Impuls
|
472 | --------------------------------------------------------
|
473 | ------------------------generiert ImpLk----------------------------
|
474 | SIGNAL ctrPLk :Integer range 0 to 33554431:=0;-- dekr. Counter für Imp. Periode
|
475 | SIGNAL ImpLk :std_logic:='1';-- inkrement virtuelle Lk Impuls von XYZ ITP (invers Trans)
|
476 | --======================================================================
|
477 | -----RUNANGLE Berechnung : a0 := arctan(Ya/Xa) und aXYT:=arctan(YT/XT) Berechnung-------------------------------
|
478 | SIGNAL ceXYZFP :std_logic:='0';
|
479 | ----------------------
|
480 | SIGNAL FXa :std_logic_vector(31 DOWNTO 0):=(OTHERS => '0');--Aktuelle X Position FP
|
481 | SIGNAL FYa :std_logic_vector(31 DOWNTO 0):=(OTHERS => '0');
|
482 | SIGNAL FZa :std_logic_vector(31 DOWNTO 0):=(OTHERS => '0');
|
483 | SIGNAL AZFPabs :std_logic_vector(31 DOWNTO 0):=(OTHERS => '0');-- abs werte
|
484 | -----------------------state 0---------------------
|
485 | SIGNAL FXYZaOK :std_logic:= '0';--signalisiert wenn FXYZa bereit
|
486 | SIGNAL suPIAT :std_logic_vector(31 downto 0):=(OTHERS => '0');
|
487 | SIGNAL adPIAT :std_logic_vector(31 downto 0):=(OTHERS => '0');
|
488 | ----------------- state 2----------------------------------
|
489 | SIGNAL cePI2 :std_logic:='0';-- start für sPIAT := PI/2 - PIATabs für sin AT
|
490 | SIGNAL PIAT :std_logic_vector(31 downto 0):=(OTHERS => '0');
|
491 | SIGNAL PIATabs :std_logic_vector(31 downto 0):=(OTHERS => '0');
|
492 | SIGNAL sPIAT :std_logic_vector(31 downto 0):=(OTHERS => '0');
|
493 | ---------------- state 3 ----------------------------------
|
494 | SIGNAL cetgFP :std_logic:='0';
|
495 | SIGNAL A0FP :std_logic_vector(31 DOWNTO 0):=(OTHERS => '0');--32 bit Resultat von ArcTanFP
|
496 | SIGNAL PIAZ :std_logic_vector(31 downto 0):=(OTHERS => '0');--Res Pi/2 - AZFP
|
497 | SIGNAL sinAZ :std_logic_vector(31 downto 0):=(OTHERS => '0');--
|
498 | SIGNAL cosAZ :std_logic_vector(31 downto 0):=(OTHERS => '0');--
|
499 | SIGNAL cosAT :std_logic_vector(31 downto 0):=(OTHERS => '0');--
|
500 | SIGNAL sinAT :std_logic_vector(31 downto 0):=(OTHERS => '0');--
|
501 | -----------------State 9 ---------------------------------
|
502 | SIGNAL cemul9 :std_logic:='0';
|
503 | SIGNAL sAZAT :std_logic_vector(31 downto 0):=(OTHERS => '0');--
|
504 | SIGNAL cAZAT :std_logic_vector(31 downto 0):=(OTHERS => '0');--
|
505 | -----------------State 10 -----------------------------------
|
506 | SIGNAL cemul10 :std_logic:='0';
|
507 | SIGNAL sAZAT3 :std_logic_vector(31 downto 0):=(OTHERS => '0');--
|
508 | SIGNAL cAZAT3 :std_logic_vector(31 downto 0):=(OTHERS => '0');--
|
509 | SIGNAL cAZAZ3 :std_logic_vector(31 downto 0):=(OTHERS => '0');--
|
510 | -----------------State 11---------------------------
|
511 | SIGNAL cesubW :std_logic:='0';
|
512 | SIGNAL aFXw :std_logic_vector(31 downto 0):=(OTHERS => '0');--
|
513 | SIGNAL sFXw :std_logic_vector(31 downto 0):=(OTHERS => '0');--
|
514 | SIGNAL FXw :std_logic_vector(31 downto 0):=(OTHERS => '0');--
|
515 | SIGNAL FYw :std_logic_vector(31 downto 0):=(OTHERS => '0');--
|
516 | SIGNAL FZw :std_logic_vector(31 downto 0):=(OTHERS => '0');--
|
517 | ---------------- State 12------------------------------
|
518 | SIGNAL cemul12 :std_logic:='0';
|
519 | SIGNAL sqXw :std_logic_vector(31 downto 0):=(OTHERS => '0');--
|
520 | SIGNAL sqYw :std_logic_vector(31 downto 0):=(OTHERS => '0');--
|
521 | SIGNAL subATAW :std_logic_vector(31 downto 0):=(OTHERS => '0');--
|
522 |
|
523 | ---------------state 13-----------------------------------
|
524 | SIGNAL subPIdiv :std_logic_vector(31 downto 0):=(OTHERS => '0');--
|
525 | SIGNAL ceaddXYw :std_logic:='0';
|
526 | SIGNAL sqXYw :std_logic_vector(31 downto 0):=(OTHERS => '0');--
|
527 | SIGNAL AwFP :std_logic_vector(31 downto 0):=(OTHERS => '0');--
|
528 | ---------------- State 14 ---------------------------------
|
529 | SIGNAL cesqrtLw :std_logic:='0';
|
530 | SIGNAL cemAZA3 :std_logic:='0';
|
531 | SIGNAL LwFP :std_logic_vector(31 downto 0):=(OTHERS => '0');--
|
532 | SIGNAL DivPIdiv :std_logic_vector(31 downto 0):=(OTHERS => '0');--
|
533 | ------------------state 15----------------------------
|
534 | SIGNAL cedAZA3 :std_logic:='0';
|
535 | SIGNAL sqZ2 :std_logic_vector(31 downto 0):=(OTHERS => '0');--
|
536 | SIGNAL sqW2 :std_logic_vector(31 downto 0):=(OTHERS => '0');--
|
537 | ------------------state 16 -----------------------------------
|
538 | SIGNAL cedivPIdiv :std_logic:='0';
|
539 | SIGNAL ceA4FP :std_logic:='0';
|
540 | SIGNAL sqaddWZ :std_logic_vector(31 downto 0):=(OTHERS => '0');--
|
541 | ----------------- state 17 -----------------------------------
|
542 | SIGNAL ceAZmul :std_logic:='0';
|
543 | SIGNAL FL12 :std_logic_vector(31 downto 0):=(OTHERS => '0');--
|
544 | SIGNAL A12FP :std_logic_vector(31 downto 0):=(OTHERS => '0');--
|
545 | SIGNAL runCalcP1 :std_logic:='0';-- start für calcP1
|
546 | ----------------- state 18 --------------------------------
|
547 | SIGNAL A4FP :std_logic_vector(31 downto 0):=(OTHERS => '0');--
|
548 | SIGNAL absdivPIdiv :std_logic_vector(31 downto 0):= (OTHERS => '0');--
|
549 | ----------------- state 19 --------------------------------
|
550 | SIGNAL sub1min :std_logic_vector(31 downto 0):= (OTHERS => '0');--
|
551 | SIGNAL cesub1min :std_logic:='0';
|
552 | ----------------- state 20 --------------------------------
|
553 | SIGNAL ceA3FP :std_logic:='0';
|
554 | SIGNAL A3FP :std_logic_vector(31 downto 0):=(OTHERS => '0');--
|
555 | --===============================================================
|
556 | ----------------state 22-- nur für test -----------------
|
557 | SIGNAL ceXYZw :std_logic:='0';
|
558 | SIGNAL Xw :std_logic_vector(31 downto 0):=(OTHERS => '0');--
|
559 | SIGNAL Yw :std_logic_vector(31 downto 0):=(OTHERS => '0');--
|
560 | SIGNAL Zw :std_logic_vector(31 downto 0):=(OTHERS => '0');--
|
561 | --======================run angle fertig=============================================
|
562 | SIGNAL A5FP :std_logic_vector(31 downto 0):=X"00000001";--
|
563 | --------------Signale für XYZ Modul-------------------------------
|
564 | SIGNAL L4 :std_logic_vector(31 downto 0):=(OTHERS => '0');
|
565 | SIGNAL AXYT :std_logic_vector(19 DOWNTO 0):=(OTHERS => '0');--20 bit integer output
|
566 | ----------------------------------
|
567 | --***************************************************************************
|
568 | --======================================================
|
569 | ---------calcALL------------------------------
|
570 | SIGNAL FL1 :std_logic_vector(31 DOWNTO 0):= (OTHERS => '0');
|
571 |
|
572 | SIGNAL FL2 :std_logic_vector(31 DOWNTO 0):= (OTHERS => '0');
|
573 |
|
574 | SIGNAL FL3 :std_logic_vector(31 DOWNTO 0):= (OTHERS => '0');
|
575 | SIGNAL FL4 :std_logic_vector(31 DOWNTO 0):= (OTHERS => '0');
|
576 | SIGNAL FW1 :std_logic_vector(31 DOWNTO 0):= (OTHERS => '0');
|
577 |
|
578 | SIGNAL FW2 :std_logic_vector(31 DOWNTO 0):= (OTHERS => '0');
|
579 | SIGNAL FZ1 :std_logic_vector(31 DOWNTO 0):= (OTHERS => '0');
|
580 |
|
581 | SIGNAL FZ2 :std_logic_vector(31 DOWNTO 0):= (OTHERS => '0');
|
582 | SIGNAL FA1 :std_logic_vector(31 DOWNTO 0):= (OTHERS => '0');
|
583 | SIGNAL FA2 :std_logic_vector(31 DOWNTO 0):= (OTHERS => '0');
|
584 | SIGNAL ceLFP :std_logic:='0';--FP conversion enable
|
585 | -------------------------------------------------------------
|
586 | --========================================================================
|
587 | ------------RUNANGLE vorher-Signale für calcP1------------------
|
588 | SIGNAL ceP1 :std_logic:='0';--start sq für P1
|
589 | SIGNAL StrtP3 :std_logic:='0';-- start für parallel ablauf P3
|
590 | SIGNAL cesqL :std_logic:='0';
|
591 | SIGNAL sqL1 :std_logic_vector(31 DOWNTO 0):=(OTHERS => '0');
|
592 | SIGNAL sqL2 :std_logic_vector(31 DOWNTO 0):=(OTHERS => '0');
|
593 | SIGNAL sqL12 :std_logic_vector(31 DOWNTO 0):=(OTHERS => '0');
|
594 | SIGNAL mul12 :std_logic_vector(31 DOWNTO 0):=(OTHERS => '0');
|
595 |
|
596 | SIGNAL ceadd1 :std_logic:='0';
|
597 | SIGNAL sqadd1 :std_logic_vector(31 DOWNTO 0):= (OTHERS => '0');
|
598 | SIGNAL cesub1 :std_logic:='0';
|
599 | SIGNAL sqsub1 :std_logic_vector(31 DOWNTO 0):= (OTHERS => '0');
|
600 | SIGNAL cem32 :std_logic:='0';
|
601 | SIGNAL mulres1 :std_logic_vector(31 DOWNTO 0):= (OTHERS => '0');
|
602 |
|
603 | SIGNAL cediv1 :std_logic:='0';
|
604 | SIGNAL ax :std_logic_vector(31 DOWNTO 0):= (OTHERS => '0');
|
605 |
|
606 | ---------------------------
|
607 | SIGNAL ceacosFP :std_logic:='0';-- Start arccosFP
|
608 | SIGNAL acosAX :std_logic_vector(31 DOWNTO 0):= (OTHERS => '0');
|
609 | SIGNAL asinAX :std_logic_vector(31 DOWNTO 0):= (OTHERS => '0');-- wird nicht benützt
|
610 | SIGNAL ceA1FP :std_logic:='0';
|
611 | SIGNAL A1FP :std_logic_vector(31 DOWNTO 0):=(OTHERS => '0');
|
612 | SIGNAL cesubA1 :std_logic:='0';
|
613 | SIGNAL A1SFP :std_logic_vector(31 DOWNTO 0):= (OTHERS => '0');
|
614 | SIGNAL cecosFP :std_logic:='0';
|
615 | SIGNAL cosA1FP :std_logic_vector(31 DOWNTO 0):= (OTHERS => '0');--1te resultat cosinFP
|
616 |
|
617 | SIGNAL sinA1FP :std_logic_vector(31 DOWNTO 0):= (OTHERS => '0');--2te resultat cosinFP
|
618 |
|
619 | ---------------------
|
620 | SIGNAL ceZ1W1 :std_logic:='0';
|
621 |
|
622 | ------ RUNANGLE vorher Calc P1 blatt1 fertig, Blatt2 anfang
|
623 | SIGNAL ceZW12 :std_logic:='0';
|
624 | SIGNAL Z2Z1 :std_logic_vector(31 DOWNTO 0):= (OTHERS => '0');
|
625 | SIGNAL W2W1 :std_logic_vector(31 DOWNTO 0):= (OTHERS => '0');
|
626 | SIGNAL cedivZW :std_logic:='0';
|
627 | SIGNAL divZW :std_logic_vector(31 DOWNTO 0):= (OTHERS => '0');
|
628 | SIGNAL ceatanZW :std_logic:='0';
|
629 | SIGNAL atanZW :std_logic_vector(31 DOWNTO 0):= (OTHERS => '0');
|
630 | SIGNAL A2FP :std_logic_vector(31 DOWNTO 0):= (OTHERS => '0');
|
631 | SIGNAL cesubAGA2 :std_logic:='0';
|
632 | SIGNAL AGA2 :std_logic_vector(31 DOWNTO 0):= (OTHERS => '0');
|
633 | SIGNAL cesubA2 :std_logic:='0';
|
634 | -------- RUNANGLE vorherende calc P1 ---------------------------------
|
635 | -----------------------------------------------------------------
|
636 | ----------ITPImpGen---------------------------------------------
|
637 | ---TYPE T_INKDEK is ARRAy(5 DOWNTO 0) of std_logic_vector(1 DOWNO 0); -- Achsen(Inc, Dec)
|
638 | SIGNAL AXinc :T_AXInc;--IS ARRAY(5 DOWNTO 0) OF SLV(31 DOWNTO 0);
|
639 | SIGNAL AXalt :T_AXInc;--IS ARRAY(5 DOWNTO 0) OF SLV(31 DOWNTO 0);
|
640 | SIGNAL vAXdif :T_AXInc;--IS ARRAY(5 DOWNTO 0) OF SLV(31 DOWNTO 0);
|
641 | SIGNAL AXdif :T_AXdif;--IS ARRAY(5 DOWNTO 0) OF SLV(15 DOWNTO 0);
|
642 | ------------------
|
643 | SIGNAL AXGr :T_Axr;-- Winkel der Achsen A0..A5 in GRD.X, (std Logic vector)
|
644 | SIGNAL ceAxx :std_logic:='0';-- start für Axconv für A1,A2 A12
|
645 |
|
646 | ----------------------
|
647 | SIGNAL A12 :std_logic_vector(19 DOWNTO 0):=X"00000";--20 bit integer output
|
648 | SIGNAL statITPimp :INTEGER RANGE 0 TO 31;
|
649 | SIGNAL AXinkr :std_logic_vector(191 downto 0):= (OTHERS => '0');--Sollwerte von inv.Transfer und Lin
|
650 | --======================================================================
|
651 | --**************************************************************************
|
652 |
|
653 | BEGIN
|
654 | --===================================================================================
|
655 | ---pfrq SLV(23 downto 0);--Bahn-Periode in anzahl CLK (10ns)
|
656 | --- frqPer :32 bit
|
657 | --FrqGen:PROCESS(clk)
|
658 | --VARIABLE cntrclk : INTEGER RANGE 0 TO 1000000;
|
659 | --BEGIN
|
660 | -- IF rising_edge(clk) THEN
|
661 | -- IF nrst = '0' THEN
|
662 | -- cntrclk := 0;
|
663 | -- cefrqFP <= '0';
|
664 | -- ELSE
|
665 | -- IF cntrclk > 0 THEN
|
666 | -- cntrclk := cntrclk - 1;
|
667 | -- cefrqFP <= '0';
|
668 | -- ELSE
|
669 | -- frqPER <= X"00" & pfrq;--ITP frqPeriode laden
|
670 | -- cefrqFP <= '1';-- start Int to FP für frqPer
|
671 | -- cntrclk := 4000; --- 20 us interval
|
672 | -- END IF;
|
673 | -- END IF; --IF nrst /ELSE
|
674 | -- END IF; --clk
|
675 | --END PROCESS;--FrqGen
|
676 | --============================================================================
|
677 | --=======Linear Interpolation in erinzelnen Achsen X,Y gemäss ebene, Kartesisch=====
|
678 | -- Generiert eine linearinterpolation in den AchsenXY gemäss konzept von Optinumeric
|
679 | -- Programmiert als lin Interpolationsatz mit nur 2 Achsen,:label 1
|
680 | --============================================================================
|
681 | --=============****************************************===================================
|
682 | ---====== XYZ Interpolation(invers Transformation) ablauf in den Achsen A5..A0 :ab Label 6
|
683 | --=========================================================================
|
684 | --Entity :oAXdif:std_logic_vector(95 downto 0):differenz von alle 6 Achsen(6 *16 bits)
|
685 | --SIGNAL AXdif :T_AXdif;--IS ARRAY(5 DOWNTO 0) OF SLV(15 DOWNTO 0);
|
686 | -- Liefert in der Entity Signal oAxdif(95..0):achsen solldifferenzen.
|
687 | -- später werden in TopAS21 in der Procedur SollInc(z6024) die Sollwerte für Alle 6 Achsen (SOLL)
|
688 | -- wobei diese als Input für Ramp dienen.
|
689 | --------------------------------------------------
|
690 | ImpSwitch:PROCESS(clk)
|
691 | VARIABLE Lin :std_logic := '0';--für lin=1, für XYZ = 0
|
692 | VARIABLE INDX :INTEGER RANGE 0 TO 127:= 0;
|
693 | VARIABLE RunStop :std_logic := '0';--speichert Stopp impuls
|
694 | -- bis Rampenende
|
695 | BEGIN
|
696 | IF rising_edge(clk) THEN
|
697 | IF nrst = '0' THEN
|
698 | itprun <= '0';
|
699 | sitprun <= '0';
|
700 | enditp <= '0';
|
701 | indx := 0;
|
702 | ITPmod <= "000";-- init ITmod
|
703 | lin:= '0';-- init
|
704 | ITPSTATE <= 0;
|
705 | statechg <= 0;
|
706 | oAXdif <= (OTHERS => '0');
|
707 | CalcOK <= '0';-- RESET IMPULS fürstart RAMP
|
708 | ELSE
|
709 | CASE ITPSTATE IS
|
710 | WHEN 0 =>
|
711 | IF celin = '1' THEN
|
712 | Lin := '1';
|
713 | indx := conv_integer(ebene(1 DOWNTO 0));-- ebene ini Receiv gesetzt Byte(1) 2..0
|
714 | ITPSTATE <= 1;
|
715 | ELSIF ce = '1' THEN
|
716 | Lin := '0';
|
717 | ITPSTATE <= 1;
|
718 | ELSE ITPSTATE <= 0;
|
719 | END IF;
|
720 | WHEN 1 =>
|
721 | IF lin = '1' THEN
|
722 | ITPmod <= ITPlin;
|
723 | ELSE
|
724 | ITPmod <= ITPxyz;
|
725 | END IF;
|
726 | ---------------
|
727 | IF (XYZok = '1') OR (LinITPok = '1') THEN
|
728 | ITPmod <= "000";
|
729 | ITPSTATE <= 0;
|
730 | ELSE ITPSTATE <= 1;
|
731 | END IF;
|
732 | WHEN OTHERS => ITPSTATE <= 0;
|
733 | END CASE;
|
734 | ----------------------------
|
735 | CASE statechg IS
|
736 | WHEN 0 =>
|
737 | IF linrun = '1' THEN --Lin Itp pulsw
|
738 | itprun <= '1';--Itp Läuft
|
739 | sitprun <= '1';
|
740 | enditp <= '1';--itp Läuft
|
741 | statechg <= 1;
|
742 | ELSIF runXYZ = '1' THEN --InvwersTransf Impulse
|
743 | itprun <= '1';--Itp Läuft
|
744 | sitprun <= '1';
|
745 | enditp <= '1';--itp Läuft
|
746 | statechg <= 6;
|
747 | ELSE -- keine Interpolation, warten auf rampen ende resp neue stz
|
748 | statechg <= 0;-- und warten
|
749 | END IF;
|
750 | --==================================================================
|
751 | ------------------- LinSatz------------------------------------
|
752 | WHEN 1 => -- ablauf linStz
|
753 | IF linrun = '1' THEN
|
754 | IF LinITPok = '1' THEN
|
755 | itprun <= '0';-- lin ITP fertig
|
756 | sitprun <= '0';
|
757 | ELSE -- LINInterpolation läuft
|
758 | oImpLk <= ImpLkLin;--Impulse LK von LinITP
|
759 | calcOK <= lincalcOK;--start für RAMP
|
760 | --oAXinkr(31..0), Xlina(15..0)
|
761 | IF Xactiv = '1' THEN ---- WinkelAchsen Inkremente auf entity
|
762 | oAXdif(indx*32+15 DOWNTO indx*32) <= Xdifa;
|
763 | END IF;
|
764 | IF Yactiv = '1' THEN
|
765 | oAXdif(indx*32+31 DOWNTO indx*32+16) <= Ydifa;
|
766 | END IF;
|
767 | ----------------------------
|
768 | IF stopp = '1' OR RunStop = '1' THEN
|
769 | RunStop := '1'; --Stopp speichern
|
770 | itpRun <= '0'; -- Unterbruch wg limit oder Endlage
|
771 | sitprun <= '0';
|
772 | enditp <= '0';-- ende kontur
|
773 | ELSE
|
774 | ItpRun <= '1';-- ITP lin läufzt
|
775 | sitprun <= '1';
|
776 | enditp <= '1';-- ende kontur
|
777 | END IF;
|
778 | END IF;
|
779 | ELSE -- linRun fertig, warten auf rampenende
|
780 | IF RampRun = '1' THEN
|
781 | IF stopp = '1' OR RunStop = '1' THEN
|
782 | RunStop := '1'; --Stopp speichern
|
783 | END IF;
|
784 | statechg <= 1;
|
785 | ELSE
|
786 | enditp <= '0';
|
787 | RunStop := '0';
|
788 | statechg <= 0;-- ende satz, warten auf neue satz
|
789 | END IF;
|
790 | END IF;
|
791 | --==================================================================================------------------------XYZ Satz= inv.Transf-------------------------
|
792 | WHEN 6 => -- impuls ausgabe bei invers transf
|
793 | IF runXYZ = '1' THEN --interpolation (Bresenham) läuft,itprun=1
|
794 | oImpLk <= ImpLk;--virt.ImpulseLK von Inv.Transf (XYZ ITP,Bresenham)
|
795 | FOR i IN 0 TO 5 LOOP
|
796 | oAXdif(i*16+15 DOWNTO i*16) <= AXdif(i);-- WinkelAchsensolldif Inkremente auf entity
|
797 | END LOOP;
|
798 | calcOK <= XYZcalcOK;--start für RAMP
|
799 | IF stopp = '1' OR RunStop = '1' THEN
|
800 | ItpRun <= '0'; -- Unterbruch wg limit oder Endlage
|
801 | sitprun <= '0';
|
802 | RunStop := '1'; -- speichern Stopp
|
803 | ELSE
|
804 | IF XYZok = '1' THEN --- wenn Bressenham fertig
|
805 | ItpRun <= '0';
|
806 | enditp <= '0'; -- ende kontur
|
807 | sitprun <= '0';
|
808 | ELSE
|
809 | ItpRun <= '1';
|
810 | sitprun <= '1';
|
811 | enditp <= '1'; -- kontur läuft
|
812 | END IF;
|
813 | END IF;
|
814 | statechg <= 6;
|
815 | ELSE -- Bresenham Interpolation fertig
|
816 | IF RampRun = '1' THEN
|
817 | IF stopp = '1' OR RunStop = '1' THEN
|
818 | RunStop := '1'; --Stopp speichern
|
819 | END IF;
|
820 | statechg <= 6;
|
821 | ELSE
|
822 | RunStop := '0';
|
823 | statechg <= 0;-- ende satz, warten auf neue satz
|
824 | END IF;
|
825 | END IF; --nächste Impulsausgabe
|
826 | WHEN OTHERS => statechg <= 0;
|
827 | END CASE;
|
828 | END IF;--if nrst/else
|
829 | END IF;-- clk
|
830 | END PROCESS;-- IMPSwitch
|
831 | --=============================================================
|
832 | -- bei linstz werden nur 16 bit akzeptiert (ist nur zum optimieren der Achsen)
|
833 | -- d.h. Max eingabe = +/- 327.67 für X,oder Y Linsatz
|
834 | --==Steuert ITP für linStz ==============================
|
835 | -- LinLk (intg):-- Generiert aus MAXAX bei Empfang von Linstz
|
836 | -- Xlin,Ylin wurden bei Empfang von Linstz geladen
|
837 | -- generiert ITPlin (status ITP)
|
838 | ------------------------------------------------
|
839 | runITPlin:PROCESS(clk)
|
840 | VARIABLE cntrclk : INTEGER RANGE 0 TO 3000000:= 0;-- für 30ms max
|
841 | VARIABLE iEB :INTEGER RANGE 0 TO 2 := 0;-- zwischenspeicher für ebene
|
842 | BEGIN
|
843 | IF rising_edge(clk) THEN
|
844 | IF nrst = '0' THEN
|
845 | LinRun <= '0'; -- reset start Bresenhamlin
|
846 | dXlin <= 0;
|
847 | dYlin <= 0;
|
848 | dLkLin <= 0;
|
849 | StateLin <= S0;
|
850 | cntrclk := 0;
|
851 | iEB := 0;
|
852 | XLinAbs <= (OTHERS =>'0');
|
853 | YLinAbs <= (OTHERS =>'0');
|
854 | ITPlin <= "000"; --init ITP für Status
|
855 | ELSE
|
856 | CASE stateLin IS
|
857 | WHEN S0 => -- start mit celin
|
858 | IF ceLin = '1' THEN
|
859 | iEB := conv_integer(Ebene);-- Ebene für linSatz
|
860 | StateLin <= S1;
|
861 | ELSE
|
862 | StateLin <= S0;-- warten
|
863 | END IF;
|
864 | WHEN S1 => -- init div koordinaten
|
865 | ITPlin(conv_integer(iEB)) <= '1';--Itp für aktive Ebene
|
866 | -----------------
|
867 | IF Xlin(15) = '1' THEN -- negativ koord
|
868 | FLinXneg <= '1';
|
869 | XLinAbs <= (Xlin XOR X"FFFF") + 1;
|
870 | ELSE
|
871 | FLinXneg <= '0';
|
872 | XlinAbs <= Xlin;
|
873 | END IF;
|
874 | ----------------------
|
875 | IF Ylin(15) = '1' THEN -- negativ koord
|
876 | FLinYneg <= '1';
|
877 | YLinAbs <= (Ylin XOR X"FFFF") + 1;
|
878 | ELSE
|
879 | FLinYneg <= '0';
|
880 | YlinAbs <= Ylin;
|
881 | END IF;
|
882 | --------------------
|
883 | StateLin <= S2;
|
884 | WHEN S2 =>
|
885 | dXlin <= conv_integer(XLinAbs);-- Xkoord
|
886 | dYlin <= conv_integer(YLinAbs);
|
887 | StateLin <= S3;
|
888 | WHEN S3 =>
|
889 | IF dXLin >= dYlin THEN
|
890 | LinLk <= dXLin;--maxax setzen
|
891 | ELSE
|
892 | LinLk <= dYLin;
|
893 | END IF; -- für 2 status mldg 30 us
|
894 | cntrclk := 2000000;-- 20 mS warte zeit
|
895 | StateLin <= S4;
|
896 | WHEN S4 =>
|
897 | IF cntrclk > 0 THEN
|
898 | cntrclk := cntrclk -1;
|
899 | StateLin <= S4;
|
900 | ELSE
|
901 | dLklin <= LinLk;--Leit koord,
|
902 | ITPlin(conv_integer(iEB)) <= '0';--Itp init für status
|
903 | cntrclk := 170;-- 2.0 us min Impulslänge
|
904 | StateLin <= S5;---S5;----ohne start imp
|
905 | END IF;
|
906 | ---------auf startImpuls warten-------------------------
|
907 | WHEN S5 => --- warten auf Start Impuls länge min 2,4us
|
908 | IF cntrclk > 0 THEN
|
909 | cntrclk := cntrclk -1;
|
910 | IF strimp = '1' THEN
|
911 | stateLin <= S5;-- warten
|
912 | ELSE
|
913 | stateLin <= S6;-- impuls ist kürzer, neu anfangen
|
914 | END IF;
|
915 | ELSE -- zeit abgelaufen
|
916 | stateLin <= S7;-- impuls hat richtige länge
|
917 | END IF;
|
918 | WHEN S6 => -- neu anfangen mit Impuls abwarten
|
919 | cntrclk := 170;-- 2.0 us min Impulslänge
|
920 | stateLin <= S5;-- neu anfangen
|
921 | -----------start impuls empfangen------------------------
|
922 | WHEN S7 =>
|
923 | LinRun <= '1'; -- Bresenhamlin starten(impuls)
|
924 | ITPlin(conv_integer(iEB)) <= '1';--Itp für status
|
925 | StateLin <= S8;
|
926 | WHEN S8 =>
|
927 | StateLin <= S9;
|
928 | WHEN S9 => -- warten bis interpolation (ITP) fertig ist
|
929 | IF LinITPok = '1' THEN
|
930 | LinRun <= '0';
|
931 | ITPlin(conv_integer(iEB)) <= '0';--Itp für status(itp fertig)
|
932 | StateLin <= S10;-- und weiter
|
933 | ELSE
|
934 | StateLin <= S9;-- warten bis ITP fertig ist
|
935 | END IF;
|
936 | WHEN S10 =>
|
937 | StateLin <= S0;-- und Warten auf nächste LInStz
|
938 | WHEN OTHERS =>
|
939 | dXlin <= 0;
|
940 | dYlin <= 0;
|
941 | dLkLin <= 0;
|
942 | StateLin <= S0;
|
943 | END CASE;
|
944 | END IF;-- if nrst/else
|
945 | END IF; -- if clk
|
946 | END PROCESS;-- runITPlin
|
947 | --=================================================================
|
948 | --=====================Bresenham Interpolation für linStz ==========
|
949 | --- interpoliert in XY eine gewählte Ebene in LinStz(linear Satz)
|
950 | -- ImpXlin,ImpYin sind Impulse in XY,,
|
951 | --ImpLklin sind virtuelle Impulse in entlang der Leitkoordinate
|
952 | -- XlinA,YlinA ist absolute Position
|
953 | -- Ende der Interpolation : LinItpok = 1 (2 clk impuls)
|
954 | --Vorschubspeed definiert mit pfrq (anz.clk(10ns) zwischen
|
955 | --zwei ImpLklin impulsen
|
956 | -------------------------------------------------------
|
957 | breshamLin: PROCESS(clk)
|
958 | VARIABLE count :INTEGER;
|
959 | VARIABLE errX :INTEGER;
|
960 | VARIABLE errY :INTEGER;
|
961 | VARIABLE XaltA :std_logic_vector(15 DOWNTO 0):=X"0000";
|
962 | VARIABLE YaltA :std_logic_vector(15 DOWNTO 0):=X"0000";
|
963 | BEGIN
|
964 | IF rising_edge(clk) THEN
|
965 | IF nrst = '0' THEN
|
966 | stateLinB <= S0;
|
967 | errX :=0;
|
968 | errY :=0;
|
969 | XLinA <= (OTHERS =>'0');
|
970 | YLinA <= (OTHERS =>'0');
|
971 | LinItpok <= '0';
|
972 | count := 0;
|
973 | ImpLkLin <= '1';--Impulse (Lk)von LinITP
|
974 | LinCalcOK <= '0';
|
975 | ELSE
|
976 | CASE statelinB IS
|
977 | WHEN S0 =>
|
978 | IF LinRun = '1' THEN
|
979 | count := conv_integer(pfrq);
|
980 | stateLinB <= S1;
|
981 | ELSE
|
982 | errX :=dLklin/2;
|
983 | errY :=dLklin/2;
|
984 | LinLka <= 0;
|
985 | LinItpok <= '0';
|
986 | stateLinB <= S0;
|
987 | END IF;
|
988 | WHEN S1 =>
|
989 | LinCalcOK <= '0';-- RESET IMPULS calcOK
|
990 | IF count = 0 THEN -- warten für pfrq periode
|
991 | IF LinLka < linLk THEN --wenn noch nicht fertig
|
992 | LinLka <= LinLka + 1;
|
993 | ------------------------
|
994 | errX := errX - dXlin;
|
995 | IF errX < 0 THEN
|
996 | XlinA <= XlinA + 1;
|
997 | ImpLklin <= '0';
|
998 | errX := errX + dLkLin;
|
999 | END IF;
|
1000 | ----------------------
|
1001 | errY := errY - dYlin;
|
1002 | IF errY < 0 THEN
|
1003 | YLinA <= YLinA + 1;
|
1004 | ImpLklin <= '0';
|
1005 | errY := errY + dLkLin;
|
1006 | END IF;
|
1007 | -------------------------
|
1008 | count := conv_integer(pfrq);
|
1009 | stateLinB <= S2;-- itp noch nicht fertig
|
1010 | ELSE -- dann itp fertig
|
1011 | count := 0;-- pfrq Zähler stoppen
|
1012 | stateLinB <= S4;--dann itp fertig
|
1013 | END IF;
|
1014 | ELSE -- warten auf count ablauf(prfg periode)
|
1015 | count := count - 1;
|
1016 | stateLinB <= S1;
|
1017 | END IF;
|
1018 | WHEN S2 => --noch nicht fertig
|
1019 | ImpLklin <= '1';
|
1020 | XdifA <= XlinA - XaltA;
|
1021 | YdifA <= YlinA - YaltA;
|
1022 | stateLinB <= S3;
|
1023 | WHEN S3 =>
|
1024 | XaltA := XlinA;
|
1025 | YaltA := YLinA;
|
1026 | LinCalcOK <= '1';--dann start für daten einlesen in RaMP
|
1027 | IF stopp = '1' THEN --sofort ITP anhalten
|
1028 | stateLinB <= S5;-- Stopp Exit
|
1029 | ELSE -- kein stopp
|
1030 | stateLinB <= S1;-- dann repeat
|
1031 | END IF;
|
1032 | --------------------------------
|
1033 | WHEN S4 => -- itp fertig
|
1034 | stateLinB <= S5;-- normal exit
|
1035 | --------------------------------------------
|
1036 | WHEN S5 => -- stop exit
|
1037 | XLinA <= (OTHERS =>'0');
|
1038 | YLinA <= (OTHERS =>'0');
|
1039 | errX :=0;
|
1040 | errY :=0;
|
1041 | count := 0;
|
1042 | ImpLkLin <= '1';--Impulse (Lk)von LinITP stoppen
|
1043 | LinItpok <= '1';
|
1044 | stateLinB <= S0;--und warten auf nächste linITP Satz
|
1045 | WHEN others => stateLinB <= S0;
|
1046 | END CASE;
|
1047 | END IF;--IF nrst/ELSE
|
1048 | END IF; -- if clk
|
1049 | END PROCESS;-- bresenham für XY LinKoordinaten
|
1050 |
|
1051 | --============= ende LinStz Interpolation =====================================
|
1052 | ------------------------------------------------------------------------------------
|
1053 | --======Invers transformation mit Linearinterpolation in XYZ Raum================
|
1054 | -----------------------------------------------------------------
|
1055 | --======berechnet gemäss XT,YT,ZT die Priode Dauer PX,Py,PZ für virtualle Strecke XYZ
|
1056 | --====== sowie AtFP, AtgrPI2, AZFP, FLk ===============================================
|
1057 | --== Flk := sqrt (xT^2 + YT^2 + ZT^2)
|
1058 | ----vorbereitung Berechnungen für virtuelle Interpolation in XYZ--------------------
|
1059 | --== Formel für X Achse, gilt das gleiche für Achse Y und Z
|
1060 | --== FxT := Int to FP, FrX := FxT/ FLk, FrY := FYT/ FLk,FrZ := FzT/ FLk,
|
1061 | --= FPx := frqFP *FrX, Px := Fpto Int, dtto Y,Z, frqFP = Fp(Frequenzperiode)
|
1062 | ---------------------------------
|
1063 | --== ATFP = atanFP(FYT/FXT)
|
1064 | --== ATgrPI2 := if AtFP > Pi/2 (ccmpAT) , cmp AT mit PI/2: if > then ATgrPI2:= 1, grPI2 <= '1';
|
1065 | --== AZFP:= atanFP(FlT/FZt)
|
1066 | -----------------------------------------------------------------
|
1067 | iniITPxyz: PROCESS(clk)
|
1068 | VARIABLE cntrclk : INTEGER RANGE 0 TO 511:= 0;
|
1069 | BEGIN
|
1070 | IF rising_edge(clk) THEN
|
1071 | IF nrst = '0' THEN
|
1072 | stateIni <= 0;
|
1073 | cntrclk := 0;
|
1074 | YXTneg <= '0';
|
1075 | initITPok <='0';--reset
|
1076 | ELSE
|
1077 | CASE stateini IS
|
1078 | WHEN 0 =>
|
1079 | IF ceXYZF = '1' THEN --start initITP, Start FP von XT,YT,ZT
|
1080 | cntrclk := clkFPtoInt;
|
1081 | stateIni <= 1;
|
1082 | ELSE
|
1083 | stateIni <= 0;
|
1084 | END IF;
|
1085 | initITPok <='0';--reset
|
1086 | WHEN 1 =>
|
1087 | stateIni <= 2;
|
1088 | WHEN 2 =>-- Berechnen FXt..FZt
|
1089 | IF cntrclk = 0 THEN
|
1090 | cesqXYZ <= '1';-- start für sq(XT,YT,ZT)
|
1091 | cntrclk := clktoSq;
|
1092 | stateIni <= 3;
|
1093 | ELSE
|
1094 | cntrclk := cntrclk - 1;
|
1095 | stateIni <= 2;
|
1096 | END IF;
|
1097 | WHEN 3 =>-- Berechnen sq (X,Y,Z)
|
1098 | IF cntrclk = 0 THEN
|
1099 | cesqXYZ <= '0';-- reset ceXYZF
|
1100 | ceaddXY <= '1';-- start für add(X,Y) und XTLTdiv:=FXT/FLT
|
1101 | cntrclk := clktoAdd;
|
1102 | stateIni <= 4;
|
1103 | ELSE
|
1104 | cntrclk := cntrclk - 1;
|
1105 | stateIni <= 3;
|
1106 | END IF;
|
1107 | WHEN 4 =>-- Berechnen addFP XY
|
1108 | IF cntrclk = 0 THEN
|
1109 | ceaddXY <= '0';-- reset ce addXY
|
1110 | ceaddXYZ <= '1';-- start für add(X,Y,Z)
|
1111 | cntrclk := clktoadd;
|
1112 | stateIni <= 5;
|
1113 | ELSE
|
1114 | cntrclk := cntrclk - 1;
|
1115 | stateIni <= 4;
|
1116 | END IF;
|
1117 | WHEN 5 =>-- Berechnen addFP XYZ
|
1118 | IF cntrclk = 0 THEN
|
1119 | ceaddXY <= '0';-- reset ce addXY
|
1120 | cesqrtFLk <= '1';-- start für sqrtFLk
|
1121 | FXtabs <= FXt AND X"7FFFFFFF";
|
1122 | FYtabs <= FYt AND X"7FFFFFFF";
|
1123 | FZtabs <= FZt AND X"7FFFFFFF";
|
1124 | cntrclk := clktosqrt;
|
1125 | stateIni <= 6;
|
1126 | ELSE
|
1127 | cntrclk := cntrclk - 1;
|
1128 | stateIni <= 5;
|
1129 | END IF;
|
1130 | WHEN 6 =>-- Berechnen sqrt(addXYZ)=>FLk, sqrt(addXY)=>FLT
|
1131 | IF cntrclk = 0 THEN
|
1132 | cesqrtFLk <= '0';-- reset ce sqrtFL
|
1133 | cntrclk :=clkFptoInt;
|
1134 | ceFlkInt <= '1'; --start FP to INt für Flk To Lk
|
1135 | stateIni <= 7;
|
1136 | ELSE
|
1137 | cntrclk := cntrclk - 1;
|
1138 | stateIni <= 6;
|
1139 | END IF;
|
1140 | WHEN 7 => ---FP to INt für Flk To Lk
|
1141 | ceFlkInt <= '0'; -- reset ce
|
1142 | IF cntrclk = 0 THEN
|
1143 | stateIni <= 9;
|
1144 | ELSE
|
1145 | cntrclk := cntrClk - 1;
|
1146 | stateIni <= 7;
|
1147 | END IF;
|
1148 | ---------------------------------------------
|
1149 | WHEN 9 => -- Berechnen FP to Int = PX..
|
1150 | IF cntrclk = 0 THEN
|
1151 | cntrclk := 36; -- 22 clk für atan,32 clk für acos
|
1152 | cetgAT <= '1';-- Start für ctgYXT:ATFP:= acos(XT/LT)
|
1153 | stateIni <= 10;
|
1154 | ELSE
|
1155 | cntrclk := cntrclk - 1;
|
1156 | stateIni <= 9;
|
1157 | END IF;
|
1158 | WHEN 10 => --Berechnen ATFP:=acos(FXT/FLT) und AZFP:= atan(FZT/FLT)
|
1159 | IF cntrclk = 0 THEN
|
1160 | cetgAT <= '0';-- reset
|
1161 | cecmpAT <= '1';-- startcmp AT mit PI/2
|
1162 | stateIni <= 11;-- und ende initITPlin: ATFP und AZFP fertig
|
1163 | ELSE
|
1164 | cntrclk := cntrclk - 1;
|
1165 | stateIni <= 10;
|
1166 | END IF;
|
1167 | WHEN 11 => --ausführen cmp AT mit PI/2: ATgrPI2 fertig
|
1168 | cecmpAT <= '0';-- reset
|
1169 | stateIni <= 12;
|
1170 | WHEN 12 => --
|
1171 | IF ATgrPI2 = "1" THEN -- ATgrPI ist vektor mit Bit 0
|
1172 | grPI2 <= '1';
|
1173 | ELSE grPI2 <= '0';
|
1174 | END IF;
|
1175 | stateIni <= 13;
|
1176 | WHEN 13 => --
|
1177 | initITPok <= '1'; -- init ITP fertig
|
1178 | stateIni <= 0;-- und Zurück an Anfang
|
1179 | WHEN OTHERS =>
|
1180 | stateIni <= 0;
|
1181 | END CASE;
|
1182 | END IF;-- nrst if/else
|
1183 | END IF; --clk
|
1184 | END PROCESS;--end iniITPxyz
|
1185 | --======Start von iniITPxyz und starten Impulsausgabe==========
|
1186 | --Virtuelle -Interpolation von XYZ Starten und steuern
|
1187 | --starten bresenham interpolation xyz & Lk
|
1188 | --Generieren ITPxyz für Status Meldung
|
1189 | runITP: PROCESS(clk)
|
1190 | VARIABLE cntrclk :INTEGER RANGE 0 TO 30000000:= 0;-- für 30ms max
|
1191 | BEGIN
|
1192 | IF rising_edge(clk) THEN
|
1193 | IF nrst = '0' THEN
|
1194 | stateITP <= 0;
|
1195 | cntrclk :=0;
|
1196 | ITPxyz <= "000";
|
1197 | ELSE
|
1198 | CASE stateITP IS
|
1199 | WHEN 0 =>
|
1200 | IF ce = '1' THEN
|
1201 | ITPxyz <= "111";
|
1202 | stateITP <= 2;
|
1203 | ELSE
|
1204 | stateITP <= 0;-- Warten auf Start
|
1205 | END IF;
|
1206 | WHEN 2 =>
|
1207 | IF XT(31) = '1' THEN -- if XT negativ
|
1208 | XTabs <= (XT XOR X"FFFFFFFF") + 1;-- XT negieren
|
1209 | fXneg <= '1';--neg Flag setzen
|
1210 | ELSE
|
1211 | XTabs <= XT;
|
1212 | fXneg <= '0';--neg Flag,Rücksetzen
|
1213 | END IF;
|
1214 | --------
|
1215 | IF YT(31) = '1' THEN -- if YT negativ
|
1216 | YTabs <= (YT XOR X"FFFFFFFF") + 1;-- YT negieren
|
1217 | fYneg <= '1';--neg Flag setzen
|
1218 | ELSE
|
1219 | YTabs <= YT;
|
1220 | fYneg <= '0';--neg Flag,Rücksetzen
|
1221 | END IF;
|
1222 | --------
|
1223 | IF ZT(31) = '1' THEN -- if ZT negativ
|
1224 | ZTabs <= (ZT XOR X"FFFFFFFF") + 1;-- ZT negieren
|
1225 | fZneg <= '1';--neg Flag setzen
|
1226 | ELSE
|
1227 | ZTabs <= ZT;
|
1228 | fZneg <= '0';--neg Flag,Rücksetzen
|
1229 | END IF;
|
1230 | ceXYZF <= '1';--Start für InitITPxyz, Start des iniITPlin Processes
|
1231 | stateITP <= 3;
|
1232 | WHEN 3 => -- wenn iniITPxyz fertig berchnet
|
1233 | IF initITPok = '1' THEN
|
1234 | cntrclk := 2000000;-- 20 ms warten wg rd Status
|
1235 | stateITP <= 4;---4; --dann weiter
|
1236 | ELSE
|
1237 | ceXYZF <= '0';--reset start für InitITP
|
1238 | stateITP <= 3;-- warten auf init ITP
|
1239 | END IF;
|
1240 | ------------------------------------
|
1241 | WHEN 4 =>-- warten 20 ms für status rd
|
1242 | IF cntrclk > 0 THEN
|
1243 | cntrclk := cntrclk -1;
|
1244 | stateITP <= 4;-- dann warten
|
1245 | ELSE
|
1246 | ITPxyz <= "000";
|
1247 | cntrclk := 170;-- 2.0 us min Impulslänge für start Impuls
|
1248 | stateITP <= 5;
|
1249 | END IF;
|
1250 | WHEN 5 => --- warten auf Start Impuls länge min 2,4us
|
1251 | IF cntrclk > 0 THEN
|
1252 | cntrclk := cntrclk -1;
|
1253 | IF strimp = '1' THEN
|
1254 | stateITP <= 5;-- warten
|
1255 | ELSE
|
1256 | stateITP <= 6;-- impuls ist kürzer, neu anfangen
|
1257 | END IF;
|
1258 | ELSE -- zeit abgelaufen
|
1259 | stateITP <= 7;-- impuls hat richtige länge
|
1260 | END IF;
|
1261 | WHEN 6 => -- neu anfangen mit Impuls abwarten
|
1262 | cntrclk := 170;-- 2 us min Impulslänge
|
1263 | stateITP <= 5;
|
1264 | ---------------------------------------
|
1265 | WHEN 7 =>
|
1266 | runXYZ <= '1'; --Impuls ausgabe(bresenham) starten
|
1267 | ITPxyz <= "111";
|
1268 | stateITP <= 8;
|
1269 | WHEN 8 => -- warten bis InterpolationXYZ fertig
|
1270 | IF stopp = '0' THEN --wenn keine Endlage dann weiter
|
1271 | IF XYZok = '1' THEN -- ITP (bresenham) ist fertig
|
1272 | runXYZ <= '0';-- reset
|
1273 | stateITP <= 0;-- itp fertig
|
1274 | ITPxyz <= "000";
|
1275 | ELSE --
|
1276 | stateITP <= 8;-- warten bis koordinaten fertig
|
1277 | END IF;
|
1278 | ELSE ----wenn Endlage dann sofort itp anhalten
|
1279 | stateITP <= 9;
|
1280 | END IF;
|
1281 | WHEN 9 => -- sofort stopp
|
1282 | ITPxyz <= "000";
|
1283 | runXYZ <= '0';-- impuls Ausgabe stoppen
|
1284 | stateITP <= 0;--itp fertig
|
1285 | WHEN OTHERS =>
|
1286 | stateITP <= 0;
|
1287 | END CASE;
|
1288 | END IF;-- nrst if/else
|
1289 | END IF; --clk
|
1290 | END PROCESS;--runITP
|
1291 | --==========================================================================
|
1292 | --=================XYZ Bresenham =Interpolation Am Roboterkopf ==========
|
1293 | --erzeugt virtuelle Impulse für ImpX,ImpY,ImpZ sowie ImpLK(entlang leitKoordinate) am Roboter Kopf
|
1294 | --und aktuelle virt.Position XA,YA,ZA (integer),
|
1295 | --Ende der Interpolation mit XYZok =1 Impuls(2clk)
|
1296 | --Vorschubspeed definiert mit pfrq (Anz.clk(10nS) zwischen zwei ImpLK
|
1297 | -- impLK startet RunAngle d.h. die Invers transf Berchnung
|
1298 | ---------------------------------------------------------------------------------------------------
|
1299 | bresham: PROCESS(clk)
|
1300 | VARIABLE count :INTEGER;
|
1301 | VARIABLE errX :INTEGER;
|
1302 | VARIABLE errY :INTEGER;
|
1303 | VARIABLE errZ :INTEGER;
|
1304 | VARIABLE startON :std_logic:= '0';
|
1305 | BEGIN
|
1306 | IF rising_edge(clk) THEN
|
1307 | IF nrst = '0' THEN
|
1308 | statebrsh <= 0;
|
1309 | dLk <= 0;
|
1310 | dX <= 0;
|
1311 | dY <= 0;
|
1312 | dZ <= 0;
|
1313 | errX :=0;
|
1314 | XAout <= (OTHERS =>'0');
|
1315 | YAout <= (OTHERS =>'0');
|
1316 | ZAout <= (OTHERS =>'0');
|
1317 | errY :=0;
|
1318 | errZ :=0;
|
1319 | XA <= (OTHERS =>'0');
|
1320 | YA <= (OTHERS =>'0');
|
1321 | ZA <= (OTHERS =>'0');
|
1322 | ImpX <= '1';
|
1323 | ImpY <= '1';
|
1324 | ImpZ <= '1';
|
1325 | ImpLk <= '1';
|
1326 | count := 0;
|
1327 | XYZok <= '0';
|
1328 | startON := '0';
|
1329 | ELSE
|
1330 | CASE statebrsh IS
|
1331 | WHEN 0 =>
|
1332 | IF runXYZ = '1' THEN
|
1333 | dX <= conv_integer(XTabs);-- Xkoord
|
1334 | dY <= conv_integer(YTabs);
|
1335 | dZ <= conv_integer(ZTabs);
|
1336 | dLk <= conv_integer(Lk);--Leit koord
|
1337 | statebrsh <= 1;
|
1338 | ELSE --anfang der berechnung nach strimp
|
1339 | IF strimp = '1' AND startON = '0' THEN
|
1340 | XA <= XS;-- Startpunkt setzen
|
1341 | YA <= YS;
|
1342 | ZA <= ZS;
|
1343 | startON := '1';
|
1344 | END IF;
|
1345 | errX :=dLk/2;
|
1346 | errY :=dLk/2;
|
1347 | errZ :=dLk/2;
|
1348 | Lka <= 0;
|
1349 | XYZok <= '0';
|
1350 | statebrsh <= 0;
|
1351 | END IF;
|
1352 | WHEN 1 =>
|
1353 | IF count = 0 THEN -- warten für pfrq periode
|
1354 | IF Lka < Lk THEN
|
1355 | Lka <= Lka + 1;
|
1356 | ImpLK <= '0';
|
1357 | ------------------------
|
1358 | errX := errX - dX;
|
1359 | IF errX < 0 THEN
|
1360 | IF fXneg = '0' THEN
|
1361 | XA <= XA + 1;
|
1362 | ELSE
|
1363 | XA <= XA - 1;
|
1364 | END IF;
|
1365 | ImpX <= '0';
|
1366 | errX := errX + dLk;
|
1367 | END IF;
|
1368 | ----------------------
|
1369 | errY := errY - dY;
|
1370 | IF errY < 0 THEN
|
1371 | IF fYneg = '0' THEN
|
1372 | YA <= YA + 1;
|
1373 | ELSE
|
1374 | YA <= YA - 1;
|
1375 | END IF;
|
1376 | ImpY <= '0';
|
1377 | errY := errY + dLk;
|
1378 | END IF;
|
1379 | -------------------------
|
1380 | errZ := errZ - dZ;
|
1381 | IF errZ < 0 THEN
|
1382 | IF fZneg = '0' THEN
|
1383 | ZA <= ZA + 1;
|
1384 | ELSE
|
1385 | ZA <= ZA - 1;
|
1386 | END IF;
|
1387 | ImpZ <= '0';
|
1388 | errZ := errZ + dLk;
|
1389 | END IF;
|
1390 | -------------------------
|
1391 | count := conv_integer(pfrq);
|
1392 | statebrsh <= 2;
|
1393 | ELSE
|
1394 | statebrsh <= 3;--dann itp fertig
|
1395 | END IF;
|
1396 | ELSE
|
1397 | count := count - 1;
|
1398 | statebrsh <= 1;
|
1399 | END IF;
|
1400 | WHEN 2 =>
|
1401 | ImpLk <= '1';
|
1402 | ImpX <= '1';
|
1403 | ImpY <= '1';
|
1404 | ImpZ <= '1';
|
1405 | XAout <= XA;
|
1406 | YAout <= YA;
|
1407 | ZAout <= ZA;
|
1408 | IF stopp = '1' THEN --sofort anhalzen, endlage
|
1409 | statebrsh <= 5;
|
1410 | ELSE --kein stop
|
1411 | statebrsh <= 1;
|
1412 | END IF;
|
1413 | WHEN 3 =>
|
1414 | XYZok <='1';
|
1415 | statebrsh <= 0;-- fertig ohne stop
|
1416 | WHEN 5 =>
|
1417 | dLk <= 0;
|
1418 | dX <= 0;
|
1419 | dY <= 0;
|
1420 | dZ <= 0;
|
1421 | errX :=0;
|
1422 | errY :=0;
|
1423 | errZ :=0;
|
1424 | XYZok <='1';--fertig mit stop
|
1425 | statebrsh <= 0;-- fertig ohne stop
|
1426 | WHEN others => statebrsh <= 0;
|
1427 | END CASE;
|
1428 | END IF;--IF nrst/ELSE
|
1429 | END IF; -- if clk
|
1430 | END PROCESS;-- bresenham für XYZ Koordinaten
|
1431 |
|
1432 | --=====================Berechnung Invers Transformation====
|
1433 | --============RUNANGLE :Berechnung der Winkel in den Roboterachsen ==========
|
1434 | --XT,YT,ZT sind strecken koordinaten die im XYZ Satz oder Kreissatz angegeben werden
|
1435 | -- bezogen auf Fräsenendpunkt (roboter KopfF)
|
1436 | --XS,YS,ZS sind startposition Koordinaten von wo XT--ZT gestartet werden
|
1437 | -- Xa,Ya,Za sind Aktuelle Koordinaten am Fräserendpunkt (roboterkopf)
|
1438 | --L1,L2,L3 sind roboterarm längen in mm
|
1439 | -- Bezeichnung FP = Wert ist Floatingpoint Format, Bsp: ATFP Winkel AT in FP format
|
1440 | ----------------------------------------------------------------------------
|
1441 | -- Folgende Werte werden hier Berechnet :
|
1442 | -- LT :Streckenlänge in XY Ebene:LT :=sqrt((xT^2 + YT^2)
|
1443 | -- LK :streckenlänge in XYZ:Lk :=sqrt((xT^2 + YT^2 + ZT^2);
|
1444 | -- AT = arccos(XT / LT)
|
1445 | -- AZ = arctan(ZT/LT)
|
1446 | -- Roboter Achsen in Ebene W : P0,P1,P2. EbeneW dreht sich mit Winkel A0
|
1447 | -- aus Xa,Ya,Za werden FXw,FYw,FZw : positionen in roboterebene W(winkel A1,A2,A3)
|
1448 | -- Aus Xa,Ya wird A0 Achse berechnet(A0FP in FP format, in radiant):A0Fp := atanFP( Fxa/FYa);
|
1449 | -- aus Xw,Yw werden Lw und Aw, Distanz und winkel in Roboterebene W
|
1450 | -- daraus die Winkelposition A3,A4
|
1451 | ----------------------------------------------------------
|
1452 | ---------- Ebene X / Y berechnungen-------------------
|
1453 | -- LwFP := sqrt(FXw^2 + FYw^2); - länge zwischen P0-P2 in Ebene XY
|
1454 | -- Winkel der Ebene W(P0,P2) =(AW), Winkel A0 ist Winkel zwischen P0..P3
|
1455 | -- A12FP := aTan(LzFP / LwFP), A12 = Winkel gerade zwischen P0 und P2 in ebene W
|
1456 | ------------------------------------------------------------------------
|
1457 | -- ****** Ende der Berechnungen wird mit Impuls FXYZaOK signalisiert *******
|
1458 | --- siehe stateangle = 20
|
1459 | ----------------------------------------------------------------------------
|
1460 | runangle:PROCESS(clk)
|
1461 | VARIABLE ctrclk :INTEGER RANGE 0 TO 127:= 0;
|
1462 | VARIABLE startON :std_logic:= '0';
|
1463 | BEGIN
|
1464 | IF rising_edge(clk) THEN
|
1465 | IF nrst = '0' THEN
|
1466 | stateangle <= 0;
|
1467 | ctrclk := 0;
|
1468 | FXYZaOK <= '0';
|
1469 | ceXYZFP <= '0'; cetgFP<='0'; cemul9<='0'; cemul10<='0';
|
1470 | cesubW <='0'; cePI2 <='0';
|
1471 | cemAZA3 <= '0';cedAZA3 <= '0';cedivPIdiv<='0'; ceAZmul<= '0';
|
1472 | cesub1min <= '0';ceA3FP<='0';
|
1473 | ceA4FP <='0'; cetgFP <= '0';
|
1474 | ceP1 <= '0';
|
1475 | cesqL <= '0'; ceadd1 <= '0'; cesub1<= '0';
|
1476 | cediv1 <= '0'; ceacosFP <= '0'; ceA1FP <='0';
|
1477 | cecosFP <= '0'; ceZ1W1 <= '0'; cesubA1 <= '0';
|
1478 | startON := '0';
|
1479 | -- Fl1 <= (OTHERS => '0'); Fl2 <= (OTHERS => '0');Fl12 <= (OTHERS => '0');
|
1480 | -- mul12 <= (OTHERS => '0');
|
1481 | ELSE
|
1482 | CASE stateangle IS
|
1483 | WHEN 0 =>
|
1484 | --IF (ImpLk = '0' AND strimp='0') OR (strimp = '1' AND StartON = '0') THEN -- start zurst mit ce
|
1485 | IF (ImpLk = '0') THEN
|
1486 | ceXYZFP <= '1';--Start für Xa,Ya,Zz=>FP, und Pi/2-AZFP,Pi/2 +/- ATFP
|
1487 | ctrclk := clkToFP;
|
1488 | stateangle <= 1;
|
1489 | ELSE
|
1490 | FXYZaOK <= '0'; --reset
|
1491 | stateangle <= 0;-- warten auf LK Impuls
|
1492 | END IF;
|
1493 | WHEN 1 => -- ausführen Xa,Ya,Zz=>FP und Pi/2-AZFP,Pi/2 +/- ATFP
|
1494 | IF ctrclk > 0 THEN
|
1495 | ctrclk := ctrclk -1;
|
1496 | stateangle <= 1;
|
1497 | ELSE
|
1498 | StartON := '1';
|
1499 | ceXYZFP <= '0';--reset CE
|
1500 | stateangle <= 2;
|
1501 | END IF;
|
1502 | WHEN 2 => -- zwischen state notwendig****
|
1503 | IF grPI2 = '1' THEN -- wenn AT > PI/2 dann sub PI/2 sonst ADD
|
1504 | PIAT <= suPIAT;
|
1505 | ELSE PIAT <= adPIAT;
|
1506 | END IF;
|
1507 | stateangle <= 3;
|
1508 | WHEN 3 => -- zwischen state notwendig ****
|
1509 | cePI2 <= '1';
|
1510 | ctrclk := clkTosub;
|
1511 | stateangle <= 4;
|
1512 | WHEN 4 => --ausführen PIAZ :=PI/2 - PIAT
|
1513 | IF ctrclk > 0 THEN
|
1514 | ctrclk := ctrclk -1;
|
1515 | stateangle <= 4;
|
1516 | ELSE
|
1517 | cePI2 <= '0';-- reset
|
1518 | ctrclk := 35;--clk Atan für durchlauf ******
|
1519 | ceTgFP <= '1'; --arcTang und cos starten
|
1520 | stateangle <= 5;
|
1521 | END IF;
|
1522 | WHEN 5 => --Ausführen A0FP:=atan(Ya/Xa),und Cos(4 bml), A=FP fertig*****
|
1523 | IF ctrclk > 0 THEN
|
1524 | ctrclk := ctrclk -1;
|
1525 | stateangle <= 5;
|
1526 | ELSE --tanYX , ATFP,AZFP fertig
|
1527 | cemul9 <= '1';-- start sinAZ* sinAT, sinAZ* cosAT
|
1528 | ctrclk := clkTomul;
|
1529 | ceTgFP <= '0'; --Reset ArcTang start Impuls
|
1530 | stateangle <= 9;
|
1531 | END IF;
|
1532 | WHEN 9 => -- ausführen; sinAZ* sinAT, sinAZ* cosAT
|
1533 | IF ctrclk > 0 THEN
|
1534 | ctrclk := ctrclk -1;
|
1535 | stateangle <= 9;
|
1536 | ELSE
|
1537 | cemul9 <= '0';--reset
|
1538 | ctrclk := clkTomul;
|
1539 | cemul10 <= '1'; --start sAZAT* FL3, cAZAT* FL3
|
1540 | stateangle <= 10;
|
1541 | END IF;
|
1542 | WHEN 10 => --ausführen sAZAT* FL3, cAZAT* FL3
|
1543 | IF ctrclk > 0 THEN
|
1544 | ctrclk := ctrclk -1;
|
1545 | stateangle <= 10;
|
1546 | ELSE
|
1547 | cemul10 <= '0';-- reset
|
1548 | ctrclk := clkTosub;
|
1549 | ceSubw <= '1'; -- Start für sub/add FXa -/+ sAZAT3 usw
|
1550 | stateangle <= 11;
|
1551 | END IF;
|
1552 | WHEN 11 => -- ausführen sub/add FXa -/+ sAZAT3.. = FYw,FZw fertig
|
1553 | IF ctrclk > 0 THEN
|
1554 | ctrclk := ctrclk -1;
|
1555 | stateangle <= 11;
|
1556 | ELSE
|
1557 | ceSubw <= '0';-- reset
|
1558 | stateangle <= 12;
|
1559 | END IF;
|
1560 | WHEN 12 =>-- für test
|
1561 | stateangle <= 13;
|
1562 | WHEN 13 => -- zwischen state notwendig ***
|
1563 | IF grPI2 = '1' THEN
|
1564 | FXw <= aFXw;
|
1565 | ELSE FXw <= sFXw;
|
1566 | END IF;
|
1567 | ctrclk := clkTosq;
|
1568 | cemul12 <= '1'; --Start für sqXw:=sq(FXw),sqYw:=sq(FYw) und ATPI:= ATFP-PI/2
|
1569 | stateangle <= 15; ---FXW fertig Berechnet
|
1570 | ----------------state reserve----------------------------
|
1571 | WHEN 15 => --- Ausführen Fxw^2,FYw^2
|
1572 | IF ctrclk > 0 THEN
|
1573 | ctrclk := ctrclk -1;
|
1574 | stateangle <= 15;
|
1575 | ELSE
|
1576 | cemul12 <= '0';-- reset
|
1577 | stateangle <= 16;
|
1578 | END IF;
|
1579 | WHEN 16 =>
|
1580 | ceXYZw <= '1';---für test ***** XYZ W ***********************
|
1581 | stateangle <= 17;
|
1582 | -----Blatt6:csqXw,csqYw, Blatt5: csubAwAt-- gestartet mit cemul12 ----------------
|
1583 | WHEN 17 => -- ausführen sqXw:=sq(FXw),sqYw:=sq(FYw)
|
1584 | ctrclk := 23;-- 22 clk für atan
|
1585 | ceXYZw <= '0'; -- reset
|
1586 | ceaddXYw <= '1'; --start fürAwFP:=atan(FYw/FXw) und sqXYW:=sqXw+SqYw,subPIDIV0subAtAW-pIDIV0
|
1587 | stateangle <= 18;
|
1588 | -----Blatt6: catgAw (22clk),caddXYw, Blatt5:csubPidiv--- gestartet mit ceaddXYw---------
|
1589 | WHEN 18 =>-- ausführen AwFP:=atan(FYw/FXw) und sqXYW:=sqXw+ SqYw,subPidiv=subAtAw-PIdiv2
|
1590 | IF ctrclk > 0 THEN
|
1591 | ctrclk := ctrclk -1;
|
1592 | stateangle <= 18;
|
1593 | ELSE
|
1594 | cesqrtLw <= '1'; --start LwFP:=sqrt(sqXYw) und subPIdiv= subATAW-pidIV2
|
1595 | ctrclk := clkTosq;
|
1596 | ceaddXYw <= '0'; --reset
|
1597 | stateangle <= 19;
|
1598 | END IF;
|
1599 | ------Blatt6:csqrtLW, Blatt5 :cdivPIdiv2-- gestartet mit cesqrtLW ---------
|
1600 | WHEN 19 => --ausführen LwFP:= sqrt(sqXYw),LWFP fertig, subPidiv=subAtAw-PIdiv2
|
1601 | IF ctrclk > 0 THEN
|
1602 | ctrclk := ctrclk - 1;
|
1603 | stateangle <= 19;
|
1604 | ELSE
|
1605 | cesqrtLw <= '0';-- reset
|
1606 | cemAzA3 <= '1'; --start AtFp-AwFp
|
1607 | absDivPIdiv <= DivPIdiv;--absDivPiDiv vorläaufig setzen
|
1608 | ctrclk := clkTosub;
|
1609 | stateangle <= 22;
|
1610 | END IF;
|
1611 | ----reserve state ----------------
|
1612 | ----- Blatt5:csqZ2,csqW2,cmuAZFP ---- gestartet mit cemAzA3 ----------------
|
1613 | WHEN 22 => --- ausführen sq(FZw),sq(LWFP), mul(AZFP,DivPIdiv)------
|
1614 | IF ctrclk > 0 THEN
|
1615 | ctrclk := ctrclk - 1;
|
1616 | stateangle <= 22;
|
1617 | ELSE
|
1618 | cemAZA3 <= '0'; --reset
|
1619 | cedAZA3 <= '1';--start subAtAw-PIdiv2
|
1620 | ctrclk := clkTosub;
|
1621 | stateangle <= 23;
|
1622 | END IF;
|
1623 | ---- Blatt 5:caddWZ, csub1min--- gestartet mit cedAZA3 ---------------
|
1624 | WHEN 23 => --- ausführen sqaddWZ=sqZ2 + sqW2,subPIdiv =
|
1625 | IF ctrclk > 0 THEN
|
1626 | ctrclk := ctrclk - 1;
|
1627 | stateangle <= 23;
|
1628 | ELSE
|
1629 | cedAZA3 <= '0';-- reset
|
1630 | cedivPIdiv <= '1';
|
1631 | ceA4FP <= '1'; -- start sqrt(sqaddWZ), atan A12,
|
1632 | ctrclk := clkToAtan;--clk Atan
|
1633 | stateangle <= 24;
|
1634 | END IF;
|
1635 | --- Blatt5:catanA12,sqrtWZ,cmulAZFP -- gestartet mit ceA4FP -------
|
1636 | WHEN 24 => --ausführen atan(FZW,LWFP),divFp,vsqrt(sqaddWZ), mul(sub1min,AZFP)
|
1637 | IF ctrclk > 0 THEN
|
1638 | ctrclk := ctrclk - 1;
|
1639 | stateangle <= 24;
|
1640 | ELSE
|
1641 | absdivPIdiv <= divPIdiv;-- vorläufig
|
1642 | ceAZmul <= '1';
|
1643 | ceP1 <= '1'; -- START intToFP für L1,L2 => FL1,FL2
|
1644 | ceA4FP <= '0'; --reset
|
1645 | cedivPIdiv <= '0';
|
1646 | stateangle <= 25;--
|
1647 | END IF;
|
1648 | WHEN 25 =>
|
1649 | IF absDivPidiv(31) = '1' THEN
|
1650 | absDivPidiv(31) <= '0';-- Abs von DivPiDiv
|
1651 | END IF;
|
1652 | ctrclk := clkTosub;
|
1653 | cesub1min <= '1';
|
1654 | stateangle <= 26;
|
1655 | WHEN 26 =>-- sub1min := 1 - absdivPIdiv
|
1656 | IF ctrclk > 0 THEN
|
1657 | ctrclk := ctrclk - 1;
|
1658 | stateangle <= 26;
|
1659 | ELSE
|
1660 | ceP1 <= '0';-- FL1,FL2 fertig
|
1661 | cesub1min <= '0';
|
1662 | ceAZmul <= '0';-- a4FP fertig
|
1663 | ceA3FP <= '1';-- startsub1min* AZFP => A3FP
|
1664 | cesqL <= '1';-- start für FL11^2,Fl2^2,FL12^2
|
1665 | ctrclk := clkTomul;
|
1666 | stateangle <= 27;
|
1667 | END IF;
|
1668 | -- Ab hier Funktionen aus calcP1---------------------------------------
|
1669 | WHEN 27 => -- A3FP :=sub1min * AZFP, a3FP fertig,FL11^2,Fl2^2,FL12^2
|
1670 | IF ctrclk > 0 THEN
|
1671 | ctrclk := ctrclk - 1;
|
1672 | stateangle <= 27;
|
1673 | ELSE
|
1674 | IF strImp = '0' THEN
|
1675 | StartON := '0';
|
1676 | END IF;
|
1677 | cesqL <= '0';--FL11^2,Fl2^2,FL12^2=> SqL1,sqL12,sqL2 fertig
|
1678 | ceA3FP <= '0';--a3FP fertig
|
1679 | ceadd1<= '1'; -- startsqL1+sqL12,Fl12*FL1
|
1680 | ctrclk := clkTomul;
|
1681 | stateangle <= 28;
|
1682 | END IF;
|
1683 | WHEN 28 => -- ausführen L1+sqL12,Fl12*FL1
|
1684 | IF ctrclk > 0 THEN
|
1685 | ctrclk := ctrclk - 1;
|
1686 | stateangle <= 28;
|
1687 | ELSE
|
1688 | ceadd1<= '0';--L1+sqL12,Fl12*FL1 fertig
|
1689 | cesub1 <= '1'; -- start für: sqadd1-sqL2, mul12 * 2
|
1690 | ctrclk := clkTomul;
|
1691 | stateangle <= 29;
|
1692 | END IF;
|
1693 | WHEN 29 => -- ausführen: sqadd1-sqL2, mul12 * 2
|
1694 | IF ctrclk > 0 THEN
|
1695 | ctrclk := ctrclk - 1;
|
1696 | stateangle <= 29;
|
1697 | ELSE
|
1698 | cesub1 <= '0';--sqadd1-sqL2, mul12 * 2 fertig
|
1699 | cediv1 <= '1'; -- start sqsub1/ mulres1 => ax
|
1700 | ctrclk := clkToDiv;
|
1701 | stateangle <= 30;
|
1702 | END IF;
|
1703 | WHEN 30 =>
|
1704 | IF ctrclk > 0 THEN
|
1705 | ctrclk := ctrclk - 1;
|
1706 | stateangle <= 30;
|
1707 | ELSE
|
1708 | cediv1 <= '0';--sqsub1/ mulres1 => ax fertig
|
1709 | ceacosFP <= '1'; -- start für atang( Ax)
|
1710 | ctrclk := clkTOacos;
|
1711 | stateangle <= 31;
|
1712 | END IF;
|
1713 | WHEN 31 =>
|
1714 | IF ctrclk > 0 THEN
|
1715 | ctrclk := ctrclk - 1;
|
1716 | stateangle <= 31;
|
1717 | ELSE
|
1718 | ceacosFP <= '0';--atang( Ax) fertig
|
1719 | ceA1FP <= '1'; -- start für acosAx + A12FP
|
1720 | ctrclk := clkTOadd;
|
1721 | stateangle <= 32;
|
1722 | END IF;
|
1723 | WHEN 32 =>
|
1724 | IF ctrclk > 0 THEN
|
1725 | ctrclk := ctrclk - 1;
|
1726 | stateangle <= 32;
|
1727 | ELSE
|
1728 | ceA1FP <= '0';--acosAx + A12FP => A+FP fertig *************
|
1729 | cesubA1 <= '1'; --start für PI/2 - A1FP
|
1730 | ctrclk := clkTOsub;
|
1731 | stateangle <= 33;
|
1732 | END IF;
|
1733 | WHEN 33 =>
|
1734 | IF ctrclk > 0 THEN
|
1735 | ctrclk := ctrclk - 1;
|
1736 | stateangle <= 33;
|
1737 | ELSE
|
1738 | cesubA1 <= '0';--PI/2 - A1FP => A1SFP fertig
|
1739 | cecosFP <= '1'; --Start für cos(a1FP) & cosFP(a1SFP)
|
1740 | ctrclk := clkTOcos;
|
1741 | stateangle <= 34;
|
1742 | END IF;
|
1743 | WHEN 34 =>
|
1744 | IF ctrclk > 0 THEN
|
1745 | ctrclk := ctrclk - 1;
|
1746 | stateangle <= 34;
|
1747 | ELSE
|
1748 | cecosFP <= '0';--cos(a1FP) & cosFP(a1SFP) =>cosA1FP,sinA1FP fertig
|
1749 | ceZ1W1 <= '1'; --start für sinA1FP*FL1, cosA1FP * FL1
|
1750 | ctrclk := clkTOmul;
|
1751 | stateangle <= 35;
|
1752 | END IF;
|
1753 | WHEN 35 =>
|
1754 | IF ctrclk > 0 THEN
|
1755 | ctrclk := ctrclk - 1;
|
1756 | stateangle <= 35;
|
1757 | ELSE
|
1758 | ceZ1W1 <= '0';--sinA1FP*FL1=> FZ1,cosA1FP * FL1=>FW1 fertig ******
|
1759 | cezw12 <= '1'; -- start für FZw-Fz1 & LwFP-FW1
|
1760 | ctrclk := clkTOsub;
|
1761 | stateangle <= 36;
|
1762 | END IF;
|
1763 | WHEN 36 =>
|
1764 | IF ctrclk > 0 THEN
|
1765 | ctrclk := ctrclk - 1;
|
1766 | stateangle <= 36;
|
1767 | ELSE
|
1768 | cezw12 <= '0';--FZw-Fz1=Z2Z1 & LwFP-FW1=W"W1 fertig
|
1769 | ceatanZW <= '1';-- start für atan
|
1770 | ctrclk := clkTOatan;
|
1771 | stateangle <= 37;
|
1772 | END IF;
|
1773 | WHEN 37 =>
|
1774 | IF ctrclk > 0 THEN
|
1775 | ctrclk := ctrclk - 1;
|
1776 | stateangle <= 37;
|
1777 | ELSE
|
1778 | ceatanZW <= '0';-- AtanZW fertig
|
1779 | cesubA2 <= '1'; -- start für atanZw- a1FP
|
1780 | ctrclk := clkTOsub;
|
1781 | stateangle <= 38;
|
1782 | END IF;
|
1783 | WHEN 38 =>
|
1784 | IF ctrclk > 0 THEN
|
1785 | ctrclk := ctrclk - 1;
|
1786 | stateangle <= 38;
|
1787 | ELSE
|
1788 | cesubA2 <= '0';-- A2FP fertig ********************
|
1789 | FXYZaOK <= '1';--RUNANGLE bereit
|
1790 | stateangle <= 0;-- alle Achsen fertig
|
1791 | --Berechnung fertg,wartn auf nächste Start
|
1792 | END IF;
|
1793 | WHEN OTHERS =>
|
1794 | stateangle <= 0;
|
1795 | END CASE;
|
1796 | END IF;-- nrst if/else
|
1797 | END IF; --clk
|
1798 | END PROCESS;-- end runangle
|
1799 |
|
1800 | --=======Ende der InversTransformation(IT) Berechnungen, Alle Achsen Winkel in FP Format=====
|
1801 | -- *******Ende der ITP wird signalisiert mit Impuls fXYZaOK*************************************
|
1802 | --=========================================================================================
|
1803 | --==========================================================================================
|
1804 | -- ITPImpulsGen:
|
1805 | -- Aktuelle Winkel der Achsen A0FP..A5FP(rad) umrechnen in Anzahl
|
1806 | -- soll-Inkremente:output AXconv:AchsInkr(31 bit),siehe modul AXconv, alle achsen Paralell
|
1807 | -- gespeichert in --AXinc.
|
1808 | ---------------------------------------------------------------------------
|
1809 | --TYPE T_Axr IS ARRAY(5 DOWNTO 0) OF std_logic_vector(15 DOWNTO 0);
|
1810 | --SIGNAL AXGrd :T_Axr; aktuelle Winkel der Achsen A0..A5 in Grad.x ,
|
1811 | -- *********zum vergleich mit Sketch Simulation **************
|
1812 | ----------------------------------------------------------------------------
|
1813 | ----SIGNAL AXinc :T_AXInc;--IS ARRAY(5 DOWNTO 0) OF SLV(31 DOWNTO 0);
|
1814 | -- Aktuelle Winkel der Achsen A0FP..A5FP(rad) umrechnen in Anzahl
|
1815 | -- soll-Inkremente:output AXconv:AchsInkr(31 bit),siehe modul AXconv, alle achsen Paralell
|
1816 | -- gespeichert in --AXinc :T_AXinc;
|
1817 | ------------------------------------------
|
1818 | --SIGNAL AXalt :T_AXInc;--IS ARRAY(5 DOWNTO 0) OF SLV(31 DOWNTO 0);
|
1819 | --speichert vorherige wert von AXinc, wird benötig um Differenz zwischen
|
1820 | -- den einzelne Sollerte aus AXinc zum
|
1821 | --SIGNAL vAXdif :T_AXInc;--IS ARRAY(5 DOWNTO 0) OF SLV(31 DOWNTO 0);
|
1822 | --------------------------------------------------------------------------------
|
1823 | --SIGNAL AXdif :T_AXdif;--IS ARRAY(5 DOWNTO 0) OF SLV(15 DOWNTO 0);
|
1824 | -- AXdif entspricht vAxdif aber beschränkt auf 16 bit, wird benötigt in
|
1825 | -- procedur ImpSwitch
|
1826 |
|
1827 | --============================================================================
|
1828 | ITPImpGen: PROCESS(clk)
|
1829 | VARIABLE cntrclk :Integer range 0 to 15:= 0;
|
1830 | VARIABLE strt :STD_LOGIC := '1';
|
1831 | BEGIN
|
1832 | IF rising_edge(clk) THEN
|
1833 | IF nrst = '0' THEN
|
1834 | statITPimp <= 0;
|
1835 | cntrclk := 0;
|
1836 | XYZcalcok <= '0';
|
1837 | FOR i IN 0 TO 5 LOOP
|
1838 | AXalt(i) <= (OTHERS => '0');
|
1839 | AXdif(i) <= (OTHERS => '0');--
|
1840 | vAXdif(i) <= (OTHERS => '0');
|
1841 | END LOOP;
|
1842 | strt := '0';
|
1843 | ELSE
|
1844 | CASE statITPimp IS
|
1845 | WHEN 0 => -- warten auf start
|
1846 | IF fXYZaOK = '1' THEN ---wenn Berechnung fertig dann Pulse berchnen
|
1847 | ceAxx <= '1';--- Start Convert für Alle Achsen A0.. A4
|
1848 | cntrclk := 6;---anz clk für convert
|
1849 | statITPimp <= 1;
|
1850 | ELSE
|
1851 | IF sitprun = '0' AND strt = '0' THEN
|
1852 | strt := '1';--vorbereiten flag für AXalt einlesen
|
1853 | END IF;
|
1854 | XYZcalcok <= '0';
|
1855 | statITPimp <= 0;
|
1856 | END IF;
|
1857 | WHEN 1 => --ausführung Convert (5 clk)
|
1858 | ceAxx <= '0';
|
1859 | IF cntrclk = 0 THEN
|
1860 | statITPimp <= 2;
|
1861 | ELSE
|
1862 | cntrclk := cntrclk -1;
|
1863 | statITPimp <= 1;-- warten bis Convert fertig
|
1864 | END IF;
|
1865 | WHEN 2 =>--
|
1866 | IF strt= '1' THEN --strt dient der start speicherung von 1. Wert von Axinc in Axalt
|
1867 | FOR i IN 0 TO 5 LOOP
|
1868 | AXalt(i)<= AXinc(i);
|
1869 | END LOOP;
|
1870 | END IF;
|
1871 | statITPimp <= 3;-- warten auf nächste
|
1872 | WHEN 3 =>
|
1873 | strt := '0';-- reset strt, erste wert von AXinc ist gespeichert in Axalt
|
1874 | -----------------------------------------------------
|
1875 | FOR i IN 0 TO 5 LOOP
|
1876 | vAXdif(i) <= AXinc(i) - AXalt(i);-- Differenz errechnen inn 32 bit
|
1877 | AXdif(i)<= vAXdif(i)(15 DOWNTO 0);--beschränken auf 16 bit, wird im ImpSwitch
|
1878 | END LOOP;
|
1879 | ------------------------
|
1880 | statITPimp <= 4;
|
1881 | WHEN 4 =>
|
1882 | FOR i IN 0 TO 5 LOOP -- speichern der vorherige AXinc wert
|
1883 | AXalt(i) <= AXinc(i);
|
1884 | END LOOP;
|
1885 | XYZcalcok <= '1';-- umrechnung fertig
|
1886 | statITPimp <= 0;-- warten auf nächste Lk impuls
|
1887 | WHEN OTHERS =>
|
1888 | statITPimp <= 0;
|
1889 | END CASE;
|
1890 | END IF; -- if nrst/else
|
1891 | END IF; -- clk
|
1892 | END PROCESS;--end ITPImpGEn
|
1893 | --=======================================================
|
1894 | --=========================
|
1895 | --TestOutput: PROCESS(sqadd1,mul12,mulres1,sqsub1,ax,acosAX,A12FP,cosA1FP,sinA1FP,
|
1896 | -- Fw1,Fz1,subATAW,subPIdiv,cesqL,FL1,FL12)
|
1897 | testOutput:PROCESS(clk)
|
1898 | BEGIN
|
1899 | IF rising_edge(clk) THEN
|
1900 | IF nrst = '0' THEN
|
1901 | testdata <= (OTHERS => '0');
|
1902 | ELSE
|
1903 | -- 16 bit daten für testoutput
|
1904 | testdata(0) <= sqadd1(0);-- A0
|
1905 | testdata(1) <= mul12(0);--
|
1906 | testdata(2) <= mulres1(0);--
|
1907 | testdata(3) <= sqsub1(0);--
|
1908 | testdata(4) <= ax(0);--
|
1909 | testdata(5) <= acosAX(0);--
|
1910 | testdata(6) <= A12FP(0);--
|
1911 | testdata(7) <= cosA1FP(0);--
|
1912 | testdata(8) <= sinA1FP(0);--
|
1913 | testdata(9) <= Fw1(0);--
|
1914 | testdata(10) <= FZ1(0);--
|
1915 | testdata(11) <= subATAW(0);--
|
1916 | testdata(12) <= subPIdiv(0);--
|
1917 | testdata(13) <= cesqL;--
|
1918 | testdata(14) <= FL1(0);--
|
1919 | testdata(15) <= FL12(0);--
|
1920 | END IF;
|
1921 | END IF;
|
1922 | END PROCESS;
|
1923 | --==========================================================================
|
1924 | --========================================================
|
1925 |
|
1926 | --==============================================================
|
1927 | ---**************************************************************
|
1928 | --------------IntToFP für ITP FrqPERIOD, Start mit frqpos------
|
1929 | ---cfrqFP: IntToFP port map(a=>frqPER,clk=>clk,ce=>cefrqFp,result=>frqFP);
|
1930 | --====================================================================
|
1931 | -------------------- initITP ------------------------------------------
|
1932 | ------XYZT => FPx..FPz, FPLk-----Initialisierung beim neuen Satz--------
|
1933 | cXTFP: IntToFP port map(a=>XT,clk=>clk,ce=>ceXYZF,result=>FXt);
|
1934 | cYTFP: IntToFP port map(a=>YT,clk=>clk,ce=>ceXYZF,result=>FYt);
|
1935 | cZTFP: IntToFP port map(a=>ZT,clk=>clk,ce=>ceXYZF,result=>FZt);
|
1936 | -------------sqFxt := FXt^2 state 3-------------------------------------------
|
1937 | cmulsqX: mulFP port map(a=>FXt,b=>FXt,clk=>clk,ce=>cesqXYZ,result=>sqFxt);
|
1938 | cmulsqY: mulFP port map(a=>FYt,b=>FYt,clk=>clk,ce=>cesqXYZ,result=>sqFyt);
|
1939 | cmulsqZ: mulFP port map(a=>FZt,b=>FZt,clk=>clk,ce=>cesqXYZ,result=>sqFzt);
|
1940 | --------------addXY := sqFxt + sqFYt state 4------------------------------------------
|
1941 | caddXY: addFP port map(a=>sqFXt,b=>sqFYt,clk=>clk,ce=>ceaddXY,result=>addXY);
|
1942 | --------------addXYZ := addXY + sqFZt ------------------------------------------
|
1943 | caddXYZ: addFP port map(a=>addXY,b=>sqFZt,clk=>clk,ce=>ceaddXYZ,result=>addXYZ);
|
1944 | ----------------FLk := sqrt(addXYZ),FLT:=sqrt(addXY)----state6--------------------
|
1945 | csqrtFLT: sqrtFP port map(a=>addXY,clk=>clk,ce=>cesqrtFLk,result=>FLT);
|
1946 | csqrtFLk: sqrtFP port map(a=>addXYZ,clk=>clk,ce=>cesqrtFLk,result=>FLk);
|
1947 | -------------------------------------------------------------------------------
|
1948 | cFPToInt: FPtoInt32 port map(a=>FLk,clk=>clk,ce=>ceFlkInt,result=>Lk);-- Flk in Integer32 slv
|
1949 | ------------------------------------------------------------------------------
|
1950 | cXTLTdiv: divFP port map(a=>FXT,b=>FLT,clk=>clk,ce=>ceFlkInt,result=>XTLTdiv);
|
1951 | ------------------AT FP Berechnen-State 10----------------------------
|
1952 | cacosAT: ArcCosFP port map(nrst=>nrst,clk=>clk,ceacos=>cetgAT,aInp=>XTLTdiv,acos=>ATFP);--ATFP :=acos(XT/LT)
|
1953 | ----------------- AZ FP Berechnen ---------------------------------------
|
1954 | ccmpAT: cmpgr port map(a=>ATFP,b=>PIdiv2,clk=>clk,ce=>cecmpAT,result=>ATgrPI2);-- wird in RUNANGLE Gebraucht
|
1955 | catgAZT: atanFP port map(nrst=>nrst,clk=>clk,ceatan=>cetgAT,Xinp=>FLT,Yinp=>FZT,atanFP=>AZFP);
|
1956 | --------------------- ende initITPlin ---------------------------------------------
|
1957 |
|
1958 | --*******************************************************************************
|
1959 | --====================================================================================
|
1960 | ---------------RUNANGLE -----------------------------------
|
1961 | -----------Xa,Ya,,Za => FP----------------------------------state 0-----------
|
1962 | cXaFP : IntToFP port map(a=>Xa,clk=>clk,ce=>cexyzFP,result=>FXa);
|
1963 | cYaFP : IntToFP port map(a=>Ya,clk=>clk,ce=>cexyzFP,result=>FYa);
|
1964 | cZaFP : IntToFP port map(a=>Za,clk=>clk,ce=>cexyzFP,result=>FZa);
|
1965 | cL3FP: Int16ToFP port map(a=>L3,clk=>clk,ce=>cexyzFP,result=>FL3);
|
1966 | ------------PIAZ:=Pi/2-AZFP, PIAT:=Pi/2-ATFP---------------state 0 --------
|
1967 | csubPIAZ: subFP port map(a=>PIdiv2,b=>AZFP,clk=>clk,ce=>ceXYZFP,result=>PIAZ);
|
1968 | csubPIAT: subFP port map(a=>ATFP,b=>PIdiv2,clk=>clk,ce=>ceXYZFP,result=>suPIAT);
|
1969 | caddPIAT: addFP port map(a=>PIdiv2,b=>ATFP,clk=>clk,ce=>ceXYZFP,result=>adPIAT);
|
1970 | ----------If ATFP > pI/2 then PIAT := suPIAT else PIAT:= adPiAT --- Starte 18, 19
|
1971 | ---- siehe InitITP xyz state 11-----------------------------------
|
1972 | ---------sub: Pi/2 -PIAT ------------------------------------ State 2-------
|
1973 | csubSAT: subFP port map(a=>PIdiv2,b=>PIAT,clk=>clk,ce=>cePI2,result=>sPIAT);
|
1974 | ------A0FP:= atan(FYa/FXa) and cosFP: PIAZ,AZFP,PIAT,SPIAT -----state 3-----
|
1975 | ctanYX: atanFP port map(nrst=>nrst,clk=>clk,ceatan=>cetgFP,Xinp=>FXa,Yinp=>FYa,atanFP=>A0FP);
|
1976 | csinAZ: cosFP port map(nrst=>nrst,clk=>clk,cecos=>cetgFP,ainp=>PIAZ,cos=>sinAZ);
|
1977 | ccosAZ: cosFP port map(nrst=>nrst,clk=>clk,cecos=>cetgFP,ainp=>AZFP,cos=>cosAZ);
|
1978 | ccosAT: cosFP port map(nrst=>nrst,clk=>clk,cecos=>cetgFP,ainp=>PIAT,cos=>cosAT);
|
1979 | csinAT: cosFP port map(nrst=>nrst,clk=>clk,cecos=>cetgFP,ainp=>sPIAT,cos=>sinAT);
|
1980 | --------------mul: sinAZ * sinAT, sinAZ * cosAT----------------- state9 -------
|
1981 | cmul90: mulFP port map(a=>sinAZ,b=>sinAT,clk=>clk,ce=>cemul9,result=>sAZAT);
|
1982 | cmul91: mulFP port map(a=>sinAZ,b=>cosAT,clk=>clk,ce=>cemul9,result=>cAZAT);
|
1983 | --------------mul: sAZAT * L3, cAZAT * L3 ----------------------state10 ------
|
1984 | csAZAT: mulFP port map(a=>sAZAT,b=>FL3,clk=>clk,ce=>cemul10,result=>sAZAT3);
|
1985 | ccAZAT: mulFP port map(a=>cAZAT,b=>FL3,clk=>clk,ce=>cemul10,result=>cAZAT3);
|
1986 | ccAZAZ: mulFP port map(a=>cosAZ,b=>FL3,clk=>clk,ce=>cemul10,result=>cAZAZ3);
|
1987 | ------------sub: FXa-sAZAT3,FYa - cAZAT3, FZa - cosAZ ----State 11 -----------
|
1988 | caddFXw: addFP port map(a=>FXa,b=>sAZAT3,clk=>clk,ce=>cesubW,result=>aFXw);
|
1989 | csubFXw: subFP port map(a=>FXa,b=>sAZAT3,clk=>clk,ce=>cesubW,result=>sFXw);
|
1990 | ------
|
1991 | csubFYw: subFP port map(a=>FYa,b=>cAZAT3,clk=>clk,ce=>cesubW,result=>FYw);
|
1992 | caddFZw: addFP port map(a=>FZa,b=>cAZAZ3,clk=>clk,ce=>cesubW,result=>FZw);
|
1993 |
|
1994 | ------------sq : FXw, FYw ,sub ATFP-AWFP=subATAW---------------State 12 --------
|
1995 | csqXw: mulFP port map(a=>FXw,b=>FXw,clk=>clk,ce=>cemul12,result=>sqXw);
|
1996 | csqYw: mulFP port map(a=>FYw,b=>FYw,clk=>clk,ce=>cemul12,result=>sqYw);
|
1997 |
|
1998 | ------------ ----------------------------state 13 -----------
|
1999 | caddXYw: addFP port map(a=>sqXw,b=>sqYw,clk=>clk,ce=>ceaddXYw,result=>sqXYw);
|
2000 | catgAw: atanFP port map(nrst=>nrst,clk=>clk,ceatan=>ceaddXYw,Xinp=>FXw,Yinp=>FYw,atanFP=>AwFP);
|
2001 | ----------------------------------------State 14-------------------------
|
2002 | csqrtLw: sqrtFP port map(a=>sqXYw,clk=>clk,ce=>cesqrtLw,result=>LwFP);
|
2003 |
|
2004 | -----------------------------------------State15-------------------
|
2005 | csqZ2: mulFP port map(a=>FZw,b=>FZw,clk=>clk,ce=>cemAZA3,result=>sqZ2);
|
2006 | csqW2: mulFP port map(a=>LwFP,b=>LwFP,clk=>clk,ce=>cemAZA3,result=>sqW2);
|
2007 | csubAWAT: subFP port map(a=>ATFP,b=>AWFP,clk=>clk,ce=>cemAZA3,result=>subATAW);
|
2008 |
|
2009 | ---------------------------------------- State 16 ----------------
|
2010 | caddWZ: addFP port map(a=>sqZ2,b=>sqW2,clk=>clk,ce=>cedAZA3,result=>sqaddWZ);
|
2011 | csubPIdiv: subFP port map(a=>subATAW,b=>PIdiv2,clk=>clk,ce=>cedAZA3,result=>subPIdiv);--alfa
|
2012 | ----------------------------------------- State 17----------------------
|
2013 | catanA12: atanFP port map(nrst=>nrst,clk=>clk,ceatan=>ceA4FP,Xinp=>LwFP,Yinp=>FZw,atanFP=>A12FP);
|
2014 | csqrtWZ: sqrtFP port map(a=>sqaddWZ,clk=>clk,ce=>ceA4FP,result=>FL12);
|
2015 |
|
2016 | cdivPIdiv2: divFP port map(a=>subPIdiv,b=>PIdiv2,clk=>clk,ce=>cedivPIdiv,result=>divPIdiv);
|
2017 |
|
2018 | ----------------------------- state 18-----------------------------------------
|
2019 | cmulAZFP: mulFP port map(a=>AZFP,b=>divPIdiv,clk=>clk,ce=>ceAZmul,result=>A4FP);
|
2020 |
|
2021 | ----------------------------- state 19-----------------------------------------
|
2022 | csub1min: subFP port map(a=>C1,b=>absdivPIdiv,clk=>clk,ce=>cesub1min,result=>sub1min);
|
2023 | ----------------------------- state 20-----------------------------------------
|
2024 | cmulAZFPs: mulFP port map(a=>sub1min,b=>AZFP,clk=>clk,ce=>ceA3FP,result=>A3FP);
|
2025 | ------------------ende run angle ----------------------------------------------------------
|
2026 | --==================TEST ======================================================================
|
2027 | ------------ FXw,FYw,FZw => Xw,Yw,Zw integer ------------state 18----** für test********
|
2028 | cFPwXtoIntw: FPtoInt32 port map(a=>FXw,clk=>clk,ce=>ceXYZw,result=>Xw);-- FXw in Integer32 Xw slv
|
2029 | cFPwYToIntw: FPtoInt32 port map(a=>FYw,clk=>clk,ce=>ceXYZw,result=>Yw);-- FXw in Integer32 Xw slv
|
2030 | cFPwZToIntw: FPtoInt32 port map(a=>FZw,clk=>clk,ce=>ceXYZw,result=>Zw);-- FXw in Integer32 Xw slv
|
2031 | --======================================================================
|
2032 | cL1FP: Int16ToFP port map(a=>L1,clk=>clk,ce=>ceP1,result=>FL1); --L1:16 bit
|
2033 | cL2FP: int16ToFP port map(a=>L2,clk=>clk,ce=>ceP1,result=>FL2); -- L2 16 biot
|
2034 | -------- FL 12 wurde bei RUNANGLE bereits berechnet -----------------------
|
2035 | ------------------------------------------------------------------------
|
2036 | csqL1: mulFP port map(a=>FL1,b=>FL1,clk=>clk,ce=>cesqL,result=>sqL1);-- quadrat FL1
|
2037 | csqL2: mulFP port map(a=>FL2,b=>FL2,clk=>clk,ce=>cesqL,result=>sqL2);-- Quadrat FL2
|
2038 | csqL12: mulFP port map(a=>FL12,b=>FL12,clk=>clk,ce=>cesqL,result=>sqL12);-- Quadrat Fl12
|
2039 | cmul12: mulFP port map(a=>FL1,b=>FL12,clk=>clk,ce=>ceadd1,result=>mul12);-- FL1 * FL12 => mul12
|
2040 | ---------------------
|
2041 | cadd12: addFP port map(a=>sqL1,b=>sqL12,clk=>clk,ce=>ceadd1,result=>sqadd1);
|
2042 | csub12: subFP port map(a=>sqadd1,b=>sqL2,clk=>clk,ce=>cesub1,result=>sqsub1);
|
2043 | ---------------------------
|
2044 | cmulres1: mulFP port map(a=>mul12,b=>C2,clk=>clk,ce=>cesub1,result=>mulres1);-- mul12 * 2 =>mulres1
|
2045 | cdiv: divFP port map(a=>sqsub1,b=>mulres1,clk=>clk,ce=>cediv1,result=>ax);
|
2046 | ----------------------ax fertig berechnet-----------------------------------
|
2047 | ccosAX: ArcCosFP port map(nrst=>nrst,clk=>clk,ceacos=>ceacosFP,aInp=>AX,acos=>acosAX);
|
2048 | caddA1: addFP port map(a=>acosAX,b=>A12FP,clk=>clk,ce=>ceA1FP,result=>A1FP);
|
2049 | ----------------------- a1CFP:=Pi/2 - A1FP---------state 8--------------------
|
2050 | csubA1: subFP port map(a=>PIdiv2,b=>A1FP,clk=>clk,ce=>cesubA1,result=>A1SFP);
|
2051 | ----------------------cos/sin +FP ------------------state 9----------------
|
2052 | ccosFp: cosFP port map(nrst=>nrst,clk=>clk,cecos=>cecosFP,ainp=>A1FP,cos=>cosA1FP);
|
2053 | csinFp: cosFP port map(nrst=>nrst,clk=>clk,cecos=>cecosFP,ainp=>A1SFP,cos=>sinA1FP);
|
2054 | ----------------------mul--------------------------state 10 ---------------------
|
2055 | cmulW1: mulFP port map(a=>cosA1FP,b=>FL1,clk=>clk,ce=>ceZ1W1,result=>FW1);
|
2056 | cmulZ1: mulFP port map(a=>sinA1FP,b=>FL1,clk=>clk,ce=>ceZ1W1,result=>FZ1);
|
2057 | -------- Blatt 1 calcP1 fertig -----Blatt2 calpP+ : Berechnung A2-----
|
2058 | csubZ2Z1: subFP port map(a=>FZw,b=>FZ1,clk=>clk,ce=>ceZW12,result=>Z2Z1);
|
2059 | csubW2W1: subFP port map(a=>LwFP,b=>FW1,clk=>clk,ce=>ceZW12,result=>W2W1);
|
2060 | ----------------------- state ------------------------------
|
2061 | catgZW: atanFP port map(nrst=>nrst,clk=>clk,ceatan=>ceatanZw,Xinp=>w2w1,Yinp=>z2z1,atanFP=>AtanZW);
|
2062 | -----------------state ----------------------------------------
|
2063 | csubA2: subFP port map(a=>atanZW,b=>A1FP,clk=>clk,ce=>cesubA2,result=>A2FP);
|
2064 | ------------------end RUNANGLE--------------------------------------------
|
2065 | --*****************************************************************************
|
2066 | --==================ITPImpGen -------------------------------------------------
|
2067 |
|
2068 | ------------------ convert Winkel DakrAx,InkrAX--------------------------
|
2069 | cA0conv: AxConv port map(nrst=>nrst,clk=>clk,ceConv=>ceAxx,AFPinp=>A0FP,Resol=>C_A0rad,
|
2070 | AchsInkr=>AXInc(0),AXGrd=>AXGr(0));--A0
|
2071 | cA1conv: AxConv port map(nrst=>nrst,clk=>clk,ceConv=>ceAxx,AFPinp=>A1FP,Resol=>C_A1rad,
|
2072 | AchsInkr=>AXInc(1),AXGrd=>AXGr(1));--A1
|
2073 | cA2conv: AxConv port map(nrst=>nrst,clk=>clk,ceConv=>ceAxx,AFPinp=>A2FP,Resol=>C_A2rad,
|
2074 | AchsInkr=>AXInc(2),AXGrd=>AXGr(2));--A2
|
2075 | cA3conv: AxConv port map(nrst=>nrst,clk=>clk,ceConv=>ceAxx,AFPinp=>A3FP,Resol=>C_A3rad,
|
2076 | AchsInkr=>AXInc(3),AXGrd=>AXGr(3));--A3
|
2077 | cA4conv: AxConv port map(nrst=>nrst,clk=>clk,ceConv=>ceAxx,AFPinp=>A4FP,Resol=>C_A4rad,
|
2078 | AchsInkr=>AXInc(4),AXGrd=>AXGr(4));--A4
|
2079 | cA5conv: AxConv port map(nrst=>nrst,clk=>clk,ceConv=>ceAxx,AFPinp=>A5FP,Resol=>C_A5rad,
|
2080 | AchsInkr=>AXInc(5),AXGrd=>AXGr(5));--A5
|
2081 | ------------------------nur für tests------------------------------
|
2082 | --cA12conv: AxConv port map(nrst=>nrst,clk=>clk,ceConv=>ceAxx,AFPinp=>A12FP,Resol=>A12res,
|
2083 | --Axint=>SA12);
|
2084 | --cATconv: AxConv port map(nrst=>nrst,clk=>clk,ceConv=>ceAxx,AFPinp=>ATFP,Resol=>A12res,Axint=>SAT);
|
2085 | --cAZconv: AxConv port map(nrst=>nrst,clk=>clk,ceConv=>ceAxx,AFPinp=>AZFP,Resol=>A12res,Axint=>SAZ);
|
2086 | --cAwconv: AxConv port map(nrst=>nrst,clk=>clk,ceConv=>ceAxx,AFPinp=>AwFP,Resol=>A12res,Axint=>SAw);
|
2087 | --===============================================================================
|
2088 | -----********************* Div Testwerte ************************************
|
2089 | ---- test ArcTang--------------------
|
2090 | -- Testwert tgFP=500/3000=0.1666666 =X"3e2aaaab"
|
2091 | -- Test Resultat für versuch mit 0.166666 = 0.16514867740814 =X"3e291cbc"
|
2092 | ------------------------------------------------------------------
|
2093 | --- testwert Input: 60grd= 1.0471975512 =X"3F860A92"-------------------------------
|
2094 | ----- Output:cos = 0.5=FP :X"3F000000",Testresultat :0.499998986721
|
2095 | -------------------------
|
2096 | --- +60 Grad Winkel :1.0471975512 rad = 3f860a92,-60 Grad:-1.04.. =bf860a92
|
2097 | ---- + 90 Grad = 3fc90fdb , -90 Grd = bfc90fdb
|
2098 | ----------------------
|
2099 | ----sin :0.86602540379= FP: 3f5db3d7, Testresultat : -----
|
2100 | -------------------------------------------------------------
|
2101 | --input FP-Testwert(XinpCos) für arcsin(0.5)=X"3f000000", Resultat =0.5235987756= X"3F060a92" (FP)
|
2102 | --input FP-Testwert(XinpCos) für arccos(0.5)=X"3f000000", Resultat =1.0471975512= X"3F" (FP)
|
2103 | --========================================================================
|
2104 |
|
2105 | end Behavioral;
|