www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Umwandlung und Erstellung von Q7 bzw. Q0.7 in VHDL


Autor: Torben Gliem (diablo27432)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

bin noch relativ neu in VHDL und habe das oben beschriebene Problem was 
ich für die Uni lösen muss.

Folgende Aufgabe:
Ein 8bit Zähler soll über einen Wertebereich von -1 bis 1 Zählen und den 
entsprechenden Wert im Q-Format mit Fixpoint ausgeben, mit dem ich dann 
Berechnungen durchführe.

Folgende Vorgaben gibs vom Prof:
- 8bit Zähler
- Bereich -1 bis 1
- Q7-Format ( keine Vorkomma und 7 Nachkomma stellen) heißt evtl. auch 
Q0.7
- Nutzung von signed std_logic_vector

Die Berechnungen habe ich einigermaßen, aber ich habe noch nie mit dem 
Q-Format gearbeitet !
Wie kann ich die Position des Punktes bestimmen ? Bzw. ist die 
Umwandlung einfach oder muss ich extra Files erstellen, die die 
Umwandlung übernehmen ?

Angeblich soll alles ein Selbstgänger sein, stehe aber völlig auf dem 
Schlauch.

Schonmal danke im Voraus!

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> - Bereich -1 bis 1
Das geht nicht.
Eine 8-Bit-Zahl kann 256 verschiedene Werte annehmen.
Das können nur die Binärwerte 00000000 bis 11111111 sein.
Unsigned sind das z.B. ganz einfach 0...255.

Jetzt gibt es die Möglichkeit, zu sagen,
00000001 (= 00000000 plus 1) sei 1
00000000 sei 0
11111111 (= 00000000 minus 1) sei -1
11111110 (= 00000000 minus 2) sei -2
Dadurch sind zwar weiterhin nur 256 Werte darstellbar, aber der Bereich 
hat sich nach -128...+127 verschoben. Das wären jetzt Signed-Zahlen.

Und wenn ich jetzt einfach sage, ich denke mir diese Zahlen 
-128...+127 einfach um die Wertigkeit 128 geteilt (= 7 Bits verschoben), 
dann gibt die gleiche Binärdarstellung andere Werte:
00000001 = 0 + 1/128 = 1/128
00000000 = 0
11111111 (= 00000000 minus 1) = 0 - 1/128

Damit können mit diesem Denkschema (die Binärzahl ist ja genau die 
gleiche, nur die Interpretation ist anders) Zahlen im Bereich
von -128/128 ... +127/128   =  -1 ... +0,9921875 dargestellt werden. Nur 
zur Vereinfachung wird hier ein Bereich von -1...+1 angegeben.

> Wert im Q-Format mit Fixpoint
Du solltest erst mal mehr zu diesem Zahlenformat herausfinden...
Aber ich könnte mir vorstellen, dass ich nicht allzu weit weg bin ;-)

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Problem ist einfach ...

Du brauchst einfach einen simplen Zähler und interpretierst das 
Bitmuster, wie du es haben möchtest.

Du hast 8bit ... und du kannst mit einem zähler alle bitmuster von 
00000000 bis 11111111 erzeugen

Nun interpretierst du es einfach als:
[vorzeichen],[7 bit nachkommastelle]

Die Ziffern hinter dem Komma werden vom Komma an mit 2^-1, 2^-2, 2^-3 
gewichtet, die Ziffern vor dem Komma mit 2^0, 2^1, 2^2, ...

Beispiel:
1 100,1101101

Der obige Wert hat 11 bit ...
gerechnet wird so:

usw ...

Eine 1,0 oder -1,0 lässt sich so aber nur durch eine Stelle vor dem 
Komma erreichen ... Dann hätte man aber schon -1,99 bis +1,99

Autor: Torben Gliem (diablo27432)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Ihr beiden für die schnellen Antworten !

@Lothar:
Das Prinzip mit den Zahlen habe ich, so denke ich, einigermaßen 
Verstanden.
Wo es bei mir scheitert ist folgendes:
In der VHDL 2003 (glaube ich) kann man z.B. "sfixed" definieren und 
durch die Definition sagen wieviel Stellen vor und nach dem Komma sind.
Da wir das jedoch nicht benutzen sollen weiß ich nicht genau wie ich das 
jetzt auf einen std_logic_vector anwenden  übertragen  interpretieren 
soll. (Stehe mit VHDL noch ziemlich auf Kriegsfuss)

