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
Phil T. schrieb: > Ich kann den Vector ja nicht negieren und danach eins dazu > addieren. Warum nicht?
1 | nachher <= not vorher; |
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.