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


von niceGast (Gast)


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.
1
          process(clk300Mhz)
2
              variable cnt : STD_LOGIC_VECTOR (13 downto 0) := (others => '0');-- [0 to x"3FFF"] 
3
              variable cntDwn : STD_LOGIC := '0';
4
            if rising_edge(clk300Mhz) then
5
            
6
            -- Dreieck-counter
7
              if cntDwn = '0' then
8
                cnt := cnt + 1;
9
                if cnt = PWM_MAX then
10
                  cntDwn := '1';
11
                end if;
12
              else
13
                cnt := cnt - 1;
14
                if cnt = x"0000" then
15
                  cntDwn := '0';
16
                end if;
17
              end if;
18
              cntDown <= cntDwn;
19
            end if;
20
          end process;
21
22
NET "cntDown" LOC = L20;
23
NET "cntDown" IOSTANDARD = "LVCMOS33";
24
NET "cntDown" DRIVE = 8;
25
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!

von iulius (Gast)


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.

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


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?

von niceGast (Gast)


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!

von niceGast (Gast)


Lesenswert?

also, feht vielleicht noch,

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

ciao

von Johann (Gast)


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.

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


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.

von niceGast (Gast)


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:
1
   clk10K: process (clkI)
2
          variable cnt : integer range 0 to 5000;
3
          begin
4
            if rising_edge(clkI) then
5
              cnt := cnt + 1;
6
              if cnt = 5000 then
7
                cnt := 0;
8
              end if;
9
              -----
10
              if cnt < scale10K/2 then
11
                clkO <= '0';
12
              else clkO <= '1';
13
              end if;
14
            end if;
15
          end process;

von niceGast (Gast)


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

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.