mikrocontroller.net

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


Autor: Andi Z. (duderino65)
Datum:

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

Autor: Schrotty (Gast)
Datum:

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

...

bitwert <= table1(1)(2);

Sollte aus dem ersten Tabelleneintrag das zweite Bit zurückliefern

Autor: Andi Z. (duderino65)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke!!!

hat funktioniert!!

buf_cnt_i ist unsigned()

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

mfg

Andi

Autor: Ralf (Gast)
Datum:

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

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

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

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
type table is Array (6 downto 0) of std_logic_vector (7 downto 0);
 und definiere nun Werte
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.
signal array_length : std_logic_vector(vec_value'length downto 0); 
signal tmp : integer := 0 ;
for i in 0 to array_length-1 loop  
    tmp <= tmp + conv_integer(vec_value(i));
  end loop;    
    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. ):
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.std_logic_arith.all;  
use ieee.std_logic_unsigned.all;


entity COG is
port (
  --  A, B : in std_logic_vector(7 downto 0);
  --  CI : in std_logic;
    SUM : out std_logic_vector(7 downto 0);
  --  CO : out std_logic);
end COG;

architecture Behavioral of COG is


constant vec_value: table := ("00000000","00000001","00000010","00000010","00000010","00000110","00010010");

signal tmp : integer := 0 ;
signal array_length : std_logic_vector(vec_value'length downto 0); 

for i in 0 to array_length-1 loop    
    tmp <= tmp + conv_integer(vec_value(i));
end loop;    
SUM <= conv_std_logic_vector(tmp);

end Behavioral;




Wäre um jeden Rat dankbar,


grüße,

Ralf

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

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

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.