Ich habe die Methode für die Sprache c gefunden . Aber ich weiß nicht, wie ich dies in VHDL ausführen soll. Lassen Sie eine Festkommazahl (12 bis -19) wie 3456.478396 Ich muss diese Zahl vollständig in separate Zahlen 3456.478396 aufteilen --> 3, 4, 5, 6, (Punkt) , 4, 7, 8, 3, 9, 6. .. in 11 Integer-Variablen. Wie führt man das in VHDL durch?
signal example : sfixed(4 downto -4);
--'example' contains 9.75 then it is storage as "01001.1100".
--simply example ="10011100".
--10011100 --> integer 156
Wie bekomme ich die ursprüngliche 9,75 -Nummer von 156 zurück , um sie in einzelne Ziffern zu trennen?
ICH BENUTZTE,
library ieee;
library ieee_proposed;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use ieee_proposed.float_pkg.ALL;
use ieee_proposed.fixed_pkg.ALL;
use ieee_proposed.fixed_float_types.ALL;
Hier ist etwas Pseudocode.
Nehmen wir zuerst die links von der Dezimalstelle, die maximale Zahl ist => 2 Dezimalstellen.
signal ex : sfixed(4 downto -4);
temp <= ex(4 downto 0);
L_0 <= temp mod 10;
temp <= temp/10;
L_1 <= temp mod 10;
Beispiel:
ex=
=
temp <= 12
L_0 <= 12 mod 10 = 2
temp <= 12/10 = 1
L_1 <= 1 mod 10 = 1
Und dann die rechts, kleinste Zahl => 0,0625 => 4 Dezimalstellen. Gleiche Methode wie zuvor, nur mit multiplizieren bevor du anfängst. Weil in binär übersetzt zu in dezimal. So sollte die Bitbreite von temp sein 14 Bit weil Ist was dein höchster Wert ist.
signal ex : sfixed(4 downto -4);
temp <= ex(0 downto -4);
temp <= temp*625
R_3 <= temp mod 10;
temp <= temp/10;
R_2 <= temp mod 10;
temp <= temp/10;
R_1 <= temp mod 10;
temp <= temp/10;
R_0 <= temp mod 10;
Beispiel:
ex=
=
temp <= 3 = 0011
temp <= 3*625 = 11101010011 = 1875
R_3 <= 1875 mod 10 = 5
temp <= 1875/10 = 187
R_2 <= 187 mod 10 = 7
temp <= 187/10 = 18
R_1 <= 18 mod 10 = 8
temp <= 18/10 = 1
R_0 <= 1 mod 10 = 1
Und es sollte so angezeigt werden:
Alle konstanten Divisionen durch 10 können durch eine Multiplikation mit ersetzt werden . Es ist also nicht zu ineffizient zu implementieren. Ich bin mir ziemlich sicher, dass der Modulo-Operator in der Standardbibliothek enthalten ist.
Wenn Sie 6 Bits für die rechte Seite des Dezimalpunkts verwenden. Dann sollte die Bitbreite für temp sein = 20 Bit . Dies ist wahrscheinlich nicht der effizienteste Weg, es ist ein Weg, den ich mir gerade selbst ausgedacht habe. Es sollte ohne größere Probleme funktionieren.
Da dies auf einem FPGA erfolgt, können Sie die Multiplikation parallelisieren, für R3, R2, R1 und R0 ihre Temperatur mit 1 multiplizieren, , Und So erhalten Sie die Werte sofort statt seriell. Und dann benutze den Mod 10 auf ihnen.
Mishyoshi gab mir eine Idee, wie dies auf andere Weise gelöst werden könnte. Und werden wie zuvor gelöst, aber die kann auf andere, effizientere Weise erfolgen.
signal ex : sfixed(4 downto -4);
signal temp : sfixed(4 downto -4);
//We need 4 to the left of the decimal point because then we can capture
//all the single digits
temp <= "0000" & ex(0 downto -4);
temp <= temp*10;
R_0 <= temp(3 downto 0); //Copy the 4 MSB bits
temp <= "0000" & temp(-1 downto -4); //Delete the 4 MSB bits
temp <= temp*10;
R_1 <= temp(3 downto 0);
temp <= "0000" & temp(-1 downto -4);
temp <= temp*10;
R_2 <= temp(3 downto 0);
temp <= "0000" & temp(-1 downto -4);
temp <= temp*10;
R_3 <= temp(3 downto 0);
Beispiel:
ex=
=
signal temp : sfixed(4 downto -4);
temp <= "0000" & "0011" = 0000.0011 = 3
temp <= 3*10 = 30 = 0001.1110
R_0 <= "0001.1110"(3 downto 0) = 0001 = 1
temp <= "0000" & temp(-1 downto -4) = 0000.1110
temp <= 14*10 = 140 = 1000.1100
R_1 <= "1000.1100"(3 downto 0) = 1000 = 8
temp <= "0000" & "1100" = 0000.1100
temp <= 12*10 = 120 = 0111.1000
R_2 <= "0111.1000"(3 downto 0) = 0111 = 7
temp <= "0000" & "1000" = 0000.1000
temp <= 8*10 = 80 = 0101.0000
R_3 <= "0101.0000"(3 downto 0) = 0101 = 5
Wie Sie sehen können, dreht sich alles darum, die Bits an die "Einer"-Stelle zu bringen, die 4 Bits links vom Dezimalkomma.
Dafür werden viel weniger Bits benötigt. In dieser anderen Lösung können Sie sie, wie Mishyoshi sagte, in eine Pipeline stecken.
Eugen Sch.
Neil_DE
Oppo
Mischyoshi
Harry Swensson
Oppo
Harry Swensson