Forum: FPGA, VHDL & Co. Xilinx: IBUF, IBUFG, BUFG, OBUF?


von Helmut (Gast)


Lesenswert?

Hallo,
ich versuche mich gerade in VHDL und in Xilinx FPGA (Digilent Board mit 
XC2S200E, ISE10.1) einzuarbeiten.

Wann brauche ich eigentlich IBUF, oder BUFG?
Wo ist der Unterschied zwischen IBUF, IBUFG, BUFG?
Wo definieren, in VHDL oder in UCF?

Ach ja und ich glaube ich habe auch noch OBUF gelesen.
Wozu brauch ich den?

Gruß
Helmut

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


Lesenswert?

> Wann brauche ich eigentlich IBUF, oder BUFG?
Das sind alles irgendwelche Treiber.
BUF = Buffer
I = In
O = Out
G = Global (Takt)

> Wo definieren, in VHDL oder in UCF?
IdR verwendet ISE automatisch den richtigen Buffer.
Du selber definierst nur, ob und wo du einen Eingang/Ausgang willst 
(IBUF/OBUF). ISE Erkennt dann selber, ob das ein Takteingang ist (BUFG)

> Ach ja und ich glaube ich habe auch noch OBUF gelesen.
Die exakte Bedeutung und Verwendung von
OBUF
IBUF
OBUFG
IBUFG
BUFG
wird im libraries guide erklärt. Den findest du über
doc/usenglish/books/manuals.pdf im ISE Verzeichnis

von Helmut (Gast)


Lesenswert?

Hallo Lothar,

"IdR verwendet ISE automatisch den richtigen Buffer."

Das hört sich ja schon mal gut an. Danke.

Ich habe als Übung einen Zähler mit Takt/CLK1) und Reset(BTN1) 
programmiert. Beide Pins(CLK1, BTN1) sind an globale Clock-Pins 
angeschlossen (GCK0, GCK1). Der Zähler funktioniert. Warum bekommt nur 
BTN1 bei der Synthese einen IBUF zugewiesen?

View Technoology Schematic:

CLK1 --- |I O| ---- |CLK der Flipflops|

BTN1 --- |IBUF| ---- |CLR Reset der Flipflops|


UCF-File:

NET "BTN1" LOC = "P77";
NET "CLK1" LOC = "P80";
NET "LED1" LOC = "P69";
NET "LED2" LOC = "P71";
NET "LED3" LOC = "P49";
NET "CLK1" TNM_NET = CLK1;
TIMESPEC TS_CLK1 = PERIOD "CLK1" 15 ns HIGH 50%;



VHDL-Code:

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 led_cnt is
    Port ( CLK1 : in  STD_LOGIC; -- 50MHz
          BTN1 : in STD_LOGIC; -- button-1
           LED1 : out  STD_LOGIC; -- LED-1
        LED2 : out STD_LOGIC; -- LED-2, P68, A4
        LED3 : out STD_LOGIC); -- LED-2, P68, A4
end led_cnt;

architecture Behavioral of led_cnt is
signal counter: std_logic_vector(23 downto 0) := 
"0000"&"0000"&"0000"&"0000"&"0000"&"0000";
signal counter2: std_logic_vector(3 downto 0) := "0000";
signal abc: STD_LOGIC;

begin

process (CLK1, BTN1)
begin
   if BTN1='1' then
  counter <= "000000000000000000000000"; --null;
  else
  if CLK1='1' and CLK1'event then
      counter <= counter + 1;
  end if;
  end if;
end process;

LED1 <= counter(23);

process (BTN1)
begin
   if BTN1='1' and BTN1'event then
      counter2 <= counter2 + 1;
   end if;
end process;
LED2 <= counter2(0);
abc <= BTN1;
LED3 <= abc;

end Behavioral;

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Helmut schrieb:
> Ich habe als Übung einen Zähler mit Takt/CLK1) und Reset(BTN1)
> programmiert. Beide Pins(CLK1, BTN1) sind an globale Clock-Pins
Oh oh... also das wird vermutlich so nicht funktionieren. Der Taster 
Prellt und dann hast du ein nahezu zufälliges Verhalten

> angeschlossen (GCK0, GCK1). Der Zähler funktioniert. Warum bekommt nur
> BTN1 bei der Synthese einen IBUF zugewiesen?

Weil die Synthese erkannt hat das du einen globalen Takt (CLK) hast und 
der "Button" ein Asyncrones Ereignis ist.

Hier:
1
process (CLK1, BTN1)
2
begin
3
   if BTN1='1' then
4
  counter <= "000000000000000000000000"; --null;
5
  else
6
  if CLK1='1' and CLK1'event then
7
      counter <= counter + 1;
8
  end if;
9
  end if;
10
end process;
Hier ist BTN1 der (asyncrone) Reset also ein normaler 'input'.
Schau dir mal Lothas Seite an besonders:

Entprellen:
http://www.lothar-miller.de/s9y/categories/5-Entprellung
und einsyncronisieren:
http://www.lothar-miller.de/s9y/categories/35-Einsynchronisieren

von Helmut (Gast)


Lesenswert?

@Lothar und Laubi,

Vielen Dank für eure Hilfe und die Links auf Lothar's Seite.
Ich sollte vielleicht doch erst mal das VHDL-Buch durchlesen.
"Lehrbuch Digitaltechnik, Eine Einführung mit VHDL, Jürgen Reichardt"

Hab gestern auch noch feststellen müssen, dass in der neuen ISE 11 mein 
Spartan-2E FPPGA nicht mehr unterstützt wird. Musste dann wieder die 
10.1 installieren. Vielleicht sollte ich mir doch besser ein Spartan-3 
Board zulegen. Leider ist das Spartan-6-Board noch zu teuer.

Gruß
Helmut

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.