Forum: FPGA, VHDL & Co. Xilinx FPGA XC5206 - Wie clock ausgeben?


von Peter K. (kloetpatra)


Lesenswert?

Hi, ich scheitere gerade daran den internen clock als Eingang zu 
verwenden. Geht das überhaupt?

mein test sieht so aus
1
library IEEE;
2
use IEEE.std_logic_1164.all;
3
4
entity clkgen is
5
    port (
6
      CLOCK: in  STD_LOGIC;
7
        Q0:  out STD_LOGIC;
8
    );
9
end clkgen;
10
11
architecture clkgen_arch of clkgen is
12
signal state : std_logic := '0';
13
begin
14
  Q0 <= '0';
15
  process (CLOCK)
16
  begin
17
    if CLOCK='1' and CLOCK'event then
18
      if state='1' then
19
        state <= '0';
20
        Q0 <= '1';
21
      else
22
        state <= '1';
23
        Q0 <= '0';
24
      end if;
25
    end if;
26
  end process;
27
end clkgen_arch;

Und meine UCF datei:
1
NET "Q0" LOC="P50";
2
NET "CLOCK" PERIOD = 500ns;

Ich vermute das ist nur die "Abtastfrequenz".
Kann mir jemand weiterhelfen?

von Cihan K. (lazoboy61)


Lesenswert?

Peter Krause schrieb:
> port (
>       CLOCK: in  STD_LOGIC;
>         Q0:  out STD_LOGIC;
>     );

Als erstes hast du in deiner entity einen Fehler. Das Semikolon von Q0 
muss weg.

Peter Krause schrieb:
> Q0 <= '0';
>   process (CLOCK)
>   begin
>     if CLOCK='1' and CLOCK'event then
>       if state='1' then
>         state <= '0';
>         Q0 <= '1';
>       else
>         state <= '1';
>         Q0 <= '0';
>       end if;
>     end if;
>   end process;

Als nächstes hast du Q0 sowohl innerhalb eines Prozesses als auch 
außerhalb gesetzt. Das führt zu Multisource, also nicht synthesierbar.

Was willst du eigentlich denn machen. Einfach die Clock auf Q0 ausgeben 
oder Clock/2 auf Q0. Erkläre mal bitte dein Vorhaben.

Cihan

von Cihan K. (lazoboy61)


Lesenswert?

Peter Krause schrieb:
> Und meine UCF datei:NET "Q0" LOC="P50";
> NET "CLOCK" PERIOD = 500ns;

Außerdem, willst du das Design später auf ein FPGA raufladen, dann musst 
du für CLOCK noch eine LOC angeben, woher soll er die Clock denn holen, 
na aus einem ext. Quarz z.B.

Und mache deine Clock Angabe am besten so ähnlich:
NET "CLK" LOC = ...;
NET "CLK" TNM_NET = CLK;
TIMESPEC TS_CLK = PERIOD "CLK" 10 ns HIGH 50%;

Die 50% gibt das Tastverhältnis an, sollte bei er Clock auch drin sein 
in der UCF.

Cihan

von Peter K. (kloetpatra)


Lesenswert?

Hallo Danke für die Tipps. Ich möchte kein externes signal als takt 
verwenden sondern den internen vom FPGA. Der Takt soll einfach an einem 
Pin ausgegeben werden und evtl noch verlangsamt werden um später eine 
LED blinken zu lassen.

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


Lesenswert?

