[[dtpr_versuch_5]]

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
dtpr_versuch_5 [2010/12/13 02:20]
beckmanf 12 MHz eingefügt
dtpr_versuch_5 [2021/03/20 08:21] (current)
beckmanf [Additionsschaltung mit VHDL] removed sim
Line 1: Line 1:
-==== Versuch ​====+===== Digitaltechnikpraktikum ​Versuch ​3 - Arithmetische Schaltung =====
  
-Dieser Versuch behandelt das Thema sequentielle Schaltungen und die Ansteuerung von externen Bausteinen. +In diesem Versuch
-In diesem Versuch ​wird der Soundbaustein,​ der sich auf dem Terasic DE01 Board befindet, angesteuert. Ziel des Versuches ist es, +
-Audiodaten mit dem Mikrofon eines Headsets aufzuzeichnen und zeitverzögert über den Kopfhörer auszugeben. Die Zeitverzögerung soll +
-etwa 1 Sekunde betragen. ​+
  
-Hier finden ​Sie das: {{:​wm8731_wm8731l.pdf|Datenblatt des Soundbausteins}}+  * 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
  
-Der Baustein wird über eine I2C Schnittstelle konfiguriert. Der VHDL Code für die I2C Schnittstelle und die +==== Projektaktualisierung ====
-Konfiguration ist bereits fertig. ​+
  
-Der Baustein ist mit folgenden Parametern konfiguriert:​+Aktualisieren Sie ihr Projekt ​mit "git pull"​. ​
  
-  * 12.288 MHz Systemtakt +==== Additionsschaltung mit VHDL ====
-  * 8 kHz Samplingfrequenz +
-  * 16 Bit Datenwortbreite +
-  * DSP Interface, LRP '​1'​ +
-  * Slave Mode+
  
