arctanFP.vhd


1
----------------------------------------------------------------------------------
2
-- test mulFP1
3
-- Company:ak development GmbH 
4
-- Engineer:a.Kurka, 31.8.2024 
5
-- www.akdevelopment.ch
6
-- ursprüngliche ArcTang Berechnung geändert
7
-- zu Testprogramm, so konnte man das bestehende Testbench verwenden
8
----------------------------------------------------------------------------------
9
library IEEE;
10
use IEEE.STD_LOGIC_1164.ALL;
11
12
13
-- synthesis translate_off
14
LIBRARY XilinxCoreLib;
15
-- synthesis translate_on
16
17
18
19
entity arctanFP is
20
  port(  nrst      : in std_logic;
21
      clk       : in std_logic;
22
      ceatan     : in std_logic;-- startimpuls afkt
23
      Xinp      :in std_logic_vector(31 downto 0);-- input X FP FP  format
24
      Yinp      :in std_logic_vector(31 downto 0);-- input Y FP FP  format
25
      outvalid    :OUT std_logic:= '0';
26
      atanFPo  :OUT std_logic_vector(31 downto 0):=X"00000000"  -- output Winkel(rad) in FP  format
27
      );
28
end arctanFP;
29
30
architecture Behavioral of arctanFP is
31
32
------------------------------------------------------------
33
--- IP coregen 5.0----------------------
34
--COMPONENT mulFP IS
35
--  port (
36
--  a: IN std_logic_VECTOR(31 downto 0);
37
--  b: IN std_logic_VECTOR(31 downto 0);
38
--  clk: IN std_logic;
39
--  ce: IN std_logic;
40
--  result: OUT std_logic_VECTOR(31 downto 0)
41
--  );
42
--END COMPONENT;
43
------------------------------------------------
44
-----IP coregen 6.1--------------------
45
COMPONENT  mulFP1 IS
46
  PORT (
47
    aclk : IN STD_LOGIC;
48
    s_axis_a_tvalid : IN STD_LOGIC;
49
    s_axis_a_tdata : IN STD_LOGIC_VECTOR(31 DOWNTO 0);
50
    s_axis_b_tvalid : IN STD_LOGIC;
51
    s_axis_b_tdata : IN STD_LOGIC_VECTOR(31 DOWNTO 0);
52
    m_axis_result_tvalid : OUT STD_LOGIC;
53
    m_axis_result_tdata : OUT STD_LOGIC_VECTOR(31 DOWNTO 0)
54
  );
55
END COMPONENT  ;
56
57
-----------------------------------------------
58
SIGNAL resvalid :std_logic;
59
60
-----------------------------------------------
61
SIGNAL stateatan  :integer range 0 to 7:= 0;
62
--SIGNAL InpA      :std_logic_VECTOR(31 downto 0):= (OTHERS => '0');
63
--SIGNAL InpB      :std_logic_VECTOR(31 downto 0):= (OTHERS => '0');
64
--SIGNAL TestOutp  :std_logic_VECTOR(31 downto 0);---:= (OTHERS => '0');
65
66
SIGNAL ce1      :std_logic:='0';-- Start resdiv^2
67
--
68
--==================================================================
69
BEGIN
70
--------------------------------------------------------------
71
patan :PROCESS (clk)
72
VARIABLE cntrclk : INTEGER RANGE 0 TO 3:= 0;
73
BEGIN
74
  IF rising_edge(clk) THEN
75
    IF nrst = '0' THEN
76
      stateatan <= 0;
77
      ce1 <= '0';
78
      --InpA <= (OTHERS => '0');
79
      ---InpB <= (OTHERS => '0');
80
      cntrclk := 0;
81
      --(OTHERS => '0');
82
    ELSE
83
      CASE stateatan IS
84
        WHEN 0 =>
85
          IF ceatan = '1' THEN
86
              stateatan <= 1;
87
              --InpA <= Xinp;
88
              --InpB <= Yinp;
89
              cntrclk := 1;-- time for calculation
90
          ELSE
91
            stateatan <= 0;
92
          END IF;
93
        WHEN 1 =>  
94
          ce1 <= '1'; -- start for MUL Xinp * Yinp
95
          stateatan <= 2;
96
        WHEN 2 => ---test Xinp * Yinp
97
          IF cntrclk > 0 THEN  -- wait for calculation
98
            cntrclk := cntrclk - 1;
99
            stateatan <= 2;
100
          ELSE
101
            ce1 <= '0'; -- reset
102
            stateatan <= 3;-- 
103
          END IF;
104
        WHEN 3 =>
105
            outvalid <= resvalid;
106
            --atanFPo <= TestOutp;
107
            stateatan <= 0;--mul result ready ?
108
        WHEN OTHERS =>
109
          stateatan <= 0;
110
      END CASE;
111
    END IF; -- if nrst/else
112
  END IF; -- clk
113
END PROCESS;--end pacos
114
115
-- Implementation: Mul FP test
116
-- Latency = 1
117
---cfuncmul: mulFP port map(a=>InpA,b=>InpB,clk=>clk,ce=>ce1,result=>TestOutp);
118
-----------------------------------------------
119
120
--SIGNAL resvalid :std_logic;
121
----------------erste test; mit Internen Signalen---------------------------------
122
--cmulFP1 :mulFP1 port map (
123
--    aclk => clk,          ---: IN STD_LOGIC;
124
--    s_axis_a_tvalid => ce1,  ---: IN STD_LOGIC;
125
--    s_axis_a_tdata => InpA,  --- : IN STD_LOGIC_VECTOR(31 DOWNTO 0);
126
--    s_axis_b_tvalid=> ce1,    --- : IN STD_LOGIC;
127
--    s_axis_b_tdata => InpB,  --- : IN STD_LOGIC_VECTOR(31 DOWNTO 0);
128
--    m_axis_result_tvalid => resvalid,  ---    : OUT STD_LOGIC;
129
--    m_axis_result_tdata => TestOutp   ----: OUT STD_LOGIC_VECTOR(31 DOWNTO 0)
130
--    );
131
-------------zweite test : Direkt auf Entity I/O a------------------------------
132
133
cmulFP1 :mulFP1 port map (
134
    aclk => clk,          ---: IN STD_LOGIC;
135
    s_axis_a_tvalid => ce1,  ---: IN STD_LOGIC;
136
    s_axis_a_tdata => Xinp,  --- : IN STD_LOGIC_VECTOR(31 DOWNTO 0);
137
    s_axis_b_tvalid=> ce1,    --- : IN STD_LOGIC;
138
    s_axis_b_tdata => Yinp,  --- : IN STD_LOGIC_VECTOR(31 DOWNTO 0);
139
    m_axis_result_tvalid => resvalid,  ---    : OUT STD_LOGIC;
140
    m_axis_result_tdata => atanFPo    ----: OUT STD_LOGIC_VECTOR(31 DOWNTO 0)
141
    );
142
143
---------------------------------------------------  
144
145
END Behavioral;