Forum: FPGA, VHDL & Co. Zuweisung von Signalen unterschiedlichen Typs


von dito (Gast)


Lesenswert?

Hallo!

Ich habe da ein Problem mit der Zuweisung von Signalen unterschiedlichen 
Typs.

Etwas vereinfacht stellt sich mein Problem wie folgt dar:
1
type A_type is array (0 to 8) of signed(8 downto 0);
2
type B_type is array (0 to 7) of signed(8 downto 0);
3
4
signal A : A_type;
5
signal B : B_type;
6
7
--- ...
8
9
A(0 to 5) <= B(0 to 5);
10
11
-- Fehler: Target type A_type in signal assignment is different from expression type B_type.

Wenn ich die letzte Zeile explizit caste
1
A(0 to 5) <= A_type(B(0 to 5));

bekomme ich den Fehler:
Length of type "A_type" is 9; length of operand is 8.

Daher erscheint es mir so, dass Modelsim in der Anweisung
1
A(0 to 5) <= B(0 to 5);
nicht versteht, dass ich hier jeweils dieselbe Anzahl Signale zuweise.

Weiß jemand eine Lösung?

Gruß,
dito

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

1
A(0 to 5) <= A_type(B)(0 to 5);
Vieleicht geht sowas??
Ansonsten mußt du auf unsere VHDL SPezialisten warten ;)

von dito (Gast)


Lesenswert?

Funktioniert leider auch nicht.

Die Fehlermeldung ist
Prefix of slice name cannot be type conversion.

von dito (Gast)


Lesenswert?

Die Signal einzeln miteinader zu verknüpfen funktioniert:
1
A(0) <= B(0);
2
A(1) <= B(1);
3
...

Aber das möchte ich nicht, da die obere Grenze parametrisierbar sein 
soll.

In einer for-Schleife könnte man das machen:
1
for i in 0 to X loop
2
  A(i) <= B(i);
3
end loop;

Das dürfte aber nicht synthesierbar sein, oder?

von D. I. (Gast)


Lesenswert?

Doch ist es wenn du mit Generics arbeitest

von dito (Gast)


Lesenswert?

Du meinst, wenn X ein Generic ist, funktioniert es?

Funcktioniert es auch, wenn X eine Konstante ist?

von D. I. (Gast)


Lesenswert?

ja, es muss einfach wenn das device instantiiert wird feststehen wie 
groß es ist dann ist es auch synthetisierbar

von dito (Gast)


Lesenswert?

Aber mit der Begründung müsste es doch so wie es oben steht (0 to 5) 
"erst recht" funktionieren.

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

1
type A_type is array (0 to 8) of signed range (8 downto 0);
Vielleicht liegt es an dem fehlenden range?

von berndl (Gast)


Lesenswert?

naja,

schau dir dein Eingangsposting nochmal genau an und versuche zu 
ergruenden, ob das wirklich eindeutig ist. Du hast zwei 2-dimensionale 
Arrays und gibst nur eine Dimension an. Also ich bin froh, wenn die 
Compiler bei sowas meckern oder aussteigen, dann formulier' ich's lieber 
zu Fuss...

von dito (Gast)


Lesenswert?

@  Niklas Gürtler:
Geht leider auch nicht:
Range constraints cannot be applied to array types.

@ berndl:
Aber ich gebe doch beide Dimensionen an oder verstehe ich da was falsch?

von Klaus Falser (Gast)


Lesenswert?

Du kannst nicht unterschiedliche Typen zueinander zuweisen, A und B sind 
von verschiedenen Typen.
Du mußt ein Array definieren aus gleichen Typen, z.B.

type ttt is signed(8 downto 0);
type A_type is array (natural range <>) of ttt;

signal A : A_type(8 to 0);
signal B : A_type(7 to 0);

A(5 to 0) <= B(5 to 0);

Oder so ähnlich. Dann werden Elemente vom gleichen Typ ttt zueinander 
zugewiesen.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

dito schrieb:
> Funcktioniert es auch, wenn X eine Konstante ist?
Es funktioniert nur dann, wenn X zum Synthesezeitpunkt konstant ist.
Sei es durch eine Konstante oder ein Generic.
1
  process (b) begin
2
    for i in 0 to 4 loop
3
      A(i) <= B(i);
4
    end loop;
5
  end process;

Oder machs doch gleich so (wie von Klaus Falser schon vorgeschlagen):
1
type C_type is array (natural range <>) of signed(8 downto 0);
2
3
signal A : C_type(0 to 8);
4
signal B : C_type(0 to 7);
5
:
6
  A(0 to 5) <= B(0 to 5);

Allerdings dürfte bei seiner Lösung das
1
  A(5 to 0) <= B(5 to 0);
ins Auge gehen  ;-)

von Klaus F. (kfalser)


Lesenswert?

Ich habe ja auch geschrieben : "Oder so ähnlich" ...

von hotline (Gast)


Lesenswert?

A(0 to 5)(8 downto 0) <= B(0 to 5)(8 downto 0);

?

von dito (Gast)


Lesenswert?

Ich habe es jetzt so gemacht wie Klaus das beschrieben hat. Die 
Änderungen waren zwar recht aufwendig, aber dafür ist das Design jetzt 
sauber.

Danke & Gruß,
dito

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

hotline schrieb:
> ?
Nein, so gehts nicht.

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.