www.mikrocontroller.net

Forum: FPGA, VHDL & Co. for mit Matrix


Autor: Gabriel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Liebe Kollegen!

Ich würde gerne bei einer Matrix die maximale Anzahl an Bits in den 
Reihen bzw. Spalten auszählen. Dazu habe ich einen Code geschrieben und 
bin mir bei den for Schleifen nicht ganz sicher. Bitte seid so lieb und 
werft einen Blick darüber. DANKE!!

Das Package:
   subtype long   is std_logic_vector (31 downto 0);
   subtype ulong  is std_logic_vector (15 downto 0);
   
   type matrix is array (0 to 3,0 to 3) of integer;
   
   
   type bitmat is record
      mat    : matrix;   
      rows   : ulong;
      cols   : ulong;
   end record bitmat;
   
   type CodeStruct is record 
      Mat    : bitmat;
      B      : std_logic;
   end record CodeStruct;

und der Code
elsif (clk'event and clk = '1') then
   s_maxpercol <= (others => '0');
   for i in 0 to conv_integer(Code.Mat.cols) loop
      for j in 0 to conv_integer(Code.MAt.rows) loop
         if (Code.Mat.mat(i,j) = 1) then 
            count <= count +1;
         end if;  
      end loop;
         if (count > s_maxpercol) then
             s_maxpercol <= count;
         end if;
   end loop; 
  
   s_maxperrow <= (others => '0');
   for i in 0 to conv_integer(Code.Mat.rows) loop
      for j in 0 to conv_integer(Code.MAt.cols) loop
         if (Code.Mat.mat(i,j) = 1) then 
            count <= count +1;
         end if;  
      end loop;
         if (count > s_maxperrow) then
             s_maxperrow <= count;
         end if;
   end loop;

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> einer Matrix die maximale Anzahl an Bits in den Reihen bzw. Spalten
> auszählen.
Und dann ein dreidimensinales Array:
>   type matrix is array (0 to 3,0 to 3) of integer;
Du willst also die gesetzten Bits in den Integern deiner Matrix 
auszählen?
Dann brauchst du auch drei verschachtelte Schleifen.
Ein zweidimensinales Array wäre das hier:
>   type matrix is array (0 to 3,0 to 3) of std_logic;

>   if (Code.Mat.mat(i,j) = 1) then
Damit frägst du einen Integer-Wert auf 1 ab, nicht ein Bit eines 
Integers. Du bist bei der Abfrage noch eine Ebene zu hoch   :-o

Willst du das synthetisieren? Falls ja:
Code.Mat.cols und Code.Mat.rows müssen dann konstant sein.

BTW:
Das was du da beschreibst, wird nur gehen, wenn du zum Zählen in der 
Loop eine Variable nimmst. Und deinen Zähler ab und an mal zurücksetzst.

Autor: Gabriel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Antwort!!

Ja, stimmt ich hab den Wert schon von integer auf std_logic geändert.
Der Wert von Code.Mat.xxx wird noch fixiert.

Eine Ebene zu hoch??? Kenn mich nicht aus.

Mein Problem ist, dass das ein Teil eines C Programms war (mit Pointern, 
Unterprogrammen, ...) und ich versuche einen VHDL Code daraus zu machen 
und dadurch ev. schneller zu sein.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Mein Problem ist, dass das ein Teil eines C Programms war
> und ich versuche einen VHDL Code daraus zu machen
> und dadurch ev. schneller zu sein.
Aufpassen: Du wist nicht schneller, weil du einen VHDL-Code daraus 
machst, sondern weil du das Ganze parallel in Hardware abbildest.

> Eine Ebene zu hoch??? Kenn mich nicht aus.
Du hattest eine Matrix aus z.B. 4 x 4 x 32 Bit definiert.
Brauchen tust du aber offenbar nur z.B. 4 x 4 x 1 Bit.

> Der Wert von Code.Mat.xxx wird noch fixiert.
Dann definier den als constant, denn sonst bekommst du keine Hardware 
:-(

Autor: Gabriel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alles klar, ich habe die Matrix schon auf 4x4x1 geändert.

Die Werte sollten eigentlich vom PC auf die Hardware übertragen werden. 
Ich habe ein RS232 VHDL Programm geschrieben, dass die Werte in das RAM 
schreibt und ggf. ausliest wenn sie gebraucht werden. Deshalb ist mir 
ein constant nicht sehr recht. Wenn es sich gar nicht vermeiden läßt 
müsste ich die HW jedes mal neu einstellen (für die ersten Versuche ist 
das aber OK).

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Deshalb ist mir ein constant nicht sehr recht.
Das was du hier beschrieben hast, braucht keinen Takt. Das ist reine 
Kombinatorik. Und die wird parallel direkt in Hardware abgebildet.

Wenn du dir erlauben kannst, ein paar Takte Zeit für die Auswertung zu 
nehmen, ist die ganze Geschichte problemlos auch dynamisch und 
umschaltbar zu realisieren. Dann könntest du dein Array in einem RAM 
ablegen, und das dann Zeilen- und Spaltenweise durchackern.

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.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

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