3D-Vector zu std_logic_vector casten

OP Persönliche Seite #5696666
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
Moderator (Firma: Titel) Persönliche Seite #5696687
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.
Gast #5696743
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.
OP Persönliche Seite #5696763
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.
#5696895
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.
OP Persönliche Seite #5698647
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!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren