Forum: FPGA, VHDL & Co. signed std_logic_vector nach bcd


von Peee. T. (da-phil)


Lesenswert?

Hallo,

ich suche nun schon seit einer Weile hier im Forum und bei Google, habe 
aber irgendwie eine Denkblockade oder finde keinen richtigen Denkanstoß. 
Ich möchte (oder muss fürs Studium) einen DS18B20 mit einem FPGA 
auslesen. Der Temperaturwert soll dann auf Sieben-Segment-Anzeigen 
ausgegeben werden. Vom Temperatursensor bekomme ich einen 16 Bit-Wert, 
wobei Bit15-11 lediglich das Vorzeichen anzeigen. Es ist also effektiv 
ein 12 Bit-Wert. Der widerrum ist unterteilt in Bit10-Bit4 für den 
ganzzahlige Werte und Bit3 bis Bit0 für die Nachkommastellen (je nach 
eingestellter Auflösung)

Ist das Vorzeichen-Bit nicht gesetzt, kann ich für die ganzen Zahlen ein 
Binär zu BCD-Wandlung entsprechend Lothar Millers Beispiel machen:

http://www.lothar-miller.de/s9y/archives/34-Vektor-nach-BCD.html

Die Nachkommastellen lese ich aufgrund der möglichen hohen Werte (>9k) 
aus einer LUT aus.

Mein scheinbar lapidares Problem besteht nun darin, wie ich das 
Zweierkomplement vor der BCD-Wandlung mache, wenn das Vorzeichen gesetzt 
ist. Ich kann den Vector ja nicht negieren und danach eins dazu 
addieren. Hat jemand einen Denkanstoß oder weiß meinen Fehler?

Grüße

von Andreas D. (Gast)


Lesenswert?

Phil T. schrieb:
> Ich kann den Vector ja nicht negieren und danach eins dazu
> addieren.
Warum nicht?
1
nachher <= not vorher;

von Peee. T. (da-phil)


Lesenswert?

Genau das habe ich vorher probiert, aber ich glaube meinen Fehler 
gefunden zu haben. Deshalb danke für diesen Denkanstoß... :D

Ich hatte mein Signal, in welches der ganzzahlige Temperaturwert 
reingeschrieben werden sollte, als Integer definiert. Dadurch 
funktionierte natürlich die Wandlung nicht. Zu dem Zeitpunkt dachte ich 
aber, dass ein grundlegender Denkfehler bei der Benutzung der Datentypen 
vorliegt.

Ich versuche das ganze zur Kontrolle noch mal zusammenzufassen. Mein 
Eingang:
1
TEMP  :in std_logic_vector(15 downto 0);

Meine zwei Signale:
1
signal  temp_ganz :std_logic_vector(6 downto 0):=(others => '0');
2
signal  temp_gebrochen  :std_logic_vector(3 downto 0):=(others => '0');

Und das ist dann die Wandlung:
1
if temp(11) = '1' then
2
  temp_ganz<=  unsigned(not(temp(10 downto 4)))+1;
3
  temp_gebrochen<=unsigned(not(temp( 3 downto 0)))+1;
4
else
5
  temp_ganz<=temp(10 downto 4);            
6
  temp_gebrochen<=temp( 3 downto 0);
7
end if;

Ich habe es nun noch nicht simuliert, aber vielleicht kann mir ja schon 
vorher jemand sagen, ob es so i. O. ist oder vollkommener Stuss. :)

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.