-- Instrument tuner -- Frequency of operation is 819200 Hz, obtained by dividing a -- 3276000 Hz quartz by four -- Author: Frédéric Pétrot entity tuner is port ( ck : in bit; d : in bit; o : out bit_vector(0 to 22); vdd : in bit; vss : in bit ); end tuner; architecture dataflow of tuner is signal start : bit; -- input handling signal d_reg : reg_bit register; -- previous value of input -- incrementer related things signal incr_out : bit_vector (14 downto 0); -- incrementer's result signal incr_cry : bit_vector (15 downto 0); -- incrementer's carry signal incr_reg : reg_vector (14 downto 0) register; -- incrementer register -- normalizer related things -- reg must be at most 381 and cannot be less than 190 (hopefully) constant c382 : bit_vector(14 downto 0) := "000_0001_0111_1110"; -- we must substract 190 from the shifted result constant c191 : bit_vector (8 downto 0) := "0_1011_1111"; signal test_out : bit_vector (14 downto 0); signal test_cry : bit_vector (15 downto 0); signal norm_out : bit_vector (14 downto 0); signal norm_reg : reg_vector (14 downto 0) register; signal subs_out : bit_vector (8 downto 0); signal subs_cry : bit_vector (9 downto 0); signal deco_reg : reg_vector (7 downto 0) register; begin input : block (ck = '1' and not ck'STABLE) begin d_reg <= guarded d; end block; start <= (not d_reg) and d; -- compute the result out of the incrementer -- maximum value is 30582 for an very flat A (26.8 Hz) -- incr_out <= incr_reg + 1 incr_out <= incr_reg xor incr_cry(14 downto 0); incr_cry (0) <= '1'; incr_cry (15 downto 1) <= (incr_reg and incr_cry (14 downto 0)); incr : block (ck = '1' and not ck'stable) begin incr_reg <= guarded incr_out when start = '0' else B"000000000000000"; end block; -- normalize the incrementer output: shift until it reaches the -- [17D, BE] range values, and then subtract BE to fit between 0 and -- whatever -- test_out <= norm_reg - c382 = norm_reg + not c382 + 1 test_out <= norm_reg xor not(c382) xor test_cry(14 downto 0); test_cry (0) <= '1'; test_cry (15 downto 1) <= (norm_reg and test_cry (14 downto 0)) or (not(c382) and test_cry (14 downto 0)) or (norm_reg and not(c382) ) ; -- loop until norm reg is less than 17E, keep its value otherwise -- norm_out <= norm_reg >> 2 if (norm_reg - c382) > 0 -- norm_reg otherwise norm_out <= '0' & norm_reg(14 downto 1) when test_out(14) = '0' else norm_reg; -- load norm_reg with incr_out when start is true norm : block (ck = '1' and not ck'stable) begin norm_reg <= guarded norm_out when start = '0' else incr_out; end block; subs_out <= norm_reg(8 downto 0) xor not(c191) xor subs_cry(8 downto 0); subs_cry (0) <= '1'; subs_cry (9 downto 1) <= (norm_reg(8 downto 0) and subs_cry (8 downto 0)) or (not(c191) and subs_cry (8 downto 0)) or (norm_reg(8 downto 0) and not(c191)); deco : block (ck = '1' and not ck'stable) begin deco_reg <= guarded subs_out(7 downto 0) when test_out(14) = '1' else deco_reg; end block; with deco_reg select o <= B"1000_0_0000_0111101_0011111" when B"10111110", -- 381 réb 380 (freq: 2161.258631) B"1000_0_0000_0111101_0011111" when B"10111101", -- 380 réb 380 (freq: 2161.258631) B"0100_0_0000_0111101_0011111" when B"10111100", -- 379 réb 377 (freq: 2175.174260) B"0100_0_0000_0111101_0011111" when B"10111011", -- 378 réb 377 (freq: 2175.174260) B"0100_0_0000_0111101_0011111" when B"10111010", -- 377 réb 377 (freq: 2175.174260) B"0010_0_0000_0111101_0011111" when B"10111001", -- 376 réb 375 (freq: 2189.179488) B"0010_0_0000_0111101_0011111" when B"10111000", -- 375 réb 375 (freq: 2189.179488) B"0001_0_0000_0111101_0011111" when B"10110111", -- 374 réb 373 (freq: 2203.274890) B"0001_0_0000_0111101_0011111" when B"10110110", -- 373 réb 373 (freq: 2203.274890) B"0001_0_0000_0111101_0011111" when B"10110101", -- 372 réb 370 (freq: 2217.461048) B"0001_0_0000_0111101_0011111" when B"10110100", -- 371 réb 370 (freq: 2217.461048) B"0000_1_0000_0111101_0011111" when B"10110011", -- 370 réb 370 (freq: 2217.461048) B"0000_0_1000_0111101_0011111" when B"10110010", -- 369 réb 368 (freq: 2231.738546) B"0000_0_1000_0111101_0011111" when B"10110001", -- 368 réb 368 (freq: 2231.738546) B"0000_0_0100_0111101_0011111" when B"10110000", -- 367 réb 365 (freq: 2246.107972) B"0000_0_0100_0111101_0011111" when B"10101111", -- 366 réb 365 (freq: 2246.107972) B"0000_0_0100_0111101_0011111" when B"10101110", -- 365 réb 365 (freq: 2246.107972) B"0000_0_0010_0111101_0011111" when B"10101101", -- 364 réb 363 (freq: 2260.569918) B"0000_0_0010_0111101_0011111" when B"10101100", -- 363 réb 363 (freq: 2260.569918) B"0000_0_0001_0111101_0011111" when B"10101011", -- 362 réb 361 (freq: 2275.124980) B"0000_0_0001_0111101_0011111" when B"10101010", -- 361 réb 361 (freq: 2275.124980) B"1000_0_0000_0111101_0000000" when B"10101001", -- 360 ré 358 (freq: 2289.773757) B"1000_0_0000_0111101_0000000" when B"10101000", -- 359 ré 358 (freq: 2289.773757) B"1000_0_0000_0111101_0000000" when B"10100111", -- 358 ré 358 (freq: 2289.773757) B"0100_0_0000_0111101_0000000" when B"10100110", -- 357 ré 356 (freq: 2304.516853) B"0100_0_0000_0111101_0000000" when B"10100101", -- 356 ré 356 (freq: 2304.516853) B"0010_0_0000_0111101_0000000" when B"10100100", -- 355 ré 354 (freq: 2319.354874) B"0010_0_0000_0111101_0000000" when B"10100011", -- 354 ré 354 (freq: 2319.354874) B"0001_0_0000_0111101_0000000" when B"10100010", -- 353 ré 352 (freq: 2334.288433) B"0001_0_0000_0111101_0000000" when B"10100001", -- 352 ré 352 (freq: 2334.288433) B"0001_0_0000_0111101_0000000" when B"10100000", -- 351 ré 349 (freq: 2349.318144) B"0001_0_0000_0111101_0000000" when B"10011111", -- 350 ré 349 (freq: 2349.318144) B"0000_1_0000_0111101_0000000" when B"10011110", -- 349 ré 349 (freq: 2349.318144) B"0000_0_1000_0111101_0000000" when B"10011101", -- 348 ré 347 (freq: 2364.444626) B"0000_0_1000_0111101_0000000" when B"10011100", -- 347 ré 347 (freq: 2364.444626) B"0000_0_0100_0111101_0000000" when B"10011011", -- 346 ré 345 (freq: 2379.668502) B"0000_0_0100_0111101_0000000" when B"10011010", -- 345 ré 345 (freq: 2379.668502) B"0000_0_0010_0111101_0000000" when B"10011001", -- 344 ré 343 (freq: 2394.990401) B"0000_0_0010_0111101_0000000" when B"10011000", -- 343 ré 343 (freq: 2394.990401) B"0000_0_0001_0111101_0000000" when B"10010111", -- 342 ré 341 (freq: 2410.410951) B"0000_0_0001_0111101_0000000" when B"10010110", -- 341 ré 341 (freq: 2410.410951) B"1000_0_0000_1001111_0011111" when B"10010101", -- 340 mib 338 (freq: 2425.930790) B"1000_0_0000_1001111_0011111" when B"10010100", -- 339 mib 338 (freq: 2425.930790) B"1000_0_0000_1001111_0011111" when B"10010011", -- 338 mib 338 (freq: 2425.930790) B"0100_0_0000_1001111_0011111" when B"10010010", -- 337 mib 336 (freq: 2441.550556) B"0100_0_0000_1001111_0011111" when B"10010001", -- 336 mib 336 (freq: 2441.550556) B"0010_0_0000_1001111_0011111" when B"10010000", -- 335 mib 334 (freq: 2457.270892) B"0010_0_0000_1001111_0011111" when B"10001111", -- 334 mib 334 (freq: 2457.270892) B"0001_0_0000_1001111_0011111" when B"10001110", -- 333 mib 332 (freq: 2473.092446) B"0001_0_0000_1001111_0011111" when B"10001101", -- 332 mib 332 (freq: 2473.092446) B"0001_0_0000_1001111_0011111" when B"10001100", -- 331 mib 330 (freq: 2489.015870) B"0000_1_0000_1001111_0011111" when B"10001011", -- 330 mib 330 (freq: 2489.015870) B"0000_0_1000_1001111_0011111" when B"10001010", -- 329 mib 328 (freq: 2505.041820) B"0000_0_1000_1001111_0011111" when B"10001001", -- 328 mib 328 (freq: 2505.041820) B"0000_0_0100_1001111_0011111" when B"10001000", -- 327 mib 326 (freq: 2521.170955) B"0000_0_0100_1001111_0011111" when B"10000111", -- 326 mib 326 (freq: 2521.170955) B"0000_0_0010_1001111_0011111" when B"10000110", -- 325 mib 324 (freq: 2537.403941) B"0000_0_0010_1001111_0011111" when B"10000101", -- 324 mib 324 (freq: 2537.403941) B"0000_0_0001_1001111_0011111" when B"10000100", -- 323 mib 321 (freq: 2553.741445) B"0000_0_0001_1001111_0011111" when B"10000011", -- 322 mib 321 (freq: 2553.741445) B"0000_0_0001_1001111_0011111" when B"10000010", -- 321 mib 321 (freq: 2553.741445) B"1000_0_0000_1001111_0000000" when B"10000001", -- 320 mi 319 (freq: 2570.184141) B"1000_0_0000_1001111_0000000" when B"10000000", -- 319 mi 319 (freq: 2570.184141) B"0100_0_0000_1001111_0000000" when B"01111111", -- 318 mi 317 (freq: 2586.732707) B"0100_0_0000_1001111_0000000" when B"01111110", -- 317 mi 317 (freq: 2586.732707) B"0010_0_0000_1001111_0000000" when B"01111101", -- 316 mi 315 (freq: 2603.387823) B"0010_0_0000_1001111_0000000" when B"01111100", -- 315 mi 315 (freq: 2603.387823) B"0001_0_0000_1001111_0000000" when B"01111011", -- 314 mi 313 (freq: 2620.150175) B"0001_0_0000_1001111_0000000" when B"01111010", -- 313 mi 313 (freq: 2620.150175) B"0001_0_0000_1001111_0000000" when B"01111001", -- 312 mi 311 (freq: 2637.020456) B"0000_1_0000_1001111_0000000" when B"01111000", -- 311 mi 311 (freq: 2637.020456) B"0000_0_1000_1001111_0000000" when B"01110111", -- 310 mi 309 (freq: 2653.999358) B"0000_0_1000_1001111_0000000" when B"01110110", -- 309 mi 309 (freq: 2653.999358) B"0000_0_0100_1001111_0000000" when B"01110101", -- 308 mi 307 (freq: 2671.087581) B"0000_0_0100_1001111_0000000" when B"01110100", -- 307 mi 307 (freq: 2671.087581) B"0000_0_0010_1001111_0000000" when B"01110011", -- 306 mi 305 (freq: 2688.285831) B"0000_0_0010_1001111_0000000" when B"01110010", -- 305 mi 305 (freq: 2688.285831) B"0000_0_0001_1001111_0000000" when B"01110001", -- 304 mi 303 (freq: 2705.594814) B"0000_0_0001_1001111_0000000" when B"01110000", -- 303 mi 303 (freq: 2705.594814) B"1000_0_0000_1000111_0000000" when B"01101111", -- 302 fa 302 (freq: 2723.015243) B"0100_0_0000_1000111_0000000" when B"01101110", -- 301 fa 300 (freq: 2740.547838) B"0100_0_0000_1000111_0000000" when B"01101101", -- 300 fa 300 (freq: 2740.547838) B"0010_0_0000_1000111_0000000" when B"01101100", -- 299 fa 298 (freq: 2758.193318) B"0010_0_0000_1000111_0000000" when B"01101011", -- 298 fa 298 (freq: 2758.193318) B"0001_0_0000_1000111_0000000" when B"01101010", -- 297 fa 296 (freq: 2775.952413) B"0001_0_0000_1000111_0000000" when B"01101001", -- 296 fa 296 (freq: 2775.952413) B"0001_0_0000_1000111_0000000" when B"01101000", -- 295 fa 294 (freq: 2793.825852) B"0000_1_0000_1000111_0000000" when B"01100111", -- 294 fa 294 (freq: 2793.825852) B"0000_0_1000_1000111_0000000" when B"01100110", -- 293 fa 292 (freq: 2811.814372) B"0000_0_1000_1000111_0000000" when B"01100101", -- 292 fa 292 (freq: 2811.814372) B"0000_0_0100_1000111_0000000" when B"01100100", -- 291 fa 290 (freq: 2829.918714) B"0000_0_0100_1000111_0000000" when B"01100011", -- 290 fa 290 (freq: 2829.918714) B"0000_0_0010_1000111_0000000" when B"01100010", -- 289 fa 288 (freq: 2848.139625) B"0000_0_0010_1000111_0000000" when B"01100001", -- 288 fa 288 (freq: 2848.139625) B"0000_0_0001_1000111_0000000" when B"01100000", -- 287 fa 286 (freq: 2866.477853) B"0000_0_0001_1000111_0000000" when B"01011111", -- 286 fa 286 (freq: 2866.477853) B"1000_0_0000_1111011_0011111" when B"01011110", -- 285 solb 285 (freq: 2884.934156) B"0100_0_0000_1111011_0011111" when B"01011101", -- 284 solb 283 (freq: 2903.509292) B"0100_0_0000_1111011_0011111" when B"01011100", -- 283 solb 283 (freq: 2903.509292) B"0010_0_0000_1111011_0011111" when B"01011011", -- 282 solb 281 (freq: 2922.204028) B"0010_0_0000_1111011_0011111" when B"01011010", -- 281 solb 281 (freq: 2922.204028) B"0001_0_0000_1111011_0011111" when B"01011001", -- 280 solb 279 (freq: 2941.019133) B"0001_0_0000_1111011_0011111" when B"01011000", -- 279 solb 279 (freq: 2941.019133) B"0001_0_0000_1111011_0011111" when B"01010111", -- 278 solb 277 (freq: 2959.955382) B"0000_0_0000_1111011_0011111" when B"01010110", -- 277 solb 277 (freq: 2959.955382) B"0000_0_1000_1111011_0011111" when B"01010101", -- 276 solb 276 (freq: 2979.013555) B"0000_0_0100_1111011_0011111" when B"01010100", -- 275 solb 274 (freq: 2998.194438) B"0000_0_0100_1111011_0011111" when B"01010011", -- 274 solb 274 (freq: 2998.194438) B"0000_0_0010_1111011_0011111" when B"01010010", -- 273 solb 272 (freq: 3017.498820) B"0000_0_0010_1111011_0011111" when B"01010001", -- 272 solb 272 (freq: 3017.498820) B"0000_0_0001_1111011_0011111" when B"01010000", -- 271 solb 270 (freq: 3036.927496) B"0000_0_0001_1111011_0011111" when B"01001111", -- 270 solb 270 (freq: 3036.927496) B"1000_0_0000_1111011_0000000" when B"01001110", -- 269 sol 269 (freq: 3056.481268) B"0100_0_0000_1111011_0000000" when B"01001101", -- 268 sol 267 (freq: 3076.160939) B"0100_0_0000_1111011_0000000" when B"01001100", -- 267 sol 267 (freq: 3076.160939) B"0010_0_0000_1111011_0000000" when B"01001011", -- 266 sol 265 (freq: 3095.967322) B"0010_0_0000_1111011_0000000" when B"01001010", -- 265 sol 265 (freq: 3095.967322) B"0001_0_0000_1111011_0000000" when B"01001001", -- 264 sol 264 (freq: 3115.901231) B"0001_0_0000_1111011_0000000" when B"01001000", -- 263 sol 262 (freq: 3135.963488) B"0000_1_0000_1111011_0000000" when B"01000111", -- 262 sol 262 (freq: 3135.963488) B"0000_0_1000_1111011_0000000" when B"01000110", -- 261 sol 260 (freq: 3156.154919) B"0000_0_1000_1111011_0000000" when B"01000101", -- 260 sol 260 (freq: 3156.154919) B"0000_0_0100_1111011_0000000" when B"01000100", -- 259 sol 259 (freq: 3176.476357) B"0000_0_0010_1111011_0000000" when B"01000011", -- 258 sol 257 (freq: 3196.928637) B"0000_0_0010_1111011_0000000" when B"01000010", -- 257 sol 257 (freq: 3196.928637) B"0000_0_0001_1111011_0000000" when B"01000001", -- 256 sol 255 (freq: 3217.512603) B"0000_0_0001_1111011_0000000" when B"01000000", -- 255 sol 255 (freq: 3217.512603) B"1000_0_0000_1110111_0011111" when B"00111111", -- 254 lab 254 (freq: 3238.229102) B"0100_0_0000_1110111_0011111" when B"00111110", -- 253 lab 252 (freq: 3259.078988) B"0100_0_0000_1110111_0011111" when B"00111101", -- 252 lab 252 (freq: 3259.078988) B"0010_0_0000_1110111_0011111" when B"00111100", -- 251 lab 250 (freq: 3280.063119) B"0010_0_0000_1110111_0011111" when B"00111011", -- 250 lab 250 (freq: 3280.063119) B"0001_0_0000_1110111_0011111" when B"00111010", -- 249 lab 249 (freq: 3301.182360) B"0001_0_0000_1110111_0011111" when B"00111001", -- 248 lab 247 (freq: 3322.437581) B"0000_1_0000_1110111_0011111" when B"00111000", -- 247 lab 247 (freq: 3322.437581) B"0000_0_1000_1110111_0011111" when B"00110111", -- 246 lab 246 (freq: 3343.829657) B"0000_0_0100_1110111_0011111" when B"00110110", -- 245 lab 244 (freq: 3365.359470) B"0000_0_0100_1110111_0011111" when B"00110101", -- 244 lab 244 (freq: 3365.359470) B"0000_0_0010_1110111_0011111" when B"00110100", -- 243 lab 243 (freq: 3387.027906) B"0000_0_0001_1110111_0011111" when B"00110011", -- 242 lab 241 (freq: 3408.835858) B"0000_0_0001_1110111_0011111" when B"00110010", -- 241 lab 241 (freq: 3408.835858) B"1000_0_0000_1110111_0000000" when B"00110001", -- 240 la 239 (freq: 3430.784224) B"1000_0_0000_1110111_0000000" when B"00110000", -- 239 la 239 (freq: 3430.784224) B"0100_0_0000_1110111_0000000" when B"00101111", -- 238 la 238 (freq: 3452.873909) B"0010_0_0000_1110111_0000000" when B"00101110", -- 237 la 236 (freq: 3475.105822) B"0010_0_0000_1110111_0000000" when B"00101101", -- 236 la 236 (freq: 3475.105822) B"0001_0_0000_1110111_0000000" when B"00101100", -- 235 la 235 (freq: 3497.480878) B"0001_0_0000_1110111_0000000" when B"00101011", -- 234 la 233 (freq: 3520.000000) B"0000_1_0000_1110111_0000000" when B"00101010", -- 233 la 233 (freq: 3520.000000) B"0000_0_1000_1110111_0000000" when B"00101001", -- 232 la 232 (freq: 3542.664116) B"0000_0_0100_1110111_0000000" when B"00101000", -- 231 la 230 (freq: 3565.474158) B"0000_0_0100_1110111_0000000" when B"00100111", -- 230 la 230 (freq: 3565.474158) B"0000_0_0010_1110111_0000000" when B"00100110", -- 229 la 229 (freq: 3588.431066) B"0000_0_0001_1110111_0000000" when B"00100101", -- 228 la 227 (freq: 3611.535786) B"0000_0_0001_1110111_0000000" when B"00100100", -- 227 la 227 (freq: 3611.535786) B"1000_0_0000_0011111_0011111" when B"00100011", -- 226 sib 226 (freq: 3634.789270) B"0100_0_0000_0011111_0011111" when B"00100010", -- 225 sib 225 (freq: 3658.192476) B"0010_0_0000_0011111_0011111" when B"00100001", -- 224 sib 223 (freq: 3681.746367) B"0010_0_0000_0011111_0011111" when B"00100000", -- 223 sib 223 (freq: 3681.746367) B"0001_0_0000_0011111_0011111" when B"00011111", -- 222 sib 222 (freq: 3705.451914) B"0001_0_0000_0011111_0011111" when B"00011110", -- 221 sib 220 (freq: 3729.310092) B"0000_1_0000_0011111_0011111" when B"00011101", -- 220 sib 220 (freq: 3729.310092) B"0000_0_1000_0011111_0011111" when B"00011100", -- 219 sib 219 (freq: 3753.321886) B"0000_0_0100_0011111_0011111" when B"00011011", -- 218 sib 217 (freq: 3777.488284) B"0000_0_0100_0011111_0011111" when B"00011010", -- 217 sib 217 (freq: 3777.488284) B"0000_0_0010_0011111_0011111" when B"00011001", -- 216 sib 216 (freq: 3801.810281) B"0000_0_0001_0011111_0011111" when B"00011000", -- 215 sib 215 (freq: 3826.288880) B"1000_0_0000_0011111_0000000" when B"00010111", -- 214 si 213 (freq: 3850.925088) B"1000_0_0000_0011111_0000000" when B"00010110", -- 213 si 213 (freq: 3850.925088) B"0100_0_0000_0011111_0000000" when B"00010101", -- 212 si 212 (freq: 3875.719920) B"0010_0_0000_0011111_0000000" when B"00010100", -- 211 si 211 (freq: 3900.674399) B"0001_0_0000_0011111_0000000" when B"00010011", -- 210 si 209 (freq: 3925.789550) B"0001_0_0000_0011111_0000000" when B"00010010", -- 209 si 209 (freq: 3925.789550) B"0000_1_0000_0011111_0000000" when B"00010001", -- 208 si 208 (freq: 3951.066410) B"0000_0_1000_0011111_0000000" when B"00010000", -- 207 si 207 (freq: 3976.506020) B"0000_0_0100_0011111_0000000" when B"00001111", -- 206 si 205 (freq: 4002.109426) B"0000_0_0100_0011111_0000000" when B"00001110", -- 205 si 205 (freq: 4002.109426) B"0000_0_0010_0011111_0000000" when B"00001101", -- 204 si 204 (freq: 4027.877685) B"0000_0_0001_0011111_0000000" when B"00001100", -- 203 si 203 (freq: 4053.811856) B"1000_0_0000_1001110_0000000" when B"00001011", -- 202 do 201 (freq: 4079.913010) B"1000_0_0000_1001110_0000000" when B"00001010", -- 201 do 201 (freq: 4079.913010) B"0100_0_0000_1001110_0000000" when B"00001001", -- 200 do 200 (freq: 4106.182220) B"0010_0_0000_1001110_0000000" when B"00001000", -- 199 do 199 (freq: 4132.620568) B"0001_0_0000_1001110_0000000" when B"00000111", -- 198 do 198 (freq: 4159.229145) B"0001_0_0000_1001110_0000000" when B"00000110", -- 197 do 196 (freq: 4186.009045) B"0000_1_0000_1001110_0000000" when B"00000101", -- 196 do 196 (freq: 4186.009045) B"0000_0_1000_1001110_0000000" when B"00000100", -- 195 do 195 (freq: 4212.961372) B"0000_0_0100_1001110_0000000" when B"00000011", -- 194 do 194 (freq: 4240.087237) B"0000_0_0010_1001110_0000000" when B"00000010", -- 193 do 193 (freq: 4267.387756) B"0000_0_0001_1001110_0000000" when B"00000001", -- 192 do 191 (freq: 4294.864053) B"0000_0_0001_1001110_0000000" when B"00000000", -- 191 do 191 (freq: 4294.864053) B"0000_0_0000_1111111_1111111" when others; end;