Präsentation herunterladen
Die Präsentation wird geladen. Bitte warten
Veröffentlicht von:Katrina Karrer Geändert vor über 10 Jahren
1
Vortrag: Praktikum Technische Informatik Sommersemester 2007
Gruppe 2 Thema: Multiplikations- und Divisionseinheit in VHDL Von Jonas Zaddach, Johannes Kohl und Marco Volbracht
2
Vorstellung der Teilnehmer Vorstellung der Aufgabe
Inhalt Vorstellung der Teilnehmer Vorstellung der Aufgabe Erläuterung Multiplizierer Grobe Übersicht Erläuterung der einzelnen Zustände Feine Übersicht Eckdaten
3
Erläuterung Dividierer
Inhalt (2) Erläuterung Dividierer Grobe Übersicht Erläuterung ausgewählter Zustände Feine Übersicht Eckdaten Zeiteinteilung Organisation Probleme
4
Vorstellung der Teilnehmer
Marco Antonio Volbracht (Projektleiter) Jonas Zaddach (Vortrag) Johannes Michael Kohl (Dokumentation)
5
Vorstellung der Aufgabe
Es ist eine Multiplikations- und Divisionseinheit zu implementieren, welche Binärzahlen in einer vorgegebenen Zahlendarstellung miteinander verrechnen. Die Schaltung wird in VHDL realisiert und mit Hilfe des Programms Altera Quartus II entworfen und getestet.
6
Grobe Funktionsweise des Multiplizierers
7
Reset Warte darauf, dass ena = Reset auf High gesetzt wird
Setze alle Flags und internen Signale zurück
8
Einlesen Berechung des Vorzeichens
Prüfen, ob eine der Eingabezahlen Null ist Setzen des Zero-Flags und Wechsel in Endzustand Speichern der Eingabewerte in internen Signalen (als positive Zahlen) -- Hoechstwertiges Bit des -- ersten Einganges (Vorzeichen) in1_msb: IN std_logic; -- Vorkommastellen des ersten -- Einganges bis auf MSB in1_vk: IN std_logic_vector(14 downto 0); -- Nachkommastellen des ersten Einganges in1_nk: IN std_logic_vector(7 downto 0);
9
Multiplizieren In1 In2 Ergebnis * = 1 1 1 1 , , ,
1 1 1 1 , , , Ergebnis ist doppelt so lang wie Eingabe Bit zur Überlauferkennung
10
Multiplizieren In1 In2 Ergebnis * = 1 1 1 1 1 1 , , ,
1 1 1 1 1 1 , , , Wenn niedrigstes Bit von In2 gesetzt ist, addiere In1 zu Ergebnis (von links)
11
Multiplizieren In1 In2 Ergebnis * = 1 1 1 1 1 , , ,
1 1 1 1 1 , , , Shift Logical Right Shift Logical Right Verschiebe In2 nach rechts Verschiebe Ergebnis nach rechts
12
Multiplizieren In1 In2 Ergebnis * = 1 1 1 1 1 , , ,
1 1 1 1 1 , , , Fange wieder von vorne an (führe Addition hier 4 mal, bei VHDL-Einheit insgesamt 23 Mal aus) Keine Addition wenn In2(0) = 0
13
Multiplizieren In1 In2 Ergebnis * = 1 1 1 1 1 , , ,
1 1 1 1 1 , , , Shift Logical Right Shift Logical Right
14
Multiplizieren In1 In2 Ergebnis * = 1 1 1 1 1 1 1 , , ,
15
Multiplizieren In1 In2 Ergebnis * = 1 1 1 1 1 1 , , ,
1 1 1 1 1 1 , , , Shift Logical Right Shift Logical Right
16
Multiplizieren In1 In2 Ergebnis * = 1 1 1 1 1 1 , , ,
17
Multiplizieren In1 In2 Ergebnis * = 1 1 1 1 1 1 , , ,
1 1 1 1 1 1 , , , Shift Logical Right Shift Logical Right
18
Multiplizieren In1 In2 Ergebnis * = 1 1 1 1 1 1 , , ,
1 1 1 1 1 1 , , , Effektive Ausgabe
19
Ausgabe anpassen Falls Ergebnis negativ ist, Bildung des Zweierkomplements
20
Ausgabe Anlegen des internen Ergebnissignals an äußere Pins
Anlegen der Flagsignale (Overflow) Setzen des Ready-Flags
21
Eckdaten Multiplizieren
Rechendauer Genau 23 Takte für die eigentliche Multiplikation 2 Takte für Wechsel Reset-Zustand Einlesen und Multiplizieren Ausgabe 3 Takte für Einlesen, Ausgabe anpassen und Ausgabe Es werden genau 28 Takte benötigt (außer wenn In = 0 oder In2 = 0) (≈ 280 ns bei Taktdauer von 10 ns) Es können Zahlen zwischen –32‘767, = -( ) und 32‘767, = ein- und ausgegeben werden
22
Eckdaten Multiplizieren (2)
Flags zero: Zeigt an, dass das Ergebnis echt Null ist (weil eine der Eingabezahlen Null war) ovr: Ergebnis hat nicht in Ausgabevektor gepasst, es ist ein Überlauf aufgetreten rdy: Wird gesetzt, wenn Chip Rechnung beendet hat
23
Divisionsbaustein
24
Divisionsbaustein
25
Nenner anpassen Sicherungskopie des ursprünglichen Nenners anlegen
Nenner wird so lange nach links geschoben, bis es keine führenden Nullen mehr gibt In2 1 1 ,
26
Nenner anpassen Nenner wird so lange nach links geschoben, bis es keine führenden Nullen mehr gibt In2 1 1 , Auf 1 testen
27
Nenner anpassen Nenner wird so lange nach links geschoben, bis es keine führenden Nullen mehr gibt In2 1 1 , Shift Logical Left
28
Nenner anpassen Nenner wird so lange nach links geschoben, bis es keine führenden Nullen mehr gibt In2 1 1 , Test auf 1 erfolgreich, fertig
29
Dividieren In1 ist ein Bit länger, um festzustellen ob Subtraktion Überlauf verursacht hat In1 In2 Ergebnis 1 1 1 / 1 1 = , , , - 1 1 , In1 und In2 sind haben doppelt so viele Nachkommastellen, damit das Ergebnis bis in die letzte Stelle genau ist Bei der Subtraktion wird eine 0 an In2 angehängt, um gleiche Breite wie In1 zu haben
30
Dividieren In1 In2 Ergebnis 1 1 1 / 1 1 = 1 , , , - 1 1 ,
1 1 1 / 1 1 = 1 , , , - 1 1 , Ergebnisbit setzen 1 , Übertragsbit ist 0 Subtraktion erfolgreich
31
Dividieren In1 In2 Ergebnis 1 / 1 1 = 1 , , , - 1 1 ,
1 / 1 1 = 1 , , , - 1 1 , Vergleichen von untersten Bits von In2 mit Original-Eingabevektor In2 Ungleich weiter machen 1 1
32
Dividieren In1 In2 Ergebnis 1 / 1 1 = 1 , , , - 1 1 ,
1 / 1 1 = 1 , , , - 1 1 , Ergebnis links schieben In2 rechts schieben
33
Dividieren In1 In2 Ergebnis 1 / 1 1 = 1 , , , - 1 1 ,
1 / 1 1 = 1 , , , - 1 1 , Ergebnisbit löschen 1 1 1 1 1 , Übertragsbit ist 1 Subtraktion nicht erfolgreich In1 in ursprünglichem Zustand belassen
34
Dividieren In1 In2 Ergebnis 1 / 1 1 = 1 , , , 1 1 ,
1 / 1 1 = 1 , , , - 1 1 , Vergleichen von untersten Bits von In2 mit Original-Eingabevektor In2 Ungleich Weiter machen 1 1
35
Dividieren In1 In2 Ergebnis 1 / 1 1 = 1 , , , - 1 1 ,
1 / 1 1 = 1 , , , - 1 1 , Ergebnis links schieben In2 rechts schieben
36
Dividieren In1 In2 Ergebnis 1 / 1 1 = 1 1 , , , - 1 1 ,
1 / 1 1 = 1 1 , , , - 1 1 , Ergebnisbit setzen 1 1 , Übertragsbit ist 0 Subtraktion erfolgreich
37
Dividieren In1 In2 Ergebnis 1 / 1 1 = 1 1 , , , 1 1 ,
1 / 1 1 = 1 1 , , , - 1 1 , Vergleichen von untersten Bits von In2 mit Original-Eingabevektor In2 Gleich Fertig 1 1
38
Eckdaten Dividieren Rechendauer
Max. 23 Takte um den Nenner nach links zu schieben Max. 3 * ( ) Takte für die Subtraktionen und Vergleiche 4 Takte für Einlesen externer Signale und Ausgabe interner Signale Es werden für die Division maximal 121 Takte benötigt (≈ 1,21 µs bei Taktdauer von 10 ns) Es können Zahlen zwischen –32‘767, = -( ) und 32‘767, = ein- und ausgegeben werden
39
Eckdaten Dividieren (2)
Flags zero: Zeigt an, dass das Ergebnis echt Null ist (weil Zähler Null war) dze: Fehlerflag für Null im Nenner ovr: Ergebnis hat nicht in Ausgabevektor gepasst, es ist ein Überlauf aufgetreten (kann vorkommen, da mit Brüchen gerechnet wird) rdy: Wird gesetzt, wenn Chip Rechnung beendet hat
40
Zeiteinteilung 15 Treffen Grobanalyse Feinanalyse Pflichtenheft
Spezifikation Implementierung Multiplikationseinheit Implementierung Divisionseinheit Testdokumentation Vortrag Ausarbeitung
41
Organisation mittels eigener Webseite
Titel und Datum Kurze Erläuterung Weitere Informationen Versionsverwaltung mittels CVS
42
Probleme Zahlendarstellung Zero-Flag
43
Fragen? ? ? ? ?
Ähnliche Präsentationen
© 2024 SlidePlayer.org Inc.
All rights reserved.