Forum: FPGA, VHDL & Co. attribute in VHDL


von René D. (Firma: www.dossmatik.de) (dose)


Lesenswert?

Wie heißt die Zuweisung richtig?
Ich will bestimmte Bits einer Variablen einer anderen Variablen zuweisen 
und die nicht benutzten Bits mit dem Bitwert des höchsten Bit füllen.

Für die nicht zugewissen Bits kann man mit "other=>    "zuweisen.
Ich habe mehere Schreibweisen ausprobiert.

Die Fehlermeldungen sind immer von dem Typ.
The type of the element in aggregate does not correspond to any array 
type.

type vec is record
cos:  signed (9 downto 0);
sin:  signed (9 downto 0);
end record;

variable value,tmp: vec;



  tmp.cos:=  (7 downto 0) =>(value.sin(9 downto 2), 
others=>value.sin'high);

auch verschiedene Klammerungen schlugen fehl.
 tmp.cos:=  (value.sin(9 downto 3),others=>value.(sin'high));

von Jan M. (mueschel)


Lesenswert?

Du musst auch noch angeben, wohin sin(9 downto 2) geschrieben werden 
soll.
Ungetestet, ich habe an dieser Stelle noch nie ranges verwendet, immer 
nur einzelne Bits:
tmp.cos:=  ((7 downto 0) => value.sin(9 downto 2),others => 
value.sin'high);

von René D. (Firma: www.dossmatik.de) (dose)


Lesenswert?

tmp.cos:=  ((7 downto 0)=>value.sin(9 downto 
2),others=>(value.sin'high));

ergibt Fehlermeldung:
Line 57. parse error, unexpected CLOSEPAR, expecting PIPE or ROW

Die Klammern stimmen und ich weiss nicht, was er mit Pipe oder ROW 
meinen könnte.

von René D. (Firma: www.dossmatik.de) (dose)


Lesenswert?

das geht

  tmp.cos :=(value.cos(1),others=>'0');

das geht nicht mehr

tmp.cos :=(value.cos(1 downto 0),others=>'0');


Das hätte ich aber erwartet, das es richtig formeliert ist. Gibt es 
Unterschiede in der VHDL Version für diesen Ausdruck?

von otto (Gast)


Lesenswert?

Einzelne Bits kann man einem Bereich zuweisen.
Das geht:
  tmp.cos :=(1 downto 0=>'1',others=>'0');

Das geht nicht auch verständlich, weil er keinen Arraytyp erwartet.
tmp.cos :=(1 downto 0=>value.sin(1 downto 0),others=>'0');

Doch wie schreibt man so etwas?

von user (Gast)


Lesenswert?

Schreib es doch in 2 Zeilen:

tmp.cos:= (others=>value.sin(sin'high));
tmp.cos(9 downto 3) := value.sin(9 downto 3);

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.