ITPModul.vhd


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