Hallo liebe Leute,
ich hab ein kleines Problemchen, und zwar studiere ich im nunmehr 3.
Semester Informations- und Elektrotechnik und habe in der Digitalen
Schaltungstechnik nun Kenntnis von VHDL genommen bzw. bekommen. Bin im
Moment an einem Versuchsbericht dran, für eine Stoppuhr, welche wir
selbst programmiert haben. Bei den Verständnisaufgaben zu diesem
Bericht, habe ich nun die Aufgabe, einen VHDL - Code zu dem angehängtem
Scan zu schreiben. Bin mir da aber absolut unsicher und kriege das noch
nicht wirklich hin.
Handelt es sich dabei denn um einen FlipFlop o. Ä.? Kann im Internet
nicht wirklich hilfreiches entdecken, grade weil ich auch nur einen
Ausgang (Q) habe. Habe schonmal begonnen, die Eingänge S,D als
std_logic_vector Eingänge zu deklarieren, bin mir aber insbesonere bei
den Masse gelegten Eingänge unsicher wie ich das festlege. Vielleicht
kann mir ja jemand weiterhelfen..
Beste Grüße
Christian
Natürlich handelt es sich hier um ein FlipFlop, kann in meinen
Unterlagen dennoch keinen Zusammenhang der inneren Verschaltung
erkennen. Ich hab hier mal die port-zuweisung:
1
libraryieee;
2
librarywork;
3
useieee.std_logic_1164.all
4
useieee.std_logic_arith.all
5
useieee.std_logic_unsigned.all
6
7
entitySchaltungis
8
port(
9
A:INstd_logic;
10
B:INstd_logic;
11
C:INstd_logic;
12
Y:OUTstd_logic);
13
endSchaltung;
Der Rest ist noch nicht so weit..
Dann habe ich noch eine weitere Frage, und zwar wird bei Anzeigetreiber
in unserem Fall in den generics die "tick_num" auf 100 gesetzt. Das ist
der Teilerwert zur Erzeugung des internen 10µs Takts. Jetzt muss ich
erklären, wie der 10µs Takt im Anzeigetreiber entsteht. Ich hab schon
soviel gegoogelt, aber ich finde keine Erklärung dafür..
ohje, die teileweise (hoffnungslos) veralteten Lehrunterlagen der Profs
oder Dozenten. Bibliotheken einbinden, die (aktuell noch garnicht)
verwendet werden und dann sind
1
useieee.std_logic_arith.all
2
useieee.std_logic_unsigned.all
Bibliotheken, welche schon eine Weile "deprecated" sind, also nicht für
Neues verwendet werden sollten. Nimm, wenn es soweit ist, dass du mit
Zahlen umgehen musst lieber
1
useieee.numeric_std.all
Zu dem "tick_num" fällt mir spontan der Begriff "Taktteiler" ein und ist
mitunter ein Grundkonstrukt im FPGA. Evtl. hilft der Begriff dir weiter.
Christian Knabe schrieb:> wozu hab ich dann die eingänge S, R und CE
Vielleicht ist es ein RS-Flipflop mit CE-Eingang?
R -> Reset
S -> Set
CE -> Clock Enable
Ein Tipp: du solltest (gerade bei VHDL) genau das hinschreiben, was du
meinst. Da gibt es keine impliziten Typkonvertierungen wie z.B. bei C.
Aber das wird dir auch noch auffallen... ;-)
Christian Knabe schrieb:> Das ist der Teilerwert zur Erzeugung des internen 10µs Takts.> Jetzt muss ich erklären, wie der 10µs Takt im Anzeigetreiber entsteht.
Man macht in einem FPGA nicht unnötig eine zweite Taktdomäne auf. Und
dass man das nicht muss, dafür gibt es ein Clock-Enable. Sieh dir mal
die blinkende LED und das Lauflicht an:
http://www.lothar-miller.de/s9y/archives/80-Hello-World!.htmlhttp://www.lothar-miller.de/s9y/archives/61-Lauflicht.html> Ich hab schon soviel gegoogelt, aber ich finde keine Erklärung dafür..
Sieh dir einfach mal hier im Forum alle die VHDL-Threads durch, wo du
das Wort "Anfänger" oder "Postulate" findest... ;-)
Christian Knabe schrieb:> Handelt es sich dabei denn um einen FlipFlop o. Ä.?
Bei Xilinx ist das ein FDRSE... ;-)
Danke schonmal für die Beiträge. Ich weiß das ich das normal auch selbst
hinkriegen müsste, aber im Moment gehts Vollgas auf die Klausurenphase
mit 8 Klausuren an 10 Tagen zu und ich hab einfach nicht die Zeit mich
den ganzen Tag mit dem Kram hier auseinanderzusetzen, weil ich einfach
zu viel lernen muss. Werd mich in den "Ferien" mal hinsetzen und das
alles versuchen zu verstehen und auch was für das weitere Leben
mitzunehmen, weil es ja wirklich interessant ist. Die Stoppuhr an sich
ist schon super gewesen. Nur ist das jetzt alles wirklich zu knapp um es
zu verstehen, ich muss es einfach fertig kriegen und mein Skript hilft
mir auch nicht wirklich weiter. Ich bin einfach extrem unsicher was die
Fortsetzung des Codes angeht. Sicher will ich keine Musterlösung hier
hingeschrieben bekommen, aber 1/2 Tipps bzw. Ansätze wären schon
wunderbar. Allein die Darstellung ,das Reset und CE das constante
Signal bekommen macht mich schon unsicher.
Ansonsten würd ich weitermachen mit der architecture:
1
architectureAufgabeofSchaltungis
2
process(CE,R)
3
begin
4
A<=S;
5
B<=D;
6
Y<=Q;
7
ifR='1'then
8
Q<='0';
9
elsifS='1'then
10
Q<='1';
11
elsifCE='1'andC='1'then
12
Q<=D;
13
endif;
14
endprocess;
15
endAufgabe;
CE und R hab ich als process gesetzt, ist das richtig? Ich weiß ja in
dem Fall hier garnicht, ob das eine konstante 1 oder 0 ausgibt oder? Und
dann gehe ich einfach mal davon aus, dass dieser FlipFlop B ausgeben
soll wenn CE und C auf 1 gesetzt sind. Wenn R eine 1 setzt, soll eine 0
rauskommen, da resettet wurde. Ansonsten, wenn S (set?) 1 ist, soll
diese auch ausgeben werden. Hoffe noch ein wenig Hilfe zu bekommen, tut
mir auch Leid wenn das für euch etwas Langeweile hervorruft.. :-(
Ein Takt wird in VHDL mit rising_edge oder 'event beschrieben...
Du hast das nicht, deshalb gibt es nur ein pegelgesteuertes
Speicherelement: ein Latch.
Lothar Miller schrieb:> Lies mal das Xilinx WP275 "Get your Priorities Right"
Ich glaube, Christian hat ganz andere Sorgen, als sich mit
FPGA-spezifischen Reset-Sonderheiten auseinanderzusetzen.
Ansonsten kann man auf den Code aufbauen, er enthält zwar etliche Fehler
(und Dinge, die man nicht machen sollte), aber zum Löschen reichts
widerum nicht ;)
Ein großer Schrit ist schon einmal, wenn du den Takt korrekt
beschreibst.
Also anstelle
1
C='1'
wäre
1
rising_edge(C)
zu schreiben.
Die erste Beschreibung sagt: solange das Signal C '1' ist, dann
übernehme D nach Q, das ist wie Lothar schon sagte ein Latch und hat in
FPGAs nur in absolut begründeten Ausnahmefällen etwas zu suchen.
Du willst aber, das D nach Q geht, wenn eine Takt-Flanke da ist: daher
"flankengesteuerten FF".
Dann solltest du dir im klaren sein, wann welcher Datenfluss sattfindet.
So wird z.B. dem Signal B das Signal von D zugewiesen und nicht
umgekehrt.
grüße
Daniel M. schrieb:> Lothar Miller schrieb:>> Lies mal das Xilinx WP275 "Get your Priorities Right"> Ich glaube, Christian hat ganz andere Sorgen, als sich mit> FPGA-spezifischen Reset-Sonderheiten auseinanderzusetzen.
Das schon, aber vielleicht ist dort eine 1:1 Copy-Paste-Lösung drin. Und
eine schöne Erklärung, wie solche Bauteile allgemein funktionieren...
So, hier ist mein "fertiger" Code den ich jetzt heute abgegeben habe..
Hab mich nochmal mit meinem Dozenten zusammengesetzt und das ganze ein
wenig besser verstanden. könnten sicher noch fehler drin sein, aber
daraus lernt man. dennoch vielen dank an alle beiträge hier, in den
semesterferien werd ich mich mal tiefer damit auseinandersetzen :-)
Christian Knabe schrieb:> So, hier ist mein "fertiger" Code den ich jetzt heute abgegeben habe..
Uuuups...
1
ERROR:HDLParsers:3312 - Line 16. Undefined symbol 'CE'.
2
ERROR:HDLParsers:1209 - Line 16. CE: Undefined symbol (last report in this block)
3
ERROR:HDLParsers:3312 - Line 17. Undefined symbol 'S'.
4
ERROR:HDLParsers:3312 - Line 18. Undefined symbol 'D'.
5
ERROR:HDLParsers:3312 - Line 19. Undefined symbol 'R'.
6
ERROR:HDLParsers:164 - Line 20. parse error, unexpected IDENTIFIER, expecting SEMICOLON
7
ERROR:HDLParsers:3312 - Line 23. Undefined symbol 'Q'.
8
ERROR:HDLParsers:1209 - Line 25. Q: Undefined symbol (last report in this block)
9
Number of errors : 8 (0 filtered)
Dazu wird deine Simulation auch nicht stimmen, denn der Takt fehlt in
der Sensitivliste... :-o
Christian Knabe schrieb:
1
ifrising_edge(C)andCE='1'then
2
ifB='1'orA='1'then
3
Q<='1';
4
else
5
Q<='0';
6
endif;
7
endif;
Dass dabei nicht das gewünschte Bauteil (Bild im ersten Post), sondern
bestenfalls das gewünschte Verhalten herauskommt, das ist dir klar?
Deshalb hatte ich auf das WP275 verwiesen...