MOCCA-TP3-2020: cordic_cor.vhd

File cordic_cor.vhd, 8.6 KB (added by franck, 4 years ago)

cordic 1 core à compléter

Line 
1ENTITY cordic_cor IS
2PORT(
3    ck          : IN  std_logic;
4    raz         : IN  std_logic;
5
6    wr_axy_p    : IN  std_logic;
7    a_p         : IN  std_logic_vector(9 DOWNTO 0);
8    x_p         : IN  std_logic_vector(7 DOWNTO 0);
9    y_p         : IN  std_logic_vector(7 DOWNTO 0);
10    wok_axy_p   : OUT std_logic;
11
12    rd_nxy_p    : -- to be completed
13    nx_p        : OUT std_logic_vector(7 DOWNTO 0);
14    ny_p        : -- to be completed
15    rok_nxy_p   : -- to be completed
16);
17END cordic_cor;
18
19ARCHITECTURE vhd OF cordic_cor IS
20
21    SIGNAL
22        n_get,  get,                -- get coordinates and angle
23        n_norm, norm,               -- normalization
24        n_calc, calc,               -- calcul
25        n_mkc,  mkc,                -- multiply KC
26        n_place,place,              -- place in good quadrant
27        n_put,  put,                -- put result
28        a_lt_0,                     -- a lower than 0
29        quadrant_0                  -- 1 quand a est dans le quadrant 0
30    : std_logic;
31
32    SIGNAL
33        n_quadrant, quadrant        -- numéro du quadrant
34    : std_logic_vector(1 downto 0);
35
36    SIGNAL
37        n_i, i                      -- compteur de recherche dichotomique
38    : std_logic_vector(2 downto 0);
39
40    SIGNAL
41        n_x,    x,                  -- coordonnée x
42        n_y,    y,                  -- coordonnée y
43        n_a,    a,                  -- angle
44        n_xkc,  xkc,                -- x * KC
45        n_ykc,  ykc,                -- y * KC
46        atan,                       -- arctangeante de l'angle de rotation
47        a_mpidiv2,                  -- a - PI/2
48        x_sra_1, y_sra_1,           -- x >> 1 et y >> 1
49        x_sra_2, y_sra_2,           -- x >> 2 et y >> 2
50        x_sra_3, y_sra_3,           -- x >> 3 et y >> 3
51        x_sra_4, y_sra_4,           -- x >> 4 et y >> 4
52        x_sra_5, y_sra_5,           -- x >> 5 et y >> 5
53        x_sra_6, y_sra_6,           -- x >> 6 et y >> 6
54        x_sra_7, y_sra_7,           -- x >> 7 et y >> 7
55        x_sra_i, y_sra_i            -- x >> i et y >> i
56    : std_logic_vector(15 downto 0);
57
58BEGIN
59
60-------------------------------------------------------------------------------
61-- FSM
62-------------------------------------------------------------------------------
63
64    -- FSM transition One Hot
65
66    n_get       <= (get  AND NOT wr_axy_p)
67                OR (put  AND rd_nxy_p)
68                ;
69    n_norm      <= -- to be completed
70                ;
71    n_calc      <= (norm AND quadrant_0)
72                OR (calc AND NOT (i = 7))
73                ;
74    n_mkc       <= (calc AND (i = 7))
75                OR (mkc  AND NOT (i = 2))
76                ;
77    n_place     <= (mkc  AND (i = 2))
78                ;
79    n_put       <= (place)
80                OR (put  AND NOT rd_nxy_p)
81                ;
82
83    FSM : PROCESS (ck) begin
84    if ((ck = '1') AND NOT(ck'STABLE) )
85    then
86        if (raz = '0') then
87            get   <= '1';
88            norm  <= '0';
89            calc  <= '0';
90            mkc   <= '0';
91            place <= '0';
92            put   <= '0';
93        else
94            get   <= n_get   ;
95            norm  <= n_norm  ;
96            calc  <= n_calc  ;
97            mkc   <= n_mkc   ;
98            place <= n_place ;
99            put   <= n_put   ;
100        end if;
101    end if;
102    end process FSM;
103
104    -- Sorties issues de l'automate
105
106    wok_axy_p   <=  get;
107    rok_nxy_p   <=  -- to be completedut;
108
109-------------------------------------------------------------------------------
110-- Compteurs de l'algorithme et calcul de l'angle de rotation@
111-------------------------------------------------------------------------------
112
113    -- Compteurs de normalisation de l'angle : quadrant est le numéro du quadrant
114
115    n_quadrant  <= "00"           when get
116              else quadrant + 1   when norm AND NOT quadrant_0
117              else quadrant;
118
119    -- ROM with arctan(2-i)
120
121    atan        <= x"0065" when i = 0     -- atan(2^-0)
122              else x"003B" when i = 1     -- atan(2^-1)
123              else x"001F" when i = 2     -- atan(2^-2)
124              else x"0010" when i = 3     -- atan(2^-3)
125              else x"0008" when i = 4     -- atan(2^-4)
126              else x"0004" when i = 5     -- atan(2^-5)
127              else x"0002" when i = 6     -- atan(2^-6)
128              else x"0001";               -- atan(2^-7)
129
130    -- Calcul de l'angle : recherche par dichotomie
131
132    a_mpidiv2   <= a - x"00C9";
133    quadrant_0  <= a_mpidiv2(15);
134    a_lt_0      <= a(15);    -- 1 si a est négatif (signe de a)
135
136    n_a         <= a_p       when get                     -- init
137              else a_mpidiv2 when norm AND NOT quadrant_0 -- a - PI/2
138              else a - atan  when calc AND NOT a_lt_0     -- trop grand
139              else a + atan  when calc AND a_lt_0         -- trop petit
140              else a;                                     -- stable
141
142    -- Compteurs de la dichotomie et de la normalisation de l'angle
143
144    n_i         <= "000"     when get                     -- init
145              else i + 1     when calc or mkc             -- inc
146              else i ;                                    -- stable
147
148
149    CTL : PROCESS (ck) begin
150    if ((ck = '1') AND NOT(ck'STABLE) )
151    then
152       i        <= n_i        ;
153       quadrant <= n_quadrant ;
154       a        <= n_a        ;
155    end if;
156    end process CTL;
157
158-------------------------------------------------------------------------------
159-- Chemin de données
160-------------------------------------------------------------------------------
161
162    -- Shifters : x_sra_i <= x << i et y_sra_i <= y << i
163
164    x_sra_1     <= x(15) &     x(15 downto 1);
165    x_sra_2     <= x(15) & x_sra_1(15 downto 1);
166    x_sra_3     <= x(15) & x_sra_2(15 downto 1);
167    x_sra_4     <= x(15) & x_sra_3(15 downto 1);
168    x_sra_5     <= x(15) & x_sra_4(15 downto 1);
169    x_sra_6     <= x(15) & x_sra_5(15 downto 1);
170    x_sra_7     <= x(15) & x_sra_6(15 downto 1);
171    x_sra_i     <= x_sra_1 when i = 1
172              else x_sra_2 when i = 2
173              else x_sra_3 when i = 3
174              else x_sra_4 when i = 4
175              else x_sra_5 when i = 5
176              else x_sra_6 when i = 6
177              else x_sra_7 when i = 7
178              else x;
179
180    y_sra_1     <= y(15) &     y(15 downto 1);
181    y_sra_2     <= y(15) & y_sra_1(15 downto 1);
182    y_sra_3     <= y(15) & y_sra_2(15 downto 1);
183    y_sra_4     <= y(15) & y_sra_3(15 downto 1);
184    y_sra_5     <= y(15) & y_sra_4(15 downto 1);
185    y_sra_6     <= y(15) & y_sra_5(15 downto 1);
186    y_sra_7     <= y(15) & y_sra_6(15 downto 1);
187    y_sra_i     <= y_sra_1 when i = 1
188              else y_sra_2 when i = 2
189              else y_sra_3 when i = 3
190              else y_sra_4 when i = 4
191              else y_sra_5 when i = 5
192              else y_sra_6 when i = 6
193              else y_sra_7 when i = 7
194              else y;
195
196    -- produits des coordonnées de rotation par KC
197
198    n_xkc       <= x_sra_7 + x_sra_5 when mkc AND i = 0
199              else xkc     + x_sra_4 when mkc AND i = 1
200              else xkc     + x_sra_1 when mkc AND i = 2
201              else xkc;
202
203    n_ykc       <= y_sra_7 + y_sra_5 when mkc AND i = 0
204              else ykc     + y_sra_4 when mkc AND i = 1
205              else ykc     + y_sra_1 when mkc AND i = 2
206              else ykc;
207
208    -- coordonnées
209
210    n_x         <= x_p(7) & x_p & "0000000" when get               -- init
211              else x - y_sra_i            when calc AND NOT a_lt_0 -- au dessus
212              else x + y_sra_i            when calc AND a_lt_0     -- en dessous
213              else xkc                    when place AND (quadrant = 0)
214              else -ykc                   when place AND (quadrant = 1)
215              else -xkc                   when place AND (quadrant = 2)
216              else ykc                    when place AND (quadrant = 3)
217              else x;
218
219    n_y         <= y_p(7) & y_p & "0000000" when get               -- init
220              else -- to be completed --  when calc AND NOT a_lt_0 -- au dessus
221              else -- to be completed --  when calc AND a_lt_0     -- en dessous
222              else -- to be completed --  when place AND (quadrant = 0)
223              else -- to be completed --  when place AND (quadrant = 1)
224              else -- to be completed --  when place AND (quadrant = 2)
225              else -- to be completed --  when place AND (quadrant = 3)
226              else y;
227
228    DP : PROCESS (ck) begin
229    if ((ck = '1') AND NOT(ck'STABLE) )
230    then
231       x     <= n_x     ;
232       y     <= n_y     ;
233       xkc   <= n_xkc   ;
234       ykc   <= n_ykc   ;
235    end if;
236    end process DP;
237
238    -- Sorties du chemin de données
239
240    nx_p        <=  x(14 downto 7);
241    ny_p        <=  y(14 downto 7);
242
243END vhd;