mikrocontroller.net

Forum: FPGA, VHDL & Co. Delay Line in VHDL


Autor: Erdin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich möchte eine Delay Line in VHDL generieren (die auch synthetisierbar 
sein soll). Außerdem funktioniert das Ganze wie eine Art Sampler... Ich 
bekomme 32 Abtastpunkte. Habe soweit folgendes zusammen:

[╝vhdl]
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;

entity Delayer is
  port(
    reset : in std_logic;
    clk : in std_logic;
    cin : in std_logic;
    dly_out : out std_logic_vector (31 downto 0);
    data_out : out std_logic_vector (1 downto 0)
    );
end Delayer;

architecture Behavioral of Delayer is

  signal del : std_logic_vector (127 downto 0);
  signal pd_D : std_logic_vector (127 downto 0);
  signal pd_R : std_logic_vector (31 downto 0);
  signal data_R : std_logic_vector (1 downto 0);

  signal clk_n : std_logic;

  attribute keep : string;
  attribute keep of del : signal is "true";
  attribute keep of pd_D : signal is "true";
  attribute keep of pd_R : signal is "true";
  attribute keep of data_R : signal is "true";

  attribute INIT : string;
  attribute INIT of ffloop_1 : label is "0";
  attribute INIT of ffloop_2 : label is "0";
  attribute INIT of ffd_1 : label is "0";
  attribute INIT of ffd_2 : label is "0";

  --attribute equivalent_register_removal : string;
  --attribute equivalent_register_removal of mloop is "false";

  component MUXCY_L
    port (LO : out STD_ULOGIC;
        CI : in STD_ULOGIC;
        DI : in STD_ULOGIC;
        S  : in STD_ULOGIC);
  end component;

  component XORCY_L
  port(LO : out STD_ULOGIC;
      CI : in STD_ULOGIC;
      LI : in STD_ULOGIC);
  end component;

  component FDC
   -- synthesis translate_off
   generic (INIT : bit:= '1');
   -- synthesis translate_on
   port (Q : out STD_ULOGIC;
         C : in STD_ULOGIC;
         CLR : in STD_ULOGIC;
         D : in STD_ULOGIC);
  end component;

  attribute box_type : string;
  attribute box_type of MUXCY_L : component is "black_box";
  attribute box_type of XORCY_L : component is "black_box";
  attribute box_type of FDC : component is "black_box";

  attribute noopt : boolean;
  attribute noopt of MUXCY_L : component is true;
  attribute noopt of XORCY_L : component is true;
  attribute noopt of FDC : component is true;

begin

  clk_n <= not clk;

  mux0: MUXCY_L port map(LO => del(0), CI => cin, DI => '0', S => '1');

  mloop: for j in 1 to 127 generate
    mux: MUXCY_L port map(LO => del(j), CI => del(j-1), DI => '0', S => 
'1');
  end generate;

  xloop: for k in 0 to 127 generate
    xor_del: XORCY_L port map(LO => pd_D(k), CI => del(k), LI => '1');
  end generate;

  ffloop_1: for m in 0 to 15 generate
    ff : FDC
    -- synthesis translate_off
    generic map (INIT => '0')
    -- synthesis translate_on
    port map (Q => pd_R(m), C => clk, CLR => reset, D => pd_D(4*m));
  end generate;

  ffd_1 : FDC
    -- synthesis translate_off
    generic map (INIT => '0')
    -- synthesis translate_on
    port map (Q => data_R(0), C => clk_n, CLR => reset, D => pd_D(62));

  ffd_2 : FDC
    -- synthesis translate_off
    generic map (INIT => '0')
    -- synthesis translate_on
    port map (Q => data_R(1), C => clk_n, CLR => reset, D => pd_D(63));

  ffloop_2: for n in 16 to 31 generate
    ff : FDC
    -- synthesis translate_off
    generic map (INIT => '0')
    -- synthesis translate_on
    port map (Q => pd_R(n), C => clk, CLR => reset, D => pd_D(4*n));
  end generate;

  dly_out <= pd_R;
  data_out <= (not data_R(1), not data_R(0));

end Behavioral;
[/vhdl]

Die mittleren zwei Elemente der Delay Line möchte ich zusätzlich 
abgreifen. Jetzt würde ich das Ganze gerne simulieren, bekomme aber für 
alle Elemente von mloop, xloop, ffloop_1, ffd_1, ffd_2, ffloop_2 
folgende Fehlermeldung (Hier eine Beispielhaft):

** Warning: (vsim-3473) Component instance "mux : muxcy_l" is not bound.

