mikrocontroller.net

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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Mampf F. (mampf) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Morgen,

ich hab einen 3D-Vector:
subtype cell is std_logic_vector(1 downto 0);
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;

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?
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;

Könnte "alias" sowas?

Viele Grüße,
Mampf

: Bearbeitet durch User
Autor: Lothar M. (lkmiller) (Moderator) Benutzerseite
Datum:

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

Autor: Vancouver (Gast)
Datum:

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

Autor: Mampf F. (mampf) Benutzerseite
Datum:

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

Autor: Markus F. (mfro)
Datum:

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

Autor: Mampf F. (mampf) Benutzerseite
Datum:

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

Autor: Lothar M. (lkmiller) (Moderator) Benutzerseite
Datum:

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

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.

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