ITPModul.vhd


1
 ----------------------------------------------------------------------------------
2
-- Company: AK development GmbH
3
-- Engineer:  A:Kurka
4
-- 
5
-- Create Date:   31.8.2021 
6
-- modif:20.08.24 Version A21
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
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
  wait until (rising_edge(clk));
698
    IF nrst = '0' THEN
699
      itprun <= '0';
700
      sitprun <= '0';
701
      enditp <= '0';
702
      indx := 0;
703
      ITPmod <= "000";-- init ITmod
704
       lin:= '0';-- init
705
      ITPSTATE <= 0;
706
      statechg <= 0;
707
      oAXdif <= (OTHERS => '0');
708
      CalcOK <= '0';-- RESET IMPULS fürstart RAMP
709
    ELSE
710
      CASE ITPSTATE IS
711
        WHEN 0 =>
712
          IF celin = '1' THEN
713
            Lin := '1';
714
            indx := to_integer(unsigned(ebene(1 DOWNTO 0)));-- ebene ini Receiv gesetzt Byte(1) 2..0
715
            ITPSTATE <= 1;
716
          ELSIF ce = '1' THEN
717
            Lin := '0';
718
            ITPSTATE <= 1;
719
          ELSE ITPSTATE <= 0;
720
          END IF;
721
        WHEN 1 =>
722
          IF lin = '1' THEN
723
            ITPmod <= ITPlin;
724
          ELSE
725
            ITPmod <= ITPxyz;
726
          END IF;
727
          ---------------
728
          IF (XYZok = '1') OR (LinITPok = '1') THEN
729
            ITPmod <= "000";
730
            ITPSTATE <= 0;
731
          ELSE ITPSTATE <= 1;
732
          END IF;
733
        WHEN OTHERS => ITPSTATE <= 0;
734
      END CASE;
735
      ----------------------------
736
      CASE statechg IS
737
        WHEN 0 =>
738
          IF linrun = '1' THEN --Lin Itp pulsw
739
            itprun <= '1';--Itp Läuft
740
            sitprun <= '1';
741
            enditp <= '1';--itp Läuft
742
            statechg <= 1;
743
          ELSIF runXYZ = '1' THEN --InvwersTransf Impulse
744
            itprun <= '1';--Itp Läuft
745
            sitprun <= '1';
746
            enditp <= '1';--itp Läuft
747
            statechg <= 6;
748
          ELSE -- keine Interpolation, warten auf rampen ende resp neue stz  
749
            statechg <= 0;-- und warten
750
          END IF;
751
--==================================================================
752
------------------- LinSatz------------------------------------
753
        WHEN 1 => -- ablauf linStz
754
          IF linrun = '1' THEN
755
            IF LinITPok = '1' THEN
756
              itprun <= '0';-- lin ITP fertig
757
              sitprun <= '0';
758
            ELSE -- LINInterpolation läuft
759
              oImpLk <= ImpLkLin;--Impulse LK von LinITP
760
              calcOK <= lincalcOK;--start für RAMP
761
              --oAXinkr(31..0), Xlina(15..0)
762
              IF Xactiv = '1' THEN ---- WinkelAchsen Inkremente auf entity
763
                  oAXdif(indx*32+15 DOWNTO  indx*32)   <=  Xdifa;
764
              END IF;
765
              IF Yactiv = '1' THEN
766
                  oAXdif(indx*32+31 DOWNTO  indx*32+16) <= Ydifa;
767
               END IF;
768
              ----------------------------
769
              IF stopp = '1' OR RunStop = '1' THEN
770
                RunStop := '1'; --Stopp speichern
771
                itpRun <= '0'; -- Unterbruch wg limit oder Endlage
772
                sitprun <= '0';
773
                enditp <= '0';-- ende kontur
774
              ELSE
775
                ItpRun <= '1';-- ITP lin läufzt
776
                sitprun <= '1';
777
                enditp <= '1';-- ende kontur
778
              END IF;
779
            END IF;
780
          ELSE -- linRun fertig, warten auf rampenende
781
            IF RampRun = '1' THEN
782
              IF stopp = '1' OR RunStop = '1' THEN
783
                RunStop := '1'; --Stopp speichern   
784
              END IF;
785
              statechg <= 1;
786
            ELSE
787
              enditp <= '0';
788
              RunStop := '0';
789
              statechg <= 0;-- ende satz, warten auf neue satz
790
            END IF;  
791
          END IF;    
792
--==================================================================================------------------------XYZ Satz= inv.Transf-------------------------
793
        WHEN 6 =>  -- impuls ausgabe bei invers transf
794
            IF runXYZ = '1' THEN --interpolation (Bresenham) läuft,itprun=1
795
              oImpLk <= ImpLk;--virt.ImpulseLK  von Inv.Transf (XYZ ITP,Bresenham)
796
              FOR i IN 0 TO 5 LOOP
797
                oAXdif(i*16+15 DOWNTO i*16) <= AXdif(i);-- WinkelAchsensolldif Inkremente auf entity
798
              END LOOP;
799
              calcOK <= XYZcalcOK;--start für RAMP
800
              IF stopp = '1' OR RunStop = '1' THEN
801
                ItpRun <= '0'; -- Unterbruch wg limit oder Endlage
802
                sitprun <= '0';
803
                RunStop := '1'; -- speichern Stopp
804
              ELSE
805
                IF XYZok = '1' THEN --- wenn Bressenham fertig
806
                  ItpRun <= '0';
807
                  enditp <= '0'; -- ende kontur
808
                  sitprun <= '0';
809
                ELSE
810
                  ItpRun <= '1';
811
                  sitprun <= '1';
812
                  enditp <= '1'; -- kontur läuft
813
                END IF;
814
              END IF;
815
              statechg <= 6;
816
            ELSE -- Bresenham Interpolation fertig   
817
              IF RampRun = '1' THEN
818
                IF stopp = '1' OR RunStop = '1' THEN
819
                  RunStop := '1'; --Stopp speichern  
820
                END IF;
821
                statechg <= 6;
822
              ELSE
823
                RunStop := '0';
824
                statechg <= 0;-- ende satz, warten auf neue satz
825
              END IF;
826
            END IF; --nächste Impulsausgabe
827
        WHEN OTHERS => statechg <= 0;
828
      END CASE;
829
    END IF;--if nrst/else
830
  ----END IF;-- clk
831
END PROCESS;-- IMPSwitch
832
--=============================================================
833
-- bei linstz werden nur 16 bit akzeptiert (ist nur zum optimieren der Achsen)
834
-- d.h. Max eingabe = +/- 327.67  für X,oder Y Linsatz    
835
--==Steuert ITP für linStz ==============================
836
--  LinLk (intg):-- Generiert aus MAXAX bei Empfang von  Linstz
837
-- Xlin,Ylin wurden bei Empfang von Linstz geladen
838
-- generiert ITPlin (status ITP)
839
------------------------------------------------
840
runITPlin:PROCESS
841
VARIABLE cntrclk : INTEGER RANGE 0 TO 3000000:= 0;-- für 30ms max
842
VARIABLE iEB :INTEGER RANGE  0 TO 2 := 0;-- zwischenspeicher für ebene    
843
BEGIN
844
  --IF rising_edge(clk) THEN
845
  wait until (rising_edge(clk));
846
    IF nrst = '0' THEN
847
      LinRun <= '0'; -- reset start Bresenhamlin
848
      dXlin <= 0;
849
      dYlin <= 0;
850
      dLkLin <= 0;
851
      StateLin <= S0;
852
      cntrclk := 0;
853
      iEB := 0;
854
      XLinAbs <= (OTHERS =>'0');
855
      YLinAbs <= (OTHERS =>'0');
856
      ITPlin <= "000"; --init ITP für Status
857
    ELSE
858
      CASE stateLin IS
859
        WHEN S0 => -- start mit celin
860
          IF ceLin = '1' THEN
861
            iEB := to_integer(unsigned(Ebene));-- Ebene für linSatz
862
            StateLin <= S1;
863
          ELSE
864
            StateLin <= S0;-- warten
865
          END IF;
866
        WHEN S1 => -- init div koordinaten
867
          ITPlin(iEB) <= '1';--Itp für aktive Ebene
868
          -----------------
869
          IF Xlin(15) = '1' THEN -- negativ koord
870
            FLinXneg <= '1';
871
            XLinAbs <= std_logic_vector((signed(Xlin XOR X"FFFF")) + 1);
872
            --XLinAbs <= (Xlin XOR X"FFFF") + 1;
873
          ELSE
874
            FLinXneg <= '0';
875
            XlinAbs <= Xlin;
876
          END IF;
877
          ----------------------
878
          IF Ylin(15) = '1' THEN -- negativ koord
879
            FLinYneg <= '1';
880
            YLinAbs <= std_logic_vector((signed(Ylin XOR X"FFFF")) + 1);
881
            --YLinAbs <= (Ylin XOR X"FFFF") + 1;
882
          ELSE
883
            FLinYneg <= '0';
884
            YlinAbs <= Ylin;
885
          END IF;
886
          --------------------
887
          StateLin <= S2;
888
        WHEN S2 =>
889
          dXlin <= to_integer(unsigned(XLinAbs));-- Xkoord
890
          dYlin <= to_integer(unsigned(YLinAbs));
891
          StateLin <= S3;
892
        WHEN S3 =>
893
          IF dXLin >= dYlin THEN
894
            LinLk <= dXLin;--maxax setzen
895
          ELSE
896
            LinLk <= dYLin;
897
          END IF; -- für 2 status mldg 30 us
898
          cntrclk := 2000000;-- 20 mS warte zeit
899
          StateLin <= S4;
900
        WHEN S4 =>
901
          IF cntrclk > 0 THEN
902
            cntrclk := cntrclk -1;
903
            StateLin <= S4;
904
          ELSE
905
            dLklin <= LinLk;--Leit koord,
906
            ITPlin(iEB) <= '0';--Itp init für status
907
            cntrclk := 170;-- 2.0 us min Impulslänge
908
            StateLin <= S5;---S5;----ohne start imp
909
          END IF;
910
        ---------auf startImpuls warten-------------------------  
911
        WHEN S5 => --- warten auf Start Impuls länge min 2,4us
912
          IF cntrclk > 0 THEN
913
            cntrclk := cntrclk -1;
914
            IF strimp = '1' THEN
915
              stateLin <= S5;-- warten
916
            ELSE
