Forum: FPGA, VHDL & Co. clocks in lattice ecp2


von Bernhard P. (Gast)


Lesenswert?

Hallo,

ich habe ein Problem mit den Clocks bei einem Lattice ECP2.
Ich habe eine PLL aufgesetzt die mir aus 25MHz 50MHz generiert und mit 
diesen 50MHz takte ich einen Zaehler den ich dann verwende um einen PWM 
zu generieren (dieser PWM hat ein eigenes .vhd file):
  process (clk_pwm)
  begin
    if rising_edge(clk_pwm) then
      if pwmPeriod = "1111111111111111" then
        pwmPeriod   <= (others => '0');
        pwmReload   <= '1';
      else
        pwmPeriod <= pwmPeriod + 1;
        pwmReload   <= '0';
      end if;
    end if;
  end process;
  pwmOut <= pwmPeriod;

pwmOut gibt mir also immer den aktuellen Zaehlerstand aus, den ich im 
top file verwende in dieser Form (pwmOut wird in der portmap auf pwm0 
geroutet):
led_out(0) <=   '1' when Kanal_1 < pwm0 else
                '0';

Somit bekomme ich eine Ausgangsfrequenz an der Led von 763Hz (50MHz / 
65536).
Soweit so gut, ich muss die Ausgangsfrequenz aber auch noch weiter 
erhöhen, habe also die PLL auf 100MHz eingestellt und komm jetzt aber 
mitn Timing nicht mehr hin, krieg die Fehlermeldung:

FREQUENCY NET "clk_100" 100.000000 MHz  |             |             |
;                                       |  100.000 MHz|   62.263 MHz| 
2 *

Welche Möglichkeiten hab ich, damit ich clk_100 auf mindestens 100MHz 
bringe??

Herzlichen Dank im Voraus
Bernhard

von SuperWilly (Gast)


Lesenswert?

z.B. led_out(0) registrieren

Gruß,
SuperWilly

von Bernhard P. (Gast)


Lesenswert?

Hallo,
was meinst du mit registrieren??

Danke
Bernhard

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


Lesenswert?

> Welche Möglichkeiten hab ich, damit ich clk_100 auf mindestens 100MHz
> bringe??
Du solltest erst mal herausfinden, welcher Logik-Pfad deine Taktfrequenz 
beschränkt. Das geht am einfachsten über die statische Timinganalyse.

> clk_100 ... clk_pwm
Wieviele Takte hast du eigentlich in deinem Design?
Wie sind die erzeugt und wie werden sie verteilt?

von Bernhard P. (Gast)


Lesenswert?

Hallo,

wenn ich die Zeile
led_out(0) <=   '1' when Kanal_1 < pwm0 else
                '0';
auskommentiere, komm ich laut Trace Report auf 264MHz...

Hab dann nur mehr eine 24MHz Clock,
clk_pwm wird in der portmap vom pwm module auf clk_100 verdrahtet.
Erzeugt werden beide clocks mit einer PLL.

Bernhard

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


Lesenswert?

Dann würde ich vermuten, dass der Vergleich
1
 Kanal_1 < pwm0
zu lange braucht...
Ist das ein 16-Bit-Vergleich?

Probier mal zur Ursachenforschung nur einen Teil von jedem Vektor zu 
vergleichen.

von Bernhard P. (Gast)


Lesenswert?

Hallo,

ja das ist ein 16 bit Vergleich.
ok, werd ich ausprobieren, angenommen es ist wirklich der Vergleich, wie 
könnt ich das umgehen bzw. schneller machen?

Danke vielmals
Bernhard

von bko (Gast)


Lesenswert?

>Hallo,
>was meinst du mit registrieren??
>Danke
>Bernhard

Das könnte >SuperWilly< damit meinen:
1
led_temp <=   '1' when Kanal_1 < pwm0 else
2
                       '0';
3
process (clk_pwm)
4
  begin
5
    if rising_edge(clk_pwm) then
6
       led_register <=  led_temp; 
7
    end if;
8
 end process;
9
10
led_out(0) <= led_register;

Damit wird noch ein Flipflop zwischen der Logik und dem
Led Ausgang eingebaut, dies könnte die mögliche Takt
Frequenz auch erhöhen. das Ausgangssignal wird aber
um einen Takt verzögert.

von Bernhard P. (Gast)


Lesenswert?

hallo,

herzlichen Dank für die vielen Antworten, sobald ich es ausprobiert habe 
melde ich mich wieder!!

habt dank
Bernhard

von Bernhard P. (Gast)


Lesenswert?

Hallo,
habe das jetzt ausprobiert:
led_temp <=   '1' when Kanal_1 < pwm0 else
                       '0';
process (clk_pwm)
  begin
    if rising_edge(clk_pwm) then
       led_register <=  led_temp;
    end if;
 end process;

led_out(0) <= led_register;

hat aber leider nix gebracht, auch das vergleichen von nur einem Bit und 
nicht die vollen 16 Bit hat auch nix gebracht.

Sobald ich die Zeile:

led_out(0) <= led_register;

auskommentiere komm ich wieder auf ca. 260MHz.
led_out ist ja ein Pin der aus dem FPGA auf eine Led rausgeht.
Gibts da eine Beschränkung für Ausgangspins oder irgendwas in der 
Richtung?

Herzlichen Dank
Bernhard

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


Lesenswert?

> Gibts da eine Beschränkung für Ausgangspins
Wenn du den Ausgang nochmal registirest, wird auf jeden Fall das 
Ausgangsregister im IO-Pad verwendet, dann brauchst du relativ lange 
Routingpfade dorthin. Das wird dir das Timing zerhageln. Aber wie 
gesagt: eine Timing-Analyse sollte dir die Schwachstelle aufzeigen.

BTW:
Ich würde das pragmatisch machen und den Pfad nach aussen so 
constrainen, dass er ignoriert wird. Dorthin sind nun wirklich keine 
100MHz nötig ;-)

Am Rande:
Hast du überhaupt schon irgendein Clock-Constraint gesetzt? Weiß die 
Toolchain, dass du 100MHz willst?

von Bernhard P. (Gast)


Lesenswert?

Hallo,

>
Ich würde das pragmatisch machen und den Pfad nach aussen so
constrainen, dass er ignoriert wird. Dorthin sind nun wirklich keine
100MHz nötig ;-)
>
da hast du natürlich recht, brauch ich ja auch nicht, aber ich denke mal 
das es mit dem Ausgang zu tun haben muss, da mir dort die clock 
reduziert wird!?

>
Hast du überhaupt schon irgendein Clock-Constraint gesetzt? Weiß die
Toolchain, dass du 100MHz willst?
>

ja, hab ich, pll mit ipexpress eingebunden, dort auf 100MHz Ausgang 
gestellt und im Design Planer bei Clock/Period Constraints, die clk_100 
angeklickt und auf 100MHz gestellt (überschreibt glaub ich eh die 
eingestellte Frequenz in der PLL).

Danke,
Bernhard

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.