arcCosFP.vhd


1
----------------------------------------------------------------------------------
2
-- Company:Zuritronic 
3
-- Engineer:a.Kurka 
4
--
5
-- Create Date:   06.05.2021 by a.kurka
6
-- Design Name:     AS21
7
-- Module Name:    arccos - Behavioral 
8
--  modified : 09.05.2021 by a.kurka
9
--
10
----------------------------------------------------------------------------------
11
library IEEE;
12
use IEEE.STD_LOGIC_1164.ALL;
13
use IEEE.STD_LOGIC_ARITH.ALL;
14
use IEEE.STD_LOGIC_UNSIGNED.ALL;
15
16
17
entity arcCosFP is
18
  port(  nrst      : in std_logic;
19
      clk       : in std_logic;
20
      ceacos     : in std_logic;-- startimpuls afkt
21
      ainp      :in std_logic_vector(31 downto 0);-- input afkt FP  format
22
      acos      :OUT std_logic_vector(31 downto 0):=X"00000000"-- output afkt FP  format
23
      );
24
end arcCosFP;
25
26
architecture Behavioral of arcCosFP is
27
28
COMPONENT afkt is
29
  generic(  P0:std_logic_vector(31 downto 0):=X"00000000";
30
        P1:std_logic_vector(31 downto 0):=X"00000000";
31
        P2:std_logic_vector(31 downto 0):=X"00000000";
32
        Q0:std_logic_vector(31 downto 0):=X"00000000";
33
        Q1:std_logic_vector(31 downto 0):=X"00000000";
34
        Q2:std_logic_vector(31 downto 0):=X"00000000"
35
        );
36
  port(  nrst      : in std_logic;
37
      clk       : in std_logic;
38
      ceafkt     : in std_logic;-- startimpuls afkt
39
      Xinp      :in std_logic_vector(31 downto 0);-- input afkt FP  format
40
      aout    :OUT std_logic_vector(31 downto 0)-- output afkt FP  format
41
      );
42
END COMPONENT;
43
-----------------------------------------
44
COMPONENT subFP IS
45
  port (
46
  a: IN std_logic_VECTOR(31 downto 0);
47
  b: IN std_logic_VECTOR(31 downto 0);
48
  clk: IN std_logic;
49
  ce: IN std_logic;
50
  result: OUT std_logic_VECTOR(31 downto 0));
51
END COMPONENT;
52
-----------------------------------------------------
53
COMPONENT sqrtFP IS
54
  port (
55
  a: IN std_logic_VECTOR(31 downto 0);
56
  clk: IN std_logic;
57
  ce: IN std_logic;
58
  result: OUT std_logic_VECTOR(31 downto 0));
59
END COMPONENT;
60
61
----------------------------------------------------
62
COMPONENT mulFP IS
63
  port (
64
  a: IN std_logic_VECTOR(31 downto 0);
65
  b: IN std_logic_VECTOR(31 downto 0);
66
  clk: IN std_logic;
67
  ce: IN std_logic;
68
  result: OUT std_logic_VECTOR(31 downto 0));
69
END COMPONENT;
70
------------------------------------
71
--If a greater then equal then true
72
COMPONENT compFP IS
73
  port (
74
  a: IN std_logic_VECTOR(31 downto 0);
75
  b: IN std_logic_VECTOR(31 downto 0);
76
  clk: IN std_logic;
77
  ce: IN std_logic;
78
  result: OUT std_logic_VECTOR(0 downto 0));
79
END COMPONENT;
80
--========================================================
81
CONSTANT PIdiv2   :std_logic_vector(31 DOWNTO 0):=X"3FC90FDB";--1.57079632679 PI/2 in FP Format
82
CONSTANT C0     :std_logic_vector(31 DOWNTO 0):=X"00000000";-- zahl 0 in FP format 32bit
83
CONSTANT C1     :std_logic_vector(31 DOWNTO 0):=X"3F800000";-- zahl 1 in FP format 32bit
84
CONSTANT C2     :std_logic_vector(31 DOWNTO 0):=X"40000000";-- zahl 2 in FP format 32bit
85
CONSTANT C05     :std_logic_vector(31 DOWNTO 0):=X"3F000000";-- zahl 0.5 in FP format 32bit
86
--==================================================================
87
SIGNAL ce1     :std_logic:= '0';
88
SIGNAL ce2     :std_logic:= '0';
89
SIGNAL ce3     :std_logic:= '0';
90
SIGNAL ce4     :std_logic:= '0';
91
SIGNAL ce5     :std_logic:= '0';
92
SIGNAL C1minX    :std_logic_VECTOR(31 downto 0):=X"00000000";
93
SIGNAL Xinp2    :std_logic_VECTOR(31 downto 0):=X"00000000";
94
SIGNAL ainp05   :std_logic_VECTOR(0 downto 0):=(OTHERS => '0');-- output Compare Input(X) <= 0.5
95
SIGNAL mul2mX    :std_logic_VECTOR(31 downto 0):=X"00000000";
96
SIGNAL C2powX    :std_logic_VECTOR(31 downto 0):=X"00000000";
97
SIGNAL ain    :std_logic_VECTOR(31 downto 0):=X"00000000";
98
SIGNAL sqrt2m  :std_logic_VECTOR(31 downto 0):=X"00000000";
99
SIGNAL aou    :std_logic_VECTOR(31 downto 0):=X"00000000";
100
SIGNAL Xq05    :std_logic_VECTOR(31 downto 0):=X"00000000";
101
SIGNAL Xk05    :std_logic_VECTOR(31 downto 0):=X"00000000";
102
SIGNAL angl1    :std_logic_VECTOR(31 downto 0):=X"00000000";
103
SIGNAL asinX    :std_logic_VECTOR(31 downto 0):=X"00000000";
104
SIGNAL angl2    :std_logic_VECTOR(31 downto 0):=X"00000000";
105
SIGNAL state :INTEGER RANGE 0 TO 15:= 0;
106
--==================================================================
107
begin
108
--------------------------------------------------------------
109
pacos :PROCESS (clk)
110
VARIABLE cntrclk : INTEGER RANGE 0 TO 127:= 0;
111
--variable state :INTEGER RANGE 0 TO 7:= 0;
112
BEGIN
113
  IF rising_edge(clk) THEN