@Gast
Wie bereits oben gesagt ist mir das Prinzip einigermaßen klar.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Da wir das jedoch nicht benutzen sollen weiß ich nicht genau wie ich das
> jetzt auf einen std_logic_vector anwenden  übertragen  interpretieren
> soll.

ÖÖööh ... du hast einen 8Bit-Zähler und der Zählerstand ist in einem 
std_logic_vector ... zB
signal ctr : std_logic_vector(7 downto 0);

ctr(7) ist dann das vorzeichen und ctr(6 downto 0) dann die 
nachkommastellen.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> ctr(7) ist dann das vorzeichen und ctr(6 downto 0) dann die
> nachkommastellen.
Das ist viel zu kurz gedacht.
Denn binär 00000001 ist dezimal 1.
Mit dem Vorzeichen wäre nach dieser Beschreibung 10000001 = -1,
weil ja das vorderste Bit gesetzt ist.

Richtig müsste die Interpretation heißen:
führende Einsen zeigen eine negative Zahl an.

>> wie ich das jetzt auf einen std_logic_vector anwenden  übertragen
>> interpretieren soll.
Wie gesagt: nimm einen "normalen" 8-Bit-Vektor und teile dir den Wert in 
Gedanken durch 128.

>>> Nutzung von signed std_logic_vector
Es gibt keinen signed std_logic_vector.
Es gibt alte Synopsis-Libs, die sagen, ob eine Vektorrechnung als Signed 
oder Unsigned ausgeführt werden soll:
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;

Und es gibt die genormte
use ieee.numeric_std.all;
in der explizite Umrechnungen für diese Thematik definiert sind.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Das ist viel zu kurz gedacht.
> Denn binär 00000001 ist dezimal 1.
> Mit dem Vorzeichen wäre nach dieser Beschreibung 10000001 = -1,
> weil ja das vorderste Bit gesetzt ist.

Wer würde denn sowas annehmen?

10000001 ist -1*2^{-7}, wie oben schon erklärt.

Man muss natürlich schon wissen, was man mit den Zahlen machen möchte 
...

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>>> ctr(7) ist dann das vorzeichen und ctr(6 downto 0) dann die
>>> nachkommastellen.
>> Das ist viel zu kurz gedacht.
> Wer würde denn sowas annehmen?
Es gab durchaus in der Vergangenheit vorzeichenbehaftete Zahlensysteme, 
in denen es eine positive und eine negative Null gab.
Für 8 Bit mit VZ und 7 Stellen wären das
z.B. 00000000 = +0
 und 10000000 = -0

> 10000001 ist -1*2^{-7}, wie oben schon erklärt.
Falsch.
-1*2^{-7} wären 10000000. Binäre 10000001 sind bereits -2*2^{-7}  :-o
Der negative Bereich geht eine Ziffer weiter als der positive.
Und wie gesagt: das gilt nur für die Zweierkomplementdarstellung.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, das Zweierkomplement ist mir klar. Das war aber nicht vom OP 
spezifiziert und mathematisch einfacher und nachvollziehbarer ist es 
wohl, es einfach zu ignorieren :-)

Es gab in der Vergangenheit solche Zahlensysteme? Schau dir mal 
IEEE754 an und frag dich mal, wo es verwendet wird ...

Grüße,
Gast

Autor: Torben Gliem (diablo27432)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

nochmal Danke für die Erklärungen, so langsam dämmerts mir, das es ja 
darauf ankommt: Was Ich daraus mache bzw. interpretiere.

Jetzt muss ich nur noch meine Berechnungen darauf anpassen... bzw. 
festlegen was ich überhaupt will und wie genau es sein muss.

Gruß

Torben

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>> Es gab durchaus in der Vergangenheit vorzeichenbehaftete Zahlensysteme,
>> in denen es eine positive und eine negative Null gab.
> Schau dir mal IEEE754 an ...
Ja, ok. Ich meinte Festkommaformate ;-)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.