VHDL - Code erklären?

Gast #2763375
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?
Gast #2763408
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...
Gast #2763411
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.
Gast #2763421
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...
#2763436
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.
Gast #2763439
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.
Gast #2763467
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?
Gast #2763517
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?
Gast #2765905
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
Gast #2765960
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.

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