[[dtpr_versuch_5]]

This is an old revision of the document!


Dieser Versuch behandelt das Thema sequentielle Schaltungen und die Ansteuerung von externen Bausteinen. 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: Datenblatt des Soundbausteins

Der Baustein wird über eine I2C Schnittstelle konfiguriert. Der VHDL Code für die I2C Schnittstelle und die Konfiguration ist bereits fertig.

Der Baustein ist mit folgenden Parametern konfiguriert:

  • 12.288 MHz Systemtakt
  • 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 Konfiguration. Der Baustein ist als slave konfiguriert, d.h. die Signale ADCLRC, DACLRC und BCLK werden vom FPGA erzeugt. Auch der Code für die Erzeugung dieser Signale ist bereits fertig. In 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 ist. Dieses 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 steht. Aus diesem Takt wird ein 12 MHz Takt für den Soundbaustein abgeleitet. Der Soundbaustein wird also statt mit 12.288 MHz mit 12 MHz betrieben.

Für die Funktion des Systems fehlen noch die:

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.

DAC Schnittstelle

Die DAC Schnittstelle liest 16 Bit Daten parallel, wenn das Signal “load_i” aktiv ist. “load_i” ist auf dem Toplevel mit framesync verbunden. 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.

Ringbuffer

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

Aufgaben

  1. Simulieren Sie den vorhandenen Code und schauen Sie sich das Timing von ADCLRC, DACLRC, BCLK und dem Enablesignal “bclk_falling_edge_en” an.
  2. Zeichnen Sie ein Timingdiagramm aus der die Funktion der ADC Schnittstelle ersichtlich ist. Zu welchen Zeitpunkten laden Sie jeweils Daten in das Schieberegister und wann wird das valid aktiv?
  3. Entwerfen Sie einen Zustandsautomaten für die ADC Schnittstelle
  4. 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?
  5. Skizzieren Sie die Funktion des Ringbuffers mit Schreib- und Lesezeiger
  6. Schreiben Sie den VHDL Code für ADC Schnittstelle, DAC Schnittstelle und Ringbuffer und simulieren Sie die Funktion
  7. Laden Sie den Code auf das FPGA und prüfen Sie die Funktion
  • dtpr_versuch_5.1292203209.txt.gz
  • Last modified: 2010/12/13 02:20
  • by beckmanf