1 | ----------------------------------------------------------------------------------
|
2 | -- Company:
|
3 | -- Engineer:
|
4 | --
|
5 | -- Create Date: 09:36:37 08/20/2024
|
6 | -- Design Name:
|
7 | -- Module Name: runangle - Behavioral
|
8 | -- Project Name:
|
9 | -- Target Devices:
|
10 | -- Tool versions:
|
11 | -- Description:
|
12 | --
|
13 | -- Dependencies:
|
14 | --
|
15 | -- Revision:
|
16 | -- Revision 0.01 - File Created
|
17 | -- Additional Comments:
|
18 | --
|
19 | ----------------------------------------------------------------------------------
|
20 | library IEEE;
|
21 | use IEEE.STD_LOGIC_1164.ALL;
|
22 | use IEEE.NUMERIC_STD.ALL;
|
23 |
|
24 |
|
25 | entity runangle is
|
26 | port (nrst : in std_logic;
|
27 | clk : in std_logic;
|
28 | -- XS :in std_logic_vector(31 downto 0);-- Startpunkt Koordinate X
|
29 | -- YS :in std_logic_vector(31 downto 0);-- Startpunkt Koordinate Y
|
30 | -- ZS :in std_logic_vector(31 downto 0);-- Startpunkt Koordinate Z
|
31 | -- XT :in std_logic_vector(31 downto 0);-- Koordinate X relativ (XE-XS)
|
32 | -- YT :in std_logic_vector(31 downto 0);-- Koordinate Y relativ (YE-YS)
|
33 | -- ZT :in std_logic_vector(31 downto 0);-- Koordinate Z relativ (ZE-ZS)
|
34 | -- pfrq :in std_logic_vector(23 downto 0);--Bahn-Periode in anzahl CLK
|
35 | -- L1 :in std_logic_vector(15 downto 0);-- länge Arm1 in mm
|
36 | -- L2 :in std_logic_vector(15 downto 0);-- länge Arm2 in mm
|
37 | -- L3 :in std_logic_vector(15 downto 0);-- länge Arm3 in mm
|
38 | ---------------------
|
39 | -- Xlin :in std_logic_vector(15 downto 0);-- Koord LinStz
|
40 | -- Ylin :in std_logic_vector(15 downto 0);-- Max.Eingabe +/-327.67
|
41 | -- ebene :in std_logic_vector(3 downto 0);--interpolationsebene für LinSatz
|
42 | -- Xactiv :in std_logic;
|
43 | -- Yactiv :in std_logic;
|
44 | -- celin :in std_logic;---start interpolation für linstz in einer ebene
|
45 | --------------------------------------
|
46 | -- stopp :in std_logic;-- stop interpolation,(stopp+) nach Endlage
|
47 | -- RampRun :in std_logic;-- rampe aktiv =1
|
48 | strimp :in std_logic;-- start interpolation
|
49 | -- ce :in std_logic;-- start interpolation von kreis oder XYZ Satz : InversTransf
|
50 | -----------------------------
|
51 | -- calcok :out std_logic:= '0';-- signalisiert alle berechnungen sind fertig
|
52 | -- XAout :out std_logic_vector(31 downto 0):=X"00000000";--virtuelle aktuelle koordinate
|
53 | -- YAout :out std_logic_vector(31 downto 0):=X"00000000";
|
54 | -- ZAout :out std_logic_vector(31 downto 0):=X"00000000";
|
55 | -- ITPmod :out std_logic_vector(2 DOWNTO 0):="000";--ITP für Status Meldung an CPU
|
56 | -- oAXdif :out std_logic_vector(95 downto 0):= (OTHERS => '0');--Sollwertdiff(16Bit) von inv.Transfer und Lin
|
57 | -- oImpLk :out std_logic:='1';--impulse von xyz itp
|
58 | -- enditp :out std_logic:='0';-- ende von Kontur:=0 (enditp-)
|
59 | -- itprun :out std_logic:='0';-- =1:interpolator läuft,aktuelle Sollwerte in oAXinkr(6x 32bit)
|
60 | -- testdata :out std_logic_vector(15 downto 0):= X"0000";
|
61 |
|
62 |
|
63 | ImpLk : in std_logic
|
64 | );
|
65 |
|
66 | end runangle;
|
67 |
|
68 | architecture Behavioral of runangle is
|
69 |
|
70 | CONSTANT clkToFP : integer range 0 to 127 := 1;
|
71 | CONSTANT clkTosq : integer range 0 to 127 := 1;
|
72 | CONSTANT clkTomul : integer range 0 to 127 := 1;
|
73 | CONSTANT clkToadd : integer range 0 to 127 := 1;
|
74 | CONSTANT clkTosub : integer range 0 to 127 := 1;
|
75 | CONSTANT clkTosqrt : integer range 0 to 127 := 1;
|
76 | CONSTANT clkTodiv : integer range 0 to 127 := 2;
|
77 | CONSTANT clkFPtoInt : integer range 0 to 127 := 1;
|
78 | CONSTANT clkToAtan : integer range 0 to 127 := 25;
|
79 | CONSTANT clkToAcos : integer range 0 to 127 := 25;
|
80 | CONSTANT clkToCos : integer range 0 to 127 := 25;
|
81 | CONSTANT clkAtan : integer range 0 to 127 := 30;
|
82 | CONSTANT clkAtan32 : integer range 0 to 127 := 11;
|
83 | CONSTANT clkdiv32 : integer range 0 to 127 := 32;
|
84 |
|
85 | CONSTANT clkTosin : integer range 0 to 127 := 1;
|
86 | CONSTANT clkToMuli : integer range 0 to 127 := 2;
|
87 | CONSTANT C2 :std_logic_vector(31 DOWNTO 0):=X"40000000";-- zahl 2 in FP format 32bit
|
88 | CONSTANT C1 :std_logic_vector(31 DOWNTO 0):=X"3F800000";-- zahl 1 in FP format 32bit
|
89 | CONSTANT C0 :std_logic_vector(31 DOWNTO 0):=X"00000000";-- zahl 0 in FP format 32bit
|
90 | CONSTANT PIdiv2 :std_logic_vector(31 DOWNTO 0):=X"3FC90FDB";-- +1.57079632679 PI/2 in FP Format
|
91 | CONSTANT PIndiv2 :std_logic_vector(31 DOWNTO 0):=X"BFC90FDB";-- -1.57079632679 PI/2 in FP Format
|
92 | CONSTANT PI :std_logic_vector(31 DOWNTO 0):=X"40490FDB";-- 3.14159265359 PI in FP Format
|
93 |
|
94 | -------
|
95 | CONSTANT C132 :std_logic_vector(31 DOWNTO 0):=X"20000000";--zahl 1 in format 1Q32 bit
|
96 | CONSTANT C126 :std_logic_vector(25 DOWNTO 0):="01" & X"000000";--zahl 1 in format 1Q26 bit
|
97 | CONSTANT C026 :std_logic_vector(25 DOWNTO 0):="00" & X"000000";-- zahl 0 in FP format 26bit
|
98 | CONSTANT Pihalf :std_logic_vector(25 DOWNTO 0):="001" & "10010010000111111011000";--Pi Half in 2Q26
|
99 |
|
100 | SIGNAL stateangle :integer range 0 to 63;
|
101 |
|
102 | SIGNAL ctrPLk :Integer range 0 to 33554431;-- dekr. Counter für Imp. Periode
|
103 | --SIGNAL ImpLk :std_logic;-- inkrement virtuelle Lk Impuls von XYZ ITP (invers Trans)
|
104 | SIGNAL grPI2 :std_logic;
|
105 |
|
106 | -----RUNANGLE Berechnung : a0 := arctan(Ya/Xa) und aXYT:=arctan(YT/XT) Berechnung-------------------------------
|
107 | SIGNAL ceXYZFP :std_logic;
|
108 |
|
109 | -----------------------state 0---------------------
|
110 | SIGNAL FXYZaOK :std_logic;--signalisiert wenn FXYZa bereit
|
111 | SIGNAL suPIAT :std_logic_vector(31 downto 0);
|
112 | SIGNAL adPIAT :std_logic_vector(31 downto 0);
|
113 | ----------------- state 2----------------------------------
|
114 | SIGNAL cePI2 :std_logic;-- start für sPIAT := PI/2 - PIATabs für sin AT
|
115 | SIGNAL PIAT :std_logic_vector(31 downto 0);
|
116 | ---------------- state 3 ----------------------------------
|
117 | SIGNAL cetgFP :std_logic;
|
118 | -----------------State 9 ---------------------------------
|
119 | SIGNAL cemul9 :std_logic;
|
120 | -----------------State 10 -----------------------------------
|
121 | SIGNAL cemul10 :std_logic;
|
122 | -----------------State 11---------------------------
|
123 | SIGNAL cesubW :std_logic:='0';
|
124 | SIGNAL aFXw :std_logic_vector(31 downto 0);--
|
125 | SIGNAL sFXw :std_logic_vector(31 downto 0);--
|
126 | SIGNAL FXw :std_logic_vector(31 downto 0);--
|
127 | ---------------- State 12------------------------------
|
128 | SIGNAL cemul12 :std_logic;
|
129 | ---------------state 13-----------------------------------
|
130 | SIGNAL ceaddXYw :std_logic;
|
131 | ---------------- State 14 ---------------------------------
|
132 | SIGNAL cesqrtLw :std_logic;
|
133 | SIGNAL cemAZA3 :std_logic;
|
134 | SIGNAL DivPIdiv :std_logic_vector(31 downto 0);--
|
135 | ------------------state 15----------------------------
|
136 | SIGNAL cedAZA3 :std_logic;
|
137 | ------------------state 16 -----------------------------------
|
138 | SIGNAL cedivPIdiv :std_logic;
|
139 | SIGNAL ceA4FP :std_logic;
|
140 | ----------------- state 17 -----------------------------------
|
141 | SIGNAL ceAZmul :std_logic;
|
142 | ----------------- state 18 --------------------------------
|
143 | SIGNAL absdivPIdiv :std_logic_vector(31 downto 0);--
|
144 | ----------------- state 19 --------------------------------
|
145 | SIGNAL cesub1min :std_logic;
|
146 | ----------------- state 20 --------------------------------
|
147 | SIGNAL ceA3FP :std_logic;
|
148 |
|
149 | ----------------state 22-- nur für test -----------------
|
150 | SIGNAL ceXYZw :std_logic;
|
151 |
|
152 | SIGNAL ceP1 :std_logic;--start sq für P1
|
153 | SIGNAL cesqL :std_logic;
|
154 |
|
155 | SIGNAL ceadd1 :std_logic;
|
156 | SIGNAL cesub1 :std_logic;
|
157 |
|
158 | SIGNAL cediv1 :std_logic;
|
159 | ---------------------------
|
160 | SIGNAL ceacosFP :std_logic;-- Start arccosFP
|
161 | SIGNAL ceA1FP :std_logic;
|
162 | SIGNAL cesubA1 :std_logic;
|
163 | SIGNAL cecosFP :std_logic;
|
164 |
|
165 | ------ RUNANGLE vorher Calc P1 blatt1 fertig, Blatt2 anfang
|
166 | SIGNAL ceZW12 :std_logic;
|
167 | SIGNAL ceatanZW :std_logic;
|
168 | SIGNAL cesubA2 :std_logic;
|
169 |
|
170 | ---------------------
|
171 | SIGNAL ceZ1W1 :std_logic;
|
172 |
|
173 | begin
|
174 | runangle:PROCESS
|
175 | VARIABLE ctrclk :INTEGER RANGE 0 TO 127:= 0;
|
176 | VARIABLE startON :std_logic:= '0';
|
177 | BEGIN
|
178 | wait until (rising_edge(clk));
|
179 |
|
180 | IF nrst = '0' THEN
|
181 | stateangle <= 0;
|
182 | ctrclk := 0;
|
183 | FXYZaOK <= '0';
|
184 | ceXYZFP <= '0'; cetgFP<='0'; cemul9<='0'; cemul10<='0';
|
185 | cesubW <='0'; cePI2 <='0';
|
186 | cemAZA3 <= '0';cedAZA3 <= '0';cedivPIdiv<='0'; ceAZmul<= '0';
|
187 | cesub1min <= '0';ceA3FP<='0';
|
188 | ceA4FP <='0'; cetgFP <= '0';
|
189 | ceP1 <= '0';
|
190 | cesqL <= '0'; ceadd1 <= '0'; cesub1<= '0';
|
191 | cediv1 <= '0'; ceacosFP <= '0'; ceA1FP <='0';
|
192 | cecosFP <= '0'; ceZ1W1 <= '0'; cesubA1 <= '0';
|
193 | startON := '0';
|
194 | ELSE
|
195 | CASE stateangle IS
|
196 | WHEN 0 =>
|
197 | IF (ImpLk = '0') THEN
|
198 | ceXYZFP <= '1';--Start für Xa,Ya,Zz=>FP, und Pi/2-AZFP,Pi/2 +/- ATFP
|
199 | ctrclk := clkToFP;
|
200 | stateangle <= 1;
|
201 | ELSE
|
202 | FXYZaOK <= '0'; --reset
|
203 | stateangle <= 0;-- warten auf LK Impuls
|
204 | END IF;
|
205 | WHEN 1 => -- ausführen Xa,Ya,Zz=>FP und Pi/2-AZFP,Pi/2 +/- ATFP
|
206 | IF ctrclk > 0 THEN
|
207 | ctrclk := ctrclk -1;
|
208 | ceXYZFP <= '0';--reset CE
|
209 | stateangle <= 1;
|
210 | ELSE
|
211 | StartON := '1';
|
212 | stateangle <= 2;
|
213 | END IF;
|
214 | WHEN 2 => -- zwischen state notwendig****
|
215 | IF grPI2 = '1' THEN -- wenn AT > PI/2 dann sub PI/2 sonst ADD
|
216 | PIAT <= suPIAT;
|
217 | ELSE PIAT <= adPIAT;
|
218 | END IF;
|
219 | stateangle <= 3;
|
220 | WHEN 3 => -- zwischen state notwendig ****
|
221 | cePI2 <= '1';
|
222 | ctrclk := clkTosub;
|
223 | stateangle <= 4;
|
224 | WHEN 4 => --ausführen PIAZ :=PI/2 - PIAT
|
225 | IF ctrclk > 0 THEN
|
226 | ctrclk := ctrclk -1;
|
227 | cePI2 <= '0';-- reset
|
228 | stateangle <= 4;
|
229 | ELSE
|
230 | ctrclk := 35;--clk Atan für durchlauf ******
|
231 | ceTgFP <= '1'; --arcTang und cos starten
|
232 | stateangle <= 5;
|
233 | END IF;
|
234 | WHEN 5 => --Ausführen A0FP:=atan(Ya/Xa),und Cos(4 bml), A=FP fertig*****
|
235 | IF ctrclk > 0 THEN
|
236 | ctrclk := ctrclk -1;
|
237 | ceTgFP <= '0'; --Reset ArcTang start Impuls
|
238 | stateangle <= 5;
|
239 | ELSE --tanYX , ATFP,AZFP fertig
|
240 | cemul9 <= '1';-- start sinAZ* sinAT, sinAZ* cosAT
|
241 | ctrclk := clkTomul;
|
242 | stateangle <= 9;
|
243 | END IF;
|
244 | WHEN 9 => -- ausführen; sinAZ* sinAT, sinAZ* cosAT
|
245 | IF ctrclk > 0 THEN
|
246 | ctrclk := ctrclk -1;
|
247 | cemul9 <= '0';--reset
|
248 | stateangle <= 9;
|
249 | ELSE
|
250 | ctrclk := clkTomul;
|
251 | cemul10 <= '1'; --start sAZAT* FL3, cAZAT* FL3
|
252 | stateangle <= 10;
|
253 | END IF;
|
254 | WHEN 10 => --ausführen sAZAT* FL3, cAZAT* FL3
|
255 | IF ctrclk > 0 THEN
|
256 | ctrclk := ctrclk -1;
|
257 | cemul10 <= '0';-- reset
|
258 | stateangle <= 10;
|
259 | ELSE
|
260 | ctrclk := clkTosub;
|
261 | ceSubw <= '1'; -- Start für sub/add FXa -/+ sAZAT3 usw
|
262 | stateangle <= 11;
|
263 | END IF;
|
264 | WHEN 11 => -- ausführen sub/add FXa -/+ sAZAT3.. = FYw,FZw fertig
|
265 | IF ctrclk > 0 THEN
|
266 | ctrclk := ctrclk -1;
|
267 | ceSubw <= '0';-- reset
|
268 | stateangle <= 11;
|
269 | ELSE
|
270 | stateangle <= 12;
|
271 | END IF;
|
272 | WHEN 12 =>-- für test
|
273 | stateangle <= 13;
|
274 | WHEN 13 => -- zwischen state notwendig ***
|
275 | IF grPI2 = '1' THEN
|
276 | FXw <= aFXw;
|
277 | ELSE FXw <= sFXw;
|
278 | END IF;
|
279 | ctrclk := clkTosq;
|
280 | cemul12 <= '1'; --Start für sqXw:=sq(FXw),sqYw:=sq(FYw) und ATPI:= ATFP-PI/2
|
281 | stateangle <= 15; ---FXW fertig Berechnet
|
282 | ----------------state reserve----------------------------
|
283 | WHEN 15 => --- Ausführen Fxw^2,FYw^2
|
284 | IF ctrclk > 0 THEN
|
285 | ctrclk := ctrclk -1;
|
286 | cemul12 <= '0';-- reset
|
287 | stateangle <= 15;
|
288 | ELSE
|
289 | stateangle <= 16;
|
290 | END IF;
|
291 | WHEN 16 =>
|
292 | ceXYZw <= '1';---für test ***** XYZ W ***********************
|
293 | stateangle <= 17;
|
294 | -----Blatt6:csqXw,csqYw, Blatt5: csubAwAt-- gestartet mit cemul12 ----------------
|
295 | WHEN 17 => -- ausführen sqXw:=sq(FXw),sqYw:=sq(FYw)
|
296 | ctrclk := 23;-- 22 clk für atan
|
297 | ceXYZw <= '0'; -- reset
|
298 | ceaddXYw <= '1'; --start fürAwFP:=atan(FYw/FXw) und sqXYW:=sqXw+SqYw,subPIDIV0subAtAW-pIDIV0
|
299 | stateangle <= 18;
|
300 | -----Blatt6: catgAw (22clk),caddXYw, Blatt5:csubPidiv--- gestartet mit ceaddXYw---------
|
301 | WHEN 18 =>-- ausführen AwFP:=atan(FYw/FXw) und sqXYW:=sqXw+ SqYw,subPidiv=subAtAw-PIdiv2
|
302 | IF ctrclk > 0 THEN
|
303 | ctrclk := ctrclk -1;
|
304 | ceaddXYw <= '0'; --reset
|
305 | stateangle <= 18;
|
306 | ELSE
|
307 | cesqrtLw <= '1'; --start LwFP:=sqrt(sqXYw) und subPIdiv= subATAW-pidIV2
|
308 | ctrclk := clkTosq;
|
309 | stateangle <= 19;
|
310 | END IF;
|
311 | ------Blatt6:csqrtLW, Blatt5 :cdivPIdiv2-- gestartet mit cesqrtLW ---------
|
312 | WHEN 19 => --ausführen LwFP:= sqrt(sqXYw),LWFP fertig, subPidiv=subAtAw-PIdiv2
|
313 | IF ctrclk > 0 THEN
|
314 | ctrclk := ctrclk - 1;
|
315 | cesqrtLw <= '0';-- reset
|
316 | stateangle <= 19;
|
317 | ELSE
|
318 | cemAzA3 <= '1'; --start AtFp-AwFp
|
319 | absDivPIdiv <= DivPIdiv;--absDivPiDiv vorläaufig setzen
|
320 | ctrclk := clkTosub;
|
321 | stateangle <= 22;
|
322 | END IF;
|
323 | ----reserve state ----------------
|
324 | ----- Blatt5:csqZ2,csqW2,cmuAZFP ---- gestartet mit cemAzA3 ----------------
|
325 | WHEN 22 => --- ausführen sq(FZw),sq(LWFP), mul(AZFP,DivPIdiv)------
|
326 | IF ctrclk > 0 THEN
|
327 | ctrclk := ctrclk - 1;
|
328 | cemAZA3 <= '0'; --reset
|
329 | stateangle <= 22;
|
330 | ELSE
|
331 | cedAZA3 <= '1';--start subAtAw-PIdiv2
|
332 | ctrclk := clkTosub;
|
333 | stateangle <= 23;
|
334 | END IF;
|
335 | ---- Blatt 5:caddWZ, csub1min--- gestartet mit cedAZA3 ---------------
|
336 | WHEN 23 => --- ausführen sqaddWZ=sqZ2 + sqW2,subPIdiv =
|
337 | IF ctrclk > 0 THEN
|
338 | ctrclk := ctrclk - 1;
|
339 | cedAZA3 <= '0';-- reset
|
340 | stateangle <= 23;
|
341 | ELSE
|
342 | cedivPIdiv <= '1';
|
343 | ceA4FP <= '1'; -- start sqrt(sqaddWZ), atan A12,
|
344 | ctrclk := clkToAtan;--clk Atan
|
345 | stateangle <= 24;
|
346 | END IF;
|
347 | --- Blatt5:catanA12,sqrtWZ,cmulAZFP -- gestartet mit ceA4FP -------
|
348 | WHEN 24 => --ausführen atan(FZW,LWFP),divFp,vsqrt(sqaddWZ), mul(sub1min,AZFP)
|
349 | IF ctrclk > 0 THEN
|
350 | ctrclk := ctrclk - 1;
|
351 | ceA4FP <= '0'; --reset
|
352 | cedivPIdiv <= '0';
|
353 | stateangle <= 24;
|
354 | ELSE
|
355 | absdivPIdiv <= divPIdiv;-- vorläufig
|
356 | ceAZmul <= '1';
|
357 | ceP1 <= '1'; -- START intToFP für L1,L2 => FL1,FL2
|
358 | stateangle <= 25;--
|
359 | END IF;
|
360 | WHEN 25 =>
|
361 | IF absDivPidiv(31) = '1' THEN
|
362 | absDivPidiv(31) <= '0';-- Abs von DivPiDiv
|
363 | END IF;
|
364 | ceP1 <= '0';-- FL1,FL2 fertig
|
365 | ceAZmul <= '0';-- a4FP fertig
|
366 | ctrclk := clkTosub;
|
367 | cesub1min <= '1';
|
368 | stateangle <= 26;
|
369 | WHEN 26 =>-- sub1min := 1 - absdivPIdiv
|
370 | IF ctrclk > 0 THEN
|
371 | ctrclk := ctrclk - 1;
|
372 | cesub1min <= '0';
|
373 | stateangle <= 26;
|
374 | ELSE
|
375 | ceA3FP <= '1';-- startsub1min* AZFP => A3FP
|
376 | cesqL <= '1';-- start für FL11^2,Fl2^2,FL12^2
|
377 | ctrclk := clkTomul;
|
378 | stateangle <= 27;
|
379 | END IF;
|
380 | -- Ab hier Funktionen aus calcP1---------------------------------------
|
381 | WHEN 27 => -- A3FP :=sub1min * AZFP, a3FP fertig,FL11^2,Fl2^2,FL12^2
|
382 | IF ctrclk > 0 THEN
|
383 | ctrclk := ctrclk - 1;
|
384 | cesqL <= '0';--FL11^2,Fl2^2,FL12^2=> SqL1,sqL12,sqL2 fertig
|
385 | ceA3FP <= '0';--a3FP fertig
|
386 | stateangle <= 27;
|
387 | ELSE
|
388 | IF strImp = '0' THEN
|
389 | StartON := '0';
|
390 | END IF;
|
391 | ceadd1<= '1'; -- startsqL1+sqL12,Fl12*FL1
|
392 | ctrclk := clkTomul;
|
393 | stateangle <= 28;
|
394 | END IF;
|
395 | WHEN 28 => -- ausführen L1+sqL12,Fl12*FL1
|
396 | IF ctrclk > 0 THEN
|
397 | ctrclk := ctrclk - 1;
|
398 | ceadd1<= '0';--L1+sqL12,Fl12*FL1 fertig
|
399 | stateangle <= 28;
|
400 | ELSE
|
401 | cesub1 <= '1'; -- start für: sqadd1-sqL2, mul12 * 2
|
402 | ctrclk := clkTomul;
|
403 | stateangle <= 29;
|
404 | END IF;
|
405 | WHEN 29 => -- ausführen: sqadd1-sqL2, mul12 * 2
|
406 | IF ctrclk > 0 THEN
|
407 | ctrclk := ctrclk - 1;
|
408 | cesub1 <= '0';--sqadd1-sqL2, mul12 * 2 fertig
|
409 | stateangle <= 29;
|
410 | ELSE
|
411 | cediv1 <= '1'; -- start sqsub1/ mulres1 => ax
|
412 | ctrclk := clkToDiv;
|
413 | stateangle <= 30;
|
414 | END IF;
|
415 | WHEN 30 =>
|
416 | IF ctrclk > 0 THEN
|
417 | ctrclk := ctrclk - 1;
|
418 | cediv1 <= '0';--sqsub1/ mulres1 => ax fertig
|
419 | stateangle <= 30;
|
420 | ELSE
|
421 | ceacosFP <= '1'; -- start für atang( Ax)
|
422 | ctrclk := clkTOacos;
|
423 | stateangle <= 31;
|
424 | END IF;
|
425 | WHEN 31 =>
|
426 | IF ctrclk > 0 THEN
|
427 | ctrclk := ctrclk - 1;
|
428 | ceacosFP <= '0';--atang( Ax) fertig
|
429 | stateangle <= 31;
|
430 | ELSE
|
431 | ceA1FP <= '1'; -- start für acosAx + A12FP
|
432 | ctrclk := clkTOadd;
|
433 | stateangle <= 32;
|
434 | END IF;
|
435 | WHEN 32 =>
|
436 | IF ctrclk > 0 THEN
|
437 | ctrclk := ctrclk - 1;
|
438 | ceA1FP <= '0';--acosAx + A12FP => A+FP fertig ************
|
439 | stateangle <= 32;
|
440 | ELSE
|
441 | cesubA1 <= '1'; --start für PI/2 - A1FP
|
442 | ctrclk := clkTOsub;
|
443 | stateangle <= 33;
|
444 | END IF;
|
445 | WHEN 33 =>
|
446 | IF ctrclk > 0 THEN
|
447 | ctrclk := ctrclk - 1;
|
448 | cesubA1 <= '0';--PI/2 - A1FP => A1SFP fertig
|
449 | stateangle <= 33;
|
450 | ELSE
|
451 | cecosFP <= '1'; --Start für cos(a1FP) & cosFP(a1SFP)
|
452 | ctrclk := clkTOcos;
|
453 | stateangle <= 34;
|
454 | END IF;
|
455 | WHEN 34 =>
|
456 | IF ctrclk > 0 THEN
|
457 | ctrclk := ctrclk - 1;
|
458 | cecosFP <= '0';--cos(a1FP) & cosFP(a1SFP) =>cosA1FP,sinA1FP fertig
|
459 | stateangle <= 34;
|
460 | ELSE
|
461 | ceZ1W1 <= '1'; --start für sinA1FP*FL1, cosA1FP * FL1
|
462 | ctrclk := clkTOmul;
|
463 | stateangle <= 35;
|
464 | END IF;
|
465 | WHEN 35 =>
|
466 | IF ctrclk > 0 THEN
|
467 | ctrclk := ctrclk - 1;
|
468 | ceZ1W1 <= '0';--sinA1FP*FL1=> FZ1,cosA1FP * FL1=>FW1 fertig ******
|
469 | stateangle <= 35;
|
470 | ELSE
|
471 | cezw12 <= '1'; -- start für FZw-Fz1 & LwFP-FW1
|
472 | ctrclk := clkTOsub;
|
473 | stateangle <= 36;
|
474 | END IF;
|
475 | WHEN 36 =>
|
476 | IF ctrclk > 0 THEN
|
477 | ctrclk := ctrclk - 1;
|
478 | cezw12 <= '0';--FZw-Fz1=Z2Z1 & LwFP-FW1=W"W1 fertig
|
479 | stateangle <= 36;
|
480 | ELSE
|
481 | ceatanZW <= '1';-- start für atan
|
482 | ctrclk := clkTOatan;
|
483 | stateangle <= 37;
|
484 | END IF;
|
485 | WHEN 37 =>
|
486 | IF ctrclk > 0 THEN
|
487 | ctrclk := ctrclk - 1;
|
488 | ceatanZW <= '0';-- AtanZW fertig
|
489 | stateangle <= 37;
|
490 | ELSE
|
491 | cesubA2 <= '1'; -- start für atanZw- a1FP
|
492 | ctrclk := clkTOsub;
|
493 | stateangle <= 38;
|
494 | END IF;
|
495 | WHEN 38 =>
|
496 | IF ctrclk > 0 THEN
|
497 | ctrclk := ctrclk - 1;
|
498 | cesubA2 <= '0';-- A2FP fertig ********************
|
499 | stateangle <= 38;
|
500 | ELSE
|
501 | FXYZaOK <= '1';--RUNANGLE bereit
|
502 | stateangle <= 0;-- alle Achsen fertig
|
503 | --Berechnung fertg,wartn auf nächste Start
|
504 | END IF;
|
505 | WHEN OTHERS =>
|
506 | stateangle <= 0;
|
507 | END CASE;
|
508 | END IF;-- nrst if/else
|
509 |
|
510 | END PROCESS;-- end runangle
|
511 |
|
512 | end Behavioral;
|