Forum: FPGA, VHDL & Co. Signale synchronisieren mit PROCEDURE/FUNCTION


von Maxen (Gast)


Lesenswert?

Hallo zusammen,

Einsynchronisieren von Signalen ist bei VHDL ja ziemlich üblich und 
kommt bei mir auch mehrfach im Code vor.
Dabei sieht das ganze immer in etwa so aus:
1
sync_signal : PROCESS (clk)
2
BEGIN
3
4
    IF rising_edge(clk) THEN
5
        signal_d1 <= signal;
6
        signal_d2 <= signal_d1;
7
    END IF;
8
9
    signal_int <= signal_d2
10
    
11
END PROCESS;

Es gibt hier noch "schönere" Lösungen indem man mit Vektoren arbeitet 
etc.

Was ich aber aktuell versuche ist das Einsynchronisieren über zwei FFs 
mittels einer Funktion oder Prozedur.

Ich stelle mir sowas vor wie:
1
signal_int <= sync_function(signal_ext,clk)

Leider scheint es nicht möglich zu sein, innerhalb einer Funktion oder 
Procedur flankensensitiv zu arbeiten, oder geht sowas?

Gibt es hier etwas einfacheres als obigen Process immer wieder zu 
nutzen?

Danke und Grüße
Maxen

von Klaus F. (kfalser)


Lesenswert?

Maxen schrieb:
> Leider scheint es nicht möglich zu sein, innerhalb einer Funktion oder
> Procedur flankensensitiv zu arbeiten, oder geht sowas?
>
Function nicht, aber mit einer concurrent aufgerufenen Procedure muss es 
möglich sein.
Du solltest aber eher lernen mit Entities zu arbeiten (siehe unten), das 
sind eigenlich die Basics für VHDL, bevor Du dich mit Procedures und 
Functions beschäftigst.

> Gibt es hier etwas einfacheres als obigen Process immer wieder zu
> nutzen?

Ob's einfacher ausschaut ist dann Geschmackssache, aber die Verwendung 
einer kleinen, wiederverwertbaren Entity ist eine Möglichkeit.
1
Sync1 : Synchronizer 
2
        port map ( clk    => clk,
3
                   sig_in => async_signal,
4
                   sig_out => sync_signal);

von Dieter (Gast)


Lesenswert?

Oder PORT MAP per positionem, machts noch etwas schlanker
1
Sync1 : Synchronizer 
2
        port map ( clk, async_signal, sync_signal);

von Maxen (Gast)


Lesenswert?

Danke für den Hinweis :)

Natürlich arbeite ich mit Entities - leider führt das dazu, dass das 
Projekt ziemlich viele "unwichtige" Entities enthält, die jeweils nur 
eine zweistufige Synchronisierung ausführen...


Beispiel:

Top_Entity
|
---DCM_sub_Entity
---functional_block1_sub_entity
---sync_external_signal1_entity
---sync_external_signal2_entity
---sync_external_signal3_entity
---functional_block2_sub_entity

Darum suche ich nach einer wenigzeiligen Lösung, die nicht jeweils eine 
Instantiierung benötigt.

Grüße

von Klaus F. (kfalser)


Lesenswert?

Maxen schrieb:
> Darum suche ich nach einer wenigzeiligen Lösung, die nicht jeweils eine
> Instantiierung benötigt.

Ich sehe das Problem nicht.
Du kannst (und hoffentlich machst Du das), ja immer die selbe Entity 
instanzieren. Du hast also nur eine Entity, aber mehrere Instanzen.

Und: Strukturierung ist eine Qualitätsmerkmal, alles in eine Datei 
hineinzuschmeissen ist meiner Meinung nach schlechter, weil dann auch 
die Hilfssignale im Top-Level angelegt werden müssen.

von Duke Scarring (Gast)


Lesenswert?

Maxen schrieb:
> Natürlich arbeite ich mit Entities - leider führt das dazu, dass das
> Projekt ziemlich viele "unwichtige" Entities enthält,
Dann ist der Inhalt Deiner Entities zu klein.

Ich schreibe den Synchronizer einfach so hin. Der IO-Kram sitzt im 
obersten Modul, da bleibt die Logik im 'inneren' sauber.

Duke

von Ralf (Gast)


Lesenswert?

Duke Scarring schrieb:
> Ich schreibe den Synchronizer einfach so hin. Der IO-Kram sitzt im
> obersten Modul, da bleibt die Logik im 'inneren' sauber.
+1

IO-Kram immer aussen und oben. Ich sehe auch den Sinn so richtig nicht 
im ständigen unnützen Aufblähen des Codes, mit functions, procedures. 
Brauch ich im Grunde nie.

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.