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?
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...
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.
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...
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...
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.
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.
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?
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?
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
entityffis
2
port(
3
C:inbit;
4
R:inbit;
5
CE:inbit;
6
Q_out:outbit
7
);
8
endentity;
9
10
architecturertlofffis
11
12
signalQ:bit;
13
14
begin
15
16
process(C,R)
17
begin
18
ifR='0'then
19
Q<='0';
20
elsif(C'eventandC='0')then
21
ifCE='1'then
22
Q<=notQ;
23
endif;
24
endif;
25
endprocess;
26
27
Q_out<=Q;
28
29
endarchitecture;
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
>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.