Forum: FPGA, VHDL & Co. Mischung


von Chindji (Gast)


Lesenswert?

Ich möchte mit VHDL eine Multiplikation von ADC-Daten mit eine 
Sinus/Cosinus Paare programmieren für ein ADC/FPGA wer hat ein Idee .wie 
muss ich das programmieren?
Danke
CHINCO

von Johnsn (Gast)


Lesenswert?

Leg dir am besten Lookup-Tables für Sinus/Cosinus an und verwende den 
Signed-Datentyp aus dem numeric_std Package für die Multiplikation.

Ansonsten würde ich vorschlagen, dein Vorhaben genauer zu spezifizieren 
(welches FPGA, Bitbreite der Daten, geforderte Geschwindigkeit ...), 
dann kann dir besser geholfen werden!

von Chindji A. (feukam)


Lesenswert?

Johnsn wrote:
> Leg dir am besten Lookup-Tables für Sinus/Cosinus an und verwende den
> Signed-Datentyp aus dem numeric_std Package für die Multiplikation.
>
> Ansonsten würde ich vorschlagen, dein Vorhaben genauer zu spezifizieren
> (welches FPGA, Bitbreite der Daten, geforderte Geschwindigkeit ...),
> dann kann dir besser geholfen werden!

Hallo Johnsn

wie kann ich eine Lookup-Tables für Sinus/Cosinus programmieren . ich 
habe schon eine synthese von Sinus/Cosinus mit der Cordic programmiert

LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
-- synthesis translate_off
Library XilinxCoreLib;
-- synthesis translate_on
ENTITY cos_sin_core IS
  port (
  phase_in: IN std_logic_VECTOR(15 downto 0);
  x_out: OUT std_logic_VECTOR(15 downto 0);
  y_out: OUT std_logic_VECTOR(15 downto 0);
  rdy: OUT std_logic;
  clk: IN std_logic;
  ce: IN std_logic;
  aclr: IN std_logic;
  sclr: IN std_logic);
END cos_sin_core;

ARCHITECTURE cos_sin_core_a OF cos_sin_core IS
-- synthesis translate_off
component wrapped_cos_sin_core
  port (
  phase_in: IN std_logic_VECTOR(15 downto 0);
  x_out: OUT std_logic_VECTOR(15 downto 0);
  y_out: OUT std_logic_VECTOR(15 downto 0);
  rdy: OUT std_logic;
  clk: IN std_logic;
  ce: IN std_logic;
  aclr: IN std_logic;
  sclr: IN std_logic);
end component;

-- Configuration specification
  for all : wrapped_cos_sin_core use entity 
XilinxCoreLib.cordic_v3_0(behavioral)
    generic map(
      c_has_clk => 1,
      c_has_x_out => 1,
      c_has_y_in => 0,
      c_reg_inputs => 1,
      c_architecture => 2,
      c_input_width => 16,
      c_iterations => 3,
      c_precision => 16,
      c_has_rdy => 1,
      c_has_sclr => 1,
      c_has_nd => 0,
      c_scale_comp => 0,
      c_enable_rlocs => 1,
      c_has_phase_in => 1,
      c_has_rfd => 0,
      c_cordic_function => 2,
      c_has_ce => 1,
      c_mif_file_prefix => "cor1",
      c_round_mode => 3,
      c_has_aclr => 1,
      c_sync_enable => 1,
      c_has_y_out => 1,
      c_data_format => 0,
      c_reg_outputs => 1,
      c_coarse_rotate => 1,
      c_phase_format => 0,
      c_has_phase_out => 0,
      c_has_x_in => 0,
      c_pipeline_mode => -2,
      c_output_width => 16);
-- synthesis translate_on
BEGIN
-- synthesis translate_off
U0 : wrapped_cos_sin_core
    port map (
      phase_in => phase_in,
      x_out => x_out,
      y_out => y_out,
      rdy => rdy,
      clk => clk,
      ce => ce,
      aclr => aclr,
      sclr => sclr);
-- synthesis translate_on

END cos_sin_core_a;


von Johnsn (Gast)


Lesenswert?

Du kannst dir mit Matlab die Werte für Sinus ausgeben lassen in der 
Auflösung, die du halt gerne hättest. Mit diesen Werten erzeugst du dann 
ein VHDL-Array und dein Lookup-Table ist fertig.

So wie es aussieht verwendest du ein Xilinx FPGA, ich tippe mal stark 
auf Spartan 3 und ich glaube das ISE-Tool ist so intelligent, dass es 
aus dem Array mit Sinuswerten RAM-Blöcke instanziert.

Der Cordic-Core würde natürlich auch genausogut funktionieren, 
allerdings ist die Lösung sicher nicht so schnell, dafür bist du 
flexibler.

von FPGA Spezialist (Gast)


Lesenswert?

Der Xilinx Core Generator hat eine LUT drin, ausserdem geht das locker 
mit Excel.

von Johnsn (Gast)


Lesenswert?

Mit Matlab kann man halt dann gleich ein Skript schreiben, welches ein 
fix-fertiges VHDL-Package als Datei erstellt. Somit tut man sich 
leichter, wenn man zB mit der Genauigkeit oder Bitbreite herumspielen 
will! Aber für den Anfang geht mit Excel natürlich auch.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.