This is an old revision of the document!
Digitaltechnikpraktikum Versuch 5 - Arithmetische Schaltung
In diesem Versuch
- analysieren Sie die Schaltung zur Addition von Bin盲rzahlen
- entwerfen Sie eine Schaltung mit dem das Additionsergebnis auf dem FPGA angezeigt wird
- entwerfen Sie die Abstimmungsschaltung f眉r 10 Schalter
- messen Sie die Verz枚gerungszeit der Abstimmungsschaltung
Projektaktualisierung
Aktualisieren Sie ihr Projekt mit 鈥済it pull鈥�.
Additionsschaltung mit VHDL
In der Datei ist eine Schaltung zur Addition von zwei 4 Bit Bin盲rzahlen mit einem 4 Bit Ergebnis in VHDL beschrieben. Die zugeh枚rige Testbench ist .
- Wechseln Sie in das Simulationsverzeichnis 鈥渟im/add4鈥� und simulieren Sie die Additionsschaltung
Sie verwenden diese Schaltung um auf dem FPGA zwei Zahlen zu addieren. Die beiden Summanden sollen an den Schaltern SW(3..0) und SW(9..6) als Bin盲rzahl vorliegen. Der Zustand der Schalter soll an den roten LEDs angezeigt werden. Gleichzeitig soll ein Summand an HEX0 und der andere Summand an HEX1 als Ziffer dargestellt werden. Das Ergebnis der Addition soll an den gr眉nen LEDs LEDG(3..0) bin盲r und an HEX2 als Ziffer dargestellt werden. Diese Schaltung soll den Namen de1_add4 haben. In der Datei gibt es schon eine fertige Testbench f眉r die Schaltung. Es ist auch schon eine unvollst盲ndige VHDL Datei vorhanden, die Sie noch erg盲nzen m眉ssen. Das Simulationsverzeichnis und das Syntheseverzeichnis ist schon fertig vorbereitet.
- Wechseln Sie in das Simulationsverzeichnis und starten Sie die Simulation.
- Erg盲nzen Sie den VHDL Code in der Datei und 眉berpr眉fen Sie Ihren Entwurf im Simulator.
- Wenn im Simulator alles gut aussieht, wechseln Sie in das Syntheseverzeichnis und synthetisieren Sie die Schaltung
- Laden Sie das Design auf das FPGA und 眉berpr眉fen Sie dort die Funktion
Analyse der Additionsschaltung
Jetzt geht es um die Analyse wie die Additonsschaltung intern auf dem FPGA mit den Logikelementen umgesetzt wird. Im ist auf Figure 2-3 die Konfiguration des Logikelementes im 鈥淣ormal Mode鈥� und in Figure 2-4 im 鈥淎rithmetic Mode鈥� dargestellt. Der Eingang 鈥渃in鈥� des Logikelementes ist immer mit dem 鈥渃out鈥� Ausgang des direkt benachbarten Logikelementes verbunden. Im 鈥淎rithmetic Mode鈥� ist die Lookuptabelle in zwei 3鈫�1 Lookuptabellen aufgeteilt, wobei der Ausgang der einen Lookuptabelle immer 鈥渃out鈥� ist und deshalb nur zum Nachbarlogikelement weitergegeben werden kann.
- Starten Sie quartus mit der GUI im Syntheseverzeichnis 鈥減nr/de1_add4鈥�
- 脰ffnen Sie den RTL Viewer und analysieren Sie die Schaltungsstruktur auf VHDL Ebene
- 脰ffnen Sie den Technology Map Viewer (Post Fitting) und analysieren Sie die Schaltungsstruktur
脰ffnen Sie das Design 鈥渁dd4鈥� im Technologymap Viewer
Skizzieren Sie die Verschaltung der Logikelemente untereinander auf Papier.
Stellen Sie den Inhalt der einzelnen Logikelement durch Doppelklicken auf das Logikelement dar.
Der Multiplexer in dem Logikelement hat einen konstanten Selecteingang. Welche Lookuptabelle ist deshalb am Ausgang des Multiplexers wirksam? Die Eigenschaften der beiden Lookuptabellen F0 und F1 innerhalb des Logikelementes k枚nnen Sie sich nach Auswahl der Lookuptabelle und Klick auf die rechte Maustaste im Kontextmen眉 鈥淧roperties鈥� anschauen.
Danach erscheint ein Fenster mit der Darstellung der booleschen Funktion in der Lookuptabelle.
Dort kann dann die Darstellung als Wahrheitstabelle 鈥淭ruth Table鈥� gew盲hlt werden.
- Welche Logikelemente sind im 鈥淣ormal Mode鈥�, welche sind im 鈥淎rithmetic Mode鈥�?
- Vergleichen Sie die Schaltung mit dem 鈥淩ipple-Carry-Addierer鈥� in .
- Analysieren Sie die booleschen Funktionen der einzelnen Lookuptabellen in den Logikelementen und notieren Sie die Wahrheitstabellen auf Papier.
- Vergleichen Sie die Funktionen mit der Funktion eines Halb- und eines Volladdierers.
- Welche Unterschiede gibt es in dieser Schaltung im Vergleich zum Ripple-Carry-Addierer?
脰ffnen Sie jetzt den Chip Planner und suchen Sie die Logikelemente, die zum Addierer geh枚ren. Die Logikelemente haben im Namen irgendetwas mit 鈥渁dd鈥�.
- Aktivieren Sie mit 鈥淰iew 鈫� Layers Settings鈥� die Auswahl f眉r die Darstellung
- Aktivieren Sie Logic Details 鈫� Ports
- Finden Sie die Verbindungungen zwischen 鈥渃in鈥� und 鈥渃out鈥� zwischen den Logikelementen vom Addierer.
Entwurf der Abstimmungsschaltung
Sie haben bislang folgende Schaltungen in Ihrem Baukasten
- 鈥渁dd4鈥�: Ein 4 Bit Addierer
- 鈥渂in2seg鈥�: Eine Schaltung zur Anzeige einer 4 Bit Bin盲rzahl an einer Siebensegmentanzeige
- 鈥渃ntones鈥�: Eine Schaltung zum Z盲hlen von der Einsen an vier Eing盲ngen.
- Allgemeine boolesche Ausdr眉cke und Wahrheitstabellen
Entwerfen Sie jetzt eine Abstimmungsschaltung mit zehn Eing盲ngen. In der Vorlesung haben Sie eine Abstimmungsschaltung mit drei Eing盲ngen durch Nachdenken und direkt aus einer Wahrheitstabelle entworfen. Entwerfen Sie jetzt auf Papier eine Schaltung auf Basis der oben genannten Komponenten! Die Schaltung soll folgende Eigenschaften haben
- LEDG(7) soll leuchten, wenn mehr als f眉nf Schalter SW(9..0) eingeschaltet sind
- Der Zustand der Schalter SW(9..0) soll an LEDR angezeigt werden.
- Verwenden Sie die HEX Anzeigen f眉r die Darstellung von internen Werten nach Belieben.
Wenn Sie die Schaltung auf Papier skizziert haben, dann k枚nnen Sie sich an die Umsetzung in VHDL machen. F眉r die Abstimmungsschaltung gibt es eine Testbench und eine angefangene Datei f眉r das Design. Das Simulationsverzeichnis und das Syntheseverzeichnis sind fertig.
F眉r die Umsetzung in VHDL ist es eventuell notwendig, dass Sie mit Signalvektoren unterschiedlicher L盲nge arbeiten m眉ssen. Daf眉r gibt es hier noch einige Tips. Sie haben bereits auf Teile aus einem Vektor zugegriffen, z.B. mit SW(3 downto 0) um einen vier Bit langen Vektor zu erhalten. Der Eingang switches_i der cntones Schaltung hat eine L盲nge von vier Bit. Wenn Sie die Eing盲nge switches_i(1 downto 0) mit SW(5 downto 4) verbinden wollen und switches_i(3 downto 2) auf 0 setzen wollen geht das so:
cntones_i0 : cntones port map ( switches_i(1 downto 0) => SW(5 downto 4), switches_i(3 downto 2) => "00", cnt_o => cnt);
Wenn Sie nur den einen Eingang switches_i(3) auf 0 setzen wollen und switches_i(2 downto 0) mit den Schaltern SW(2 downto 0) verbinden wollen, dann geht das so:
cntones_i0 : cntones port map ( switches_i(2 downto 0) => SW(2 downto 0), switches_i(3) => '0', cnt_o => cnt);
- Entwerfen Sie die Abstimmungsschaltung auf Papier
- Entwerfen Sie die Abstimmungsschaltung in VHDL
- Simulieren Sie die Schaltung im Verzeichnis sim/de1_majority
- Sorgen Sie daf眉r, dass kein Ausgang bei der Simulation 鈥渦ndefined鈥� ist
- Wenn die Schaltung funktioniert, starten Sie die Synthese im Verzeichnis pnr/de_majority
- 脺berpr眉fen Sie die Funktion auf dem FPGA.
Messung der Verz枚gerungszeit der Schaltung
Jetzt messen Sie die Verz枚gerungszeit der Schaltung auf dem FPGA. Dazu verwenden Sie den Expansionport 鈥淕PIO_1鈥�. F眉r diese Messung soll nicht der Signalgenerator verwendet werden, sondern der 50 MHz Oszillator, der schon auf dem Board vorhanden ist. Um das 50 MHz Signal vom Oszillator auch messen zu k枚nnen, wird es erst durch das FPGA auf den Expansionport gef眉hrt und dann vom Expansionport wieder zur眉ck in den FPGA an die Schaltung.
- 脺berlegen Sie von welchem Schalter aus es die gr枚脽te Verz枚gerungszeit zum Ausgang der Abstimmungsschaltung geben k枚nnte.
- F眉gen Sie einen Eingang CLOCK_50 zum Design hinzu
- F眉gen Sie einen Ausgang CLOCK_50_OUT zum Design hinzu
- F眉gen Sie einen Eingang CLK_IN zum Design hinzu
- F眉gen Sie einen Ausgang MAJ zum Design hinzu
- Ersetzen Sie den Schaltereingang, der wahrscheinlich der Startpunkt der l盲ngsten Verz枚gerung ist, durch den Eingang CLK_IN
- Verbinden Sie neben LEDG(7) auch den Ausgang MAJ mit dem Ausgang der Abstimmungsschaltung
- Leiten Sie auf dem FPGA das 50 MHz Taktsignal, das am Eingang CLOCK_50 ankommt, zum Ausgang CLOCK_50_OUT.
Jetzt m眉ssen Sie noch geeignete Pindefinitionen zum hinzuf眉gen um
- CLOCK_50 mit dem 50 MHz Oszillator
- CLOCK_50_OUT mit dem Pin 1 auf dem Expansionport 1 (GPIO1)
- CLK_IN mit dem Pin 2 auf Expansionport 1
- MAJ mit dem Pin 40 auf dem Expansionport 1
zu verbinden.
Nach etwas Recherche im sollte dabei herauskommen:
set_location_assignment PIN_L1 -to CLOCK_50 set_location_assignment PIN_H12 -to CLOCK_50_OUT set_location_assignment PIN_H13 -to CLK_IN set_location_assignment PIN_P18 -to MAJ
- Messen Sie die Verz枚gerungszeit durch das FPGA!