114
    IF nrst = '0' THEN
115
      state <= 0;
116
      cntrclk := 0;
117
      
118
      --(OTHERS => '0');
119
      
120
    ELSE
121
      CASE state IS
122
        WHEN 0 =>
123
          IF ceacos = '1' THEN
124
            ce1 <= '1';-- start für 1-x, x`2, ComP0.5
125
            state <= 1;
126
          ELSE
127
            state <= 0;
128
          END IF;
129
        WHEN 1 => --- Ausführen 1-x,X`2,CompX  
130
            ce1 <= '0';
131
            ce2 <= '1';-- start für mul2mxX,2powX berechnen
132
            state <= 2;
133
        WHEN 2 => ---- mul2mX,2powX fertig
134
            ce2 <= '0';
135
            state <= 3;
136
        WHEN 3 =>
137
          IF ainp05 = "1" THEN
138
            ain <= C1minX;
139
          ELSE
140
            ain <= C2powX;
141
          END IF;
142
            cntrclk := 11;
143
            ce3 <= '1'; --Start für afkt und sqrt
144
            state <= 4;
145
        WHEN 4 => -- ausführung afkt
146
          IF cntrclk = 0 THEN -- dann afkt(x) fertig, sqrt sowieso
147
            IF ainp05 = "1" THEN
148
              Xq05 <= aou;
149
            ELSE
150
              Xk05 <= aou;
151
            END IF;
152
            ce4 <= '1';-- start für angl1,asinX
153
            state <= 5;--
154
          ELSE  
155
            ce3   <= '0';-- reset ce3
156
            cntrclk := cntrclk - 1;
157
            state <= 4;
158
          END IF;  
159
        WHEN 5 =>  -- angl1 ,asinX fertig
160
          ce4 <= '0';
161
          ce5 <= '1';-- start für angl2
162
          state <= 6;
163
        WHEN 6 =>
164
          ce5 <= '0'; --reset
165
          state <= 7;
166
        WHEN 7 =>
167
          IF ainp05 = "1" THEN
168
            acos <= angl1;
169
          ELSE
170
            acos <= angl2;
171
          end IF;
172
          state <= 0; --warten auf nächste Start
173
        WHEN OTHERS =>
174
          state <= 0;
175
      END CASE;
176
    END IF; -- if nrst/else
177
  END IF; -- clk
178
END PROCESS;--end pacos
179
180
--=======Implementation==================================
181
182
Cafkt:   afkt
183
    generic map(P0=>X"3f7ffffd",-- +0.99999984852024669 
184
            P1=>X"be8c8cb6",-- -0.27451104135987186
185
            P2=>X"00000000",-- +0.0  
186
            Q0=>X"3f800000",-- +1.0 
187
            Q1=>X"beb73881",-- -0.35785296234245088
188
            Q2=>X"3c36a182"-- +0.011146905255803363 
189
            )   
190
    port map(nrst=>nrst,clk=>clk,ceafkt=>ce3,Xinp=>ain,aout=>aou);
191
192
---------------------------------------
193
cminX:   subFP port map(a=>C1,b=>ainp,clk=>clk,ce=>ce1,result=>C1minX);
194
CmulX2: mulFP port map(a=>ainp,b=>ainp,clk=>clk,ce=>ce1,result=>Xinp2);  
195
Ccomp:  compFP port map(a=>ainp,b=>C05,clk=>clk,ce=>ce1,result=>ainp05);
196
-------- 
197
cmul2mX:  mulFP port map(a=>C1minX,b=>C2,clk=>clk,ce=>ce2,result=>mul2mX);
198
Cmul2p:   mulFP port map(a=>Xinp2,b=>C2,clk=>clk,ce=>ce2,result=>C2powX);  
199
--------
200
csqrt2: sqrtFP port map(a=>mul2mX,clk=>clk,ce=>ce3,result=>sqrt2m);
201
------
202
Cmula1: mulFP port map(a=>sqrt2m,b=>xq05,clk=>clk,ce=>ce4,result=>angl1);
203
Cmula2: mulFP port map(a=>Xk05,b=>ainp,clk=>clk,ce=>ce4,result=>asinX);
204
------
205
csub5:   subFP port map(a=>PIdiv2,b=>asinX,clk=>clk,ce=>ce5,result=>angl2);
206
---------------------------------------------------  
207
end Behavioral;