mikrocontroller.net

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


Autor: dito (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

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

Etwas vereinfacht stellt sich mein Problem wie folgt dar:
type A_type is array (0 to 8) of signed(8 downto 0);
type B_type is array (0 to 7) of signed(8 downto 0);

signal A : A_type;
signal B : B_type;

--- ...

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

-- Fehler: Target type A_type in signal assignment is different from expression type B_type.

Wenn ich die letzte Zeile explizit caste
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
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

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

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

Autor: dito (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Funktioniert leider auch nicht.

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

Autor: dito (Gast)
Datum:

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

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

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

Das dürfte aber nicht synthesierbar sein, oder?

Autor: D. I. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Doch ist es wenn du mit Generics arbeitest

Autor: dito (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du meinst, wenn X ein Generic ist, funktioniert es?

Funcktioniert es auch, wenn X eine Konstante ist?

Autor: D. I. (Gast)
Datum:

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

Autor: dito (Gast)
Datum:

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

Autor: Niklas Gürtler (erlkoenig)
Datum:

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

Autor: berndl (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: dito (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Klaus Falser (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.
  process (b) begin
    for i in 0 to 4 loop
      A(i) <= B(i);
    end loop;
  end process;

Oder machs doch gleich so (wie von Klaus Falser schon vorgeschlagen):
type C_type is array (natural range <>) of signed(8 downto 0);

signal A : C_type(0 to 8);
signal B : C_type(0 to 7);
:
  A(0 to 5) <= B(0 to 5);

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

Autor: Klaus Falser (kfalser)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe ja auch geschrieben : "Oder so ähnlich" ...

Autor: hotline (Gast)
Datum:

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

?

Autor: dito (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hotline schrieb:
> ?
Nein, so gehts nicht.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.