Forum: FPGA, VHDL & Co. NUMERIC_STD resize() Problem


von MacFly (Gast)


Lesenswert?

Ich habe 2 Typen
1
(...)
2
subtype t_data14 is signed(13 downto 0); 
3
subtype t_data18 is signed(17 downto 0); 
4
(...)
5
signal sig14 : t_data14;
6
signal sig18 : t_data18;

Da habe ich einen 14 bit Typ aus meinem adc und einen 18 bit Typ der in 
einen Multiplier geht. Ich kann z.B. ein Signal auf 18 bit vergrößern 
und dann an den Block verdrahten, wo intern mit 18 bit gerechnet wird 
und dann das Ergebnis auch wieder runter auf 14 bit skalieren mit 
resize.
1
sig18 <= resize(sig14,18);
2
(...)

Meine Frage ist wie sieht das mit einem Vector aus diesen Typen aus. Ich 
würde gerne 3 data skalieren, also so:
1
type t_arr14 is array ( natural range <> ) of signed(13 downto 0);
2
type t_arr18 is array ( natural range <> ) of signed(17 downto 0);
3
4
signal arr14 : t_arr14(0 to 2);
5
signal arr18 : t_arr18(0 to 2);
6
7
arr18 <= resize(arr14,18); --HIER GEHT ES DRUM

Wie kann ich das machen? So wird gesagt "no feasable entries for 
subprogram resize"

von too smart for AI (Gast)


Lesenswert?

MacFly schrieb:
> Wie kann ich das machen? So wird gesagt "no feasable entries for
> subprogram resize"

Naja die typen passen halt nicht, du musst elementeweise durch arr18 
durchgehen (wie bei sig18). Und dann kannste das per overleoad auf den 
alten Funktionsaufruf übertragen.

https://www.vhdl-online.de/courses/system_design/vhdl_language_and_syntax/subprogram_declaration_and_overloading

von MacFly (Gast)


Lesenswert?

Danke für den Link arbeite ich am Wochenende mal durch.

Also müsste ich eine function resize für machen für signed arrays und da 
darum in einer for Schleife über die Elemente gehen? Wenn die Längen 
stimmen gibts keinen Fehler. Das kann dann 'überladen' werden mit dem 
normalen resize()?

Richtig überblickt?

von MacFly (Gast)


Lesenswert?

Nachtrag:

ich glaube ich brauche da noch etwas Hilfe. Ich versuche mir gerade erst 
mal 'nur so' Testfunktionen zu machen, die signed Vektoren beliebiger 
Größe bekommen und das haut nicht hin.
1
  type t_bar is std_logic_vector(natural range <>); --ok
2
  type t_foo is signed(natural range <>); --geht nicht bei signed

Wenn ich einen signed Vektor nicht mit allgemeiner Größe schreiben kann, 
wie dann ein array dieser Vektoren...
Plan war jetzt eine Funktion zu machen so in etwa:
1
type t_general_arr :  array ( natural range <> ) of signed(natural range <>);
2
 
3
(...)
4
function test (data_in : t_general_arr; bitwidth : integer ) return  t_general_arr  is
5
variable local_data : t_general_arr (data_in'range);
6
begin
7
8
for offset in 0 to data_in'length - 1 loop
9
local_data(offset) := resize(data_in(offset))
10
end loop;
11
12
end test;
13
14
15
--so geht das natürlich alles nicht :-(

Ihr seht das das immer chaotischer wird, je konkreter ich versuche zu 
werden und ich glaube da brauche ich noch etwas Hilfe.
Ich merke jetzt erst, dass ich offenbar noch nicht richtig verstehe, wie 
ich mit Arrays von Vektoren und unbestimmten Größen umgehen muss.

von etwasvhdlamfreitag (Gast)


Lesenswert?

warum nicht einfach so:
1
label: for i in 0 to 2 generate
2
    arr18 (i) <= resize(arr14 (i), 18);
3
end generate;

von MacFly (Gast)


Lesenswert?

Das wird so übersetzt. Danke für den Vorschlag, da hatte ich zu Beginn 
herum probiert allerdings mit einer for loop().

Damit hast du auf jeden fall einen Plan B gezeigt :-)
Allerdings wo ich jetzt bei mir diese wirklich gravierenden 
Verständnisprobleme bemerkt habe, würde ich das originale Problem gerne 
dazu nutzen besser durch zu blicken. Vielleicht gelingt das ja.
schönes Wochenende ans Forum

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.