Forum: FPGA, VHDL & Co. Differentielles Out-/Input Signal erzeugen/ einlesen


von FPGA (Gast)


Lesenswert?

- Virtex 6
- VHDL

Guten Morgen,

Es liegt ein differentielles Signal (x_N, X_P) vor. Bei dem 
Ausgangssignal (welches ich im weiteren intern im FPGA nutzen möchte) 
handelt es sich um ein single ended Signal y.

Wie folgt habe ich dieses umgesetzt:

Library UNISIM;
use UNISIM.vcomponents.all;

.
.
.

component IBUFGDS
      port (
        I  : in  STD_LOGIC;
        IB : in  STD_LOGIC;
        O  : out STD_LOGIC
        );
    end component;

IBUFGDS_Y : IBUFGDS
generic map (IOSTANDARD => "LVDS_25")
   port map (
      O =>  y,
      I =>  x_P,
      IB => x_N);.

Dadrauf folgt folgende Fehlermeldung:

Line 125: Type error near y ; current type std_logic_vector; expected 
type std_ulogic
Line 125: Type error near x_P ; current type std_logic_vector; expected 
type std_ulogic
Line 125: Type error near x_N ; current type std_logic_vector; expected 
type std_ulogic
Unit <behavioral> ignored due to previous errors.

Kann mir eventuell einer eine Lösung vorschlagen, oder das Problem 
aufzeigen?

Möchte ich eine differentielles Ausgangssignal erzeugen, dann schreibe 
ich doch


component OBUFDS
      port (
        O  : out STD_LOGIC;
        OB : out STD_LOGIC;
        I  : in  STD_LOGIC
        );
    end component;

OBUFGDS_Y : OBUFGDS
generic map (IOSTANDARD => "LVDS_25")
   port map (
      O =>  Y_N,
      OB => Y_P,
      I => Y);.

richtig?

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


Lesenswert?

FPGA schrieb im Beitrag #3413553:
> Line 125: Type error near y ; current type std_logic_vector; expected
> type std_ulogic
> Line 125: Type error near x_P ; current type std_logic_vector; expected
> type std_ulogic
> Line 125: Type error near x_N ; current type std_logic_vector; expected
> type std_ulogic
Das Problem liegt nicht im geposteten Code.
Zeig doch mal die Typdefinitionen für y, x_P und x_N.

von Christian R. (supachris)


Lesenswert?

Außerdem ist der IBUFGDS nur für Takt-Eingänge gedacht, dessen Ausgang 
geht nämlich auf ein internes Takt-Netz. IBUFDS ist für Daten.

von FPGA (Gast)


Lesenswert?

Vielen Dank. Ich habe die Anregung einmal umgesetzt.

component IBUFDS
port (  I  : in  STD_LOGIC;
        IB : in  STD_LOGIC;
        O  : out STD_LOGIC);
end component;

component OBUFDS
port (  O  : out STD_LOGIC;
  OB : out STD_LOGIC;
  I  : in  STD_LOGIC);
end component;

begin ...

IBUFDS_Y_1 : IBUFDS
--   generic map (IOSTANDARD => "LVDS_25")
port map (
O =>  Y_1,
I =>  X_P,
IB => X_N);

IBUFDS_Y_2 : IBUFDS
--   generic map (IOSTANDARD => "LVDS_25")
port map (
O  =>  Y_N,
OB =>  Y_P,
I  =>  Y);

So läuft es zumindestens ohne eine Fehlermeldung durch. Das Beispiel 
habe ich von 
http://www.cs.indiana.edu/hmg/le/project-home/xilinx/ise_8.1/doc/usenglish/de/libs/lib/ibufds.pdf. 
Dort kommentiert der Autor generic map (IOSTANDARD => "LVDS_25") 
allerdings ein. Dieses funktioniert bei mir nicht. Es wird dann eine 
Meldung ausgegeben (IOSTANDARD nicht definiert ...).

X_N, x_P ... dürften auch Vektoren sein, oder muss man dafür ein anderes 
Konstrukt wählen?

Dank euch

von FPGA (Gast)


Lesenswert?

Ich habe die Antwort im "Virtex-6 Libraries Guide for HDL Designs" 
(S.154/154)gefunden. Danke euch nocheinmal für die Hilfe. Für alle 
anderen, die eine Ähnliche Frage haben:

library UNISIM;
use UNISIM.vcomponents.all;
...
signal y  :std_logic;
signal x_N:std_logic;
signal x_P:std_logic;
...
IBUFDS_y : IBUFDS
generic map (
  DIFF_TERM     => FALSE,
  IBUF_LOW_PWR   => TRUE,
  IOSTANDARD     => "DEFAULT")
port map (
        O =>  y,
        I =>  x_P,
        IB => x_N);

Für den Output Buffer siehe Seite 256/257.

Für Vektoren, d.h. signal x_n :std_logic_vector (2 downto 0) funktiniert 
es bei mir nicht. Hier muss jedes Bit x_n(0),x_n(1),x_n(2) betrachtet 
werden. Falls ich falsch liege, oder es für vektorielle Signale eine 
andere Lösung gibt, wäre es nett diese zu posten.

von Christian R. (supachris)


Lesenswert?

Für Vektoren musst du dann alles hinschreiben, eleganter gehts natürlich 
mit einer "for ... generate" Schleife.

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


