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