917
              stateLin <= S6;-- impuls ist kürzer, neu anfangen
918
            END IF;
919
          ELSE -- zeit abgelaufen
920
            stateLin <= S7;-- impuls hat richtige länge
921
          END IF;  
922
        WHEN S6 => -- neu anfangen mit Impuls abwarten    
923
          cntrclk := 170;-- 2.0 us min Impulslänge
924
          stateLin <= S5;-- neu anfangen      
925
        -----------start impuls empfangen------------------------
926
        WHEN S7 =>
927
          LinRun <= '1'; -- Bresenhamlin starten(impuls)
928
          ITPlin(iEB) <= '1';--Itp für status
929
          StateLin <= S8;
930
        WHEN S8 =>
931
          StateLin <= S9;
932
        WHEN S9 =>  -- warten bis interpolation (ITP) fertig ist    
933
          IF LinITPok = '1' THEN
934
            LinRun <= '0';
935
            ITPlin(iEB) <= '0';--Itp für status(itp fertig)
936
            StateLin <= S10;-- und weiter
937
          ELSE
938
            StateLin <= S9;-- warten bis ITP fertig ist
939
          END IF;
940
        WHEN S10 =>
941
          StateLin <= S0;-- und Warten auf nächste LInStz
942
        WHEN OTHERS =>
943
          dXlin <= 0;
944
          dYlin <= 0;
945
          dLkLin <= 0;
946
          StateLin <= S0;
947
      END CASE;
948
    END IF;-- if nrst/else
949
  ----END IF; -- if clk
