mikrocontroller.net

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


Autor: Bernhard P. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: SuperWilly (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
z.B. led_out(0) registrieren

Gruß,
SuperWilly

Autor: Bernhard P. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
was meinst du mit registrieren??

Danke
Bernhard

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Bernhard P. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

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

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

Autor: Bernhard P. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: bko (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Hallo,
>was meinst du mit registrieren??
>Danke
>Bernhard

Das könnte >SuperWilly< damit meinen:
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;

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.

Autor: Bernhard P. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,

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

habt dank
Bernhard

Autor: Bernhard P. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Bernhard P. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.