Was bedeutet das in dem Kontext? Ich mein verbunden sind die doch alle 
korrekt, oder? Wurden die wegoptimiert? Hab ich nen Denkfehler?

Viele Grüße,

Erdin

Autor: Erdin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich möchte eine Delay Line in VHDL generieren (die auch synthetisierbar
sein soll). Außerdem funktioniert das Ganze wie eine Art Sampler... Ich
bekomme 32 Abtastpunkte. Habe soweit folgendes zusammen:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;

entity Delayer is
  port(
    reset : in std_logic;
    clk : in std_logic;
    cin : in std_logic;
    dly_out : out std_logic_vector (31 downto 0);
    data_out : out std_logic_vector (1 downto 0)
    );
end Delayer;

architecture Behavioral of Delayer is

  signal del : std_logic_vector (127 downto 0);
  signal pd_D : std_logic_vector (127 downto 0);
  signal pd_R : std_logic_vector (31 downto 0);
  signal data_R : std_logic_vector (1 downto 0);

  signal clk_n : std_logic;

  attribute keep : string;
  attribute keep of del : signal is "true";
  attribute keep of pd_D : signal is "true";
  attribute keep of pd_R : signal is "true";
  attribute keep of data_R : signal is "true";

  attribute INIT : string;
  attribute INIT of ffloop_1 : label is "0";
  attribute INIT of ffloop_2 : label is "0";
  attribute INIT of ffd_1 : label is "0";
  attribute INIT of ffd_2 : label is "0";

  --attribute equivalent_register_removal : string;
  --attribute equivalent_register_removal of mloop is "false";

  component MUXCY_L
    port (LO : out STD_ULOGIC;
        CI : in STD_ULOGIC;
        DI : in STD_ULOGIC;
        S  : in STD_ULOGIC);
  end component;

  component XORCY_L
  port(LO : out STD_ULOGIC;
      CI : in STD_ULOGIC;
      LI : in STD_ULOGIC);
  end component;

  component FDC
   -- synthesis translate_off
   generic (INIT : bit:= '1');
   -- synthesis translate_on
   port (Q : out STD_ULOGIC;
         C : in STD_ULOGIC;
         CLR : in STD_ULOGIC;
         D : in STD_ULOGIC);
  end component;

  attribute box_type : string;
  attribute box_type of MUXCY_L : component is "black_box";
  attribute box_type of XORCY_L : component is "black_box";
  attribute box_type of FDC : component is "black_box";

  attribute noopt : boolean;
  attribute noopt of MUXCY_L : component is true;
  attribute noopt of XORCY_L : component is true;
  attribute noopt of FDC : component is true;

begin

  clk_n <= not clk;

  mux0: MUXCY_L port map(LO => del(0), CI => cin, DI => '0', S => '1');

  mloop: for j in 1 to 127 generate
    mux: MUXCY_L port map(LO => del(j), CI => del(j-1), DI => '0', S =>
'1');
  end generate;

  xloop: for k in 0 to 127 generate
    xor_del: XORCY_L port map(LO => pd_D(k), CI => del(k), LI => '1');
  end generate;

  ffloop_1: for m in 0 to 15 generate
    ff : FDC
    -- synthesis translate_off
    generic map (INIT => '0')
    -- synthesis translate_on
    port map (Q => pd_R(m), C => clk, CLR => reset, D => pd_D(4*m));
  end generate;

  ffd_1 : FDC
    -- synthesis translate_off
    generic map (INIT => '0')
    -- synthesis translate_on
    port map (Q => data_R(0), C => clk_n, CLR => reset, D => pd_D(62));

  ffd_2 : FDC
    -- synthesis translate_off
    generic map (INIT => '0')
    -- synthesis translate_on
    port map (Q => data_R(1), C => clk_n, CLR => reset, D => pd_D(63));

  ffloop_2: for n in 16 to 31 generate
    ff : FDC
    -- synthesis translate_off
    generic map (INIT => '0')
    -- synthesis translate_on
    port map (Q => pd_R(n), C => clk, CLR => reset, D => pd_D(4*n));
  end generate;

  dly_out <= pd_R;
  data_out <= (not data_R(1), not data_R(0));

end Behavioral;

Die mittleren zwei Elemente der Delay Line möchte ich zusätzlich
abgreifen. Jetzt würde ich das Ganze gerne simulieren, bekomme aber für
alle Elemente von mloop, xloop, ffloop_1, ffd_1, ffd_2, ffloop_2
folgende Fehlermeldung (Hier eine Beispielhaft):