-Die Schnittstelle für die Audiodaten ist unabhängig von der I2C Schnittstelle für die KonfigurationDer Baustein +In der Datei [[https://​gitlab.elektrotechnik.hs-augsburg.de/​beckmanf/​digitaltechnikpraktikum/​blob/​master/​src/​add4_rtl.vhd|add4_rtl.vhd]] ist eine Schaltung zur Addition von zwei 4 Bit Binärzahlen mit einem 4 Bit Ergebnis in VHDL beschrieben
-ist als slave konfiguriert,​ d.hdie Signale ADCLRC, DACLRC und BCLK werden vom FPGA erzeugtAuch der Code für die Erzeugung dieser +
-Signale ist bereits fertigIn Figure 29 des Datenblatts ​ist das Timing der Audioschnittstelle dargestellt. Die Audiodaten werden bitseriell +
-übertragen. Die Signale ADCLRC und DACLRC werden auch "​framesync"​ genannt+
  
-Im VHDL Code gibt es ein Enablesignal "​bclk_falling_edge_en",​ das jeweils vor der fallenden Flanke des Bitclock "​bclk"​ aktiv istDieses Enablesignal ​soll für die weiteren Aufgaben verwendet ​werden. ​Auf dem FPGA wird in diesem Versuch ​der 24 MHz Takt verwendet, der auch auf dem FPGA zur Verfügung stehtAus diesem Takt wird ein 12 MHz Takt für den Soundbaustein abgeleitetDer Soundbaustein wird also statt mit 12.288 MHz mit 12 MHz betrieben+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 werdenGleichzeitig ​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 habenEs ist auch schon eine unvollständige VHDL Datei [[https://​gitlab.elektrotechnik.hs-augsburg.de/​beckmanf/​digitaltechnikpraktikum/​blob/​master/​src/​de1_add4_rtl.vhd|de1_add4_rtl.vhd]] vorhanden, die Sie noch ergänzen müssen. Das Syntheseverzeichnis [[https://​gitlab.elektrotechnik.hs-augsburg.de/​beckmanf/​digitaltechnikpraktikum/​tree/​master/​pnr/​de1_add4|pnr/​de1_add4]] ist schon fertig vorbereitet.
  
-Für die Funktion ​des Systems fehlen noch die: +  - Wechseln Sie in das Syntheseverzeichnis [[https://​gitlab.elektrotechnik.hs-augsburg.de/​beckmanf/​digitaltechnikpraktikum/​tree/​master/​pnr/​de1_add4|pnr/​de1_add4]] und starten Sie Quartus mit der grafischen Oberfläche. 
 +  - Ergänzen Sie den VHDL Code in der Datei [[https://​gitlab.elektrotechnik.hs-augsburg.de/​beckmanf/​digitaltechnikpraktikum/​blob/​master/​src/​de1_add4_rtl.vhd|de1_add4_rtl.vhd]] 
 +  - Laden Sie das Design auf das FPGA und überprüfen Sie dort die Funktion
  
-**ADC Schnittstelle** 
  
-Die ADC Schnittstelle liest die eingehenden 16 Bit von ADCDAT ein und aktiviert ein "​valid"​ Signal, wenn das Einlesen beendet ist. Es wird jeweils ein Bit gelesen wenn "​en_i"​ aktiv ist. "​en_i"​ ist auf dem Toplevel mit bclk_falling_edge_en verbunden. Die Daten werden parallel ausgegeben und müssen gültig sein, wenn das valid aktiv ist. Die ADC Schnittstelle wird mit einem "​start_i"​ Signal aktiviert. Dieses start_i Signal ist auf dem Toplevel mit dem "​framesync"​ Signal verbunden. Die ADC Schnittstelle ist mono, d.h. es müssen nur die ersten 16 Bit gelesen werden. ​+==== Analyse der Additionsschaltung ====
  
-**DAC Schnittstelle**+Jetzt geht es um die Analyse wie die Additonsschaltung intern auf dem FPGA mit den Logikelementen umgesetzt wird. Im [[https://​www.hs-augsburg.de/​~beckmanf/​restricted/​DE1_V.1.0.1_CDROM/​Datasheets/​Cyclone_II/​cyc2_cii5v1_01.pdf|Cyclone II Datenblatt]] ist auf Figure 2-3 die Konfiguration des Logikelementes im "​Normal Mode" und in Figure 2-4 im "​Arithmetic Mode" dargestellt. Der Eingang "​cin"​ des Logikelementes ist immer mit dem "​cout"​ Ausgang des direkt benachbarten Logikelementes verbunden. Im "​Arithmetic Mode" ist die Lookuptabelle in zwei 3->1 Lookuptabellen aufgeteilt, wobei der Ausgang der einen Lookuptabelle immer "​cout"​ ist und deshalb nur zum Nachbarlogikelement weitergegeben werden kann.
  
-Die DAC Schnittstelle liest 16 Bit Daten parallel, wenn das Signal ​"load_i" ​aktiv ist. "​load_i"​ ist auf dem Toplevel mit framesync verbunden. ​ +  - Starten Sie quartus mit der GUI im Syntheseverzeichnis ​"pnr/​de1_add4
-Dann gibt die DAC Schnittstelle jedesmal wenn en_i aktiv ist, ein weiteres Bit des Datenwortes seriell aus. Die DAC Schnittstelle muss das 16 Bit Datenwort zweimal ausgeben, da der Baustein ein Stereosignal erwartet. ​ +  - Ö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
  
-**Ringbuffer**+{{ ::​addfour01.jpg?​800 | de1_add4 Technology Map Viewer}}
  
-Der Ringbuffer speichert die Daten vom ADC in einem Speicher und liest die Daten für den DAC aus dem Speicher. Der Ringbuffer wird mit einem Dual-Port Memory aufgebaut, d.h. mit einem Speicher, der zeitgleich in jedem Takt geschrieben und gelesen werden kann. Für den Ringbuffer benötigt man einen Schreib- und einen Lesezeiger der die Adresse für die Adressierung des Speichers angibt. In jedem Takt wird dann die Schreib- und Leseadresse um eins erhöht. Der Code für das Dual-Port Memory ist bereits fertig (memory.vhd). Der Speicher hat 8192 Speicherplätze mit jeweils 16 Bit Datenwortbreite. Der Ringbuffer wird jedesmal aktiviert, wenn neue Daten aus der ADC Schnittstelle verfügbar sind.  
  
-[[dtpr_v5_code]]+Öffnen Sie das Design "​add4"​ im Technologymap Viewer
  
-=== Aufgaben ===+{{ ::​addfour02.jpg?​800 | add4 Technology Map Viewer}}
  
-  - Simulieren ​Sie den vorhandenen Code und schauen Sie sich das Timing von ADCLRC, DACLRC, BCLK und dem Enablesignal "​bclk_falling_edge_en"​ an.  +Skizzieren ​Sie die Verschaltung ​der Logikelemente untereinander auf Papier
-  - Zeichnen Sie ein Timingdiagramm aus der die Funktion ​der ADC Schnittstelle ersichtlich istZu welchen Zeitpunkten laden Sie jeweils Daten in das Schieberegister und wann wird das valid aktiv? +
-  - Entwerfen Sie einen Zustandsautomaten für die ADC Schnittstelle +
-  - Zeichnen Sie ein Timingdiagramm für die DAC Schnittstelle. Zu welchem Zeitpunkt wird welches Bit auf dem seriellen Ausgang ausgeben? Wann werden die Daten parallel geladen? +
-  - Skizzieren Sie die Funktion des Ringbuffers mit Schreib- und Lesezeiger +
-  - Schreiben Sie den VHDL Code für ADC Schnittstelle,​ DAC Schnittstelle und Ringbuffer und simulieren Sie die Funktion +
-  - Laden Sie den Code auf das FPGA und prüfen Sie die Funktion +
- +
  
 +Stellen Sie den Inhalt der einzelnen Logikelement durch Doppelklicken auf das Logikelement dar.
  
 +{{ ::​addfour03.jpg?​800 | add4 Logic Element Detail}}
  
 +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ü "​Properties"​ anschauen. ​
 +
 +{{ ::​addfour04.jpg?​800 | add4 Kontext Menu Properties}}
 +
 +Danach erscheint ein Fenster mit der Darstellung der booleschen Funktion in der Lookuptabelle. ​
 +
 +{{ ::​addfour05.jpg?​800 | add4 Lookuptable Schematic}}
 +
 +Dort kann dann die Darstellung als Wahrheitstabelle "Truth Table" gewählt werden. ​
 +
 +{{ ::​addfour06.jpg?​800 | add4 Lookuptable Truth Table}}
 +
 +  - Welche Logikelemente sind im "​Normal Mode", welche sind im "​Arithmetic Mode"? ​
 +  - Vergleichen Sie die Schaltung mit dem "​Ripple-Carry-Addierer"​ in [[http://​dx.doi.org/​10.1524/​9783486707953.167|Kapitel 10.8.2 im "​Lehrbuch Digitaltechnik"​ von Reichardt]]. ​
 +  - 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 "​add"​. ​
 +
 +{{ ::​addfour07.jpg?​800 | add4 Chip Planner}}
 +
 +  * Aktivieren Sie mit "View -> Layers Settings"​ die Auswahl für die Darstellung
 +  * Aktivieren Sie Logic Details -> Ports
 +
 +{{ ::​addfour08.jpg?​800 | add4 LE Ports}}
 +
 +  * Finden Sie die Verbindungungen zwischen "​cin"​ und "​cout"​ zwischen den Logikelementen vom Addierer.
 +
 +==== Entwurf der Abstimmungsschaltung ====
 +
 +Sie haben bislang folgende Schaltungen in Ihrem Baukasten ​
 +
 +  * "​add4":​ Ein 4 Bit Addierer ​
 +  * "​bin2seg":​ Eine Schaltung zur Anzeige einer 4 Bit Binärzahl an einer Siebensegmentanzeige
 +  * "​cntones":​ 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 [[https://​gitlab.elektrotechnik.hs-augsburg.de/​beckmanf/​digitaltechnikpraktikum/​blob/​master/​src/​t_de1_majority.vhd|t_de1_majority.vhd]] und eine angefangene Datei [[https://​gitlab.elektrotechnik.hs-augsburg.de/​beckmanf/​digitaltechnikpraktikum/​blob/​master/​src/​de1_majority_rtl.vhd|de1_majority.vhd]] für das Design. Das Simulationsverzeichnis [[https://​gitlab.elektrotechnik.hs-augsburg.de/​beckmanf/​digitaltechnikpraktikum/​tree/​master/​sim/​de1_majority|sim/​de1_majority]] und das Syntheseverzeichnis [[https://​gitlab.elektrotechnik.hs-augsburg.de/​beckmanf/​digitaltechnikpraktikum/​tree/​master/​pnr/​de1_majority|pnr/​de1_majority]] 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:
 +
 +<code vhdl>
 +  cntones_i0 : cntones
 +  port map (
 +    switches_i(1 downto 0) => SW(5 downto 4),
 +    switches_i(3 downto 2) => "​00",​
 +    cnt_o      => cnt);
 +</​code>​
 +
 +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: 
 +
 +<code vhdl>
 +  cntones_i0 : cntones
 +  port map (
 +    switches_i(2 downto 0) => SW(2 downto 0),
 +    switches_i(3) ​         => '​0',​
 +    cnt_o                  => cnt);
 +</​code>​
 +
 +  - 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 "​undefined"​ 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 "​GPIO_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 [[https://​gitlab.elektrotechnik.hs-augsburg.de/​beckmanf/​digitaltechnikpraktikum/​blob/​master/​pnr/​de1_majority/​de1_majority_pins.tcl|Pindefinitionsfile]] 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 [[https://​www.hs-augsburg.de/​~beckmanf/​restricted/​DE1_V.1.0.1_CDROM/​DE1_user_manual/​DE1_UserManual_v1.2.1.pdf|Altera DE1 Usermanual]] sollte dabei herauskommen: ​
 +
 +<​code>​
 +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
 +</​code> ​
 +
 +  * Messen Sie die Verzögerungszeit durch das FPGA!
 +
 +
 + 
  • dtpr_versuch_5.1292203209.txt.gz
  • Last modified: 2010/12/13 02:20
  • by beckmanf