Signale synchronisieren mit PROCEDURE/FUNCTION

Gast #3608625
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
#3608676
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);
Gast #3608689
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
#3608751
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.
Gast #3608823
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
Gast #3609090
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren