Forum: FPGA, VHDL & Co. Timer Prescaler


von Daniel K. (daniel_k80)


Lesenswert?

Hallo,

ich versuche gerade mir einen konfigurierbaren Timer mit PWM in VHDL zu 
erschaffen und habe da eine Frage zu der Simulation.
Ich habe den Code
1
    Half_Prescaler <= '0' & Prescaler(Width - 1 downto 1);
2
    
3
    process begin
4
        if(Prescaler = "00000000") then
5
            Clock <= '0';
6
        elsif(Prescaler = "00000001") then
7
            Clock <= Clock_In;
8
        else
9
            wait until rising_edge(Clock_In);
10
            if(Clock_Counter = (to_integer(unsigned(Half_Prescaler)) - 1)) then
11
                Clock <= not Clock;
12
                Clock_Counter <= 0;
13
            else     
14
                Clock_Counter <= Clock_Counter + 1;    
15
            end if;
16
        end if;
17
    end process;

Dieser Code funktioniert in der Simulation aber nicht...die Simulation 
bleibt bei 0ps stehen.
Wenn ich den Code nun so schreibe
1
    Half_Prescaler <= '0' & Prescaler(Width - 1 downto 1);
2
    
3
    process (Clock_In)
4
    begin
5
        if(Prescaler = "00000000") then
6
            Clock <= '0';
7
        elsif(Prescaler = "00000001") then
8
            Clock <= Clock_In;
9
        else
10
            if rising_edge(Clock_In) then   
11
                if(Clock_Counter = (to_integer(unsigned(Half_Prescaler)) - 1)) then
12
                    Clock <= not Clock;
13
                    Clock_Counter <= 0;
14
                else     
15
                    Clock_Counter <= Clock_Counter + 1;    
16
                end if;
17
            end if;
18
        end if;
19
    end process;

funktioniert die Simulation. Ist das nicht praktisch das selbe?
Oder liegt das daran, dass im ersten Beispiel keine Signale in der 
Sensitivity List stehen?

Danke für eine Antwort!

Gruß
Daniel

von Schlumpf (Gast)


Lesenswert?

Hallo Daniel,

wenn du schon vermutest, dass es an der Sensitivity-List liegen könnte, 
warum probierst du es nicht einfach aus?
Wäre doch 10mal schneller gegangen, als die Frage hier zu posten, oder 
nicht?

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


Lesenswert?

Daniel K. schrieb:
> Dieser Code funktioniert in der Simulation aber nicht...
Klar. Weil du mit einem "wait" keinen asynchronen Reset beschreiben 
kannst. Mal überlegen: ein Prozess ohne Sensitivliste wird ständig 
durchlaufen, bis zum nächsten "wait". Im Fall von Prescaler="00000000" 
oder Prescaler="00000001" kommt der Simulator aber niemals zu einem wait 
und rechnet sich zu Tode. Mach einfach mal im ersten Fall den Initwert 
von Prescaler z.B. auf "00000011" und sieh dir dann nochmal die 
Simulation an.

> funktioniert die Simulation.
Sie ist aber falsch, weil das Signal "Prescaler" in der Sensitivliste 
fehlt.

> funktioniert die Simulation.
Aber nicht die Hardware. Man verwendet keinen asynchronen und zudem 
kombinatorischen Reset...

> Ist das nicht praktisch das selbe?
Es ist in beiden Fällen eine fehlerhafte Beschreibung. Sieh dir mal an, 
wo andere den Takt unterbringen. Was ist bei dir anders?

BTW: so werden keine Takte zur Verwendung im FPGA gemacht:
>  Clock <= not Clock;

: Bearbeitet durch Moderator
von Daniel K. (daniel_k80)


Lesenswert?

Schlumpf schrieb:
> Hallo Daniel,
>
> wenn du schon vermutest, dass es an der Sensitivity-List liegen könnte,
> warum probierst du es nicht einfach aus?
> Wäre doch 10mal schneller gegangen, als die Frage hier zu posten, oder
> nicht?

Hallo Schlumpf,

ich habe es ja ausprobiert....wie gesagt mit der Liste funktioniert es 
auch. Ich wollte lediglich wissen ob meine Vermutung richtig ist....

@ Lothar:
Danke für deine Erklärungen :D
Dann fange ich am besten noch mal von vorne an :o

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


Lesenswert?

Daniel K. schrieb:
> Dann fange ich am besten noch mal von vorne an :o
Naja, ein wenig koordiniert Umsortieren reicht eigentlich schon aus...

(Abgesehen natürlich von der Tatsache, dass so kein Takt für ein FPGA 
erzeugt werden sollte!)

von Daniel K. (daniel_k80)


Lesenswert?

Lothar Miller schrieb:
> Daniel K. schrieb:
>> Dann fange ich am besten noch mal von vorne an :o
> Naja, ein wenig koordiniert Umsortieren reicht eigentlich schon aus...
>
> (Abgesehen natürlich von der Tatsache, dass so kein Takt für ein FPGA
> erzeugt werden sollte!)

Hallo Lothar,

ich hatte im restlichen Code auch irgendwie einen Knoten drin, daher 
habe ich das neu gemacht ;)
Ich bin dann auch von der Idee abgewichen den Prescaler wie oben 
einstellbar zu machen und habe nun einen Prescaler mit Zweierpotenzen 
realisiert....der reicht auch aus.

Kannst du mir vielleicht noch kurz erklären warum so kein Takt erzeugt 
werden sollte?
Danke schon mal :)

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


Lesenswert?

Daniel K. schrieb:
> Kannst du mir vielleicht noch kurz erklären warum so kein Takt erzeugt
> werden sollte?
> Danke schon mal :)
Weil das ein physikalisch schlechter Takt ist, der von der Toolchain 
nicht analysiert und bewertet werden kann (Jitter, Delay, Zugang zu den 
Taktnetzen...).

Statt dessen arbeitet man mit 1 einzigen Takt und Click-Enables. Sieh 
dir auf meiner HP mal das Lauflicht und andere Beispiele an. Dann siehst 
du, wie es gemacht wird.

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.