Forum: FPGA, VHDL & Co. VHDL - Code erklären?


von wert (Gast)


Lesenswert?

Hi Leute!

Ich hab hier diesen VHDL-Code gegeben:

1
process(C,R)
2
begin
3
if R = '0' then
4
Q <= '0'
5
elseif(C' event and C = '0') then
6
if CE = '1' then
7
Q <= not Q;
8
endif
9
endif;
10
end process


Ich soll nun angeben welches Bauteil dadurch beschrieben wird. Wie geht 
das konkret? Ich hab's mal probiert:

Anhand process(C,R) wird wohl festgelegt welche Eingänge das Gerät haben 
soll. Also hat das Gerät wohl C und R als Eingang. Nun geht's weiter. 
"begin" sagt wohl, dass ab jetzt die eigentlich Beschreibung des 
"Prozesses" beginnt. Dann kommt das if. Wenn nun der Eingang R=0 ist, 
dann soll Q = 0 werden? Stimmt das so? Q wird dann wohl der Ausgang des 
Bauteils sein, oder? Warum werden dann die Ausgänge nicht auf bei 
"process" festgelegt?

von Dario B. (abcd)


Lesenswert?

ernst gemeinte frage: kannst du überhaupt vhdl?

von wert (Gast)


Lesenswert?

Nein, von "können" kann keine Rede sein. Wir sollen auch nur ganz wenig 
erklären können und unter anderem das hier.

von ScannerViren (Gast)


Lesenswert?

Vergiss C! Die Ein- und Ausgänge werden bei der Entity-Deklaration 
festgelegt. Ein Entity enthält dann diesen prozess. Ein kleiner Tipp: 
das C'event and C = '0' lässt sich auch als falling_edge(clk) schreiben, 
d.h. alles innerhalb dieser if-Bedingung wird bei einer fallenden Flanke 
von C ausgeführt...

von wert (Gast)


Lesenswert?

Vorerst mal klarzustellen: Ich will KEIN VHDL Programmierer werden, der 
ganze Bauteile später entwickelt. Ich will nur eine gewisse Prüfung 
bestehen wo eben ein ganz kleiner Teil VHDL drin ist und hab deswegen 
einige Fragen.

Ich kapiere bspw. auch nicht, was es mit diesem C'event auf sich hat.

von wert (Gast)


Lesenswert?

Ahja, das C' event and C = '0' lässt sich also als fallende Flanke 
vorstellen. Wie muss ich mir das genauer vorstellen?

Ich mein, ich hab hier ja keinen Takt oder so gegeben...

von wert (Gast)


Lesenswert?

Entschuldige bitte, aber was meinst du mit, dass ich "C vergessen soll"? 
Das die Entität, die vor diesem programmausschnitt folgt, die Variablen 
deklariert weiß ich eigentlich. Laut einem online Tutorial ist dieses 
process(C,R) eine so genannte Sensitivity-List und beschreibt alle 
Eingänge, die beim Prozess reagieren soll...

von Alexander F. (alexf91)


Lesenswert?

wert schrieb:
> Ich mein, ich hab hier ja keinen Takt oder so gegeben...

C ist ein Takteingang. Ein- und Ausgänge werden aber in einer Entity 
festgelegt. Diese benötigt wiederrum eine Architecture, welche dann den 
von dir angegebenen Prozess enthält.
Die Signale in der Klammer (übrigens Sensitivity-List genannt) benötigt 
der Simulator, damit dieser weiß, wann er den Prozess neu berechnen 
muss.

von ScannerViren (Gast)


Lesenswert?

Ich meinte die Programmiersprache C. Ist hinderlich wenn man mit VHDL 
entwickelt, da Hardware beschrieben wird. Die sensitivity list gibt 
signale an bei deren änderung der Prozess ausgeführt wird.

Also bei einer Änderung von C, deinem Takt, und R dem Reset-Eingang. Bei 
R = '0' wird Q gesetzt, unabhängig davon was C macht.
Bei einer fallenden Taktflanke und CE = '1' macht der Prozess dann Q <= 
not Q.

von wert (Gast)


Lesenswert?

Ahja, jetzt verstehe ich dich! Das VHDL nichts mit C/C++ zu tun hat, ist 
durch meine Vorlesung klar geworden. Aber sowas wie Fallunterscheidungen 
und wie man sich das "in etwa" vorzustellen hat, ist, wenn man C/C++ 
kann, doch einfacher.

Wenn R auf 0 ist, ist Q sofort 0.

Was passiert wenn R=1 ist? Dann geht's doch sofort ins elseif oder?

von ScannerViren (Gast)


Lesenswert?

Ja, richtig. Dein Prozess toggelt Q mit der Taktflanke. R ist ein 
asynchroner reset.

von wert (Gast)


Lesenswert?

Also, dann nochmal:

Wenn R auf 0 ist, ist Q sofort 0.

Wenn nun R=1 ist, dann geht's ins elseif und das entscheidet ob eine 
fallende Taktflanke kommt. Kommt eine fallende Taktflanke ist dieses if 
erfüllt und prüft ob if CE = 1 erfüllt ist. Ist wiederum dieses if 
erfüllt, dann schaltet er den Ausgang Q auf nicht Q.

Was ist nun wenn keine fallende Taktflanke, sonder eine steigende 
Taktflanke kommt? Dann überspringt er doch alle nachfolgenden 
Anweisungen und geht doch gleich zum end process weiter, oder? Welche 
Auswirkung hat das dann auf Ausgang Q? Genauer formuliert: Welchen 
Zustand hat der Ausgang Q, wenn R=1 und eine steigende Taktflanke kommt?

von wert (Gast)


Lesenswert?

Dieses CE wird wohl für ChipEnable stehen und soll bei einer 1 den 
Baustein wohl einschalten? Stimmts?

von ET-Grundlagen (Gast)


Lesenswert?

Das ist ein T-FF auf fallender Flanke mit asynchronen Low-aktiven Reset 
und H-aktiven Enable.

Gruß

von ET-Grundlagen (Gast)


Lesenswert?

Dein Code hat mindestens 4 syntax fehler bei 10 lines of code ...

von wert (Gast)


Lesenswert?

Das ist NICHT mein Code, sondern der gegebene Code durch die Aufgabe!

von Duke Scarring (Gast)


Lesenswert?

ET-Grundlagen schrieb:
> Dein Code hat mindestens 4 syntax fehler bei 10 lines of code ...
Aha. Und Du konntest sofort fehlerfreien Code schreiben, nachdem Du aus 
dem Ei gepellt wurdest?

wert schrieb:
> Ich soll nun angeben welches Bauteil dadurch beschrieben wird. Wie geht
> das konkret?
In Deinem Code fehlt die Hälfte ;-)
Ich hab die mal ergänzt:
1
entity ff is
2
    port (
3
        C     : in  bit;
4
        R     : in  bit;
5
        CE    : in  bit;
6
        Q_out : out bit
7
        );
