Serien-Parallel-Wandler in VHDL - public.fh
Transcrição
Serien-Parallel-Wandler in VHDL - public.fh
Ostfalia Hochschule für angewandte Wissenschaften Fakultät Elektrotechnik Labor Design Digitaler Systeme Prof. Dr.-Ing. Rainer Bermbach Entwicklung eines Seriell-Parallel-Wandlers in VHDL zur Druckeransteuerung Das Labor DDS (vormals DT II) beschäftigt sich mit der Programmierung von FPGAs mit Hilfe der Hardwarebeschreibungssprache VHDL. Um Ihnen das Vorgehen bei der Programmierung mit VHDL näher zu bringen, sollen Sie die folgende Aufgabe lösen. Damit alle Studenten das Endergebnis erreichen können, werden verschiedene Komponenten bereitgestellt, die in das Design einzubinden sind. Engagiertere Gruppen können später die Funktionalität dieser Komponenten selbst beschreiben. Bis dahin ist diese Funktionalität in einer Library “versteckt“ (d.h. als Objektcode ohne Source). Aufgabenstellung Es ist eine Druckeransteuerung zu programmieren. Ein auf dem PC laufendes Terminalprogramm sendet dabei Daten über die serielle Schnittstelle an einen Serien-Parallel-Wandler (SPW). Das Empfangen der Daten kann dabei schneller sein als das Senden der parallelisierten Daten an den Drucker. Um zu verhindern, dass Daten verloren gehen, ist ein FIFO als Ausgangspuffer vorgesehen. Dieses speichert die empfangenen Daten zwischen. Damit bei einem gefüllten FIFO nicht trotzdem Daten verloren gehen, setzt dieses rechtzeitig ein Signal (FULL_N, siehe „Zum FIFO“), bevor es voll ist. Daraufhin muss dem Sender – dem Terminalprogramm auf dem PC – angezeigt werden, dass das Senden pausieren muss. Dies geschieht, indem ein XOFF an den Sender geschickt wird. Wenn das FIFO leer ist, muss die Hardware ihre Empfangsbereitschaft wieder durch Senden eines XONs anzeigen. Das gesamte Design ist erst mit ActiveVHDL zu erstellen und zu simulieren. Später wird es synthetisiert, implementiert und in das FPGA geladen und dort in einer realen Umgebung getestet. Aufgaben-Übersicht 1. Erstellen einer Komponente zum Seriell-Parallel-Wandeln der Daten der seriellen Schnitt2. 3. 4. 5. 6. stelle. Simulieren dieser Komponente mit verschiedenen Abweichungen des Sendetaktes (max. ±10%, s. DeltaBaud in der Testbench). Einbinden einer Einheit zum Überprüfen der Parität. Falsche Paritäten sind in einem 8-BitZähler zu zählen. Es kann ein Eingang genutzt werden, um die Parität, z.B. mit Hilfe eines Schiebeschalters, zu wechseln, alternativ wird mit der falschen Parität gesendet. (Dadurch werden dann alle empfangenen Daten als “falsch“ gezählt.) Übergabe der parallelen Daten an das (bereitgestellte) FIFO. Ausgabe der Daten aus dem FIFO an den Drucker (Busy, Strobe_not und ParData). Erstellen einer Komponente zum Senden von XOFF / XON an das Terminalprogramm auf dem PC. Wenn Sie noch Zeit haben: Ersetzen des bereitgestellten FIFOs durch ein eigenes. Zum Bearbeiten dieser Aufgaben wird ihnen eine Testbench bereitgestellt, welche die benötigten Signale zum Simulieren bereitstellt. Diese sind RxD (also die seriellen Daten), das Busy-Signal, der Systemreset und der Takt. Die Testbench befindet sich in einer Library und muss als top level in Aldec eingestellt werden. In der Library sind zusätzlich noch das FIFO und die XONXOFF -Komponente. Den Rahmencode des SPWs erhalten Sie als Datei SPW.vhd, in der die bereitgestellten Komponenten schon deklariert sind; diese müssen allerdings noch instanziert werden. 1 Ostfalia Hochschule für angewandte Wissenschaften Fakultät Elektrotechnik Labor Design Digitaler Systeme Prof. Dr.-Ing. Rainer Bermbach Der prinzipielle Aufbau des gesamten Designs sieht für das Simulieren wie folgt aus: Testbench-spw SPW Ihre Einheiten und Prozesse XONXOFF FIFO2 Zeichnen Sie bitte vor dem Programmieren ein Blockschaltbild mit Ihren Prozessen (jeder Prozess = ein Block), damit Ihnen die Funktionsweise des jeweiligen Schaltungsteils klar wird. (Wer gleich “wild drauflos“ programmiert, muss sich nicht wundern, wenn seine Schaltung nicht funktioniert.) Einstiegsaufgabe Als erstes muß der interne Takt CLK, der alle Prozesse treiben soll, aus dem 50-MHz-Clock (clockin) des Spartan 3 Boards erzeugt werden. Dazu kann der aus dem DT I Laborversuch „FPGA“ bekannte VHDL-Teiler etwas modifiziert und in das VHDL-Projekt integriert werden. Alle Prozesse sollen folgenden Grundaufbau haben, wobei SystemReset ein externes ResetSignal darstellt: prozessname: process(SystemReset,...,CLK) begin if SystemReset= ‘1‘ then „signal“ <= ‘0‘ ; -- initial/reset value elsif rising_edge(CLK) then „signal“ <= ‘1‘ ; -- actual value ... end if; end process; In manchen Fällen wird ein weiteres Signal für den asynchronen Reset benötigt. Es muss in die Sensitivity List eingetragen werden und kann z.B. mit SystemReset verknüpft werden: if SystemReset= ‘1‘ or Reset= ‘1‘ then ... Wichtig: Signalen immer nur in einem Prozess Werte zuweisen, nicht in mehreren. 2 Ostfalia Hochschule für angewandte Wissenschaften Fakultät Elektrotechnik Labor Design Digitaler Systeme Prof. Dr.-Ing. Rainer Bermbach Funktionale Simulation Simulieren Sie das Design funktional in Active-VHDL mit der Testbench. Drucken Sie Ihr Simulationsergebnis quer auf einem DIN-A4-Blatt aus. (Beachten/nutzen Sie das Deltabaud-Signal.) Zu den Aufgabenpunkten 1 und 2 Entwickeln Sie ein VHDL-Design in Verhaltensbeschreibung, das seriell mit 57600 Baud ankommende Daten in parallele ASCII-Zeichen umwandelt. Serielles Format: 8E1 (8 Datenbits, gerade Parität, ein Stoppbit), Bitbreite ______? ms, TTL-Pegel, nicht-invertierte Logik mit Startbit = LOW ! D0 D1 Startbit D2 D3 D4 D5 D6 D7 Datenbits P Stopp -bit Paritätsbit Als Herzstück des Wandlers dient ein 10-Bit-Schieberegister, in das das Startbit, die acht Datenbits des ASCII-Zeichens und das Parity-Bit nacheinander geschoben werden. Ferner benötigt man ein Datenregister mit einer Breite von 9 Bit, welches die Daten und das Paritätsbit aus dem Schieberegister übernimmt. Erstellen Sie einen Process Startbitdetektor, der bei Auftreten eines Startbits das Signal Start_not (lowaktiv) auf 0 setzt. Das Startbit, die folgenden 8 Datenbits und das Parity-Bit werden ins Schieberegister geschoben. Ist das Startbit dort im MSB angekommen, kann man es zur Generierung eines Reset-Signals benutzen, das im Startbitdetektor gebraucht wird (Sensitivity List), um Start_not wieder auf 1 zu setzen (Startbitdetektor = D-FF). Die Datenübernahme in das Datenregister muss vor dem Reset geschehen. Damit die Übernahme der empfangenen Bits in der Mitte der Bitzelle besser eingestellt werden kann, soll das Design mit dem 4-fachen Takt (CLK, 230400 Hz) laufen. Erzeugen Sie alle vier CLKPerioden ein Signal Mitte, mit dem Sie den Shift Enable des Schieberegisters bedienen. Zum FIFO Das FIFO dient dazu, die empfangenen Daten zwischenzuspeichern. Dieses wird als bestehende Komponente bereitgestellt, kann aber später auch selbst erstellt werden. Die bereitgestellte FIFO-Komponente sieht dabei wie folgt aus: component FIFO2 is -- FIFO mit DPRAM integriert, generiert FULL, FULL minus N, EMPTY generic (ld_size: natural:= 4; width: natural:= 8; words_left: natural:= 4); port(D_IN: WR, CLKWR: RD, CLKRD: RES: D_OUT: FULL: FULL_N: EMPTY: ); end component FIFO2; in in in in out out out out std_logic_vector(width-1 downto 0); std_logic; std_logic; std_logic; std_logic_vector(width-1 downto 0); std_logic; std_logic; std_logic 3 Ostfalia Hochschule für angewandte Wissenschaften Fakultät Elektrotechnik Labor Design Digitaler Systeme Prof. Dr.-Ing. Rainer Bermbach Beschreibung der Signale des FIFOs: • • • • • • • • • • D_IN: WR, CLKWR: Eingangsvektor WriteEnable und Clock; bei WR = ‚1’ wird D_IN mit der steigenden Flanke in den Speicher übernommen RD;CLKRD: ReadEnable und Clock; arbeitet auf steigender Flanke RES: Reset High enable D_OUT: Datenausgang FULL: FIFO ist komplett gefüllt FULL_N: FIFO hat noch N plätze frei (siehe generic: words_left) EMPTY: kein Datum im Speicher => alle Speicherplätze sind frei ld_size: Zweierpotenz der Größe des Speichers (Speicherplätze) width: Datenbusbreite Zur Druckeransteuerung Bitte informieren Sie sich, wenn Sie so weit sind, über die Druckeransteuerung. Zur Funktionsweise bzw. zum Timing hängt ein Datenblatt im Labor. Sie können sich auch im Internet schlau machen, Wiki etc. Zur Flusssteuerung Das Senden eines XOFFs an das Terminalprogramm bewirkt, dass es mit dem Senden pausiert, bis es ein XON empfängt. Zu Beginn ist die bereitgestellte Komponente XONXOFF einzubinden. Diese sendet ein XOFF bei FULL_N und ein XON bei EMPTY. Wenn das System so weit arbeitet, entwickeln Sie eine Schaltung, welche die Signale des FIFOs auswertet und diese Steuerworte entsprechend sendet. Dieser Sender ist dabei wie ein umgekehrter Empfänger aufgebaut (ParallelSeriell-Wandler). Beachten Sie, dass das “Stoppen“ des Terminalprogramms per XOFF mit einer gewissen Verzögerung verbunden ist, so dass i.d.R. noch 1-3 Zeichen von ihm gesendet werden. Weitere Möglichkeiten Es ist möglich, die verschiedenen Schieberegler und Taster des Spartan 3 Boards zu nutzen. Wie beschrieben kann ein Schiebeschalter z.B. dazu dienen, die Parität umzuschalten. Des Weiteren ist es möglich, die 8 LEDs und die 7-Segment-Anzeige zu nutzen, um Zählerstände oder Ähnliches anzuzeigen. Den User Guide zum Board finden sie auf dem Info-Laufwerk L:\fbe\LDT\DT2: S3BOARD-rm.pdf Vorgehen Bitte arbeiten Sie alle Unterpunkte ab und simulieren Sie ihr Design. Wenn es fehlerfrei arbeitet, können Sie es mit Hilfe der Xilinx ISE in den FPGA laden. Dabei ist noch zu beachten, dass das UCF-File, in dem die Informationen über die Portbelegungen stehen, eingebunden wird. Das gesamte Vorgehen zum Downloaden des Design wird noch ausführlich im Labor erklärt. Abschlussbericht Ähnlich wie beim ASM-Abschlussprogramm. Details werden noch bekanntgegeben. 4