Forum: FPGA, VHDL & Co. vhdl array / tabelle


von R. M. (rma)


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?

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


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?

von R. M. (rma)


Lesenswert?

Ich sehe vor mir leider gar keine Hardware nur ein bischen Software 
code. Aber ich werde mir es mal mit Harware überlegen.

Aber es gibt doch möglich keiten eine Array / Tabelle mit VHDL zu machen 
oder nicht?

von Vi (Gast)


Lesenswert?

Es gibt Arrays. Aber beachte das nur eindimensionale (in Ausnahmefällen 
auch zweidimensionale) Arrays synthetisierbar sind (zumindest nicht ohne 
kleine Tricks).

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


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

von vI (Gast)


Lesenswert?

Wie gesagt nicht ohne Trick (synthetisierbar!). Du musst den Umweg über 
eine Typdeklaration gehen sonst macht dir dein Synthesewerkzeug einen 
Strich durch die Milchmädchenrechnung.

von R. M. (rma)


Lesenswert?

Ok ich werde es mal ausprobieren, danke für eure hilfe

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


Lesenswert?

vI schrieb:
> Du musst den Umweg über eine Typdeklaration gehen
Welchen Umweg? Und natürlich "muss" ich über eine Typdefinition gehen. 
Das ist VHDL. Zeig doch mal an einem Beispiel, wie du direkter zum Ziel 
kommst...

von Vi (Gast)


Lesenswert?

Der Umweg über eine Typdeklaratation. Der direkte wäre dieser:

type foobar is array (0 to 7, 0 to 3) of std_logic;

Das nimmt dir aber in der Regel der Synthetisierer nicht.

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


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

von Vi (Gast)


Lesenswert?

Ausnahmen bestätigen die Regel :)

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


Lesenswert?

Vi schrieb:
> Ausnahmen bestätigen die Regel :)
Die nächste Ausnahme wäre dann offenbar auch Synplify (Lattice).
Auch das Ding setzt die obenstehende Beschreibung um und meldet:
1
Done: completed successfully

von user (Gast)


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

von R.M. (Gast)


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?

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


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

von R.M. (Gast)


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?

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


Lesenswert?

R.M. schrieb:
> Wie kann ich jetzt z.B. genau die Zelle auslesen in welcher die hex Zahl
> 23 steht?
Ich würde sagen, es gibt 2 Möglichkeiten: foo(2,1) oder foo(1,2)
Und nur eine davon ist richtig. Auf welche würdest du tippen?
Mein Tipp: erst nachdenken und dann ausprobieren...

von R.M. (Gast)


Lesenswert?

Gibt es eine Möglichkeit, die Ausgänge direkt in das Array zu schreiben?
Oder könnte man den Ausgang indirekt aus dem Array ansprechen?

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


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

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.