vhdl array / tabelle

OP #2621706
Lesenswert?

Hallo zusammen

Meine Aufgabe ist mit einem Altera Ausgänge auf Eingänge 
zurückzuschalten.
Meine Idee ist nun die Soll Ausgänge und die Soll Eingänge in einer 
array / tabelle abzuspeichern, in einer dritten spalte möchte ich noch 
erwähnen wenn der ausgang nicht auf den eingang geschaltet wird. Und 
diese tabelle wird in einer schleife immer wieder aufgerufen.

Kann ich meine Idee einfach mit VHDL realisieren? Und wie?
Moderator (Firma: Titel) Persönliche Seite #2621723
Lesenswert?

R. M. schrieb:
> in einer dritten spalte möchte ich noch
> erwähnen wenn der ausgang nicht auf den eingang geschaltet wird.
Gegenüber wem?

> Und diese tabelle wird in einer schleife immer wieder aufgerufen.
Schleife? Aufgerufen?
Hoppala, da hat aber noch jemand eine sehr softwarelastige Denkweise...

Zeichne doch einfach mal einen Schaltplan, wie du das mit ICs machen 
würdest. Und dann machst du eine VHDL-Beschreibung, bei der das selbe 
rauskommt. Denn für VHDL musst du in Hardware denken...

> mit einem Altera
Ach so, mit dem Altera. Zum Glück gibts nur einen...

> Ausgänge auf Eingänge zurückzuschalten.
Ich sehe einen (bzw. viele) Multiplexer vor mir. Was siehst du?
Moderator (Firma: Titel) Persönliche Seite #2622866
Lesenswert?

Vi schrieb:
> Aber beachte das nur eindimensionale (in Ausnahmefällen auch
> zweidimensionale) Arrays synthetisierbar sind (zumindest nicht ohne
> kleine Tricks).
Schon ein std_logic_vector ist ein eindimensionales Array...
Und ein Array von std_logic_vectoren (das kann jeder Synthesizer) ist 
ein zweidimensionales Array. Aber auch höhere Dimensionen gehen 
inzwischen problemlos: 
http://www.lothar-miller.de/s9y/categories/32-Arrays
Moderator (Firma: Titel) Persönliche Seite #2625826
Lesenswert?

Vi schrieb:
> Das nimmt dir aber in der Regel der Synthetisierer nicht.
Ich nehm dann mal XST und diesen Code:
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.NUMERIC_STD.ALL;
4

5
entity array_test is
6
    Port ( x : in  STD_LOGIC_VECTOR (1 downto 0);
7
           y : in  STD_LOGIC_VECTOR (1 downto 0);
8
           o : out  STD_LOGIC_VECTOR (7 downto 0));
9
end array_test;
10

11
architecture Behavioral of array_test is
12

13
type foobar is array (0 to 3, 0 to 3) of std_logic_vector(7 downto 0);
14
signal foo : foobar := ((x"11",x"12",x"13",x"14"),
15
                        (x"21",x"22",x"23",x"24"),
16
                        (x"31",x"32",x"33",x"34"),
17
                        (x"41",x"42",x"43",x"44"));
18
begin                 
19
  o <= foo(to_integer(unsigned(x)),to_integer(unsigned(y))); 
20
end Behavioral;
Ergebnis:
1
HDL Synthesis Report
2
Macro Statistics
3
# RAMs                                                 : 4
4
 4x8-bit single-port Read Only RAM                     : 4
Kurz: das RAM/ROM wird wie gewünscht realisiert...
Gast #2630290
Lesenswert?

Altera QuartusII mag die Datei auch:

Info: Implemented 16 device resources after synthesis - the final 
resource count might be different
    Info: Implemented 4 input pins
    Info: Implemented 8 output pins
    Info: Implemented 4 logic cells
Info: Quartus II Analysis & Synthesis was successful. 0 errors, 4 
warnings
Gast #2634393
Lesenswert?

@ Lothar Miller

Verstehe ich das richtig, das man in das o die Konstanden Zahlen aus dem 
Array ausliest?

Wie kann ich jetzt den den Array Wert eingeben? (dies müsste ich nach 
mir mit dem x und dem y machen.) Aber diesen Variablen kann ich ja nur 0 
oder 1 zuweisen oder nicht?
Moderator (Firma: Titel) Persönliche Seite #2634446
Lesenswert?

R.M. schrieb:
> Verstehe ich das richtig, das man in das o die Konstanden Zahlen aus dem
> Array ausliest?
Richtig, abgesehen davon, dass es konstan-t-e Werte sind...

> Wie kann ich jetzt den den Array Wert eingeben? (dies müsste ich nach
> mir mit dem x und dem y machen.)
Wie meinst du das? Du willst Werte nicht nur auslesen (=ROM), sondern 
auch welche reinschreiben (=RAM)?
Das geht so:
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.NUMERIC_STD.ALL;
4

5
entity array_test is
6
    Port ( x : in  STD_LOGIC_VECTOR (1 downto 0);
7
           y : in  STD_LOGIC_VECTOR (1 downto 0);
8
           o : out  STD_LOGIC_VECTOR (7 downto 0)
9
           a : in  STD_LOGIC_VECTOR (1 downto 0);
10
           b : in  STD_LOGIC_VECTOR (1 downto 0);
11
           i : in  STD_LOGIC_VECTOR (7 downto 0));
12
end array_test;
13

14
architecture Behavioral of array_test is
15

16
type ramtyp is array (0 to 3, 0 to 3) of std_logic_vector(7 downto 0);
17
signal ram : ramtyp := (others=>(other=>'0'));
18
begin                 
19
  o <= ram(to_integer(unsigned(x)),to_integer(unsigned(y))); 
20
  ram(to_integer(unsigned(a)),to_integer(unsigned(b))) <= i; 
21
end Behavioral;
Das ist ein Dual-Port-RAM. Für die praktische Umsetzung in einm FPGA 
wäre jetzt aber noch ein Takt angeraten, damit das Ganze auf einen 
RAM-Block abgebildet werden kann.

> Aber diesen Variablen kann ich ja nur 0 oder 1 zuweisen oder nicht?
Naja, am Ende werden das immer nur Nullen und Einsen sein.
Nur eben nicht nur eine einzelne. Mach 8 nebeneinander dann hast du ein 
Byte, mach 16 nebeneinander dann hast du ein Wort, mach 32 nebeneinander 
dann hast du ein Doppelwort...
Gast #2634740
Lesenswert?

1
type foobar is array (0 to 3, 0 to 3) of std_logic_vector(7 downto 0);
2
signal foo : foobar := ((x"11",x"12",x"13",x"14"),
3
                        (x"21",x"22",x"23",x"24"),
4
                        (x"31",x"32",x"33",x"34"),
5
                        (x"41",x"42",x"43",x"44"));

Wie kann ich jetzt z.B. genau die Zelle auslesen in welcher die hex Zahl 
23 steht?
Moderator (Firma: Titel) Persönliche Seite #2648594
Lesenswert?

R.M. schrieb:
> Gibt es eine Möglichkeit, die Ausgänge direkt in das Array zu schreiben?
Nicht, wenn es ein RAM ist, sieh dir ein RAM einfach mal an: das hat 
nach aussen nur Adress-, Daten und ein paar Steuerleitungen.

Du könntest as natürlich trotzdem machen, dann wird im FPGA aber kein 
RAM mehr verwendet, sondern viele einzelne Flipflops...  :-o

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren