Forum: FPGA, VHDL & Co. for mit Matrix


von Gabriel (Gast)


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:
1
   subtype long   is std_logic_vector (31 downto 0);
2
   subtype ulong  is std_logic_vector (15 downto 0);
3
   
4
   type matrix is array (0 to 3,0 to 3) of integer;
5
   
6
   
7
   type bitmat is record
8
      mat    : matrix;   
9
      rows   : ulong;
10
      cols   : ulong;
11
   end record bitmat;
12
   
13
   type CodeStruct is record 
14
      Mat    : bitmat;
15
      B      : std_logic;
16
   end record CodeStruct;

und der Code
1
elsif (clk'event and clk = '1') then
2
   s_maxpercol <= (others => '0');
3
   for i in 0 to conv_integer(Code.Mat.cols) loop
4
      for j in 0 to conv_integer(Code.MAt.rows) loop
5
         if (Code.Mat.mat(i,j) = 1) then 
6
            count <= count +1;
7
         end if;  
8
      end loop;
9
         if (count > s_maxpercol) then
10
             s_maxpercol <= count;
11
         end if;
12
   end loop; 
13
  
14
   s_maxperrow <= (others => '0');
15
   for i in 0 to conv_integer(Code.Mat.rows) loop
16
      for j in 0 to conv_integer(Code.MAt.cols) loop
17
         if (Code.Mat.mat(i,j) = 1) then 
18
            count <= count +1;
19
         end if;  
20
      end loop;
21
         if (count > s_maxperrow) then
22
             s_maxperrow <= count;
23
         end if;
24
   end loop;

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


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.

von Gabriel (Gast)


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.

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


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 
:-(

von Gabriel (Gast)


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).

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


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.

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.