moin!
ich habe einen relativ langen Vektor (u_tmp) der unterschiedlich weit
benutzt wird. Dessen Wert möchte ich entwicklungsbegleitend auf einer
8bit Schnittestelle ausgeben. Dafüt gibt es einen 8 bit Vektor
oslv_byte.
1 | signal u_tmp : unsigned(24 downto 0);
|
2 | oslv_byte : out STD_LOGIC_VECTOR (7 downto 0);
|
Die Länge von u_tmp habe ich in einer Konstanten i_width.
Jetzt kann ich ja die oberen 8bits ab der msb-Stelle einfach auf den 8
bit Vektor ausschneiden. Also so zuweisen:
1 | oslv_byte <= std_logic_vector(u_tmp( (i_width-1) downto (i_width-8)))
|
Mein Problem ist aber der Wertebereich. u_tmp ist das Ergebnis eines
sinc3 Filters und geht z.B. von 0..512. Also ist am oberen Ende nur das
MSB besetzt. Schneide ich nur die höchsten 8 bits aus, dann habe reicht
der 8bit Wertebereich halt nur von 0..128.
257 Werte in ein Byte.
Habe das dann so gemacht:
1 | oslv_byte <= std_logic_vector(u_tmp( (i_width-2) downto (i_width-9))) when u_tmp(i_width-1) = '0' else (others=>'1');
|
Dadurch ist oben natürlich das ganze nichtlinear, was sich ja auch nicht
vermeiden lässt es wird ja irgendwie auch der Wertebereich gestaucht.
Meine Frage:
wie würdet ihr das Problem lösen? Obere 8 bit abschneiden und halben
Wertebereich in der 8bit-Welt in Kauf nehmen? Oder gibt es eine runde
Lösung
herzlichen Dank!