Guten Morgen, ich hab einen 3D-Vector:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
gibt es eine andere Möglichkeit den in einen std_logic_vector zu casten, als es über einen eigenen Prozess zu machen?
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
Könnte "alias" sowas? Viele Grüße, Mampf
|
Anzeige
|
3D-Vector zu std_logic_vector castenGuten Morgen, ich hab einen 3D-Vector:
gibt es eine andere Möglichkeit den in einen std_logic_vector zu casten, als es über einen eigenen Prozess zu machen?
Könnte "alias" sowas? Viele Grüße, Mampf Mampf F. schrieb: > Könnte "alias" sowas? Nein, denn ein Alias ist ja nur ein andere Name mit dem selben Typ. Aber cuboid ist eben kein std_logic_vector, sondern ein komplett eigener Typ. > gibt es eine andere Möglichkeit den in einen std_logic_vector zu casten, > als es über einen eigenen Prozess zu machen? Schreib halt eine to_flat() Funktion, die das macht. Dann steht da z.B. nur noch flat <= to_flat(state); > type row is array(8 downto 0) of cell; > type slice is array(2 downto 0) of row; > type cuboid is array(26 downto 0) of slice; Üblicherweise ordne ich Arrays aufsteigend an. Dann ist das 0te Element nicht "ganz hinten". Kann man aber natürlich auch "umgekehrt" machen.
Gast
#5696743
Nur als Anmerkung, vermutlich weißt du das auch selbst: Das Loop-Nest sieht zwar kompliziert aus, erzeugt aber keine Logik, sondern nur "Verdrahtung". Mit einer anderen Lösung machst Du also höchstens den Sourcecode schöner, aber das Design lässt sich nicht weiter optimieren. Vancouver schrieb: > Nur als Anmerkung, vermutlich weißt du das auch selbst: Das > Loop-Nest > sieht zwar kompliziert aus, erzeugt aber keine Logik, sondern nur > "Verdrahtung". Mit einer anderen Lösung machst Du also höchstens den > Sourcecode schöner, aber das Design lässt sich nicht weiter optimieren. Jau, das ist mir bekannt :) Als Funktion hatte ich das tatsächlich mal ausprobiert, das hat aus irgendeinem Grund, den ich vergessen habe, nicht funktioniert. Mampf F. schrieb: > process(state) > variable tmp : integer range 0 to 2047; > begin > for Z in 0 to 26 loop > for Y in 0 to 2 loop > for X in 0 to 8 loop > tmp := (Z*27+Y*9+X)*2; -- every cell has 2 bits > flat(tmp+1 downto tmp) <= state(Z)(Y)(X); > end loop; > end loop; > end loop; > end process; was man m.E. allerdings - unabhängig ob als Funktion oder als Prozeß - besser machen könnte, ist die fixe Festlegung der Laufvariablen und Arraylängen. VHDL Vektoren/Arrays "wissen", wie groß sie sind. Anstatt z.B. "0 to 26" und "27" würde ich "cuboid'range" und "cuboid'length" schreiben, dann paßt das auch dann noch "ganz von alleine", wenn Du an den Arrays etwas änderst. Außerdem weiß der Leser sofort, was gemeint ist. Markus F. schrieb: > Mampf F. schrieb: >> process(state) >> variable tmp : integer range 0 to 2047; >> begin >> for Z in 0 to 26 loop >> for Y in 0 to 2 loop >> for X in 0 to 8 loop >> tmp := (Z*27+Y*9+X)*2; -- every cell has 2 bits >> flat(tmp+1 downto tmp) <= state(Z)(Y)(X); >> end loop; >> end loop; >> end loop; >> end process; > > was man m.E. allerdings - unabhängig ob als Funktion oder als Prozeß - > besser machen könnte, ist die fixe Festlegung der Laufvariablen und > Arraylängen. > > VHDL Vektoren/Arrays "wissen", wie groß sie sind. > > Anstatt z.B. "0 to 26" und "27" würde ich "cuboid'range" und > "cuboid'length" schreiben, dann paßt das auch dann noch "ganz von > alleine", wenn Du an den Arrays etwas änderst. Außerdem weiß der Leser > sofort, was gemeint ist. Ui, man lernt nie aus ... 'length kannte ich, 'range nicht. Danke für den Tipp! Mampf F. schrieb: > 'length kannte ich, 'range nicht. Einfach mal in die "mitgelieferten" Bibliotheken numeric_std&Co gucken. Die leben davon... ? Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|