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


von Erdin (Gast)


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

von Erdin (Gast)


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:
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.STD_LOGIC_ARITH.ALL;
4
use IEEE.STD_LOGIC_UNSIGNED.ALL;
5
6
---- Uncomment the following library declaration if instantiating
7
---- any Xilinx primitives in this code.
8
--library UNISIM;
9
--use UNISIM.VComponents.all;
10
11
entity Delayer is
12
  port(
13
    reset : in std_logic;
14
    clk : in std_logic;
15
    cin : in std_logic;
16
    dly_out : out std_logic_vector (31 downto 0);
17
    data_out : out std_logic_vector (1 downto 0)
18
    );
19
end Delayer;
20
21
architecture Behavioral of Delayer is
22
23
  signal del : std_logic_vector (127 downto 0);
24
  signal pd_D : std_logic_vector (127 downto 0);
25
  signal pd_R : std_logic_vector (31 downto 0);
26
  signal data_R : std_logic_vector (1 downto 0);
27
28
  signal clk_n : std_logic;
29
30
  attribute keep : string;
31
  attribute keep of del : signal is "true";
32
  attribute keep of pd_D : signal is "true";
33
  attribute keep of pd_R : signal is "true";
34
  attribute keep of data_R : signal is "true";
35
36
  attribute INIT : string;
37
  attribute INIT of ffloop_1 : label is "0";
38
  attribute INIT of ffloop_2 : label is "0";
39
  attribute INIT of ffd_1 : label is "0";
40
  attribute INIT of ffd_2 : label is "0";
41
42
  --attribute equivalent_register_removal : string;
43
  --attribute equivalent_register_removal of mloop is "false";
44
45
  component MUXCY_L
46
    port (LO : out STD_ULOGIC;
47
        CI : in STD_ULOGIC;
48
        DI : in STD_ULOGIC;
49
        S  : in STD_ULOGIC);
50
  end component;
51
52
  component XORCY_L
53
  port(LO : out STD_ULOGIC;
54
      CI : in STD_ULOGIC;
55
      LI : in STD_ULOGIC);
56
  end component;
57
58
  component FDC
59
   -- synthesis translate_off
60
   generic (INIT : bit:= '1');
61
   -- synthesis translate_on
62
   port (Q : out STD_ULOGIC;
63
         C : in STD_ULOGIC;
64
         CLR : in STD_ULOGIC;
65
         D : in STD_ULOGIC);
66
  end component;
67
68
  attribute box_type : string;
69
  attribute box_type of MUXCY_L : component is "black_box";
70
  attribute box_type of XORCY_L : component is "black_box";
71
  attribute box_type of FDC : component is "black_box";
72
73
  attribute noopt : boolean;
74
  attribute noopt of MUXCY_L : component is true;
75
  attribute noopt of XORCY_L : component is true;
76
  attribute noopt of FDC : component is true;
77
78
begin
79
80
  clk_n <= not clk;
81
82
  mux0: MUXCY_L port map(LO => del(0), CI => cin, DI => '0', S => '1');
83
84
  mloop: for j in 1 to 127 generate
85
    mux: MUXCY_L port map(LO => del(j), CI => del(j-1), DI => '0', S =>
86
'1');
87
  end generate;
88
89
  xloop: for k in 0 to 127 generate
90
    xor_del: XORCY_L port map(LO => pd_D(k), CI => del(k), LI => '1');
91
  end generate;
92
93
  ffloop_1: for m in 0 to 15 generate
94
    ff : FDC
95
    -- synthesis translate_off
96
    generic map (INIT => '0')
97
    -- synthesis translate_on
98
    port map (Q => pd_R(m), C => clk, CLR => reset, D => pd_D(4*m));
99
  end generate;
100
101
  ffd_1 : FDC
102
    -- synthesis translate_off
103
    generic map (INIT => '0')
104
    -- synthesis translate_on
105
    port map (Q => data_R(0), C => clk_n, CLR => reset, D => pd_D(62));
106
107
  ffd_2 : FDC
108
    -- synthesis translate_off
109
    generic map (INIT => '0')
110
    -- synthesis translate_on
111
    port map (Q => data_R(1), C => clk_n, CLR => reset, D => pd_D(63));
112
113
  ffloop_2: for n in 16 to 31 generate
114
    ff : FDC
115
    -- synthesis translate_off
116
    generic map (INIT => '0')
117
    -- synthesis translate_on
118
    port map (Q => pd_R(n), C => clk, CLR => reset, D => pd_D(4*n));
119
  end generate;
120
121
  dly_out <= pd_R;
122
  data_out <= (not data_R(1), not data_R(0));
123
124
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

von Jan M. (mueschel)


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.

von Erdin (Gast)


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?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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...

von Erdin (Gast)


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 =/...

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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

von Erdin (Gast)


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 
=) !

von IsKlar (Gast)


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

von J. S. (engineer) Benutzerseite


Lesenswert?

Oder das file ist nicht Bestandteil des ModelSIM-Projektes.

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.