Xilinx FPGA XC5206 - Wie clock ausgeben?

OP #3023873
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?
#3023881
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
#3023884
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
OP #3024316
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;
#3024334
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
Moderator (Firma: Titel) Persönliche Seite #3024555
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...
OP #3032600
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.
#3032671
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren