mikrocontroller.net

Forum: FPGA, VHDL & Co. DCM bei spartan 3a, clkfxout 300Mhz geht nicht?


Autor: niceGast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo zusammen,

um die PWM-frequenz für ungefähr 9khz zu erzeugen, brauche ich takt für 
300Mhz. single DCM-SP v9.1i, clkin : 50Mhz auf dem board wurden benutzt.
Bei DCM-wizard steht Fout von 5 bis 333Mhz, deswegen hab als frequzenout 
= 300Mhz ausgewählt.

Es geht um symmetrisches PWM, also ein 14bit-counter zählt hoch bis max 
3fff und runter bis 0, also dreiecksignal. Die Dreieck-Frequenz ergibt 
sich dann: f = 300Mhz/2**15 ~ 9khz.

Sumulation geht, aber auf hw geht nicht.
          process(clk300Mhz)
              variable cnt : STD_LOGIC_VECTOR (13 downto 0) := (others => '0');-- [0 to x"3FFF"] 
              variable cntDwn : STD_LOGIC := '0';
            if rising_edge(clk300Mhz) then
            
            -- Dreieck-counter
              if cntDwn = '0' then
                cnt := cnt + 1;
                if cnt = PWM_MAX then
                  cntDwn := '1';
                end if;
              else
                cnt := cnt - 1;
                if cnt = x"0000" then
                  cntDwn := '0';
                end if;
              end if;
              cntDown <= cntDwn;
            end if;
          end process;

NET "cntDown" LOC = L20;
NET "cntDown" IOSTANDARD = "LVCMOS33";
NET "cntDown" DRIVE = 8;
NET "cntDown" SLEW = SLOW;


den outport : "cntDown" hab ich auf ein IO-Pin zugewiesen und auf oszzi 
schauen, es sollte ein Impuls für  300Mhz/2**15 Hz erscheinen. Aber 
scheint ein konstante Signal, 3.3 V, also "high" !?

