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


von Torben G. (diablo27432)


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!

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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 ;-)

von Gast (Gast)


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

von Torben G. (diablo27432)


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.

von Gast (Gast)


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
1
signal ctr : std_logic_vector(7 downto 0);

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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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.

von Gast (Gast)


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 
...

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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.

von Gast (Gast)


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

von Torben G. (diablo27432)


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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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 ;-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.