** Warning: (vsim-3473) Component instance "mux : muxcy_l" is not bound.

Was bedeutet das in dem Kontext? Ich mein verbunden sind die doch alle
korrekt, oder? Wurden die wegoptimiert? Hab ich nen Denkfehler?

Viele Grüße,

Erdin

Autor: Jan M. (mueschel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lies dir mal die vier Kommentarzeilen fast m Anfang des Codes durch.

Du wirst an der normalen Simulation aber keine Freude haben - du musst 
eine timing simulation machen, sonst werden keine Laufzeiten im FPGA 
simuliert.

Autor: Erdin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich muss gestehen, mir ist das auch gerade aufgefallen, dass die 
auskommentiert waren =D! Das war nicht so gedacht...
Was meinst Du mit Timing Simulation? Wie kann ich die machen?

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum machst du dir diesen abartigen Aufwand, um ein paar Register, 
einen MUX und ein XOR zu instantiieren? Hier wäre eine 
Verhaltensbeschrbung tausendmal durchschau- und lesbarer...

> Was meinst Du mit Timing Simulation? Wie kann ich die machen?
Du mußt dein Design implementieren und danach auf den ensprechenden 
Knopf (Prozess) drücken. So ähnlich, wie die Verhaltenssimulation, aber 
etwas weiter unten...

Autor: Erdin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmm... also ich find den Code recht kompakt... Wenn Du das in VHDL 
kürzer hinbekommst... nur zu =)! Ich bin blutiger Anfänger und brauche 
erst noch das Gefühl. Zumal ich mich relativ strikt an die Xilinx 
AppNote 250 gehalten habe um das zu implementieren. Die machen das da 
auch so...
Das mit der Simulation hab ich auch mittlerweile rausgefunden... Muss 
mich noch mit den ganzen Tools anfreunden =/...

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Wenn Du das in VHDL kürzer hinbekommst ... nur zu =)!
Wenn du mir sagst, was es tun soll... ;-)
Oder alternativ, wofür du es brauchst...

> Ich bin blutiger Anfänger und brauche erst noch das Gefühl.
> Zumal ich mich relativ strikt an die Xilinx AppNote 250 gehalten habe
> um das zu implementieren. Die machen das da auch so...
Du bist Anfänger und hast die XAPP250 im Auge.
Donnerwetter, mein Respekt...  :-o

Autor: Erdin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lothar Miller schrieb:
> Wenn du mir sagst, was es tun soll... ;-)
> Oder alternativ, wofür du es brauchst...

Wie in der AppNote beschrieben, soll das ne DelayLine werden, die bei 
einem Takt von 160MHz etwas mehr als eine Periode aber nicht mehr als 
zwei Perioden buffert. Dabei wird das Signal gleichmäßig an 32 Punkten 
abgetastet, um später damit eine Flanke zu erkennen (wird nicht in 
diesem Modul gemacht). Das Ganze wird gebraucht, um Clock Data Recovery 
zu machen. Ich will hier also die übertragenen Bits zurückgewinnnen. Ein 
externer VCO wir dabei so gesteuert, dass der Flankenwechsel immer in 
der Mitte der Delayline geschieht. Die anderen Abtastwerte werden 
verwendet, um den VCO zu steuern.

>> Ich bin blutiger Anfänger und brauche erst noch das Gefühl.
>> Zumal ich mich relativ strikt an die Xilinx AppNote 250 gehalten habe
>> um das zu implementieren. Die machen das da auch so...
> Du bist Anfänger und hast die XAPP250 im Auge.
> Donnerwetter, mein Respekt...  :-o
Naja irgendwie muss sich doch mein Studium für was gelohnt haben =D ! 
Naja ich kann ja relativ gut Verilog... Somit ist es nicht allzu schlimm 
=) !

Autor: IsKlar (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>** Warning: (vsim-3473) Component instance "mux : muxcy_l" is not bound.
>Was bedeutet das in dem Kontext? Ich mein verbunden sind die doch alle
>korrekt, oder? Wurden die wegoptimiert? Hab ich nen Denkfehler?

Bei einer funktionalen Simulation (Simulation des HDL-Codes, nicht der 
synthetisierten Netzliste) wird nicht wegoptimiert.
Das hört sich eher dananch an, dass du das Portmapping falsch machst, 
oder
du hast nicht die richtigen Bibliotheken eingebunden.


IsKlar

Autor: Jürgen S. (engineer) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oder das file ist nicht Bestandteil des ModelSIM-Projektes.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.