Hallo meine Freunde und Forenmitglieder, Ich bin etwas am verzweifeln. Ich habe 2 Fragen bzw. Probleme, die mir selbst ein Master Student nicht beantworten konnte. Vielleicht könnt ihr nem Hobbymäßigen VHDLer ein bisschen helfen. Ich finde entweder keine passende Erklärung auf Deutsch oder Englisch, oder ich verstehe die Erklärung einfach nicht. Wenn ich diese 2 Schaltungen endlich verstehe, dann bin ich ein großen Schritt weiter, danke meine Freunde!!! Ich beschäftige mich derzeit mit einfachen Gatter-Schaltungen und den ganzen VHDL Grundlagen. Das es 3 verschiedene Möglichkeiten zur Beschreibung gibt, habe ich verstanden!!! Nun weiß ich wie die Verhaltensbeschreibung sprich das RTL-Design mit Xilinx auszusehen hat für die Verhaltensbeschreibung. Die Data Flow oder auch Structur Beschreibungsform verstehe ich vollkommen!!! Aber die Verhaltensbeschreibung Behaviour Description...damit habe ich ein paar Probleme: Folgendes RTL_Design ist richtig und passt zum XOR-Gatter in der Beschreibungsform!!! Bild 1: Ich habe früher mal in C oder Assembler Mikrocontroller programmiert ein wenig. Aber da ist abhängig davon, wie der PIN intern geschaltet ist, ob Masse mein Signal auf How oder Low zieht. Normalerweise habe ich gelernt Masse bedeutet Low. Zumindest früher und in meiner Jugend. Auch Arduinos habe ich so immer programmiert. Also über die Masse Leitungen auf 0 gezogen. Generell habe ich noch Probleme mir RTL Design und Umsetzung im FPGA vorzustellen. Es ist eben kein Code in C oder eben ein 74er Modell mit Käfern oder echten Gattern drauf, sondern eben über meine SRAM Zellen Speicher ich mir logisch eine eins oder null und mach dann da Zeugs mit. Ich habe noch mit ROMs oder PROMs den Teilen bei denen man mit UV Licht den Speicher löscht gearbeitet. 1.) Hierzu gerne ein paar Tipps oder Anregungen. Danke ^^ Jetzt zu Bild 1: IN0 IN1 Y-Ausgang 0 0 0 1 0 1 0 1 1 1 1 1 Das ist die normale Logiktabelle für das XOR-Gatter also die Logik in diesem Sinne gespeichert in LUTs auf englisch in meinen FPGA durch setzen von 1sen und 0len. Wenn ich nun die Annahme treffe, dass Ground eine logische 0 ist, und zwar immer!!! dann ist mein Ground logisch 0. Nun lege ich meine Masse auch auf logisch 0!!! Masse ist also Low!!! Dann reicht es ja erstmal, dass ich den Fall INO=1 und IN1=0 untersuche. IN0=1 geht mit einer 1 in den RTL_EQ. Dieser hat nun eine 1 und eine 0 durch den Ground an seinen beiden Eingängen. Somit gleich der RTL_EQ block ab, da beide ungleich sind, gibt es den Boolschen Wert (ich bin leider eher der Informatiker C++ oder Java) mit false also einer 0 auf den RTL_EQ Ausgang. Einen EQ kenne ich sonst nur aus Cubase oder ProTools. Naja Equation also abgleichen. Der VHDL Code passt. Der zweite RTL_EQ bekommt eine 0 und eine 0. Somit gibt er auf den Ausgang eine 1 weil es true ist. Okay keine zwei == sondern nur ein =. In der Schule war ich in Informatik echt gut. Immer so eine 2+ oder 1-. Naja. VHDL ist einfach schwer. Jetzt geht also eine 0 in den I0 des oberen AND-Gatters und eine 0 in den I1 des oberen AND-Gatters. Somit kommt am Output eine 0 raus. Unten kommt eine 1 und eine 1 in das AND-Gatter. Somit kommt eine 1. Die 1 geht an den Select Eingang des Multiplexers. 2.) Ich habe gelernt (habe nicht soviel Ahnung von elektrischen Dingen), dass für select = 0 ich den Eingang I0 schalte und für select = 1 den Eingang I1 schalte. Ist das soweit generell richtig? Aber bei dem Multiplexer des RTL Designs steht bei I0 S=1 und bei I1 S=default. Also es kommt nun eine 0 auf den I0 Eingang wegen der Masse und eine 0 aus dem oberen Gatter in den I1 Eingang dann. Der Select Eingang schaltet eine 1 also auf den I1. Somit geht eine 0 auf den Ausgang!!! 3.) Für 1 0 und 0 1 muss mein XOR-Gatter doch eine 1 rausgeben. Der Code ist definitiv richtig. if IN0 = '0' and IN1 = '1' then OUTPUT_XOR <= '1'; elsif IN0 = '1' and IN1 = '0' then OUTPUT_XOR <= '1'; else OUTPUT_XOR <= '0'; end if; Auch alles Sensitiv auf die Eingangssignale. Erstmal totale Grundlagen ohne Takt und alles. Ich sitze da seit 5 Stunden dran und verstehe nicht, wie ich den Pfad des RTL_Designs entlang gehen soll. 4.) Ist das vielleicht nicht wirklich implementierbar sondern wird abstarkt dargestellt? Dann eine weitere Frage die mich sehr beschäftigt um komplexere Aufgaben verstehen zu können. Was ist das genau nur diese Bestandteile? Und wie könnte ich dazu eine Datenflussbeschreibung machen? Und wieder das Problem mit Masse und Ground und was ist eben logisch 0 was ist logisch 1 und was wählt der Multiplexer für seinen dementsprechenden Select Eingang aus. In C++ kann ich alle möglichen Dinge schnell und einfach bauen, kleine Computerspiele über das CMD Fenster oder auch komplexe Dinge mit drehenden Grafiken. Also ich konnte das mal sehr gut. In Java mussten wir mal in der Schule einen MP3 Player bauen. Allerdings war die mp3 Wiedergabe Bibliothek (ich glaube selbst erstellt) schon vorhanden. Wir mussten also nur noch über Queue oder Stack oder einen Baum mit Pointer ich weiß es schon gar nicht mehr das ganze auswählen. Vielleicht hätte ich beruflich was mit Technik oder Informatik machen sollen. Da denke ich viel drüber nach. Zurück zum eigentlichen Thema. Mein Ansatz wäre für die Komponente, erstmal die Entity und die Port Beschreibung zu machen. Also die Deklaration richtig? Ich benutze zu gerne Informatik Wörter. Ich hatte mir beides aufgemalt, so kann ich das besser nachvollziehen und die Linien entlang gehen mit der Hand und schauen wohin mich der Weg dann führt. Ich habe tendenziell Probleme logische Dinge auf einem Bildschirm nachzuvollziehen. Auch Logiktabellen oder andere logische Dinge muss ich auf einem Blatt aufmalen. Als Input Signale in Form von bit hab ich meine Signale S_1 S_2 und S_3 definiert. Als Output Signal würde ich jetzt mein S_Out als out bit definieren. Also in Port rein port( S_1, S_2, S_3 : in bit; S_Out : out bit); Dann ganz normal Architektur of Name der Entity mein is und dann geht es rund Meine Idee: Select 0 = auswählen von I0=0 am Multiplexer. Select 1 = auswählen von I1=0 am Multiplexer. Dann wäre das Bauelement aber ohne Nutzen. Also schein hier vielleicht die Masse doch 1 zu sein? Dann würde ich für S_1=0 die Masse auswählen und die 1 auf den Ausgang geben sofern Masse 1 bedeutet am Multiplexer und für Select = S_1 entspricht es hier für den Wert 1 würde ich den Wert von Ground also 0 auf den Ausgang geben. S_1 Y_Mux 0 1 1 0 5.) Dann würde der Multiplexer wie ein Inverter arbeiten? 6.) Was ist den nun richtig für a) den Select Eingang, b) für den Ground (0 oder eine 1), c) für die Masse (0 oder eine 1). architecture Probe of <Name_Entity> is begin S_Out <= S_2 AND S_3 x NOT S_1 end Probe; 7.) Wo ist mein gedanklicher Fehler? 8.) Ist es egal ob ich entity, port, end, if oder AND groß oder klein schreibe? Bei manchen Dingen macht es keinen Unterschied bei anderen bekomme ich Fehler dabei heraus. Meine Idee: Ich habe mein AND Gatter und meinen Mutliplexer der je nachdem wie jetzt genau Masse, Ground und Select definiert sind, als Invertierer oder als Nichtsnutz der einfach nur Ressourcen und Gatterlaufzeit verschwendet meinen Eingang S_1 wie er ist auf den FlipFlop gibt. Im Internet habe ich viel zu FlipFlops gefunden. Ein Latch ist wohl sowas wie ein Zustandsgesteuerter Speicher, der quasi je nachdem was am Eingang anliegt, den vorherigen Zustand speichert oder den neuen Zustand speichert. Kein Clocksignal in Ordnung. 9.) Aber wie soll ich einen Latch also einen FlipFlop explizit implementieren. Dafür habe ich keinen Code gefunden. VHDL macht doch gewisse Bereiche wo es automatisch FlipFlops gibt ohne das ich die explizit programmiert also beschrieben habe. 10.) Laut Logiktabelle gibt es aber auch je nachdem ob es ein DD, JK FF FlipFlop ist, verschiedene Zustände, die nicht erreicht werden dürfen oder eben nicht genau definiert sind. 11.) Ebenso gibt es FlipFlops die Zustandsgesteuert, Zustands und Taktgesteuert und nur Taktgesteuert sind? Oder wird das nur überall anders genannt? Weil auch wenn der taktgesteuert ist, der Folgezustand ist von dem vorherigen Zustand abhängig. 12.) Ebenso fand ich jede Menge FlipFlop Zeichnungen wo es noch einen invertierten Ausgang oder Zustand gab oder der Ausgang eines Multiplexers zurückgeführt wurde. Fehlt bei dem RTL einfach der Multiplexer und die Rückführung. Ist die direkt im Block enthalten? Ich bin etwas überfragt. 13.) In der Mitte der beiden Logikfunktionen habe ich ein X stehen gelassen. Vielleicht kann mir einer erklären wie ich die beiden miteinander verknüpfen kann damit eben das Verhalten erfüllt wird. Ich will nah an Schaltungen arbeiten und damit etwas rumprobieren. Ich hab auch Leute gesehen die haben lustige Dinge gemacht so richtig Nerd mäßigen Spaß mit VHDL. Aber dafür muss man erstmal die Grundlagen verstehen. 14.) Was mir noch einfällt: Ich habe einen Prozess mit Sensitivitätsliste. Danach kommt die Verhaltungsbeschreibung mit if, ifelse, else und then dieser ganze Kladeradatsch. Dann kommt ja am Ende end if und end process. Kann ich zwischen end if und end process noch etwas paralellläufiges implementieren oder erst nach end if und nach end process? Ebenso ist es möglich, da es eben ja keine Programmiersprache ist, nach end if und end process ein signal zu definieren. Ziel ist quasi ich habe meinen MUX oder mein XOR Gatter in der Verhaltensbeschreibung. Nun Definiere ich mit if then else elseif die ganzen Verhalten, die meine Komponente erfüllen soll. Ich ordne meinen Ausgang aber keine Werte wie 1 oder 0 zu, sondern benutze ein internes Signal, welches nicht zuvor zwischen der Architektur und dem begin definiert wurde. Also benutze ich mein internes signal und ordne dem meine Werte 1 oder 0 für das XOR Gatter oder den Mutliplexer zu. Nun definiere ich erst am Ende mein Signal. Und ordne dann das Signal dem wahren Output der Entity zu. 15.) Muss das Signal vor end process definiert werden? Ist es möglich da es ja eine Hardwarebeschreibungssprache ist, dass so zu machen? Habe ich dadurch Laufzeit Vorteile oder mehr Stabilität? Wäre das dann Paralellläufig oder Nebenläufig? Darf eine Datenflussbeschreibung niemals einen Prozess enthalten? Ich hoffe ihr versteht meine Anliegen als Anfänger. Exsplizit auf meine Situation konnte ich leider keinen Thread finden der auf solche RTL Designs Grundlegend eingeht und das ganze gut erklärt. Ebenso werden auf diversen Webseiten viele Codes und Beschreibungsformen besprochen. Manchmal wird dann auch das jeweilige RTL Design gezeigt. Aber wirklich ins Detail die einzelnen Pfade entlang gehangelt mit Erklärung wird nirgendwo leider. Vielleicht könnt ihr mir helfen in den nächsten Tagen damit ich weiter komme ich bedanke mich. Cooles Forum hier aufjedenfall Mit freundlichen Grüßen und Gesundheit wünschend Sin
Sin S. schrieb: > Naja. VHDL ist einfach schwer. Nein. VHDL ist einfach nur eine Sprache. Das, woran es bei dir klemmt, ist grundlegendes Verständnis für Digitaltechnik. Und deshalb hängst du dich an irgendwelchen Begrifflichkeiten und Pseudodefinitionen auf. > Wenn ich nun die Annahme treffe, dass Ground eine logische 0 ist, und > zwar immer!!! Diese Annahme gilt dann so lange, bis einer was Anderes annimmt und das kundtut. > dann ist mein Ground logisch 0. Ja klar, du hast das ja gerade eben angenommen und so für dein System definiert. > Nun lege ich meine Masse auch auf logisch 0!!! Masse ist also Low!!! Korrekt. Das sind 2 weitere Definitionen. In anderen Systemen könnte Masse auch logisch 1 sein (das wäre dann "negative Logik") und es kann auch sein, das Masse "High" ist, wenn die Schaltung kurioserweise z.B. mit -3,3V versorgt werden würde. Aber im Allgemeinen gilt: Ground ist einfach das englische Wort für Masse. Dorthin wird in den meisten Fällen 0V als Bezugspotential gelegt. Und wenn nichts anderes vereinbart ist, dann darf man positive Logik annehmen und 0V als "Low" ansetzen und stattdessen auch '0' schreiben. Dann gilt also Masse = GND = 0V = Low = 0 und Versorgungsspanung = Vcc = 3V3 = High = 1 Darüber muss man aber eigentlich kein Wort verlieren, es ist schlicht egal. > Okay keine zwei == sondern nur ein = So wie in den allermeisten anderen Programmiersprachen auch. Hier solltest du eigentlich sagen "C ist schwierig". > 1.) ... > Der VHDL Code passt. Ja. Wenn auch nach unnötig vielen mentalen Umwegen. > 2.) Ich habe gelernt (habe nicht soviel Ahnung von elektrischen Dingen) Man lernt ja immer weiter. Was man mal gelernt hat kann schon veraltet und überholt sein. > dass für select = 0 ich den Eingang I0 schalte und für select = 1 den > Eingang I1 schalte. Ist das soweit generell richtig? Generell ist hier nichts richtig oder falsch. Diese Namen werden nur verwendet, dass man die Signale auseinander halten kann. Was wie geschaltet wird, steht im konkreten Datenblatt. Und natürlich wäre es sinnvoll. Wenn I0 mit 0 bzw I1 mit 1 am select geschaltet würde. Übrigens: warum hampelst du da auf einmal mit Multiplexern herum, wenn du vorher alles mit Gattern gemacht hast? Denn das sind schon wieder 2 Abstraktionsebenen: der Multiplexer ist letztlich nur eine reale Ausführung einer logischen Funktion. Alles, was ein Multiplexer macht, könnte auch mit Logikgattern beschrieben werden. Oder andersrum: im "echten Leben" schreibe ich eine Verhaltensbeschreibung und der Synhtesizer macht daraus dann logische Funktionen und Multiplexer. > 7.) Wo ist mein gedanklicher Fehler? Du vermischt unterschiedliche Abstraktionsebenen kunterbunt und verkantest dich gnadenlos in der Thematik: grade schreibst du was von "Masse" und dann sofort etwas von einem "Zustand". Das erste ist härteste Hardware, das zweite eine logische Definition für einen Automaten. Du reibst dich an Kleinigkeiten und Begriffen auf. Und zudem verwendest du Begriffe selbst völlig beliebig und führst beliebige neue Begriffe ein. Das sorgt zusätzlich für Verwirrung. > 14.) Was mir noch einfällt: Ich habe einen Prozess mit > Sensitivitätsliste. Danach kommt die Verhaltungsbeschreibung mit if, > ifelse, else und then dieser ganze Kladeradatsch. Dann kommt ja am Ende > end if und end process. Halte dich nicht an Begrifflichkeiten auf. > Kann ich zwischen end if und end process noch etwas paralellläufiges > implementieren oder erst nach end if und nach end process? Nebenläufiger Code verwendet andere Syntaxelemente und kann natürlich nicht in einem sequentiellen Block verwendet werden. > 9.) Aber wie soll ich einen Latch also einen FlipFlop explizit > implementieren. Dafür habe ich keinen Code gefunden. VHDL macht doch > gewisse Bereiche wo es automatisch FlipFlops gibt ohne das ich die > explizit programmiert also beschrieben habe. Immer wenn ein 'event im Code auftaucht (so eines ist auch im rising_egde() und falling_edge()), wird letztlich (mindestens) ein Flipflop instantiitert werden. > 10.) Laut Logiktabelle gibt es aber auch je nachdem ob es ein DD, JK FF > FlipFlop ist, verschiedene Zustände, die nicht erreicht werden dürfen > oder eben nicht genau definiert sind. Im FPGA gibt es nur simple taktgesteuerte D-Flipflops. > 11.) Ebenso gibt es FlipFlops die Zustandsgesteuert, Zustands und > Taktgesteuert und nur Taktgesteuert sind? Oder wird das nur überall > anders genannt? Weil auch wenn der taktgesteuert ist, der Folgezustand > ist von dem vorherigen Zustand abhängig. Natürlich ist der Ausgangspegel des Flipflops vom Eingangspegel abhängig. Ob das letztlich ein "Zustand" ist, hängt davon ab, wie dieses Flipflop eingesetzt wird. > wie ich den Pfad des RTL_Designs entlang gehen soll. Häng dich doch nicht am Wort "RTL-Design" auf. > Wenn ich diese 2 Schaltungen endlich verstehe, dann bin ich ein großen > Schritt weiter, Fangen wir mal mit der linken Schaltung an. Was ist gegeben? Und was wird gefordert? Was soll die Schaltung tun? Was soll denn da letztlich zwischen Input0, Input1 und OUTPUT_XOR passieren? Beschreibe die eigentliche, ursprüngliche Aufgabe mit wenigen Worten und ohne eigene Erklärungs- bzw. Lösungsversuche.
Ich versuche es mal mit einer Buchempfehlung: Vom Gatter zu VHDL: Eine Einführung in die Digitaltechnik ISBN 978-3728131256
Vielen Lieben Dank ihr zwei, Gerade Lothar hat mir hier und da nochmal die Augen geöffnet. Und auch Danke an Christoph, für die Buchempfehlung. Ich werde mal schauen das ich das Buch über Medimops oder so als gebrauchtes Exemplar für nen guten Kurs ersteigern kann!!! Hat bei anderen Sachen wie Mikrocontrollern auch geklappt!!! Es ging mir nur darum: Ich habe den Code implementiert und Vivado spuckte mir eben genau diese Schaltung (RTL-Schema) raus. Und egal wie ich die Pfade entlang gehe und meine zwei Eingänge setze, ich komme nicht auf meine XOR-Logik am Ausgang des MUX!!! Das ein Mux aus einzelnen Gattern besteht, weiß ich. Ich habe mit PROMs, Mikrocontrollern und ich meine ich hab sogar mal vor Jahren mit nem Chip der nur aus &-Gattern bestand (74er? Oder teilweise festverdrahtete Logik...wo ich die Ein und Ausgänge verbunden habe, i dont know) und einer großen Logiktabelle per KV Diagramm, die Logik selbstständig per Verdrahtung umsetzen können. Hab derzeit allerdings nur nen Arduino rumliegen. Ich war früher mal echt gut in ET und so ein Zeug. In Schulzeiten war ich Mitglied der freiwilligen ET AG. Hat mir immer Spaß gemacht in der 8/9 Klasse. Vielleicht fehlt mir das Talent. Und ich habe starke Gedächtnislücken. Ich vergesse extrem schnell Syntax und Grundlegende Dinge. Habt ihr da Tipps? 1.) Das Problem ist, es geht einfach nicht auf. Wenn Erde logisch 0 ist und Masse auch logisch 0 und meine RTL-Schaltung so herauskommt und ich richtig verstanden habe, wie die Funktionsblöcke funktionieren (RTL_EQ gibt quasi Boolean raus), dann kommt für Select 0 entspricht I0...eben für IN0 = 1 und IN1 = 0 keine 1 am Ausgang der Gesamtschaltung raus, wie es für XOR gefordert wäre...mit IN0 meine ich den vorderen Input...I0 den Input des Mux. Lothar M. schrieb: > In anderen Systemen könnte Masse auch logisch 1 sein (das wäre dann > "negative Logik") und es kann auch sein, das Masse "High" ist, wenn die > Schaltung kurioserweise z.B. mit -3,3V versorgt werden würde. 2.) Ja, aber in meinem RTL Design steht ja ganz klar das Vivado mir ausspuckt: I0 S=1 b und I1 S=Default Was hat der Schmarn zu bedeuten? Das Masse hier also doch 1 also High ist? Wie soll das ohne Pullup gehen? Ebenso S=Default für I1... Ich will eben Gatterlogik und Digitaltechnik verstehen. Ich will aus VHDL Code eine Schaltung mir denken können und aus der Schaltung mir die Logik und den Code erschließen können. Heißt wie komme ich nur mit dem Schaltplan auf meine Logik XOR, ohne das mehr gegeben ist ich quasi reverse das ganze anpacke. Lothar M. schrieb: > Übrigens: warum hampelst du da auf einmal mit Multiplexern herum, wenn > du vorher alles mit Gattern gemacht hast? 3.) Weil Vivado mir da nen Multiplexer hinsetzt...und ich will versuchen genau die Schaltung zu verstehen und warum ich nicht auf meine passenden Ausgänge der XOR Logik komme. Ich habe mir auf Blättern und in Paint sämtliche Wege und 1/0 aufgemalt. 5 Stunden lang. Ich habe sogar Masse als 1 definiert oder die Erde als 1 die in den RTl_EQ reingehen (was ja falsch ist, beide sind hier 0?!), es kommt nicht das richtige heraus. Lothar M. schrieb: > rising_egde() und falling_edge()), wird letztlich (mindestens) ein > Flipflop instantiitert werden. 4.) Also weil es sich um sequentielle Logik handelt und ich quasi über FlipFlops Werte halten und ein synchronisieren kann, richtig? 5.) Ich beschäftige mich seit Weihnachten (hatte nichts zu tun wegen Corona) immer wieder intensiv jeden Tag 3 bis 5 Stunden abends nach Arbeit mit FPGAs und allem. Nach über einem Monat bin ich gefühlt, immer noch nicht groß weiter gekommen. Sofern ich die XOR-Schaltung verstehe wie ich sie schalten muss, was das S=default bedeutet und wie das richtige Verhalten rauskommt, und eben ob RTL_EQ quasi so funktioniert, dass er den Eingang mit dem zweiten Eingang also der Erde=logisch 0 abgleicht und einen Boolean für True oder False rausgibt, bin ich schon mal viel weiter!!! Lothar M. schrieb: > Du vermischt unterschiedliche Abstraktionsebenen kunterbunt und > verkantest dich gnadenlos in der Thematik: grade schreibst du was von > "Masse" und dann sofort etwas von einem "Zustand". Das erste ist > härteste Hardware, das zweite eine logische Definition für einen > Automaten. Du reibst dich an Kleinigkeiten und Begriffen auf. Und zudem > verwendest du Begriffe selbst völlig beliebig und führst beliebige neue > Begriffe ein. Das sorgt zusätzlich für Verwirrung. Danke! Da muss ich besser differenzieren! Eben. Und du sagst ich halte mich an Begrifflichkeiten fest. Ich bin leider jemand, der sehr strikte Regeln braucht um Dinge zu verstehen. Und es gibt gefühlt immer mal wieder Ausnahmen in allen möglichen Bereichen. Eigentlich ist VHDL sehr logisch und stringent aufgebaut. Lothar M. schrieb: >> Wenn ich diese 2 Schaltungen endlich verstehe, dann bin ich ein großen >> Schritt weiter, > Fangen wir mal mit der linken Schaltung an. Was ist gegeben? Und was > wird gefordert? Was soll die Schaltung tun? Was soll denn da letztlich > zwischen Input0, Input1 und OUTPUT_XOR passieren? > Beschreibe die eigentliche, ursprüngliche Aufgabe mit wenigen Worten und > ohne eigene Erklärungs- bzw. Lösungsversuche. Ich möchte ein exklusives Oder erreichen. So wie es beispielsweise beim Halbaddierer der Fall ist. Also die reine Summe als Ausgang erzeugen. Für 00 ist es 0. Nur wenn einer der beiden 1 ist, wird es 1, wenn beide 1 sind, wird es 0 und ich bekomme einen Übertrag...den C Ausgang (hier entfernt von der Aufgabe) könnte man mit einem einfachen AND-Gatter umsetzen, nur wenn beide 1 sind, Carry=1. 6.) Logik verstehe ich. Ich möchte aber eben reproduzieren können. Schaltung gegeben...ich weiß nicht das es ein XOR-Gatter ist, wie sieht die Tabelle aus. 7.) Okay Logik bei sequentiellen Dingen wird von FlipFlops eingefasst. Wie sehe den mein VHDL Code zu so einer Schaltung aus? Ich setze keinerlei Clock Events, nichts. Schaltung 2 eben mit dem Mux, dem AND und dem RTL_Latch. Wenn Masse obwohl da dran S=1 steht im RTL Design, eine 0 bedeutet und Erde wo S=Default dran steht für meinen Eingang I1, für select = 1 ausgewählt wird, obwohl da Default steht, dann gibt der Multiplexer ja egal was ich eigentlich mache, eine 0 auf den Ausgang meines Multiplexers. Meine Frage ist eigentlich simple. Es macht doch keinen Sinn, der Multiplexer würde dann ja immer, egal was S_1 als Select Signal macht, eine 0 auf seinen Ausgang geben!!! Und eben was bedeutet S=Default und S=1. Wenn Erde und Masse beide logisch eine 0 sind!!! In der Regel. Wenn ich eben keine Datenblätter habe sondern nur meine Schaltung. Und wie sehe als Data Flow Description als Einzeiler meine Digitalschaltung aus. Ich will genau diese 2 Schaltungen verstehen, dann kann ich dieses Grundlegende Verständnis auf andere übertragen. Bitte helft mir. Ich recherchiere so viel...wenn ich da drauf eine Lösung finde, finde ich sie auch auf komplexere Schaltungen. 8.) Außerdem rede ich hier von Zuständen, weil der RTL_Latch im Design keinen CLK Eingang aufweist, sondern eben nur einen Data und einen G Eingang. Somit ist er für sequentielle Logik nicht zu gebrauchen, da er ein Zustandsgesteuerter FlipFlip ist. 9.) Demzufolge hätte VHDL dieses RTL Design ja nie ausspucken dürfen, wenn nur der einfache Taktgesteuerte vorhanden ist und alles andere wie RAM oder Register oder LUTs aus einer Kaskadierung bzw Zusammenschaltung mit weiteren Komponenten beruhen. 10.) Wie sehe für so eine Schaltung ein guter Ansatz aus, sofern nur die Schaltung gegeben ist, um daraus OUTPUT <= S_2 and S_3 x ´0´; zu machen. X ist das dazwischen. Ich kann ja dazwischen keine sequentielle Logik verwenden in meiner Zuweisung, nur darüber über if rising edge clock event und clock = 1... Und der Mux würde ja immer 0 ausspucken. Wie geht das. Ohne If darüber, ohne Clock Eingang am FlipFlop? Bitte helft mir. 11.) ror und rll gehen ja leider nicht mit Standard_Logic...warum? Weil Standard_Logic mehr Zustände als nur High und Low annehmen kann? 12.) Noch eine letzte Frage: Zur initialisierung eines Vectors mit 0llen...der eine variable Breite über Generic Naturals aufweist...aber die Instanziierung der 0llen wird erst bei einem process per Sensitivitätsliste ausgeführt...also keine wirkliche Instanziierung am Anfang bei der Deklaration...sondern einfach nur 0llen zuweisen an alle Stellen, da er Variable Breite Aufweist... Ich würde einfach Def Generic etc. signal probe_vec : bit_vector (GENERIC_VAR-1 downto 0); ... probe_vec <= probe_vec and (not probe_vec); Achja was für zusätzliche Parameter kann ich bei der Instanziierung noch angeben? signal probe_vec : bit_vector [optional????](GENERIC_VAR-1 downto 0); Kann ich die Instanziierung mit Others auch nach der Definition des Datentypus vornehmen und dann die Breite des Vectors festlegen? Ich habe ziemlich viele Schreibweisen mir angeguckt, es muss zwischen Datentyp und der Breiten (downto oder to) Definition laut Literatur noch optinale Dinge geben, ein zweites Signal müsste ich per Komma vor dem : <Datentyp> schreiben. Aber was kann ich dahinter vor dem ( downto ) schreiben? Dort gibt es Optionen, ich finde nur nicht was dort hin kann. Ist das auch hier abhängig davon, mit welchem Chip ich arbeite? Welche VHDL Syntax mir zur Verfügung stehen, trotz desselben Herstellers? Ich meine ror und rll sind seit 1993 Bestandteil der Syntax. Ich habe zu allem möglichen gesucht in Literaturen und allem aber finde es nicht so, dass ich es verstehe oder auf mein Problem angepasst. Deshalb muss ich fragen. Wenn mir jemand das erklären kann, macht es klick und ich bin einen riesen Schritt weiter. Ich bin nur an der Grenze meiner eigenen Erklärungs und Recherche Fähigkeiten angelangt. Wenn einmal einer mit das in Ruhe erklären könnte, ich würde es verstehen und dadurch auch neue Sachen viel schneller lernen. Mit freundlichen Grüßen Sin
Sin S. schrieb: > Ich vergesse extrem schnell Syntax und > Grundlegende Dinge. Habt ihr da Tipps? Ich habe zu jeder Programmiersprache die ich aktiv gebrauche (VHDL, Python, TCL, Matlab) und zu jedem Tool (Emacs, VIM, Git) ein Cheat-sheet oder "in a nutshell" Buch auf meinem Tisch liegen. Das Zeug ist alles zu ähnlich und doch verschieden, dass ich mir das merken könnte. :-) Sin S. schrieb: > Es ging mir nur darum: Ich habe den Code implementiert und Vivado > spuckte mir eben genau diese Schaltung (RTL-Schema) raus. Und egal wie > ich die Pfade entlang gehe und meine zwei Eingänge setze, ich komme > nicht auf meine XOR-Logik am Ausgang des MUX!!! Das war die wichtigste Information, die in deinem Eröffnungspost gefehlt hat. Dann ist uns auch klar, wieso solche Schaltungselemente vorkommen können. Was aber fehlt, damit wir dich unterstützen können ist der VHDL Code, den du in Vivado hineingesteckt hast und, falls vorhanden, deine Testbench die zeigt, dass dein Code auch im Simulator das macht, was du von einem EXOR erwartest. Also das ganze VHDL File, nicht nur den Ausschnitt den du gepostet hast (der soweit auch zu passen scheint). Sin S. schrieb: > 11.) ror und rll gehen ja leider nicht mit Standard_Logic...warum? Weil > Standard_Logic mehr Zustände als nur High und Low annehmen kann? Nein, weil bei std_logic unbekannt ist, ob es als signed oder unsigned interpretiert wird. ror und rll sind erst für die Typen signed oder unsigned aus der Library numeric_std definiert. Hier meine Quelle: https://stackoverflow.com/questions/53389379/vhdl-ror-and-rol-operations Sin S. schrieb: > Achja was für zusätzliche Parameter kann ich bei der Instanziierung noch > angeben? > > signal probe_vec : bit_vector [optional????](GENERIC_VAR-1 downto 0); > [...] Dort gibt es Optionen, ich finde nur nicht was dort hin kann. Gemäss dem Buch das ich hier habe, würde es theoretisch noch die Schlüsselwörter "register" und "bus" geben für den optionalen Teil (sog. Guarded Signals). Das Buch sagt aber auch gleich: "Guarded signals (register and bus) are obscure and are generally to be avoided" Also nicht aufhalten lassen davon. Einfach ignorieren, dass es da noch was geben würde :-) (Ja, genau solche Dinge machen eine Sprache nicht einfach zu lernen...)
Sin S. schrieb: > Ich habe den Code implementiert und Vivado spuckte mir eben genau diese > Schaltung (RTL-Schema) raus. Zeig doch mal genau den Code und einen Screenshot vom fraglichen Plan. Dann könenn wir mal drüber diskutieren, warum der Synthesizer das so gemacht hat. Und natürlich gibt es da auch urige Effekte. Hier fühlt sich der Synthesizer bemüßigt, alline durch das Umformatieren des Codes zwei zusätzliche Inverter einzubauen: http://www.lothar-miller.de/s9y/archives/52-Kompakte-Flankenerkennung.html Das macht in der Praxis aber nichts aus, weil diese "zusätzlichen" Bauteile sowieso im FPGA sind und ohne zusätzlichen Aufwand verwendet werden können.
Mittlerweile habe ich da irgendwie durch stundenlange Simulationen durchgeblickt und bin um einiges weiter in der VHDL Thematik reingekommen. Eine wirklich wichtige Sache beschäftigt mich aber immer noch ein wenig sehr... Wenn ich ein Schieberegister implementiere ganz normal dann habe ich ja quasi mehrere Möglichkeiten a) Ich könnte mit einem Signal arbeiten architecture Behavior of shift_reg is signal QINT: STD_LOGIC_VECTOR (7 downto 0) := (others => '0'); begin shift_reg: process (CLK, Reset) begin if Reset = '1' then Q <= (others => '0'); elsif CLK = '1' and CLK'event then QINT <= D & QINT(7 downto 1 ) ; Q <= QINT; end if; end process shift_reg; end Behavior; Dann wäre das ganze um einen Takt Verzögert b) ich könnte mit einer Prozessinternen Variablen arbeiten für eine direkt Ausgabe wenn ich das richtig verstanden habe. Somit wäre das die Variante, für keinerlei Verzögerung bei der Ausgabe des Schieberegisters, thats right? Oder habe ich da einen Fehler. begin shift_reg: process (CLK, Reset) variable QINT: STD_LOGIC_VECTOR (7 downto 0) := (others => '0') ; begin if Reset = '1' then Q <= (others => '0'); elsif CLK = '1' and CLK'event then QINT := D & QINT(7 downto 1 ); Q <= QINT; end if; end process shift_reg; end Behavioral; c) Ich könnte die Signalzuweisung auf Q <= meines Signals paralellläufig machen, also außerhalb des Prozesses. Für meine Variable geht das ja nicht, die ist nur dort bekannt, wo sie deklariert wurde und ist Prozessintern. shift_reg: process (CLK, Reset) begin if Reset = '1' then Q <= (others => '0'); elsif CLK = '1' and CLK'event then QINT <= D & QINT(7 downto 1 ) ; -- Q <= QINT; end if; end process shift_reg; Q <= QINT; -- Paralell/Nebenläufig end Behavior; Was würde das für einen Zeitlichen Unterschied, im Vergleich zum ersten machen? Achja und wie erzeuge ich reine Verzögerungsglieder mit VHDL? Ihr habt mir viel weitergeholfen ich verstehe inzwischen ein wenig mehr. Mit freundlichen Grüßen
Sin S. schrieb: > Was würde das für einen Zeitlichen Unterschied, im Vergleich zum ersten > machen? In der ersten Variante wird Q nur bei einer aktiven Flanke zugewiesen, in der dritten Variante immer. Folglich bekommst zu bei V3 das Ergebnis einen Takt früher an als bei V1. V3 wird übrigens nicht funktionieren, weil du Q innerhalb und außerhalb des Prozesses zuweist. In V1 musst du QINT resetten, nicht nur Q, in V3 nur QINT. Zu V2: Keine Ahnung ob das funktioniert, aber wie schon oft gesagt in diesem Forum: Lass die Finger von Variablen, gerade als Anfänger. Es gibt nur wenige Situationen, in denen Variablen wirklich von Nutzen sind, z.B. wenn du komplexe Ausdrücke in einfachere Teilausdrücke zerlegen willst. Aber man kommt fast immer ohne Variablen aus. In reinen Simulationsmodellen und Testbenches ist das etwas anderes, da kannst du mit Variablen fast das gleiche machen was man aus der Software kennt. Aber im Design stiften sie hauptsächlich Verwirrung. Sin S. schrieb: > Achja und wie erzeuge ich reine Verzögerungsglieder mit VHDL? Was meinst du mit rein? Dein Schieberegister ist ein Verzögerungsglied. Es verzögert das Eingangssignal um 8 Takte, wenn du das letzte Bit als Ausgang betrachtest.
Sin S. schrieb: > IN0 IN1 Y-Ausgang > 0 0 0 > 1 0 1 > 0 1 1 > 1 1 1 > > Das ist die normale Logiktabelle für das XOR-Gatter also die Logik in > diesem Sinne gespeichert in LUTs auf englisch in meinen FPGA durch > setzen von 1sen und 0len. Ist das nicht eine OR Verknüpfung?
Sin S. schrieb: > ich könnte mit einer Prozessinternen Variablen arbeiten für eine direkt > Ausgabe wenn ich das richtig verstanden habe Nein, du hast den Sinn und Zweck von Signalen und Variabeln noch nicht richtig verstanden. > Was würde das für einen Zeitlichen Unterschied, im Vergleich zum ersten > machen? In einem VHDL-Prozess gibt es keinen "Zeitunterschied". So ein Prozess passiert per Definition "sofort" mit einer Änderung in der Sensitivliste. > Achja und wie erzeuge ich reine Verzögerungsglieder mit VHDL? Gar nicht. Lies das hier: http://www.lothar-miller.de/s9y/archives/80-Hello-World!.html und exerziere es selber durch. Und dann mach das Lauflicht und arbeite dich langsam Schritt für Schritt weiter durch. Ich empfehle dafür dringenst ein Buch, das sich mit "VHDL-Synthese" beschäftigt. Wenn du das durch hast, dann weißt du, dass Zeiten ab vom ns-Bereich aufwärts in VHDL über Zustandsautomaten (aka. Zähler) erzeugt werden. Und Zeiten unter einer ns werden nicht in VHDL sondern per manuellem Gefrickel im Layouteditor "so in etwa" hingebastelt. Sin S. schrieb: > weiter in der VHDL Thematik reingekommen. Bitte verwende die [vhdl] Tags. Die Anleitung ist bei "Wichtige Regeln - erst lesen, dann posten!" unter "Formatierung" zu finden.
:
Bearbeitet durch Moderator
Ich hatte mir jetzt schon 3 Bücher zugelegt. Aber eine Sache ist mir immer noch etwas rätselhaft. Wenn es heißt die Daten sollen in ein Schieberegister von links hineingeschoben werden oder das Schieberegister soll mit jedem Takt nach Rechts schieben. Für mich bedeutet von links hineingeschoben a) reg <= DATAIN & reg(7 downto 1); Und wenn dann der am weitesten rechts stehende Wert ausgegeben werden soll, wäre das für mich reg(0); Nun fand ich aber mitunter das links hineinschieben sowas bedeutet was auch 2 Kollegen von mir so verwendet haben für "Daten von links je Taktflanke in ein Register schiebt". Die haben aber auch wenig Ahnung und sind sich nicht sicher. Was ist jetzt was? Ich kann nicht mehr. Stundenlang, etliche Forenbeiträge, 3 dicke Bücher a 500 Seiten...ich finde da nichts passend zu. b) reg <= reg(6 downto 0) & DATAIN; Und der am weitesten rechts stehende Wert reg(7) ist... bei signal reg : std_logic_vector(7 downto 0):="00000000"; Macht das für mich wenig Sinn. Ich gucke doch immer von links nach rechts. Nur bei to ist eben mein MSB reg(7) bei downto und mein LSB reg(0) bei downto vertauscht. Je nach Literatur und Quelle ist das anders formuliert. Das ist extrem wichtig für mich was es jetzt bedeutet. Wenn Daten von Links in ein Schieberegister geschoben werden. Oder eben Wortlaut 2 das Schieberegister mit jeder Flanke die Werte nach Rechts schiebt. Ich brauche dazu explizit die Erklärung. Ich weiß ich kann alles drehen und wenden wie ich will aber ich möchte wissen was genau für diese Formulierung gefordert wird. Oder was diese Formulierung aussagt. Ich sitze da jetzt 4 Stunden dran und finde eigentlich nur, dass von links reingeschoben bedeutet das es eben von links nach rechts reingeht also für mich in meinem Verständnis Code a). Ein Kollege hat es aber genau andersrum. Ich brauche genau darauf die Definition, damit ich das nicht verwechsle. Zum Thema VHDL Tags. Wenn ich da auf das VHDL oben drücke öffnet sich eine weiße Seite wo Schrift steht. Deine Webseite ist echt gut.
:
Bearbeitet durch User
Sin S. schrieb: > Das ist extrem wichtig für mich was es jetzt bedeutet. Wenn Daten von > Links in ein Schieberegister geschoben werden. Oder eben Wortlaut 2 das > Schieberegister mit jeder Flanke die Werte nach Rechts schiebt. Ich > brauche dazu explizit die Erklärung. Das ist, wie wenn nach einem Münzwurf der eine sagt: "Kopf ist oben" und ein anderer sagt: "Zahl ist unten". Beide meinen *exakt das selbe.* Es ist egal, ob ich sowas schreibe:
1 | -- 1
|
2 | -- links .. rechts
|
3 | signal reg : std_logic_vector(7 downto 0):= (others=>'0'); |
4 | :
|
5 | reg <= DATAIN & reg(7 downto 1) when rising_edge(clk); |
Oder so was:
1 | -- 2
|
2 | -- links .. rechts
|
3 | signal reg : std_logic_vector(0 to 7):= (others=>'0'); |
4 | :
|
5 | reg <= DATAIN & reg(0 to 6) when rising_edge(clk); |
In beiden Fällen kommt das selbe heraus. Z.B. bei einer Dauer-'1' am DATAIN das hier:
1 | clk ____________---------_________---------_________---------_________--------_________ |
2 | reg 00000000 10000000 11000000 11100000 11110000 |
Und natürlich ist beim 1. Fall (mit downto) nach der ersten Taktflanke
das Bit reg(7) bereits '1', beim 2. Fall (mit to) ist das reg(0) = '1',
weil beide jeweils das "linkste" Bit im Vektor sind.
Mein Tipp: nimm solche einfachen und grundlegenden Konstrukte und
probiere sie am Simulator aus.
> Zum Thema VHDL Tags
Soooo arg schwierig ist das nun auch nicht: tippe genau die Zeichenfolge
dort ab und ersetze die Buchstaben "VHDL-Code" durch deinen VHDL-Code
Du kannst das ja einfach mal selber probieren und dann zum Test erst
mal auf den "Vorschau"-Knopf drücken statt auf "Beitrag
veröffentlichen".
:
Bearbeitet durch Moderator
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.