950
END PROCESS;-- runITPlin
951
--=================================================================
952
--=====================Bresenham Interpolation für linStz ==========
953
--- interpoliert in XY eine gewählte Ebene in LinStz(linear Satz)
954
-- ImpXlin,ImpYin sind Impulse in XY,, 
955
--ImpLklin sind virtuelle Impulse in entlang der Leitkoordinate
956
-- XlinA,YlinA ist absolute Position
957
-- Ende der Interpolation : LinItpok = 1 (2 clk impuls)
958
--Vorschubspeed definiert mit pfrq (anz.clk(10ns) zwischen 
959
--zwei ImpLklin impulsen
960
-------------------------------------------------------
961
breshamLin: PROCESS
962
VARIABLE count :INTEGER;
963
VARIABLE errX   :INTEGER;
964
VARIABLE errY   :INTEGER;
965
VARIABLE XaltA  :std_logic_vector(15 DOWNTO 0):=X"0000";
966
VARIABLE YaltA  :std_logic_vector(15 DOWNTO 0):=X"0000";
967
BEGIN
968
  ---IF rising_edge(clk) THEN
969
  wait until (rising_edge(clk));
970
    IF nrst = '0' THEN
971
      stateLinB <= S0;
972
      errX :=0; 
973
      errY :=0; 
974
      XLinA <= (OTHERS =>'0');
975
      YLinA <= (OTHERS =>'0');
976
      LinItpok <= '0';
977
      count := 0;
978
      ImpLkLin <= '1';--Impulse (Lk)von LinITP
979
      LinCalcOK <= '0';
980
    ELSE
981
      CASE statelinB IS
982
        WHEN S0 =>
983
            IF LinRun = '1' THEN
984
              count := to_integer(unsigned(pfrq));
985
              stateLinB <= S1;
986
            ELSE
987
              errX :=dLklin/2;
988
              errY :=dLklin/2;
989
              LinLka <= 0;
990
              LinItpok <= '0';
991
              stateLinB <= S0;
992
            END IF;
993
        WHEN S1 =>
994
          LinCalcOK <= '0';-- RESET IMPULS calcOK
995
          IF count = 0 THEN -- warten für pfrq periode
996
            IF LinLka < linLk  THEN  --wenn noch nicht fertig
997
              LinLka <= LinLka + 1;
998
              ------------------------
999
              errX := errX - dXlin;  
1000
              IF errX < 0 THEN
1001
                XlinA <= std_logic_vector(signed(XlinA) + 1);
1002
                ImpLklin <= '0';
1003
                errX := errX + dLkLin;
1004
              END IF;
1005
              ----------------------
1006
              errY := errY - dYlin;  
1007
              IF errY < 0 THEN
1008
                YLinA <= std_logic_vector(signed(YLinA) + 1);
1009
                ImpLklin <= '0';
1010
                errY := errY + dLkLin;
1011
              END IF;
1012
              -------------------------
1013
              count := to_integer(unsigned(pfrq));
1014
              stateLinB <= S2;-- itp noch nicht fertig
1015
            ELSE -- dann itp fertig
1016
              count := 0;-- pfrq Zähler stoppen
1017
              stateLinB <= S4;--dann itp fertig
1018
            END IF;
1019
          ELSE -- warten auf count ablauf(prfg periode)
1020
            count := count - 1;
1021
            stateLinB <= S1;
1022
          END IF;
1023
        WHEN S2 => --noch nicht fertig
1024
          ImpLklin <= '1';
1025
          XdifA <= std_logic_vector(signed(XlinA) - signed(XaltA));
1026
          YdifA <= std_logic_vector(signed(YlinA) - signed(YaltA));
1027
          stateLinB <= S3;
1028
        WHEN S3 =>
1029
            XaltA := XlinA;
1030
            YaltA := YLinA;
1031
            LinCalcOK <= '1';--dann start für daten einlesen in RaMP
1032
            IF stopp = '1' THEN --sofort ITP anhalten
1033
              stateLinB <= S5;-- Stopp Exit
1034
            ELSE  -- kein stopp
1035
              stateLinB <= S1;-- dann repeat
1036
            END IF;
1037
        --------------------------------
1038
        WHEN S4 =>  -- itp fertig
1039
          stateLinB <= S5;-- normal exit
1040
        --------------------------------------------
1041
        WHEN S5 =>  -- stop exit
1042
          XLinA <= (OTHERS =>'0');
1043
          YLinA <= (OTHERS =>'0');
1044
          errX :=0; 
1045
          errY :=0; 
1046
          count := 0;
1047
          ImpLkLin <= '1';--Impulse (Lk)von LinITP stoppen
1048
          LinItpok <= '1';
1049
          stateLinB <= S0;--und warten auf nächste linITP Satz
1050
        WHEN others  => stateLinB <= S0;
1051
      END CASE;
1052
    END IF;--IF nrst/ELSE
1053
  -----END IF; -- if clk
1054
END PROCESS;-- bresenham für XY LinKoordinaten 
1055
1056
--============= ende LinStz Interpolation =====================================
1057
------------------------------------------------------------------------------------
1058
--======Invers transformation mit Linearinterpolation in XYZ Raum================
1059
-----------------------------------------------------------------
1060
--======berechnet gemäss XT,YT,ZT die Priode Dauer PX,Py,PZ für virtualle Strecke XYZ
1061
--====== sowie AtFP, AtgrPI2, AZFP, FLk  ===============================================
1062
--==  Flk := sqrt (xT^2 + YT^2 + ZT^2)
1063
----vorbereitung Berechnungen für virtuelle Interpolation in XYZ--------------------
1064
--== Formel für X Achse, gilt das gleiche für  Achse Y und Z
1065
--== FxT := Int to FP, FrX := FxT/ FLk, FrY := FYT/ FLk,FrZ := FzT/ FLk,
1066
--=  FPx := frqFP *FrX, Px := Fpto Int, dtto Y,Z, frqFP = Fp(Frequenzperiode)
1067
---------------------------------
1068
--== ATFP = atanFP(FYT/FXT)
1069
--== ATgrPI2 := if AtFP > Pi/2 (ccmpAT) , cmp AT mit PI/2: if > then ATgrPI2:= 1, grPI2 <= '1';
1070
--== AZFP:= atanFP(FlT/FZt) 
1071
-----------------------------------------------------------------
1072
iniITPxyz: PROCESS
1073
VARIABLE cntrclk : INTEGER RANGE 0 TO 511:= 0;                                                                                      
1074
BEGIN
1075
  --IF rising_edge(clk) THEN
1076
  wait until (rising_edge(clk));
1077
    IF nrst = '0' THEN
1078
      stateIni <= 0;
1079
      cntrclk := 0;
1080
      YXTneg <= '0';
1081
      initITPok <='0';--reset
1082
    ELSE
1083
      CASE stateini IS
1084
        WHEN 0 =>
1085
          IF ceXYZF = '1' THEN --start initITP, Start FP von XT,YT,ZT
1086
            cntrclk := clkFPtoInt;
1087
            stateIni <= 1;
1088
          ELSE
1089
            stateIni <= 0;
1090
          END IF;
1091
          initITPok <='0';--reset
1092
        WHEN 1 =>
1093
          stateIni <= 2;
1094
        WHEN 2 =>-- Berechnen FXt..FZt
1095
          IF cntrclk = 0  THEN
1096
            cesqXYZ <= '1';-- start für sq(XT,YT,ZT)
1097
            cntrclk := clktoSq;
1098
            stateIni <= 3;
1099
          ELSE
1100
            cntrclk := cntrclk - 1;
1101
            stateIni <= 2;
1102
          END IF;
1103
        WHEN 3 =>-- Berechnen sq (X,Y,Z)
1104
          IF cntrclk = 0    THEN
1105
            cesqXYZ <= '0';-- reset ceXYZF
1106
            ceaddXY <= '1';-- start für add(X,Y) und XTLTdiv:=FXT/FLT
1107
            cntrclk := clktoAdd;
1108
            stateIni <= 4;
1109
          ELSE
1110
            cntrclk := cntrclk - 1;
1111
            stateIni <= 3;
1112
          END IF;  
1113
        WHEN 4 =>-- Berechnen addFP XY
1114
          IF cntrclk = 0    THEN
1115
            ceaddXY <= '0';-- reset ce addXY
1116
            ceaddXYZ <= '1';-- start für add(X,Y,Z)
1117
            cntrclk := clktoadd;
1118
            stateIni <= 5;
1119
          ELSE 
1120
            cntrclk := cntrclk - 1;
1121
            stateIni <= 4;
1122
          END IF;  
1123
        WHEN 5 =>-- Berechnen addFP XYZ
1124
          IF cntrclk = 0    THEN
1125
            ceaddXY <= '0';-- reset ce addXY
1126
            cesqrtFLk <= '1';-- start für sqrtFLk
1127
            FXtabs <= FXt AND X"7FFFFFFF";
1128
            FYtabs <= FYt AND X"7FFFFFFF";
1129
            FZtabs <= FZt AND X"7FFFFFFF";
1130
            cntrclk := clktosqrt;
1131
            stateIni <= 6;
1132
          ELSE
1133
            cntrclk := cntrclk - 1;
1134
            stateIni <= 5;
1135
          END IF;  
1136
        WHEN 6 =>-- Berechnen sqrt(addXYZ)=>FLk, sqrt(addXY)=>FLT
1137
          IF cntrclk = 0   THEN
1138
            cesqrtFLk <= '0';-- reset ce sqrtFL
1139
            cntrclk :=clkFptoInt;
1140
            ceFlkInt <= '1'; --start FP to INt für Flk To Lk 
1141
            stateIni <= 7;
1142
          ELSE
1143
            cntrclk := cntrclk - 1;
1144
            stateIni <= 6;
1145
          END IF;
1146
        WHEN 7 =>  ---FP to INt für Flk To Lk 
1147
          ceFlkInt <= '0'; -- reset ce
1148
          IF  cntrclk = 0  THEN
1149
            stateIni <= 9;
1150
          ELSE
1151
            cntrclk := cntrClk - 1;
1152
            stateIni <= 7;
1153
          END IF;
1154
             ---------------------------------------------
1155
        WHEN 9 => -- Berechnen FP to Int = PX..
1156
          IF  cntrclk = 0  THEN                      
1157
            cntrclk := 36; -- 22 clk für atan,32 clk für acos
1158
            cetgAT <= '1';-- Start für ctgYXT:ATFP:= acos(XT/LT)
1159
            stateIni <= 10;
1160
          ELSE 
1161
            cntrclk := cntrclk - 1;
1162
            stateIni <= 9;
1163
          END IF;
1164
        WHEN 10 =>  --Berechnen ATFP:=acos(FXT/FLT) und AZFP:= atan(FZT/FLT)
1165
          IF  cntrclk = 0  THEN
1166
            cetgAT <= '0';-- reset
1167
            cecmpAT <= '1';-- startcmp AT mit PI/2
1168
            stateIni <= 11;-- und ende initITPlin: ATFP und AZFP fertig
1169
          ELSE 
1170
            cntrclk := cntrclk - 1;
1171
            stateIni <= 10;
1172
          END IF;
1173
        WHEN 11 => --ausführen cmp AT mit PI/2: ATgrPI2 fertig
1174
          cecmpAT <= '0';-- reset
1175
          stateIni <= 12;
1176
        WHEN 12 => --
1177
          IF ATgrPI2 = "1" THEN -- ATgrPI ist vektor mit Bit 0
1178
            grPI2 <= '1';
1179
          ELSE grPI2 <= '0';
1180
          END IF;
1181
          stateIni <= 13;
1182
        WHEN 13 => --
1183
          initITPok <= '1'; -- init ITP fertig
1184
          stateIni <= 0;-- und Zurück an Anfang
1185
        WHEN OTHERS  => 
1186
          stateIni <= 0;
1187
      END CASE;
1188
    END IF;-- nrst if/else
1189
  -----END IF; --clk
1190
END PROCESS;--end iniITPxyz
1191
--======Start von iniITPxyz und starten Impulsausgabe==========
1192
--Virtuelle -Interpolation von XYZ Starten und steuern
1193
--starten bresenham interpolation xyz & Lk
1194
--Generieren ITPxyz für Status Meldung
1195
runITP: PROCESS
1196
VARIABLE cntrclk :INTEGER RANGE 0 TO 30000000:= 0;-- für 30ms max
1197
BEGIN
1198
  ---IF rising_edge(clk) THEN
1199
  wait until (rising_edge(clk));
1200
    IF nrst = '0' THEN
1201
      stateITP <= 0;    
1202
      cntrclk :=0;
1203
      ITPxyz <= "000";
1204
    ELSE
1205
      CASE stateITP IS
1206
        WHEN 0 =>
1207
          IF ce = '1' THEN
1208
            ITPxyz <= "111";
1209
            stateITP <= 2;
1210
          ELSE
1211
            stateITP <= 0;-- Warten auf Start
1212
          END IF;
1213
        WHEN 2 =>
1214
            IF XT(31)  = '1' THEN -- if XT negativ
1215
              --XTabs <= (XT XOR X"FFFFFFFF") + 1;-- XT negieren
1216
              XTAbs <= std_logic_vector((signed(XT XOR X"FFFFFFFF")) + 1);
1217
              fXneg <= '1';--neg Flag setzen
1218
            ELSE 
1219
              XTabs <= XT;
1220
              fXneg <= '0';--neg Flag,Rücksetzen
1221
            END IF;
1222
            --------
1223
            IF YT(31)  = '1' THEN -- if YT negativ
1224
              --YTabs <= (YT XOR X"FFFFFFFF") + 1;-- YT negieren
1225
              YTAbs <= std_logic_vector((signed(YT XOR X"FFFFFFFF")) + 1);
1226
              fYneg <= '1';--neg Flag setzen
1227
            ELSE
1228
              YTabs <= YT; 
1229
              fYneg <= '0';--neg Flag,Rücksetzen
1230
            END IF;
1231
            --------
1232
            IF ZT(31)  = '1' THEN -- if ZT negativ
1233
              ZTabs <= std_logic_vector((signed(ZT XOR X"FFFFFFFF")) + 1);-- ZT negieren
1234
              fZneg <= '1';--neg Flag setzen
1235
            ELSE 
1236
              ZTabs <= ZT;
1237
              fZneg <= '0';--neg Flag,Rücksetzen
1238
            END IF;
1239
          ceXYZF <= '1';--Start für InitITPxyz, Start des iniITPlin Processes
1240
          stateITP <= 3;
1241
        WHEN 3 => -- wenn iniITPxyz fertig berchnet
1242
          IF initITPok = '1' THEN
1243
            cntrclk := 2000000;-- 20 ms warten wg rd Status
1244
            stateITP <= 4;---4; --dann weiter
1245
          ELSE
1246
            ceXYZF <= '0';--reset start für InitITP
1247
            stateITP <= 3;-- warten auf init ITP
1248
          END IF;
1249
          ------------------------------------
1250
        WHEN 4 =>-- warten 20 ms für status rd
1251
            IF cntrclk > 0 THEN
1252
              cntrclk := cntrclk -1;
1253
              stateITP <= 4;-- dann warten
1254
            ELSE
1255
              ITPxyz <= "000";
1256
              cntrclk := 170;-- 2.0 us min Impulslänge für start Impuls
1257
              stateITP <= 5;
1258
            END IF;
1259
        WHEN 5 => --- warten auf Start Impuls länge min 2,4us
1260
            IF cntrclk > 0 THEN
1261
              cntrclk := cntrclk -1;
1262
              IF strimp = '1' THEN
1263
                stateITP <= 5;-- warten
1264
              ELSE
1265
                stateITP <= 6;-- impuls ist kürzer, neu anfangen
1266
              END IF;
1267
            ELSE -- zeit abgelaufen
1268
              stateITP <= 7;-- impuls hat richtige länge
1269
            END IF;  
1270
        WHEN 6 => -- neu anfangen mit Impuls abwarten    
1271
              cntrclk := 170;-- 2 us min Impulslänge
1272
              stateITP <= 5;      
1273
        ---------------------------------------
1274
        WHEN 7 =>
1275
          runXYZ <= '1'; --Impuls ausgabe(bresenham) starten
1276
          ITPxyz <= "111";
1277
          stateITP <= 8;
1278
        WHEN 8 => -- warten bis InterpolationXYZ fertig
1279
          IF stopp = '0' THEN --wenn keine Endlage dann weiter
1280
            IF XYZok = '1' THEN -- ITP (bresenham) ist fertig
1281
              runXYZ <= '0';-- reset 
1282
              stateITP <= 0;-- itp fertig
1283
              ITPxyz <= "000";
1284
            ELSE  --
1285
              stateITP <= 8;-- warten bis koordinaten fertig
1286
            END IF;
1287
          ELSE  ----wenn Endlage dann sofort itp anhalten
1288
            stateITP <= 9;
1289
          END IF;
1290
        WHEN 9 =>  -- sofort stopp
1291
          ITPxyz <= "000";
1292
          runXYZ <= '0';-- impuls Ausgabe stoppen
1293
          stateITP <= 0;--itp fertig
1294
        WHEN OTHERS  =>
1295
          stateITP <= 0;
1296
      END CASE;
1297
    END IF;-- nrst if/else
1298
  -----END IF; --clk
1299
END PROCESS;--runITP
1300
--==========================================================================
1301
--=================XYZ Bresenham =Interpolation Am Roboterkopf ==========
1302
--erzeugt virtuelle Impulse für ImpX,ImpY,ImpZ sowie ImpLK(entlang leitKoordinate) am Roboter Kopf 
1303
--und aktuelle virt.Position XA,YA,ZA (integer), 
1304
--Ende der Interpolation mit XYZok =1 Impuls(2clk)
1305
--Vorschubspeed definiert mit pfrq (Anz.clk(10nS) zwischen zwei ImpLK
1306
-- impLK startet RunAngle d.h. die Invers transf Berchnung
1307
---------------------------------------------------------------------------------------------------   
1308
bresham: PROCESS
1309
VARIABLE count :INTEGER;
1310
VARIABLE errX   :INTEGER;
1311
VARIABLE errY   :INTEGER;
1312
VARIABLE errZ   :INTEGER;
1313
--VARIABLE startON :std_logic:= '0';
1314
BEGIN
1315
  ----IF rising_edge(clk) THEN
1316
  wait until (rising_edge(clk));
1317
    IF nrst = '0' THEN
1318
      statebrsh <= 0;
1319
      dLk <= 0;
1320
      dX <= 0;
1321
      dY <= 0;
1322
      dZ <= 0;
1323
      errX :=0;
1324
      XAout <= (OTHERS =>'0');
1325
      YAout <= (OTHERS =>'0');
1326
      ZAout <= (OTHERS =>'0');
1327
      errY :=0; 
1328
      errZ :=0;
1329
      XA <= (OTHERS =>'0');
1330
      YA <= (OTHERS =>'0');
1331
      ZA <= (OTHERS =>'0');
1332
      ImpX <= '1';
1333
      ImpY <= '1';
1334
      ImpZ <= '1';
1335
      ImpLk <= '1';
1336
      count := 0;
1337
      XYZok  <= '0';
1338
      --startON := '0';
1339
    ELSE
1340
      CASE statebrsh IS
1341
        WHEN 0 =>
1342
            IF runXYZ = '1' THEN
1343
              dX <= to_integer(unsigned(XTabs));-- Xkoord
1344
              dY <= to_integer(unsigned(YTabs));
1345
              dZ <= to_integer(unsigned(ZTabs));
1346
              dLk <= to_integer(unsigned(Lk));--Leit koord
1347
              statebrsh <= 1;
1348
            ELSE --anfang der berechnung nach strimp
1349
              --IF strimp = '1' AND startON = '0' THEN
1350
              IF strimp = '1' THEN
1351
                XA <= XS;-- Startpunkt setzen
1352
                YA <= YS;
1353
                ZA <= ZS;
1354
                --startON := '1';
1355
              END IF;
1356
              errX :=dLk/2;
1357
              errY :=dLk/2;
1358
              errZ :=dLk/2;
1359
              Lka <= 0;
1360
              XYZok  <= '0';
1361
              statebrsh <= 0;
1362
            END IF;
1363
        WHEN 1 =>
1364
          IF count = 0 THEN -- warten für pfrq periode
1365
          ---------- ursprünglich-----------
1366
            --IF Lka < Lk  THEN..Lka:integer,LkSLV(31..0)
1367
              ---Lka <= Lka + 1;
1368
          -----------------------------------------------
1369
            IF (to_unsigned(Lka,32) < to_integer(unsigned(Lk)))  THEN
1370
              Lka <= to_integer(to_unsigned(Lka,32) + 1);
1371
              
1372
              ImpLK <= '0';
1373
              ------------------------
1374
              errX := errX - dX;  
1375
              IF errX < 0 THEN
1376
                IF fXneg = '0' THEN
1377
                  XA <= std_logic_vector(signed(XA) + 1);
1378
                ELSE
1379
                  XA <= std_logic_vector(signed(XA) - 1);
1380
                END IF;
1381
                ImpX <= '0';
1382
                errX := errX + dLk;
1383
              END IF;
1384
              ----------------------
1385
              errY := errY - dY;  
1386
              IF errY < 0 THEN
1387
                IF fYneg = '0' THEN
1388
                  YA <= std_logic_vector(signed(YA) + 1);
1389
                ELSE
1390
                  YA <= std_logic_vector(signed(YA) - 1);
1391
                END IF;
1392
                ImpY <= '0';
1393
                errY := errY + dLk;
1394
              END IF;
1395
              -------------------------
1396
              errZ := errZ - dZ;  
1397
              IF errZ < 0 THEN
1398
                IF fZneg = '0' THEN
1399
                  ZA <= std_logic_vector(signed(ZA) + 1);
1400
                ELSE
1401
                  ZA <= std_logic_vector(signed(ZA) - 1);
1402
                END IF;
1403
                ImpZ <= '0';
1404
                errZ := errZ + dLk;
1405
              END IF;
1406
              -------------------------
1407
              count := to_integer(unsigned(pfrq));
1408
              statebrsh <= 2;
1409
            ELSE
1410
              statebrsh <= 3;--dann itp fertig
1411
            END IF;
1412
          ELSE
1413
            count := count - 1;
1414
            statebrsh <= 1;
1415
          END IF;
1416
        WHEN 2 =>
1417
          ImpLk <= '1';
1418
          ImpX <= '1';
1419
          ImpY <= '1';
1420
          ImpZ <= '1';
1421
          XAout <= XA;
1422
          YAout <= YA;
1423
          ZAout <= ZA;
1424
          IF stopp = '1' THEN --sofort anhalzen, endlage
1425
            statebrsh <= 5;
1426
          ELSE  --kein stop
1427
            statebrsh <= 1;
1428
          END IF;
1429
        WHEN 3 =>
1430
          XYZok <='1';
1431
          statebrsh <= 0;-- fertig ohne stop
1432
        WHEN 5 =>
1433
          dLk <= 0;
1434
          dX <= 0;
1435
          dY <= 0;
1436
          dZ <= 0;
1437
          errX :=0; 
1438
          errY :=0; 
1439
          errZ :=0;
1440
          XYZok <='1';--fertig mit stop
1441
          statebrsh <= 0;-- fertig ohne stop
1442
        WHEN others  => statebrsh <= 0;
1443
      END CASE;
1444
    END IF;--IF nrst/ELSE
1445
  ---END IF; -- if clk
1446
END PROCESS;-- bresenham für XYZ Koordinaten 
1447
1448
--=====================Berechnung Invers  Transformation====
1449
--============RUNANGLE :Berechnung der Winkel in den Roboterachsen ==========
1450
--XT,YT,ZT sind strecken koordinaten die im XYZ Satz oder Kreissatz angegeben werden
1451
--  bezogen auf Fräsenendpunkt (roboter KopfF)
1452
--XS,YS,ZS sind startposition Koordinaten von wo XT--ZT gestartet werden
1453
-- Xa,Ya,Za sind Aktuelle Koordinaten am Fräserendpunkt (roboterkopf)
1454
--L1,L2,L3 sind roboterarm längen in mm
1455
-- Bezeichnung FP = Wert ist Floatingpoint Format, Bsp: ATFP  Winkel AT in FP format
1456
----------------------------------------------------------------------------
1457
-- Folgende Werte werden hier Berechnet :
1458
--   LT :Streckenlänge in XY Ebene:LT :=sqrt((xT^2 + YT^2)
1459
--   LK :streckenlänge in XYZ:Lk :=sqrt((xT^2 + YT^2 + ZT^2); 
1460
--   AT = arccos(XT / LT)
1461
--   AZ = arctan(ZT/LT)
1462
-- Roboter Achsen in Ebene W : P0,P1,P2. EbeneW dreht sich mit Winkel A0
1463
-- aus Xa,Ya,Za werden  FXw,FYw,FZw : positionen in roboterebene W(winkel A1,A2,A3)
1464
-- Aus Xa,Ya wird  A0 Achse berechnet(A0FP in FP format, in radiant):A0Fp := atanFP( Fxa/FYa);
1465
-- aus Xw,Yw  werden Lw und Aw, Distanz und winkel in Roboterebene W
1466
-- daraus die Winkelposition A3,A4
1467
----------------------------------------------------------
1468
---------- Ebene X / Y berechnungen-------------------
1469
--  LwFP := sqrt(FXw^2 + FYw^2); - länge zwischen P0-P2 in Ebene  XY
1470
--  Winkel der Ebene W(P0,P2) =(AW), Winkel A0 ist Winkel zwischen P0..P3 
1471
--  A12FP := aTan(LzFP / LwFP), A12 = Winkel gerade zwischen P0 und P2 in ebene  W
1472
------------------------------------------------------------------------
1473
-- ****** Ende der Berechnungen wird mit Impuls FXYZaOK signalisiert *******
1474
--- siehe stateangle = 20 
1475
----------------------------------------------------------------------------
1476
--runangle:PROCESS(clk)
1477
runangle:PROCESS
1478
VARIABLE ctrclk :INTEGER RANGE 0 TO 127:= 0;
1479
--VARIABLE startON :std_logic:= '0';
1480
BEGIN
1481
  --IF rising_edge(clk) THEN  
1482
  wait until (rising_edge(clk));
1483
    IF nrst = '0' THEN
1484
      stateangle <= 0;
1485
      ctrclk := 0;
1486
      FXYZaOK <= '0';
1487
      ceXYZFP <= '0'; cetgFP<='0'; cemul9<='0'; cemul10<='0';
1488
      cesubW <='0'; cePI2 <='0';
1489
      cemAZA3 <= '0';cedAZA3 <= '0';cedivPIdiv<='0'; ceAZmul<= '0';
1490
      cesub1min <= '0';ceA3FP<='0';
1491
      ceA4FP <='0'; cetgFP <= '0';
1492
      ceP1 <= '0';
1493
      cesqL <= '0'; ceadd1 <= '0'; cesub1<= '0';
1494
      cediv1 <= '0'; ceacosFP <= '0'; ceA1FP <='0';
1495
      cecosFP <= '0'; ceZ1W1 <= '0'; cesubA1 <= '0';
1496
      --startON := '0';
1497
--      Fl1 <= (OTHERS => '0'); Fl2 <= (OTHERS => '0');Fl12 <= (OTHERS => '0');
1498
--      mul12 <= (OTHERS => '0');
1499
    ELSE
1500
      CASE stateangle IS
1501
        WHEN 0 =>
1502
          --IF (ImpLk = '0' AND strimp='0') OR (strimp = '1' AND StartON = '0') THEN   -- start zurst mit ce
1503
          IF (ImpLk = '0') THEN  
1504
            ceXYZFP <= '1';--Start für Xa,Ya,Zz=>FP, und Pi/2-AZFP,Pi/2 +/- ATFP
1505
            ctrclk := clkToFP;
1506
            stateangle <= 1;
1507
          ELSE
1508
            FXYZaOK <= '0'; --reset
1509
            stateangle <= 0;-- warten auf LK Impuls
1510
          END IF;
1511
        WHEN 1 => -- ausführen Xa,Ya,Zz=>FP und Pi/2-AZFP,Pi/2 +/- ATFP
1512
          IF ctrclk > 0 THEN
1513
            ctrclk := ctrclk -1;
1514
            ceXYZFP <= '0';--reset CE
1515
            stateangle <= 1;
1516
          ELSE
1517
            ---StartON := '1';
1518
            stateangle <= 2;
1519
          END IF;
1520
        WHEN 2 =>  -- zwischen state notwendig****
1521
          IF grPI2 = '1' THEN -- wenn AT > PI/2 dann  sub PI/2 sonst ADD
1522
              PIAT <= suPIAT;
1523
          ELSE PIAT <= adPIAT;
1524
          END IF;
1525
          stateangle <= 3;
1526
        WHEN 3 =>  -- zwischen state notwendig ****
1527
           cePI2 <= '1';
1528
           ctrclk := clkTosub;
1529
           stateangle <= 4;
1530
        WHEN 4 => --ausführen PIAZ :=PI/2 - PIAT
1531
          IF ctrclk > 0 THEN
1532
            ctrclk := ctrclk -1;
1533
            cePI2 <= '0';-- reset
1534
            stateangle <= 4;
1535
          ELSE
1536
            ctrclk  := 35;--clk Atan für durchlauf  ******  
1537
            ceTgFP <= '1'; --arcTang und cos starten
1538
            stateangle <= 5;
1539
          END IF;
1540
        WHEN 5 => --Ausführen A0FP:=atan(Ya/Xa),und Cos(4 bml),  A=FP fertig*****
1541
          IF ctrclk > 0 THEN
1542
            ctrclk := ctrclk -1;
1543
            ceTgFP <= '0'; --Reset ArcTang start Impuls
1544
            stateangle <= 5;
1545
          ELSE --tanYX , ATFP,AZFP fertig
1546
            cemul9 <= '1';-- start sinAZ* sinAT, sinAZ* cosAT
1547
            ctrclk := clkTomul;
1548
            stateangle <= 9;
1549
          END IF;
1550
        WHEN 9 => -- ausführen; sinAZ* sinAT, sinAZ* cosAT
1551
          IF ctrclk > 0 THEN
1552
            ctrclk := ctrclk -1;
1553
            cemul9 <= '0';--reset
1554
            stateangle <= 9;
1555
          ELSE
1556
            ctrclk := clkTomul;
1557
            cemul10 <= '1'; --start sAZAT* FL3, cAZAT* FL3
1558
            stateangle <= 10;
1559
          END IF;
1560
        WHEN 10 => --ausführen  sAZAT* FL3, cAZAT* FL3
1561
            IF ctrclk > 0 THEN
1562
              ctrclk := ctrclk -1;
1563
              cemul10 <= '0';-- reset
1564
              stateangle <= 10;
1565
            ELSE
1566
              ctrclk := clkTosub;
1567
              ceSubw <= '1'; -- Start für sub/add FXa -/+ sAZAT3 usw
1568
              stateangle <= 11;
1569
            END IF;
1570
        WHEN 11 =>  -- ausführen sub/add FXa -/+ sAZAT3.. = FYw,FZw fertig
1571
          IF ctrclk > 0 THEN
1572
            ctrclk := ctrclk -1;
1573
            ceSubw <= '0';-- reset
1574
            stateangle <= 11;
1575
          ELSE
1576
            stateangle <= 12;
1577
          END IF;
1578
        WHEN 12 =>-- für test 
1579
            stateangle <= 13;
1580
        WHEN 13 => -- zwischen state notwendig ***
1581
            IF grPI2 = '1' THEN
1582
              FXw <= aFXw;
1583
            ELSE FXw <= sFXw;
1584
            END IF;
1585
            ctrclk := clkTosq;
1586
            cemul12 <= '1'; --Start für sqXw:=sq(FXw),sqYw:=sq(FYw) und ATPI:= ATFP-PI/2
1587
            stateangle <= 15; ---FXW fertig Berechnet 
1588
        ----------------state reserve----------------------------
1589
        WHEN 15 =>  ---  Ausführen Fxw^2,FYw^2
1590
            IF ctrclk > 0 THEN
1591
              ctrclk := ctrclk -1;
1592
              cemul12 <= '0';-- reset
1593
              stateangle <= 15;
1594
            ELSE
1595
              stateangle <= 16;
1596
            END IF;
1597
        WHEN 16 =>
1598
            ceXYZw <= '1';---für test ***** XYZ W ***********************
1599
            stateangle <= 17;  
1600
            -----Blatt6:csqXw,csqYw, Blatt5: csubAwAt-- gestartet mit cemul12 ----------------            
1601
        WHEN 17 =>  -- ausführen sqXw:=sq(FXw),sqYw:=sq(FYw)  
1602
            ctrclk  := 23;-- 22 clk für atan
1603
            ceXYZw <= '0'; -- reset
1604
            ceaddXYw <= '1'; --start fürAwFP:=atan(FYw/FXw) und sqXYW:=sqXw+SqYw,subPIDIV0subAtAW-pIDIV0
1605
            stateangle <= 18;
1606
        -----Blatt6: catgAw (22clk),caddXYw, Blatt5:csubPidiv--- gestartet mit ceaddXYw---------
1607
        WHEN 18 =>-- ausführen AwFP:=atan(FYw/FXw) und  sqXYW:=sqXw+ SqYw,subPidiv=subAtAw-PIdiv2
1608
            IF ctrclk > 0 THEN
1609
              ctrclk := ctrclk -1;
1610
              ceaddXYw <= '0'; --reset 
1611
              stateangle <= 18;
1612
            ELSE
1613
              cesqrtLw <= '1'; --start LwFP:=sqrt(sqXYw) und subPIdiv= subATAW-pidIV2
1614
              ctrclk  := clkTosq;
1615
              stateangle <= 19;
1616
            END IF;
1617
        ------Blatt6:csqrtLW, Blatt5 :cdivPIdiv2-- gestartet mit cesqrtLW ---------
1618
        WHEN 19 => --ausführen LwFP:= sqrt(sqXYw),LWFP fertig, subPidiv=subAtAw-PIdiv2
1619
          IF ctrclk > 0 THEN
1620
            ctrclk := ctrclk - 1;
1621
            cesqrtLw <= '0';-- reset
1622
            stateangle <= 19;
1623
          ELSE
1624
            cemAzA3 <= '1'; --start AtFp-AwFp
1625
            absDivPIdiv <= DivPIdiv;--absDivPiDiv vorläaufig setzen
1626
            ctrclk := clkTosub;
1627
            stateangle <= 22;
1628
          END IF;
1629
        ----reserve state ----------------
1630
        ----- Blatt5:csqZ2,csqW2,cmuAZFP ---- gestartet mit cemAzA3 ----------------
1631
         WHEN 22 =>  --- ausführen sq(FZw),sq(LWFP), mul(AZFP,DivPIdiv)------
1632
          IF ctrclk > 0 THEN
1633
            ctrclk := ctrclk - 1;
1634
            cemAZA3 <=  '0'; --reset
1635
            stateangle <= 22;
1636
          ELSE
1637
            cedAZA3 <= '1';--start subAtAw-PIdiv2
1638
            ctrclk := clkTosub;
1639
            stateangle <= 23;
1640
          END IF;
1641
        ---- Blatt 5:caddWZ, csub1min--- gestartet mit cedAZA3 ---------------
1642
        WHEN 23 =>  --- ausführen sqaddWZ=sqZ2 + sqW2,subPIdiv =
1643
          IF ctrclk > 0 THEN
1644
            ctrclk := ctrclk - 1;
1645
            cedAZA3 <= '0';-- reset
1646
            stateangle <= 23;
1647
          ELSE
1648
            cedivPIdiv <= '1';
1649
            ceA4FP <= '1'; -- start sqrt(sqaddWZ), atan A12,
1650
            ctrclk  := clkToAtan;--clk Atan
1651
            stateangle <= 24;
1652
          END IF;
1653
        --- Blatt5:catanA12,sqrtWZ,cmulAZFP -- gestartet mit ceA4FP -------
1654
        WHEN 24 => --ausführen atan(FZW,LWFP),divFp,vsqrt(sqaddWZ), mul(sub1min,AZFP)
1655
            IF ctrclk > 0 THEN
1656
              ctrclk := ctrclk - 1;
1657
              ceA4FP <= '0'; --reset
1658
              cedivPIdiv <= '0';
1659
              stateangle <= 24;
1660
            ELSE
1661
              absdivPIdiv <= divPIdiv;-- vorläufig
1662
              ceAZmul <= '1';
1663
              ceP1 <= '1'; -- START intToFP für  L1,L2 => FL1,FL2
1664
              stateangle <= 25;--
1665
            END IF;    
1666
        WHEN 25 =>
1667
          IF absDivPidiv(31) = '1' THEN
1668
            absDivPidiv(31) <= '0';-- Abs von DivPiDiv
1669
          END IF;
1670
          ceP1 <= '0';-- FL1,FL2 fertig
1671
          ceAZmul <= '0';-- a4FP fertig
1672
          ctrclk := clkTosub;
1673
          cesub1min <= '1';
1674
          stateangle <= 26;
1675
        WHEN 26 =>-- sub1min := 1 - absdivPIdiv
1676
          IF ctrclk > 0 THEN
1677
            ctrclk := ctrclk - 1;
1678
            cesub1min <= '0';
1679
            stateangle <= 26;
1680
          ELSE
1681
            ceA3FP <= '1';-- startsub1min* AZFP => A3FP 
1682
            cesqL <= '1';-- start für FL11^2,Fl2^2,FL12^2
1683
            ctrclk := clkTomul;
1684
            stateangle <= 27;
1685
          END IF;
1686
         -- Ab hier Funktionen aus calcP1---------------------------------------
1687
        WHEN 27 => -- A3FP :=sub1min * AZFP, a3FP fertig,FL11^2,Fl2^2,FL12^2 
1688
          IF ctrclk > 0 THEN
1689
            ctrclk := ctrclk - 1;
1690
            cesqL <= '0';--FL11^2,Fl2^2,FL12^2=> SqL1,sqL12,sqL2  fertig
1691
            ceA3FP <= '0';--a3FP fertig
1692
            stateangle <= 27;
1693
          ELSE  
1694
            IF strImp = '0' THEN
1695
              --StartON := '0';
1696
            END IF;
1697
            ceadd1<= '1'; -- startsqL1+sqL12,Fl12*FL1
1698
            ctrclk := clkTomul;
1699
            stateangle <= 28;
1700
          END IF;  
1701
        WHEN 28 => -- ausführen  L1+sqL12,Fl12*FL1  
1702
          IF ctrclk > 0 THEN
1703
            ctrclk := ctrclk - 1;
1704
            ceadd1<= '0';--L1+sqL12,Fl12*FL1  fertig
1705
            stateangle <= 28;
1706
          ELSE  
1707
            cesub1 <= '1'; -- start für: sqadd1-sqL2, mul12 * 2
1708
            ctrclk := clkTomul;
1709
            stateangle <= 29;
1710
          END IF;
1711
        WHEN 29 => -- ausführen: sqadd1-sqL2, mul12 * 2
1712
          IF ctrclk > 0 THEN
1713
            ctrclk := ctrclk - 1;
1714
            cesub1 <= '0';--sqadd1-sqL2, mul12 * 2 fertig
1715
            stateangle <= 29;
1716
          ELSE  
1717
            cediv1 <= '1'; -- start sqsub1/ mulres1 => ax
1718
            ctrclk := clkToDiv;
1719
            stateangle <= 30;
1720
          END IF;
1721
        WHEN 30 =>
1722
          IF ctrclk > 0 THEN
1723
            ctrclk := ctrclk - 1;
1724
            cediv1 <= '0';--sqsub1/ mulres1 => ax fertig
1725
            stateangle <= 30;
1726
          ELSE    
1727
            ceacosFP <= '1'; -- start für atang( Ax)
1728
            ctrclk := clkTOacos;
1729
            stateangle <= 31;
1730
          END IF;  
1731
        WHEN 31 =>    
1732
          IF ctrclk > 0 THEN
1733
            ctrclk := ctrclk - 1;
1734
            ceacosFP <= '0';--atang( Ax) fertig
1735
            stateangle <= 31;
1736
          ELSE      
1737
            ceA1FP <= '1'; -- start für acosAx + A12FP
1738
            ctrclk := clkTOadd;
1739
            stateangle <= 32;
1740
          END IF;  
1741
        WHEN 32 =>    
1742
          IF ctrclk > 0 THEN
1743
            ctrclk := ctrclk - 1;
1744
            ceA1FP <= '0';--acosAx + A12FP => A+FP fertig ************
1745
            stateangle <= 32;
1746
          ELSE        
1747
            cesubA1 <= '1'; --start für PI/2 - A1FP
1748
            ctrclk := clkTOsub;
1749
            stateangle <= 33;
1750
          END IF;  
1751
        WHEN 33 =>      
1752
          IF ctrclk > 0 THEN
1753
            ctrclk := ctrclk - 1;
1754
            cesubA1 <= '0';--PI/2 - A1FP => A1SFP fertig
1755
            stateangle <= 33;
1756
          ELSE    
1757
            cecosFP <= '1'; --Start  für cos(a1FP) & cosFP(a1SFP)
1758
            ctrclk := clkTOcos;
1759
            stateangle <= 34;
1760
          END IF;  
1761
        WHEN 34 =>    
1762
          IF ctrclk > 0 THEN
1763
            ctrclk := ctrclk - 1;
1764
            cecosFP <= '0';--cos(a1FP) & cosFP(a1SFP) =>cosA1FP,sinA1FP fertig
1765
            stateangle <= 34;
1766
          ELSE    
1767
            ceZ1W1 <= '1'; --start für sinA1FP*FL1, cosA1FP * FL1
1768
            ctrclk := clkTOmul;
1769
            stateangle <= 35;
1770
          END IF;
1771
        WHEN 35 =>    
1772
          IF ctrclk > 0 THEN
1773
            ctrclk := ctrclk - 1;
1774
            ceZ1W1 <= '0';--sinA1FP*FL1=> FZ1,cosA1FP * FL1=>FW1  fertig ******
1775
            stateangle <= 35;
1776
          ELSE    
1777
            cezw12 <= '1'; -- start für FZw-Fz1 & LwFP-FW1
1778
            ctrclk := clkTOsub;
1779
            stateangle <= 36;
1780
          END IF;
1781
        WHEN 36 =>    
1782
          IF ctrclk > 0 THEN
1783
            ctrclk := ctrclk - 1;
1784
            cezw12 <= '0';--FZw-Fz1=Z2Z1 & LwFP-FW1=W"W1 fertig
1785
            stateangle <= 36;
1786
          ELSE    
1787
            ceatanZW <= '1';-- start für atan
1788
            ctrclk := clkTOatan;
1789
            stateangle <= 37;
1790
          END IF;
1791
        WHEN 37 =>
1792
          IF ctrclk > 0 THEN
1793
            ctrclk := ctrclk - 1;
1794
            ceatanZW <= '0';-- AtanZW fertig
1795
            stateangle <= 37;
1796
          ELSE  
1797
            cesubA2 <= '1'; -- start für atanZw- a1FP
1798
            ctrclk := clkTOsub;
1799
            stateangle <= 38;
1800
          END IF;
1801
        WHEN 38 =>
1802
          IF ctrclk > 0 THEN
1803
            ctrclk := ctrclk - 1;
1804
            cesubA2 <= '0';-- A2FP fertig ********************
1805
            stateangle <= 38;
1806
          ELSE    
1807
            FXYZaOK <= '1';--RUNANGLE  bereit
1808
            stateangle <= 0;-- alle Achsen fertig
1809
          --Berechnung fertg,wartn auf nächste Start
1810
          END IF;
1811
        WHEN OTHERS  =>
1812
          stateangle <= 0;
1813
      END CASE;
1814
    END IF;-- nrst if/else
1815
  ----END IF; --clk
1816
END PROCESS;-- end runangle
1817
1818
--=======Ende der InversTransformation(IT) Berechnungen, Alle Achsen Winkel in FP Format=====
1819
-- *******Ende der ITP  wird signalisiert mit Impuls fXYZaOK*************************************
1820
--=========================================================================================
1821
--==========================================================================================
1822
-- ITPImpulsGen:
1823
-- Aktuelle Winkel der Achsen A0FP..A5FP(rad) umrechnen in Anzahl 
1824
-- soll-Inkremente:output AXconv:AchsInkr(31 bit),siehe modul AXconv, alle achsen Paralell
1825
-- gespeichert in --AXinc.
1826
---------------------------------------------------------------------------
1827
--TYPE T_Axr  IS ARRAY(5 DOWNTO 0) OF std_logic_vector(15 DOWNTO 0);
1828
--SIGNAL AXGrd    :T_Axr; aktuelle Winkel der Achsen A0..A5 in Grad.x , 
1829
--  *********zum vergleich mit Sketch Simulation **************
1830
----------------------------------------------------------------------------
1831
----SIGNAL AXinc   :T_AXInc;--IS ARRAY(5 DOWNTO 0) OF SLV(31 DOWNTO 0);
1832
-- Aktuelle Winkel der Achsen A0FP..A5FP(rad) umrechnen in Anzahl 
1833
-- soll-Inkremente:output AXconv:AchsInkr(31 bit),siehe modul AXconv, alle achsen Paralell
1834
-- gespeichert in --AXinc :T_AXinc;
1835
------------------------------------------
1836
--SIGNAL AXalt   :T_AXInc;--IS ARRAY(5 DOWNTO 0) OF SLV(31 DOWNTO 0);
1837
  --speichert vorherige wert von AXinc, wird benötig um Differenz  zwischen
1838
  -- den einzelne Sollerte aus AXinc zum
1839
  --SIGNAL vAXdif   :T_AXInc;--IS ARRAY(5 DOWNTO 0) OF SLV(31 DOWNTO 0);
1840
--------------------------------------------------------------------------------
1841
--SIGNAL AXdif  :T_AXdif;--IS ARRAY(5 DOWNTO 0) OF SLV(15 DOWNTO 0);
1842
-- AXdif entspricht vAxdif aber beschränkt auf 16 bit, wird benötigt in 
1843
-- procedur ImpSwitch
1844
1845
--============================================================================ 
1846
ITPImpGen: PROCESS
1847
VARIABLE cntrclk :Integer range 0 to 15:= 0;
1848
VARIABLE strt :STD_LOGIC := '1';
1849
BEGIN
1850
  ----IF rising_edge(clk) THEN
1851
  wait until (rising_edge(clk));
1852
    IF nrst = '0' THEN
1853
      statITPimp <= 0;
1854
      cntrclk := 0;
1855
      XYZcalcok <= '0';
1856
      FOR i IN 0 TO 5 LOOP
1857
        AXalt(i) <= (OTHERS => '0');
1858
        AXdif(i) <= (OTHERS => '0');--
1859
        vAXdif(i) <= (OTHERS => '0');
1860
      END LOOP;
1861
      strt := '0';
1862
    ELSE
1863
     CASE statITPimp IS
1864
      WHEN 0 => -- warten auf start
1865
        IF fXYZaOK = '1' THEN ---wenn Berechnung fertig dann Pulse berchnen
1866
          ceAxx <= '1';--- Start Convert für Alle Achsen A0.. A4
1867
          cntrclk := 6;---anz clk für convert
1868
          statITPimp <= 1;
1869
        ELSE
1870
          IF sitprun = '0'  AND strt = '0' THEN
1871
            strt := '1';--vorbereiten flag für AXalt einlesen
1872
          END IF;
1873
          XYZcalcok <= '0';
1874
          statITPimp <= 0;
1875
        END IF;  
1876
      WHEN 1 => --ausführung Convert (5 clk)
1877
        ceAxx <= '0';
1878
        IF cntrclk = 0 THEN
1879
          statITPimp <= 2;
1880
        ELSE
1881
          cntrclk := cntrclk -1;
1882
          statITPimp <= 1;-- warten bis Convert fertig
1883
        END IF;
1884
      WHEN 2 =>--
1885
        IF  strt= '1' THEN --strt dient der start speicherung von 1. Wert von Axinc in Axalt
1886
          FOR i IN 0 TO 5 LOOP
1887
            AXalt(i)<= AXinc(i);
1888
          END LOOP;
1889
        END IF;
1890
        statITPimp <= 3;-- warten  auf nächste
1891
      WHEN 3 =>
1892
        strt := '0';-- reset strt, erste wert von AXinc ist gespeichert  in Axalt
1893
        -----------------------------------------------------
1894
        FOR i IN 0 TO 5 LOOP
1895
          vAXdif(i) <= std_logic_vector(signed(AXinc(i)) - signed(AXalt(i)));-- Differenz errechnen inn 32 bit
1896
          AXdif(i)<= std_logic_vector(signed(vAXdif(i)(15 DOWNTO 0)));--beschränken auf 16 bit, wird im ImpSwitch
1897
        END LOOP;
1898
        ------------------------
1899
        statITPimp <= 4;
1900
      WHEN 4 =>
1901
        FOR i IN 0 TO 5 LOOP -- speichern der vorherige AXinc wert
1902
          AXalt(i) <= AXinc(i);
1903
        END LOOP;
1904
        XYZcalcok <= '1';-- umrechnung fertig
1905
        statITPimp <= 0;-- warten  auf nächste Lk impuls
1906
      WHEN OTHERS =>
1907
        statITPimp <= 0;  
1908
     END CASE;
1909
  END IF; -- if nrst/else
1910
  -----END IF; -- clk
1911
END PROCESS;--end ITPImpGEn
1912
--=======================================================
1913
--=========================
1914
--TestOutput: PROCESS(sqadd1,mul12,mulres1,sqsub1,ax,acosAX,A12FP,cosA1FP,sinA1FP,
1915
--  Fw1,Fz1,subATAW,subPIdiv,cesqL,FL1,FL12)
1916
testOutput:PROCESS
1917
BEGIN
1918
  ---IF rising_edge(clk) THEN
1919
  wait until (rising_edge(clk));
1920
    IF nrst = '0' THEN
1921
      testdata <= (OTHERS => '0');
1922
    ELSE
1923
      -- 16 bit  daten für testoutput
1924
      testdata(0) <=  sqadd1(0);-- A0
1925
      testdata(1) <=  mul12(0);--
1926
      testdata(2) <=  mulres1(0);--
1927
      testdata(3) <=  sqsub1(0);--
1928
      testdata(4) <=  ax(0);--
1929
      testdata(5) <=  acosAX(0);--
1930
      testdata(6) <=  A12FP(0);--
1931
      testdata(7) <=  cosA1FP(0);--
1932
      testdata(8) <=  sinA1FP(0);--
1933
      testdata(9) <=  Fw1(0);--
1934
      testdata(10) <= FZ1(0);--
1935
      testdata(11) <= subATAW(0);--
1936
      testdata(12) <= subPIdiv(0);--
1937
      testdata(13) <= cesqL;--
1938
      testdata(14) <= FL1(0);--
1939
      testdata(15) <= FL12(0);--
1940
    END IF;
1941
  ----END IF;
1942
END PROCESS;
1943
--==========================================================================
1944
--========================================================
1945
1946
--==============================================================
1947
---**************************************************************
1948
--------------IntToFP für ITP FrqPERIOD, Start mit frqpos------
1949
---cfrqFP: IntToFP port map(a=>frqPER,clk=>clk,ce=>cefrqFp,result=>frqFP);
1950
--====================================================================
1951
-------------------- initITP ------------------------------------------
1952
------XYZT => FPx..FPz, FPLk-----Initialisierung beim neuen Satz--------
1953
cXTFP: IntToFP port map(a=>XT,clk=>clk,ce=>ceXYZF,result=>FXt);
1954
cYTFP: IntToFP port map(a=>YT,clk=>clk,ce=>ceXYZF,result=>FYt); 
1955
cZTFP: IntToFP port map(a=>ZT,clk=>clk,ce=>ceXYZF,result=>FZt);
1956
-------------sqFxt := FXt^2 state 3-------------------------------------------
1957
cmulsqX: mulFP port map(a=>FXt,b=>FXt,clk=>clk,ce=>cesqXYZ,result=>sqFxt);
1958
cmulsqY: mulFP port map(a=>FYt,b=>FYt,clk=>clk,ce=>cesqXYZ,result=>sqFyt);
1959
cmulsqZ: mulFP port map(a=>FZt,b=>FZt,clk=>clk,ce=>cesqXYZ,result=>sqFzt);
1960
--------------addXY := sqFxt + sqFYt state 4------------------------------------------
1961
caddXY: addFP port map(a=>sqFXt,b=>sqFYt,clk=>clk,ce=>ceaddXY,result=>addXY);
1962
--------------addXYZ := addXY + sqFZt ------------------------------------------
1963
caddXYZ: addFP port map(a=>addXY,b=>sqFZt,clk=>clk,ce=>ceaddXYZ,result=>addXYZ);
1964
----------------FLk := sqrt(addXYZ),FLT:=sqrt(addXY)----state6--------------------
1965
csqrtFLT: sqrtFP port map(a=>addXY,clk=>clk,ce=>cesqrtFLk,result=>FLT);
1966
csqrtFLk: sqrtFP port map(a=>addXYZ,clk=>clk,ce=>cesqrtFLk,result=>FLk);
1967
-------------------------------------------------------------------------------
1968
cFPToInt: FPtoInt32 port map(a=>FLk,clk=>clk,ce=>ceFlkInt,result=>Lk);-- Flk  in Integer32 slv
1969
------------------------------------------------------------------------------
1970
cXTLTdiv:  divFP port map(a=>FXT,b=>FLT,clk=>clk,ce=>ceFlkInt,result=>XTLTdiv);
1971
------------------AT FP Berechnen-State 10----------------------------
1972
cacosAT: ArcCosFP  port map(nrst=>nrst,clk=>clk,ceacos=>cetgAT,aInp=>XTLTdiv,acos=>ATFP);--ATFP :=acos(XT/LT)
1973
-----------------  AZ FP Berechnen ---------------------------------------
1974
ccmpAT:   cmpgr port map(a=>ATFP,b=>PIdiv2,clk=>clk,ce=>cecmpAT,result=>ATgrPI2);-- wird in RUNANGLE Gebraucht
1975
catgAZT:  atanFP port map(nrst=>nrst,clk=>clk,ceatan=>cetgAT,Xinp=>FLT,Yinp=>FZT,atanFP=>AZFP);
1976
--------------------- ende initITPlin ---------------------------------------------
1977
1978
--*******************************************************************************
1979
--====================================================================================
1980
---------------RUNANGLE -----------------------------------
1981
-----------Xa,Ya,,Za => FP----------------------------------state 0-----------        
1982
cXaFP  :  IntToFP port map(a=>Xa,clk=>clk,ce=>cexyzFP,result=>FXa);
1983
cYaFP  :  IntToFP port map(a=>Ya,clk=>clk,ce=>cexyzFP,result=>FYa);
1984
cZaFP  :  IntToFP port map(a=>Za,clk=>clk,ce=>cexyzFP,result=>FZa);
1985
cL3FP:   Int16ToFP port map(a=>L3,clk=>clk,ce=>cexyzFP,result=>FL3);
1986
------------PIAZ:=Pi/2-AZFP, PIAT:=Pi/2-ATFP---------------state 0 --------
1987
csubPIAZ: subFP port map(a=>PIdiv2,b=>AZFP,clk=>clk,ce=>ceXYZFP,result=>PIAZ);
1988
csubPIAT: subFP port map(a=>ATFP,b=>PIdiv2,clk=>clk,ce=>ceXYZFP,result=>suPIAT);
1989
caddPIAT: addFP port map(a=>PIdiv2,b=>ATFP,clk=>clk,ce=>ceXYZFP,result=>adPIAT);
1990
----------If ATFP > pI/2 then PIAT := suPIAT else PIAT:= adPiAT --- Starte 18, 19
1991
---- siehe InitITP xyz  state 11-----------------------------------
1992
---------sub: Pi/2 -PIAT ------------------------------------ State 2-------  
1993
csubSAT: subFP port map(a=>PIdiv2,b=>PIAT,clk=>clk,ce=>cePI2,result=>sPIAT);
1994
------A0FP:= atan(FYa/FXa) and cosFP: PIAZ,AZFP,PIAT,SPIAT -----state 3-----
1995
ctanYX:  atanFP port map(nrst=>nrst,clk=>clk,ceatan=>cetgFP,Xinp=>FXa,Yinp=>FYa,atanFP=>A0FP);
1996
csinAZ:  cosFP  port map(nrst=>nrst,clk=>clk,cecos=>cetgFP,ainp=>PIAZ,cos=>sinAZ);
1997
ccosAZ:  cosFP  port map(nrst=>nrst,clk=>clk,cecos=>cetgFP,ainp=>AZFP,cos=>cosAZ);
1998
ccosAT:  cosFP  port map(nrst=>nrst,clk=>clk,cecos=>cetgFP,ainp=>PIAT,cos=>cosAT);
1999
csinAT:  cosFP  port map(nrst=>nrst,clk=>clk,cecos=>cetgFP,ainp=>sPIAT,cos=>sinAT);
2000
--------------mul: sinAZ * sinAT, sinAZ * cosAT----------------- state9 -------
2001
cmul90: mulFP port map(a=>sinAZ,b=>sinAT,clk=>clk,ce=>cemul9,result=>sAZAT);
2002
cmul91: mulFP port map(a=>sinAZ,b=>cosAT,clk=>clk,ce=>cemul9,result=>cAZAT);
2003
--------------mul: sAZAT * L3, cAZAT * L3 ----------------------state10 ------
2004
csAZAT: mulFP port map(a=>sAZAT,b=>FL3,clk=>clk,ce=>cemul10,result=>sAZAT3);
2005
ccAZAT: mulFP port map(a=>cAZAT,b=>FL3,clk=>clk,ce=>cemul10,result=>cAZAT3);
2006
ccAZAZ: mulFP port map(a=>cosAZ,b=>FL3,clk=>clk,ce=>cemul10,result=>cAZAZ3);
2007
------------sub: FXa-sAZAT3,FYa - cAZAT3, FZa - cosAZ ----State 11 -----------
2008
caddFXw: addFP port map(a=>FXa,b=>sAZAT3,clk=>clk,ce=>cesubW,result=>aFXw);
2009
csubFXw: subFP port map(a=>FXa,b=>sAZAT3,clk=>clk,ce=>cesubW,result=>sFXw);
2010
------
2011
csubFYw: subFP port map(a=>FYa,b=>cAZAT3,clk=>clk,ce=>cesubW,result=>FYw);
2012
caddFZw: addFP port map(a=>FZa,b=>cAZAZ3,clk=>clk,ce=>cesubW,result=>FZw);
2013
2014
------------sq : FXw, FYw ,sub ATFP-AWFP=subATAW---------------State 12 --------
2015
csqXw: mulFP port map(a=>FXw,b=>FXw,clk=>clk,ce=>cemul12,result=>sqXw);
2016
csqYw: mulFP port map(a=>FYw,b=>FYw,clk=>clk,ce=>cemul12,result=>sqYw);
2017
2018
------------ ----------------------------state 13 -----------
2019
caddXYw: addFP port map(a=>sqXw,b=>sqYw,clk=>clk,ce=>ceaddXYw,result=>sqXYw);
2020
catgAw:  atanFP port map(nrst=>nrst,clk=>clk,ceatan=>ceaddXYw,Xinp=>FXw,Yinp=>FYw,atanFP=>AwFP);
2021
----------------------------------------State 14-------------------------
2022
csqrtLw: sqrtFP port map(a=>sqXYw,clk=>clk,ce=>cesqrtLw,result=>LwFP);
2023
2024
-----------------------------------------State15-------------------
2025
csqZ2: mulFP port map(a=>FZw,b=>FZw,clk=>clk,ce=>cemAZA3,result=>sqZ2);
2026
csqW2: mulFP port map(a=>LwFP,b=>LwFP,clk=>clk,ce=>cemAZA3,result=>sqW2);
2027
csubAWAT: subFP port map(a=>ATFP,b=>AWFP,clk=>clk,ce=>cemAZA3,result=>subATAW);
2028
2029
---------------------------------------- State 16 ----------------
2030
caddWZ: addFP port map(a=>sqZ2,b=>sqW2,clk=>clk,ce=>cedAZA3,result=>sqaddWZ);
2031
csubPIdiv: subFP port map(a=>subATAW,b=>PIdiv2,clk=>clk,ce=>cedAZA3,result=>subPIdiv);--alfa
2032
----------------------------------------- State 17----------------------
2033
catanA12: atanFP port map(nrst=>nrst,clk=>clk,ceatan=>ceA4FP,Xinp=>LwFP,Yinp=>FZw,atanFP=>A12FP);
2034
csqrtWZ: sqrtFP port map(a=>sqaddWZ,clk=>clk,ce=>ceA4FP,result=>FL12);
2035
2036
cdivPIdiv2:  divFP port map(a=>subPIdiv,b=>PIdiv2,clk=>clk,ce=>cedivPIdiv,result=>divPIdiv);
2037
2038
----------------------------- state  18-----------------------------------------
2039
cmulAZFP: mulFP port map(a=>AZFP,b=>divPIdiv,clk=>clk,ce=>ceAZmul,result=>A4FP);
2040
2041
----------------------------- state  19-----------------------------------------
2042
csub1min:  subFP port map(a=>C1,b=>absdivPIdiv,clk=>clk,ce=>cesub1min,result=>sub1min);
2043
----------------------------- state  20-----------------------------------------
2044
cmulAZFPs: mulFP port map(a=>sub1min,b=>AZFP,clk=>clk,ce=>ceA3FP,result=>A3FP);
2045
------------------ende run angle ----------------------------------------------------------
2046
--==================TEST ======================================================================
2047
------------ FXw,FYw,FZw => Xw,Yw,Zw integer  ------------state 18----** für test********
2048
cFPwXtoIntw: FPtoInt32 port map(a=>FXw,clk=>clk,ce=>ceXYZw,result=>Xw);-- FXw in Integer32 Xw slv
2049
cFPwYToIntw: FPtoInt32 port map(a=>FYw,clk=>clk,ce=>ceXYZw,result=>Yw);-- FXw in Integer32 Xw slv
2050
cFPwZToIntw: FPtoInt32 port map(a=>FZw,clk=>clk,ce=>ceXYZw,result=>Zw);-- FXw in Integer32 Xw slv
2051
--======================================================================
2052
cL1FP: Int16ToFP port map(a=>L1,clk=>clk,ce=>ceP1,result=>FL1); --L1:16 bit
2053
cL2FP: int16ToFP port map(a=>L2,clk=>clk,ce=>ceP1,result=>FL2); -- L2 16 biot
2054
-------- FL 12 wurde bei RUNANGLE bereits berechnet -----------------------
2055
------------------------------------------------------------------------
2056
csqL1: mulFP port map(a=>FL1,b=>FL1,clk=>clk,ce=>cesqL,result=>sqL1);-- quadrat FL1
2057
csqL2: mulFP port map(a=>FL2,b=>FL2,clk=>clk,ce=>cesqL,result=>sqL2);-- Quadrat FL2
2058
csqL12: mulFP port map(a=>FL12,b=>FL12,clk=>clk,ce=>cesqL,result=>sqL12);-- Quadrat Fl12
2059
cmul12: mulFP port map(a=>FL1,b=>FL12,clk=>clk,ce=>ceadd1,result=>mul12);-- FL1 * FL12 => mul12
2060
---------------------
2061
cadd12: addFP port map(a=>sqL1,b=>sqL12,clk=>clk,ce=>ceadd1,result=>sqadd1);
2062
csub12: subFP port map(a=>sqadd1,b=>sqL2,clk=>clk,ce=>cesub1,result=>sqsub1);
2063
---------------------------
2064
cmulres1: mulFP port map(a=>mul12,b=>C2,clk=>clk,ce=>cesub1,result=>mulres1);-- mul12 * 2 =>mulres1
2065
cdiv:    divFP port map(a=>sqsub1,b=>mulres1,clk=>clk,ce=>cediv1,result=>ax);
2066
----------------------ax fertig berechnet-----------------------------------
2067
ccosAX: ArcCosFP  port map(nrst=>nrst,clk=>clk,ceacos=>ceacosFP,aInp=>AX,acos=>acosAX);
2068
caddA1: addFP port map(a=>acosAX,b=>A12FP,clk=>clk,ce=>ceA1FP,result=>A1FP);
2069
----------------------- a1CFP:=Pi/2 - A1FP---------state 8--------------------
2070
csubA1:   subFP port map(a=>PIdiv2,b=>A1FP,clk=>clk,ce=>cesubA1,result=>A1SFP);
2071
----------------------cos/sin +FP ------------------state 9----------------
2072
ccosFp:  cosFP  port map(nrst=>nrst,clk=>clk,cecos=>cecosFP,ainp=>A1FP,cos=>cosA1FP);
2073
csinFp:  cosFP  port map(nrst=>nrst,clk=>clk,cecos=>cecosFP,ainp=>A1SFP,cos=>sinA1FP);
2074
----------------------mul--------------------------state 10 ---------------------
2075
cmulW1: mulFP port map(a=>cosA1FP,b=>FL1,clk=>clk,ce=>ceZ1W1,result=>FW1);
2076
cmulZ1: mulFP port map(a=>sinA1FP,b=>FL1,clk=>clk,ce=>ceZ1W1,result=>FZ1);
2077
-------- Blatt 1 calcP1 fertig -----Blatt2 calpP+ : Berechnung A2-----
2078
csubZ2Z1: subFP port map(a=>FZw,b=>FZ1,clk=>clk,ce=>ceZW12,result=>Z2Z1);
2079
csubW2W1: subFP port map(a=>LwFP,b=>FW1,clk=>clk,ce=>ceZW12,result=>W2W1);
2080
----------------------- state  ------------------------------  
2081
catgZW:  atanFP port map(nrst=>nrst,clk=>clk,ceatan=>ceatanZw,Xinp=>w2w1,Yinp=>z2z1,atanFP=>AtanZW);
2082
-----------------state ----------------------------------------
2083
csubA2: subFP port map(a=>atanZW,b=>A1FP,clk=>clk,ce=>cesubA2,result=>A2FP);
2084
------------------end RUNANGLE--------------------------------------------
2085
--*****************************************************************************
2086
--==================ITPImpGen -------------------------------------------------
2087
2088
------------------ convert Winkel DakrAx,InkrAX--------------------------
2089
cA0conv: AxConv port map(nrst=>nrst,clk=>clk,ceConv=>ceAxx,AFPinp=>A0FP,Resol=>C_A0rad,
2090
    AchsInkr=>AXInc(0),AXGrd=>AXGr(0));--A0
2091
cA1conv: AxConv port map(nrst=>nrst,clk=>clk,ceConv=>ceAxx,AFPinp=>A1FP,Resol=>C_A1rad,
2092
    AchsInkr=>AXInc(1),AXGrd=>AXGr(1));--A1
2093
cA2conv:  AxConv port map(nrst=>nrst,clk=>clk,ceConv=>ceAxx,AFPinp=>A2FP,Resol=>C_A2rad,
2094
    AchsInkr=>AXInc(2),AXGrd=>AXGr(2));--A2
2095
cA3conv: AxConv port map(nrst=>nrst,clk=>clk,ceConv=>ceAxx,AFPinp=>A3FP,Resol=>C_A3rad,
2096
    AchsInkr=>AXInc(3),AXGrd=>AXGr(3));--A3
2097
cA4conv: AxConv port map(nrst=>nrst,clk=>clk,ceConv=>ceAxx,AFPinp=>A4FP,Resol=>C_A4rad,
2098
    AchsInkr=>AXInc(4),AXGrd=>AXGr(4));--A4
2099
cA5conv: AxConv port map(nrst=>nrst,clk=>clk,ceConv=>ceAxx,AFPinp=>A5FP,Resol=>C_A5rad,
2100
    AchsInkr=>AXInc(5),AXGrd=>AXGr(5));--A5
2101
------------------------nur für tests------------------------------
2102
--cA12conv: AxConv port map(nrst=>nrst,clk=>clk,ceConv=>ceAxx,AFPinp=>A12FP,Resol=>A12res,
2103
--Axint=>SA12);
2104
--cATconv: AxConv port map(nrst=>nrst,clk=>clk,ceConv=>ceAxx,AFPinp=>ATFP,Resol=>A12res,Axint=>SAT);
2105
--cAZconv: AxConv port map(nrst=>nrst,clk=>clk,ceConv=>ceAxx,AFPinp=>AZFP,Resol=>A12res,Axint=>SAZ);
2106
--cAwconv: AxConv port map(nrst=>nrst,clk=>clk,ceConv=>ceAxx,AFPinp=>AwFP,Resol=>A12res,Axint=>SAw);
2107
--===============================================================================
2108
-----********************* Div Testwerte ************************************
2109
---- test ArcTang--------------------
2110
-- Testwert tgFP=500/3000=0.1666666 =X"3e2aaaab"
2111
-- Test Resultat für versuch mit 0.166666 = 0.16514867740814 =X"3e291cbc"
2112
------------------------------------------------------------------
2113
--- testwert Input: 60grd= 1.0471975512 =X"3F860A92"-------------------------------
2114
----- Output:cos = 0.5=FP :X"3F000000",Testresultat :0.499998986721 
2115
-------------------------
2116
--- +60 Grad Winkel :1.0471975512 rad =  3f860a92,-60 Grad:-1.04.. =bf860a92
2117
---- + 90 Grad = 3fc90fdb , -90 Grd = bfc90fdb
2118
----------------------
2119
----sin :0.86602540379= FP: 3f5db3d7, Testresultat : -----
2120
-------------------------------------------------------------
2121
--input FP-Testwert(XinpCos) für arcsin(0.5)=X"3f000000", Resultat =0.5235987756= X"3F060a92" (FP)
2122
--input FP-Testwert(XinpCos) für arccos(0.5)=X"3f000000", Resultat =1.0471975512= X"3F" (FP)
2123
--========================================================================
2124
2125
end Behavioral;