Peter Krause schrieb:
> Der Takt soll einfach an einem Pin ausgegeben werden
Das geht so:
Q0 <= CLOCK;
(Das ist zwar quick 'n dirty, reicht aber für erste Funktionstests)

> und evtl noch verlangsamt werden um später eine LED blinken zu lassen.
Sieh dir das mal an:
http://www.lothar-miller.de/s9y/archives/80-Hello-World!.html

von Peter K. (kloetpatra)


Lesenswert?

Wie ich ihn ausgebe weiß ich. Ich weiß nicht wie ich den internen Takt 
dafür verwende.... Ich habe kein Taktgenerator am FPGA angeschlossen.

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


Lesenswert?

Peter Krause schrieb:
> Ich weiß nicht wie ich den internen Takt dafür verwende....
Welchen internen Takt?

> Ich habe kein Taktgenerator am FPGA angeschlossen.
Das wirst du aber müssen.

von Peter K. (kloetpatra)


Lesenswert?

Irgendwie klappt es immer noch nicht.
Ich habe jetzt einen 10MHz Oszillator an GCK3 (Pin 84).
Orientiert habe ich mich am tutorial 
http://www.lothar-miller.de/s9y/archives/80-Hello-World!.html

Ich habe es sowohl wie im Tutorial ohne Sensitivity-Liste mit "wait 
until" als auch wie hier mit Sensitivity-Liste probiert. Bei beiden 
varianten scheint es so als ob er keine Flanke registriert.
Die Zustände sind dauerhaft:
  Q0 HIGH (Pullup)
  Q1 LOW (Pullup)
  Q2 HIGH
  Q3 LOW

Laut Simulation müsste es aber gehen...
Was mach ich denn falsch?

Und warum muss ich denn die Periodenzeit angeben wenn ich eh den Takt 
von GCK3 hole?

UCF:
1
NET "Q0" LOC = "P40";
2
NET "Q1" LOC = "P44";
3
NET "Q2" LOC = "P50";
4
NET "Q3" LOC = "P53";
5
NET "CLOCK" LOC = "P84";
6
NET "CLOCK" PERIOD = 100ns HIGH 50 %;
7
NET "CLOCK" TNM_NET = "CLOCK";

led.vhd:
1
library IEEE; 
2
use IEEE.STD_LOGIC_1164.ALL; 
3
use IEEE.NUMERIC_STD.ALL; 
4
 
5
entity led is 
6
    Port ( CLOCK  : in  STD_LOGIC; 
7
           Q0:  out STD_LOGIC;
8
           Q1:  out STD_LOGIC;
9
           Q2:  out STD_LOGIC;
10
           Q3:  out STD_LOGIC
11
    ); 
12
end led; 
13
 
14
architecture led_arch of led is 
15
16
signal c : integer range 0 to 124 := 0;
17
signal x : std_logic;  
18
19
begin
20
   process (CLOCK) begin
21
      Q2 <= '1';
22
      if CLOCK='1' and CLOCK'event then
23
        if (c < 124 ) then
24
          c <= c+1;                -- wenn kleiner: c weiterzählen 
25
          x <= '0';
26
          Q3 <= '0';
27
        else                       -- wenn Zählerende erreicht: 
28
          c <= 0;                  -- Zähler c zurücksetzen 
29
          x <= '1';                -- und Zähler x hochzählen 
30
          Q3 <= '1';
31
        end if;
32
      end if; 
33
   end process;
34
   Q1 <= '0'; 
35
   Q0 <= x;    -- Signal x an LED ausgeben
36
    
37
end led_arch;

von Cihan K. (lazoboy61)


Lesenswert?

Q1 und Q2 hat der synthesierer bestimmt wegoptimiert, da diese sich nie 
ändern.

Welchen FPGA hast du denn? Kann es vielleicht sein, dass du dir 
Port-Angaben in der UCF falsch hast? Zumindest der P84, wo die Clock 
eingelesen wird?

Cihan

von Cihan K. (lazoboy61)


Lesenswert?

Und was ich gerade auch noch sehe:
1
...
2
   process begin  
3
      wait until rising_edge(clk); -- warten bis zum nächsten Takt 
4
      if (c<24999999) then         -- 0…24999999 = 25000000 Takte = 1/2 Sekunde bei 50MHz 
5
          c <= c+1;                -- wenn kleiner: weiterzählen 
6
      else                         -- wenn Zählerende erreicht: 
7
          c <= 0;                  -- Zähler zurücksetzen 
8
          x <= not x;              -- und Signal x togglen 
9
      end if; 
10
   end process; 
11
   led <= x;                       -- Signal x an LED ausgeben 
12
end Behavioral;

Mache das mit x mal genauso wie es Lothar gemacht hat, sonst hast du, so 
wie du es beschrieben hast, den x nur für einen Takt auf High. Der Q3 
natürlich ebenso.

Cihan

von hiall (Gast)


Lesenswert?

wenn x nur 1 Takt high ist siehst du es nicht

von Cihan K. (lazoboy61)


Lesenswert?

hiall schrieb:
> wenn x nur 1 Takt high ist siehst du es nicht

mit bloßem Auge nicht, aber den Impuls würde er auf dem Oszilloskopen 
sehen. Evtl. fügt er Chipscope ein und sieht sogar was intern im FPGA 
abgeht.

Cihan

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


Lesenswert?

Peter Krause schrieb:
> Laut Simulation müsste es aber gehen...
Wie sieht die denn aus?

> Und warum muss ich denn die Periodenzeit angeben wenn ich eh den Takt
> von GCK3 hole?
Da gibst du nicht die Periodenzeit an, sondern das, was du von der 
Toolchain mindestens erwartest. Damit gibst du der Toolchain eine 
Einschränkung (=Constraint), damit die das Design nicht aus Versehen 
unendlich langsam macht und damit zufrieden ist...

von Peter K. (kloetpatra)


Lesenswert?

Also mittlerweile hab ich so einiges herausgefunden.
Es geht sehr wohl auch ohne externen Takt. Das Interne Taktsignal läuft 
mit 12MHz und lässt sich über das Macro OSC3 benutzen. Dazu gibt es ein 
paar Argumente um den Divider einzustellen.

Warum es nicht ging, lag einfach daran, dass noch (1-2) Taktflanken vom 
JTAG-Programmer gefehlt haben damit der FPGA richtig los läuft.

von Georg A. (georga)


Lesenswert?

Wenn du genug rumgespielt hast, solltest du evtl. überlegen, mal auf ein 
aktuelleres FPGA (Spartan6 oder so) umzusteigen. Die XC5* sind so 15 
Jahre alt. Da ein FPGA-Jahr wie ein Hundejahr gerechnet wird, fallen sie 
eigentlich schon unter Denkmalschutz und du müsstest sie in einem Museum 
abgeben ;)

Solange du bei Xilinx bleibst, musst du auch nicht gross umdenken.

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.