Forum: FPGA, VHDL & Co. Suche Hilfe bei unverständlichen VHDL Code


von Daniel (Gast)


Lesenswert?

Hallo,

ich hab da ein Problem und verstehe den Code nicht.

Mein Aufgabe ist es ein RAM für ein Altera Board zu schreiben´. Nun hab 
ich auf der Altera Site ein Bsp RAM gefunden was eigentlich 
funktionieren sollte.

Mein Problem ist ich verstehe folgende Zeile nicht.
1
ARCHITECTURE rtl OF ram IS
2
  TYPE RAM IS ARRAY(0 TO 2 ** ADDRESS_WIDTH - 1) OF std_logic_vector(DATA_WIDTH - 1 DOWNTO 0);

Danke für jegliche Hilfe.

Gruß
Daniel
1
LIBRARY ieee;
2
USE ieee.std_logic_1164.ALL;
3
USE ieee.numeric_std.ALL;
4
5
ENTITY ram IS
6
  GENERIC
7
  (
8
    ADDRESS_WIDTH  : integer := 4;
9
    DATA_WIDTH  : integer := 8
10
  );
11
  PORT
12
  (
13
    clock      : IN  std_logic; -- Takt
14
    data      : IN  std_logic_vector(DATA_WIDTH - 1 DOWNTO 0); -- 8-bit data input to RAM
15
    write_address  : IN  std_logic_vector(ADDRESS_WIDTH - 1 DOWNTO 0); --  4-bit read address input
16
    read_address  : IN  std_logic_vector(ADDRESS_WIDTH - 1 DOWNTO 0); --  4-bit write address input
17
    we        : IN  std_logic; -- Write enable input
18
    q        : OUT std_logic_vector(DATA_WIDTH - 1 DOWNTO 0) -- 8-bit data output of RAM
19
  );
20
END ram;
21
22
ARCHITECTURE rtl OF ram IS
23
  TYPE RAM IS ARRAY(0 TO 2 ** ADDRESS_WIDTH - 1) OF std_logic_vector(DATA_WIDTH - 1 DOWNTO 0);
24
25
  SIGNAL ram_block : RAM;
26
BEGIN
27
  PROCESS (clock)
28
  BEGIN
29
    IF (clock'event AND clock = '1') THEN
30
      IF (we = '1') THEN
31
          ram_block(to_integer(unsigned(write_address))) <= data;
32
      END IF;
33
34
      q <= ram_block(to_integer(unsigned(read_address)));
35
    END IF;
36
  END PROCESS;
37
END rtl;

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


Lesenswert?

> Mein Problem ist ich verstehe folgende Zeile nicht.
Das sind zwei Zeilen!!!
1
ARCHITECTURE rtl OF ram IS
2
  TYPE RAM IS ARRAY(0 TO 2 ** ADDRESS_WIDTH - 1) OF std_logic_vector(DATA_WIDTH - 1 DOWNTO 0);

Die erste Zeile sagt:
Hier beginnt die Architekturbeschreibung des ram
1
ARCHITECTURE rtl OF ram IS
Diese Beschreibung endet bei
1
END rtl;

Und die zweite Zeile beschreibt ein Array von Vektoren:
1
  TYPE RAM IS ARRAY(0 TO 2 ** ADDRESS_WIDTH - 1) OF std_logic_vector(DATA_WIDTH - 1 DOWNTO 0);
Dieses Array beinhaltet 16 (0 bis 2^4-1) Vektoren der Breite 8 Bit (8-1 
downto 0)

Mein Tipp: "VHDL-Synthese" von Reichardt/Schwarz

von Daniel (Gast)


Lesenswert?

Wenn ich nun die ADDRESS_WIDTH ändere passt sich das Array an.

Ich hätte da noch eine kleine Frage zu
DATA_WIDTH - 1 DOWNTO 0

Data ist ja 8 - 1 = 7 bis 0

Man könnte das auch ersetzen durch 7 DOWNTO 0

Besten dank für die Hilfe nun ist mir alles sehr viel klarer.

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


Lesenswert?

> Wenn ich nun die ADDRESS_WIDTH ändere passt sich das Array an.
> Man könnte das auch ersetzen durch 7 DOWNTO 0
Ja und ja.

von Martin K. (mkohler)


Lesenswert?

Daniel wrote:
> Man könnte das auch ersetzen durch 7 DOWNTO 0
Dann wäre es aber eben nicht mehr "generic".

Lothar Miller wrote:
> Mein Tipp: "VHDL-Synthese" von Reichardt/Schwarz
Genau, das liegt auch gerade neben der Tastatur. Diese "Investition" hat 
sich gelohnt.

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.