| 1 | ENTITY cordic_cor IS |
|---|
| 2 | PORT( |
|---|
| 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 | ); |
|---|
| 17 | END cordic_cor; |
|---|
| 18 | |
|---|
| 19 | ARCHITECTURE 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 | |
|---|
| 58 | BEGIN |
|---|
| 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 | |
|---|
| 243 | END vhd; |
|---|