This is an old revision of the document!
Echo mit externen SRAM
Im Digitaltechnik Repository gibt es das de1_audio Projekt. In dem Design wird der Wolfson Audio Codec WM8731 verwendet um die Audiodaten vom Mikrofon kontinuierlich im On-Chip RAM auf dem FPGA zu speichern und dann zeitversetzt wieder auszugeben. Das ergibt einen Echoeffekt.
Unterlagen
- Terasic DE1 FPGA Board Unterlagen (siehe Datenblatt Wolfson Codec und IS61WV25616EDBLL RAM)
Beschreibung On-Chip Echo
Der WM8731 Wolfson Audio Codec hat eine I2C Konfigurationsschnittstelle und eine serielle Audiodatenschnittstelle. Auf dem FPGA wird im Modul audio.vhd die Konfiguration über I2C durchgeführt und die seriellen Audiodaten werden seriell/parallel gewandelt und stehen dann als 16 Bit Datenworte zur Verfügung. Die Audiodaten werden im Modul ringbuf.vhd zwischengespeichert und mit Verzögerung wieder ausgelesen. Die beiden Module sind auf dem de1_audio.vhd toplevel zusammengeschaltet.
- Starten Sie die die Simulation des de1_audio Moduls. Zeigen Sie im Simulator, dass das adc_valid anzeigt wenn ein neues Audiosample vom Audio Codec ankommt. Zeigen Sie, dass die Audiosamples mit einer Datenrate von ungefähr 48 kSamples/s ankommen.
- Erläutern Sie die Funktion des Moduls ringbuf.
- Starten Sie die Synthese und zeigen Sie, dass die Audiosamples im FPGA On-Chip RAM gespeichert werden. Wie groß ist der verfügbare FPGA On-Chip Speicher und wieviel von diesem Speicher wird für das Design verwendet?
- Berechnen Sie die Echozeit, die mit diesem Design erreicht wird.
- Laden Sie das Design auf das FPGA und überprüfen Sie die Funktion mit dem Headset.
Aufgabe
Auf dem Terasic DE1 FPGA Board befindet sich ein IS61WV25616 statisches SRAM. Dieses SRAM soll eingesetzt werden um die Echozeit zu verlängern. Dazu sollen die Audiosamples nicht mehr im On-Chip RAM sondern im externen RAM zwischengespeichert werden.
- Ermitteln Sie die Speichergröße des externen SRAM und berechnen Sie die mögliche Echozeit.
Für den Zugriff auf das SRAM müssen die Steuersignale des SRAM in einer geeigneten Weise angesteuert werden. Der Zugriff muss so erfolgen, dass alle Timingparameter des SRAMs sicher berücksichtigt werden. Dies soll mit einem Zustandsautomaten erfolgen.
Tri-State
Das externe SRAM ist ein asynchrones SRAM mit einem bidirektionalen 16 Bit Datenbus. Bei einem Schreibzugriff werden die Datenleitung vom FPGA getrieben und bei einem Lesezugriff werden die Datenleitungen vom SRAM getrieben. Dazu muss auf dem FPGA ein Tri-State Treiber eingesetzt werden.
signal io : std_logic_vector(15 downto 0) signal wdata,rdata : std_ulogic_vector(15 downto 0); signal trien : std_ulogic; ... io <= wdata when trien = '1' else (others => 'Z'); rdata <= io;
Im Codebeispiel wird ein Tri-State Treiber für das bidirektionale Signal “io” eingesetzt. Beachten Sie, dass der Typ std_logic_vector ist, weil dieses Signal mehrere Treiber hat. Im folgenden Beispielcode wird an der entity von de1_audio der Port SRAM_DQ mit der Portrichtung “inout” beschrieben. Damit ist dies ein bidirektionaler Port.
entity de1_audio is port ( CLOCK_50: in std_ulogic; KEY0: in std_ulogic; SRAM_DQ : inout std_logic_vector(15 downto 0); I2C_SCLK: out std_ulogic; ...
In der Gesamtschaltung ist dann ein Tri-State Treiber auf dem FPGA und ein Tri-State Treiber auf dem SRAM. Die beiden Treiber können auf die gleiche Leitung treiben. Wenn beide Tri-State Treiber gleichzeitig treiben, dann entsteht ein Kurzschluss wenn eine Seite einen Highpegel und die andere Seite eine Lowpegel treibt. Deshalb muss verhindert werden, dass beide Seiten gleichzeitig treiben.
Gleichzeitig dürfen auch nicht beide Seiten für einen langen Zeitraum nicht treiben, da dann die Leitung hochohmig ist. Durch parasitäte Widerstände kann es auf der Leitung zu Spannungswerten kommen bei denen die Eingangstreiber an der Tri-State Leitung in einen ungünstigen Betriebszustand kommen weil dann sowohl der PMOS als auch der NMOS Transistor teilweise leiten. Deshalb muss man folgendes sicherstellen:
- Niemals beide Treiber gleichzeitig treiben lassen (Kurzschluss)
- Beide Treiber dürfen nur kurzzeitig für weniger als 100 ns gleichzeitig nicht treiben
SRAM Zugriff
Das SRAM hat die Steuersignale “CEN, OEN, WEN, UBN, LBN”. Finden Sie anhand des Datenblatts des SRAMs heraus wie man einen Lese- und einen Schreibzugriff auf das RAM machen kann. Berücksichtigen Sie dabei die Timingparameter des RAM. Im Datenblatt des SRAM sind beispielsweise in der Tabelle “READ CYCLE SWITCHING CHARACTERISTICS” auf Seite 6 verschiedene Werte für “-8, -10, -20” angegeben. Dabei handelt es sich um verschiedenen Speedgrades des RAM, d.h. man kann den Speicher in verschiedenen Geschwindigkeitsklassen kaufen. Dabei ist “-8” das schnellste und “-20” das langsamste RAM. Nehmen Sie für Ihre Überlegungen an, dass Sie das langsamste RAM vom Typ “-20” einsetzen. Auf dem Board befindet sich ein RAM vom Typ “-10”.
Nehmen Sie an, dass alle Daten- und Steuerleitungen des SRAM vom FPGA aus mit Registern angesteuert werden, die mit dem 50 MHz Clock arbeiten. Die Steuerleitungen werden vom FPGA aus mit einem noch zu konstruierenden Steuerautomaten angesteuert. Deshalb können Sie die Leitungen im Raster der Taktperiodendauer von 20ns verändern.
- Wählen Sie einen geeigneten Betriebszustand wenn weder ein Schreib- noch ein Lesezugriff auf das RAM erfolgen soll. Welchen Wert haben dann die Steuerleitungen?
- Welche Steuerleitungen können Sie permanent auf einen konstanten Wert setzen? Auf welchen Wert?
Wenn Sie den Wert eines Steuersignals verändern, dann muss diese Änderung vom Register aus ggf. noch durch eine Ausgangslogik und durch einen Pin des FPGA. Nehmen Sie für jedes Signal, das in das FPGA oder aus dem FPGA geht eine Verzögerung von 4-6ns bezüglich des Taktsignals an.
Bei einem Lesezugriff müssen die Daten vom SRAM in ein Register auf dem FPGA übernommen werden. Dieses Register muss mit einem Enablesignal zu einem geeigneten Zeitpunkt enabled werden wenn die gültigen Lesedaten am D-Eingang des Registers anliegen. Das Enablesignal für das Register soll auch aus dem noch zu konstruierenden Steuerautomaten kommen.
- Zeichnen Sie ein Timingdiagramm für einen Lesezugriff. Im Timingdiagramm soll der Systemtakt, die Steuerleitungen für das SRAM, das Enablesignal für den Tri-State Treiber auf dem FPGA, das Enablesignal für das Leseregister und die Adress- und Datenleitungen zu sehen sein.
- Zeichnen Sie ein Timingdiagramm für einen Schreibzugriff