Nach paar stunden :( ausprobiert, hab gemerkt, es läuft nur bis maximal 
fout = 260Mhz, mehr geht nicht.


wieso ist das, welche parameter muss ich vllt DCM einstellen?

vielen dank im voraus!

Autor: iulius (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
versuchs mal mit dem generic für speedgrade...

alternativ kannst du auch einfach deine Struktur so überarbeiten das sie 
nicht Unmengen an sequentieller Logik benötigt.

z.b. sowas :

cnt := cnt + 1;
if cnt = PWM_MAX then


warum bitte muss man im gleichen Takt prüfen ob der sich gerade erhöhte 
Zähler schon den Schwellwert erreicht hat ?

erhöhe halt den zähler immer und denke einen Takt voraus für das 
vorzeichen.

Das sollte für die 40mhz ausreichen, einen 14bit counter mit 
reseteingang dürfte der spartan noch mit 300mhz betreiben können.


weiter Stichworte :

- (unmatched) timing constraints
- timing report
- level of logic


Nur weil die dcm bis 333mhz erzeugen kann heißt das nunmal nicht das 
jedwede logik damit läuft.

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

Bewertung
0 lesenswert
nicht lesenswert
Welches FPGA?
Hast du Timing-Constraints?
Welche Taktfrequenz bietet die Synthese?

>> if cnt = PWM_MAX then
Können deine 14 Bit-Komparatoren überhaupt 300MHz?

Autor: niceGast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
vielen dank für eure schnell-antwort!

iulius schrieb:
> alternativ kannst du auch einfach deine Struktur so überarbeiten das sie
> nicht Unmengen an sequentieller Logik benötigt.
>
> z.b. sowas :
>
> cnt := cnt + 1;
> if cnt = PWM_MAX then
>
>
> warum bitte muss man im gleichen Takt prüfen ob der sich gerade erhöhte
> Zähler schon den Schwellwert erreicht hat ?

was meinst du?,kann man noch besseres verfahren umschreiben?, tut mir 
leid, bin noch ziemlich newbie in FPGA.

Lothar Miller schrieb:
> Welches FPGA?

es geht um xc3s700a-4fg484

Lothar Miller schrieb:
> Hast du Timing-Constraints?

nein, welche parameter vllt soll ich in timing-constraints in diesem 
fall eingeben?

Lothar Miller schrieb:
> Welche Taktfrequenz bietet die Synthese?
upss, weiß leider nicht:( was ist das eigentlich?

Lothar Miller schrieb:
>>> if cnt = PWM_MAX then
> Können deine 14 Bit-Komparatoren überhaupt 300MHz?

PWM_MAX = Max-Count = 3fff. weiß nicht ob das geht mit 300Mhz, woher 
kann man wißen?

vielen dank für ihre hilfe!

Autor: niceGast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also, feht vielleicht noch,

das ist evaluation-board, spartan 3a, xc3s700a-4fg484

ciao

Autor: Johann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also wenn ich das richtig gelesen habe dann willst Du einen 300MHz Puls 
messen. Du must mal im Datenblatt unter den Schaltzeiten der I/O Buffer 
nachschauen. Dann stellst Du sehr schnell fest das mit dem "LVCMOS33" 
und dem LOW keine so schnellen Schaltzeiten möglich sind.

Wenn Du einen LVCMOS33 Inpuft Buffer verwendest dann ist das vielleicht 
noch möglich, jedoch die Output Buffer sind da deutlich langsamer.

LVDS Pegel sind da deutlich schneller. Vielleicht kann man jedoch eine 
DDR-Lösung machen.

Ich befürchte allerdings auch das Deine interne Logic bei diese 
Geschwindkeit noch funktioniert.

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

Bewertung
0 lesenswert
nicht lesenswert
> weiß nicht ob das geht mit 300Mhz, woher kann man wißen?
Das konnte man sich in den Reports ansehen. Als erster Anhaltspunkt 
könnte aber auch das Syntheseergebnis aus der Console herhalten...

> nein, welche parameter vllt soll ich in timing-constraints in diesem
> fall eingeben?
Mindestens die Eingangs-Taktfrequenz des DCM: 50MHz
Wenn du den DCM richtig verwendet hast, dann werden die Constraints für 
die erzeugten 300MHz automatisch richtig gesetzt.

Autor: niceGast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Johann schrieb:
> Also wenn ich das richtig gelesen habe dann willst Du einen 300MHz Puls
> messen.

nein, ich will den signal "cntDwn" mit frequenz = 300Mhz/2**15 
anschauen. Die 300Mhz Takt ist nur für ein 14bit-counter angewendet.

Und außerdem hab ich grad nochmal ausprobiert, zwar kommt das 
Impulssignal "cntDown" auf dem oszziloscop, aber andere signale, die 
über on-board DA-Wandler umgesetzt werden, erscheinen auf oszzi mit viel 
rauchen.

Das "cntDown"-signal wird benutzt als "clk" für die anderen berechnenden 
Blocks.

Das sind hier die timing-report:

Timing Summary:
---------------
Speed Grade: -4

   Minimum period: 7.993ns (Maximum Frequency: 125.109MHz)
   Minimum input arrival time before clock: 1.521ns
   Maximum output required time after clock: 25.259ns
   Maximum combinational path delay: 1.070ns


Static Timing report:

Data Sheet report:
-----------------
All values displayed in nanoseconds (ns)

Clock clk to Pad
------------+------------+------------------+--------+
            | clk (edge) |                  | Clock  |
Destination |   to PAD   |Internal Clock(s) | Phase  |
------------+------------+------------------+--------+
cntDown     |    9.171(R)|clk300Mhz         |   0.000|
------------+------------+------------------+--------+

Clock to Setup on destination clock clk
---------------+---------+---------+---------+---------+
               | Src:Rise| Src:Fall| Src:Rise| Src:Fall|
Source Clock   |Dest:Rise|Dest:Rise|Dest:Fall|Dest:Fall|
---------------+---------+---------+---------+---------+
clk            |    7.788|         |         |         |
---------------+---------+---------+---------+---------+


Ziemlich viel Berechnungnen werden durchgeführt:


Advanced HDL Synthesis Report

Macro Statistics
# ROMs                                                 : 2
 256x16-bit ROM                                        : 1
 4x16-bit ROM                                          : 1
# Multipliers                                          : 4
 16x16-bit registered multiplier                       : 4
# Adders/Subtractors                                   : 138
 13-bit adder                                          : 1
 14-bit adder                                          : 1
 14-bit subtractor                                     : 1
 16-bit adder                                          : 88
 16-bit addsub                                         : 2
 16-bit subtractor                                     : 33
 17-bit adder                                          : 5
 17-bit subtractor                                     : 6
 5-bit subtractor                                      : 1
# Counters                                             : 2
 8-bit up counter                                      : 2
# Registers                                            : 195
 Flip-Flops                                            : 195
# Latches                                              : 4
 1-bit latch                                           : 4
# Comparators                                          : 55
 12-bit comparator equal                               : 4
 12-bit comparator not equal                           : 4
 13-bit comparator less                                : 1
 14-bit comparator greatequal                          : 3
 16-bit comparator greatequal                          : 4
 16-bit comparator greater                             : 4
 16-bit comparator less                                : 4
 16-bit comparator lessequal                           : 4
 17-bit comparator greatequal                          : 7
 17-bit comparator greater                             : 6
 17-bit comparator less                                : 7
 17-bit comparator lessequal                           : 6
 8-bit comparator less                                 : 1


Und kriege ich noch die Warnung,

"WARNING:Xst:2677 - Node <clkO> of sequential type is unconnected in 
block <XLXI_47>."

für den code:

   clk10K: process (clkI)
          variable cnt : integer range 0 to 5000;
          begin
            if rising_edge(clkI) then
              cnt := cnt + 1;
              if cnt = 5000 then
                cnt := 0;
              end if;
              -----
              if cnt < scale10K/2 then
                clkO <= '0';
              else clkO <= '1';
              end if;
            end if;
          end process;

Autor: niceGast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
niceGast schrieb:
> "WARNING:Xst:2677 - Node <clkO> of sequential type is unconnected in
> block <XLXI_47>."

ahh, hab verstanden, nur weil es nicht benutzt ist, meldet die warnung:D

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.