Lesenswert?

FPGA schrieb im Beitrag #3413616:
> IBUFDS_Y_2 : IBUFDS
> port map (
> O  =>  Y_N,
> OB =>  Y_P,
> I  =>  Y);
> X_N, x_P ... dürften auch Vektoren sein?
Nein, denn ein paar Zeilen weiter oben schreibst du selber
> component IBUFDS
> port (  I  : in  STD_LOGIC;
>         IB : in  STD_LOGIC;
>         O  : out STD_LOGIC);
> end component;
Und STD_LOGIC ist /= STD_LOGIC_VECTOR.

> Dort kommentiert der Autor generic map (IOSTANDARD => "LVDS_25")
> allerdings ein. Dieses funktioniert bei mir nicht. Es wird dann eine
> Meldung ausgegeben (IOSTANDARD nicht definiert ...).
Vermutlich ist beim "Autor" diese Definition vorhanden und bei dir 
nicht.

Das Schöne und manchmal Umständliche an VHDL ist die strikte 
Typverwaltung. Jede Konvertierung und jeder Typ muss vor der Verwendung 
angegeben werden. Sonst stellt sich der Synthesizer sofort dumm und sagt 
"undefined!"

von FPGA (Gast)


Lesenswert?

Vielen Dank.

Ich habe noch eine generelle Frage zu den verwendeten Signaltypen.

Bei einem differentiellen Ausgang x_N, x_P sind diese vom Datentyp LVDS 
=> UCF-File ...

NET "x_N"    LOC = "A1"| IOSTANDARD = LVDS_25;
NET "x_P"    LOC = "A2"| IOSTANDARD = LVDS_25;

In der main.vhd habe ich diese dann Einbunden als

...

entity main is
Port (
  x_N : out std_logic;
  x_P : out std_logic);
end main;

architecture Behavioral of main is

  signal y std_logic := '0';

begin
OBUFDS_TX_FRAME : OBUFDS
generic map (
IOSTANDARD     => "DEFAULT")
port map (
  O  =>  x_net,
  OB =>  x_N_net,
  I  =>  y);
end Behavioral;


Vom Verhalten soll jetzt das Signal y differentiel zwischen Pin A1 und 
A2 anliegen. Korrekt? Das Signal ist vom Typ STD_LOGIC.

Ich bekommen teils eine solche Fehlermeldung:

ERROR:Bitgen - Could not find programming information for I/O standard 
LVDS_25
   drive=-1, slew=*, master=*.  The programming of the output buffers 
will not   be correct.

Zum besseren Verständnis also diese Nachfrage. Danke euch

von FPGA (Gast)


Lesenswert?

Habe es bis auf ein Signal geschafft:

...
y_P        : out STD_LOGIC_VECTOR(5 downto 0);
y_N        : out STD_LOGIC_VECTOR(5 downto 0);

...
signal y: STD_LOGIC_VECTOR(5 downto 0)   := "000000";
signal y_P_net: STD_LOGIC_VECTOR(5 downto 0)   := "000000";
signal y_N_net: STD_LOGIC_VECTOR(5 downto 0)   := "111111";

Loop_Y: for i in 0 to 5 generate
OBUFDS_Y : OBUFDS
  generic map (IOSTANDARD => "DEFAULT")
  port map (
    O   =>  y_P_net(i),
    OB =>  y_N_net(i),
    I   =>  y(i));
end generate Loop_Y;

Zugehöriges UCF-File

NET "y_P<0>"    LOC = "D34"| IOSTANDARD = LVDS_25;
...

NET "y_N<0>"    LOC = "D34"| IOSTANDARD = LVDS_25;
...

y_N <= y_N_net;
y_P <= y_P_Net;




ERROR:Pack:1107 - Pack was unable to combine the symbols listed below 
into a  single IOBM component because the site type selected is not 
compatible.



Ich sehe den Fehler insofern nicht, da der Rest des Programms 
funktioniert, wenn ich die oben aufgezeigten Zeilen auskommentiere. D.h. 
der Fehler muss beim Signal y, y_p, y_n etc liegen

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


Lesenswert?

FPGA schrieb im Beitrag #3414249:
> da der Rest des Programms
Eins vorneweg: es ist kein Programm. Sondern eine Hardwarebeschreibung. 
Deshalb heißt VHDL auch nicht VHPL (Very high density Hardware 
Programming Language)...

FPGA schrieb im Beitrag #3414249:
> ERROR:Pack:1107 - Pack was unable to combine the symbols listed below
> into a  single IOBM component because the site type selected is not
> compatible.
Funktioniert diese Beschreibung mit ausgerollter Schleife, wenn du jedem 
Buffer einen eigenen Namen gibst?

von Christian R. (supachris)


Lesenswert?

Kann doch nicht gehen, wenn N und P auf dem selben Pin liegen. Ist bei 
dir beide Male D34. Mach mal die Pin Zuweisung in PlanAhead. Bei User 
Constraints ist das zu finden, Package Planning oder so. Hab ISE gerade 
nocht zur Hand. Da kannst du dann in Drop Down Boxen alles einstellen. 
Normal muss man auch nur den P angeben, N passt ja dann nur einer dazu, 
das macht der selber.

@Lothar: War das V nicht für VHSIC?

: Bearbeitet durch User
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.