Forum: FPGA, VHDL & Co. zugriff auf ein std_logic_vector element in einem Array


von Andi Z. (duderino65)


Lesenswert?

hallo,

ich habe folgendes problem:

in einem array aus std_logic_vector elementen möchte ich auf ein 
einzelnes bit des vektors zugreifen.
also undgefähr so:

foobar <= array(x) -> std_logic_vector(y)
also so ähnlich wie in c :-) mit '.' oder '->'

sollte den vector dann natürlich auch in ein std_logic wandeln, das is 
mir klar. weiss nur nicht wie ich darauf zugreifen kann.

mfg


Andi

von Schrotty (Gast)


Lesenswert?

1
type table is ARRAY (natural range <>) OF std_logic_vector (3 downto 0);
2
constant table1: table := ("1111","1010","0011");
3
4
...
5
6
bitwert <= table1(1)(2);

Sollte aus dem ersten Tabelleneintrag das zweite Bit zurückliefern

von Andi Z. (duderino65)


Lesenswert?

danke!!!

hat funktioniert!!

buf_cnt_i ist unsigned()

sdto <= std_logic(txd_buf_2(0)(to_integer(buf_cnt_i)));

mfg

Andi

von Ralf (Gast)


Lesenswert?

Schrotty schrieb:
> type table is ARRAY (natural range <>) OF std_logic_vector (3 downto 0);
> constant table1: table := ("1111","1010","0011");

Wenn man nun diese Werte aus table addieren möchte, also (1111) + (1010) 
+ (0011), wie geht man da am besten vor (am besten auch synthetisierbar 
sein)?

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


Lesenswert?

Ralf schrieb:
> wie geht man da am besten vor
Man sagt mehr zum eigentlichen Problem...
Woher kommen die Daten?
Wie groß ist das Array?
Wie schnell muss das Ganze gehen?
Usw. usf...

von Ralf (Gast)


Lesenswert?

Das Ganze dient erst einmal zur Übung, bzw. zum  Verständnis mit dem 
Umgang von arithmetischen Operationen.

Nun möchte ich  Werte einlesen, welche indiziert werden, um später eine 
Positionsbestimmung zu realisieren. Ich habe mir dabei jetzt folgendes 
gedacht: Ich definiere ein Array aus std_logic_vectoren:
1
type table is Array (6 downto 0) of std_logic_vector (7 downto 0);
 und definiere nun Werte
1
constant vec_value: table := ("00000000","00000001","00000010","00000010","00000010","00000110","00010010");

Um nun die Summe aller enthaltenen Vektorewerte zu bestimmen, würde ich 
eine For-Schleife definieren, welche so oft iteriert, so viele Elemente 
auch vorhanden sind.
1
signal array_length : std_logic_vector(vec_value'length downto 0); 
2
signal tmp : integer := 0 ;
1
for i in 0 to array_length-1 loop  
2
    tmp <= tmp + conv_integer(vec_value(i));
3
  end loop;    
4
    SUM <= conv_std_logic_vector(tmp);

Bei der Forschleife bekomme ich nun folgende Fehlermeldung:
"Syntax error near "in"". Ob danach noch weitere Fehler kommen, konnte 
ich leider noch nicht feststellen.

Das Ganze sieh jetzt wie folgt aus(Hier ist jetzt noch kein Übertrag 
implementiert. ):
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use ieee.std_logic_arith.all;  
4
use ieee.std_logic_unsigned.all;
5
6
7
entity COG is
8
port (
9
  --  A, B : in std_logic_vector(7 downto 0);
10
  --  CI : in std_logic;
11
    SUM : out std_logic_vector(7 downto 0);
12
  --  CO : out std_logic);
13
end COG;
14
15
architecture Behavioral of COG is
16
17
18
constant vec_value: table := ("00000000","00000001","00000010","00000010","00000010","00000110","00010010");
19
20
signal tmp : integer := 0 ;
21
signal array_length : std_logic_vector(vec_value'length downto 0); 
22
23
for i in 0 to array_length-1 loop    
24
    tmp <= tmp + conv_integer(vec_value(i));
25
end loop;    
26
SUM <= conv_std_logic_vector(tmp);
27
28
end Behavioral;


Wäre um jeden Rat dankbar,


grüße,

Ralf

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


Lesenswert?

Eine for-Schleife muss in einem Prozess stehen....

Mein Tipp: du solltest erst mal ein VHDL Buch anschauen.
Z.B. VHDL Synthese von Reichardt&Schwarz.

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.