8
end entity;
9
10
architecture rtl of ff is
11
12
    signal Q : bit;
13
14
begin
15
16
    process(C, R)
17
    begin
18
        if R = '0' then
19
            Q <= '0';
20
        elsif(C' event and C = '0') then
21
            if CE = '1' then
22
                Q <= not Q;
23
            end if;
24
        end if;
25
    end process;
26
27
    Q_out <= Q;
28
29
end architecture;

wert schrieb:
> Also hat das Gerät wohl C und R als Eingang.
Wie andere schon geschrieben haben ist das nur die Sensitivity-Liste. 
Sprich, wenn sich an den dort angegebenen Signalen etwas ändert, muß der 
Prozess neu berechnet werden.

wert schrieb:
> Was ist nun wenn keine fallende Taktflanke, sonder eine steigende
> Taktflanke kommt? Dann überspringt er doch alle nachfolgenden
> Anweisungen und geht doch gleich zum end process weiter, oder?
Jepp.

> Welche
> Auswirkung hat das dann auf Ausgang Q? Genauer formuliert: Welchen
> Zustand hat der Ausgang Q, wenn R=1 und eine steigende Taktflanke kommt?
Keine Asuwirkung.
Der Prozess ist nur auf der fallenden Flanke von C aktiv.

In der Realität gibt so gut wir keine digitalen Bauteile, die auf beiden 
Taktflanken aktiv sind (Ausgenommen DDR-IOs im FPGA.)

Duke

von Drüber-Steher (Gast)


Lesenswert?

>ET-Grundlagen schrieb:
>> Dein Code hat mindestens 4 syntax fehler bei 10 lines of code ...
>Aha. Und Du konntest sofort fehlerfreien Code schreiben, nachdem Du aus
>dem Ei gepellt wurdest?

Ich bemüh mich zumindest die Sachen die ich anfange ordentlich zu 
machen. Semikolons nach Belieben setzen und elsif mit elseif zu 
verwechseln lassen mich am ernsten Bemühen zweifeln. Ich bin nun mal 
nicht begeistert, das mir jemand code vor die Füße wirft dem das selber 
mehr als lästig ist und der sich auch nicht die Mühe macht, das zu 
verbergen.

>In der Realität gibt so gut wir keine digitalen Bauteile, die auf beiden
>Taktflanken aktiv sind (Ausgenommen DDR-IOs im FPGA.)

Ne, das ist nicht auf FPGA's beschränkt, die Millarden von DDR-SDR 
Speicher resp. die dazu passenden CPU's/DSP's haben das in silizum 
on-Board. Auch bei Hispeed Übertragungen wäre ich mir nicht sicher, ob 
da nicht die Datenrate durch Verwendung beider Flanken verdoppelt wird. 
Und wenn auch nicht die taktleitung sondern die SDA-Strippe nutzt 
bereits I2C beide Flanken (START/STOP Condition). SCNR.

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.