Forum: FPGA, VHDL & Co. 3D-Vector zu std_logic_vector casten


von Mampf F. (mampf) Benutzerseite


Lesenswert?

Guten Morgen,

ich hab einen 3D-Vector:
1
subtype cell is std_logic_vector(1 downto 0);
2
type row is array(8 downto 0) of cell;
3
type slice is array(2 downto 0) of row;
4
type cuboid is array(26 downto 0) of slice;
5
6
signal state : cuboid;

gibt es eine andere Möglichkeit den in einen std_logic_vector zu casten, 
als es über einen eigenen Prozess zu machen?
1
process(state)
2
variable tmp : integer range 0 to 2047;
3
begin
4
  for Z in 0 to 26 loop
5
    for Y in 0 to 2 loop
6
      for X in 0 to 8 loop
7
        tmp := (Z*27+Y*9+X)*2; -- every cell has 2 bits
8
        flat(tmp+1 downto tmp) <= state(Z)(Y)(X);
9
       end loop;
10
     end loop;
11
   end loop;  
12
 end process;

Könnte "alias" sowas?

Viele Grüße,
Mampf

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


Lesenswert?

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.

von Vancouver (Gast)


Lesenswert?

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.

von Mampf F. (mampf) Benutzerseite


Lesenswert?

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.

von Markus F. (mfro)


Lesenswert?

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.

von Mampf F. (mampf) Benutzerseite


Lesenswert?

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!

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


Lesenswert?

Mampf F. schrieb:
> 'length kannte ich, 'range nicht.
Einfach mal in die "mitgelieferten" Bibliotheken numeric_std&Co gucken. 
Die leben davon... ?

: Bearbeitet durch Moderator
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.