Problem mit Integer in VHDL

Gast #388591
Lesenswert?

Hallo,
ich wollte mir einen Rom Programmieren in dem 2 getrennte Werte über
eine Adresse angesprochen werden. Dazu habe ich ein Array von Typ eines
anderen Arrays (aus 2 Integer-Werten) erstellt.
Wenn das Programm kompilieren will bekomme ich folgende Fehlermeldung:

** Error: test_Rom.vhd(24): Cannot resolve indexed name as type
integer.

Wieso schafft er es nicht, die Integer-Werte aus den ROM in eine
Integer-Variable zu schreiben?!?

Hat jemand ne Idee?

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;

entity ROM is
       port(
             -- Input signals
             address              : in std_logic_vector(1 downto 0);
             -- Output signals
             output               : out integer range -3 to 3;
       );
end entity ROM;

architecture BEHAVIOR of ROM is
type BLOC is array (0 to 1) of integer range -3 to 3;
type MEMORY is array (0 to 3) of BLOC;

constant ROM: MEMORY := ((1,2),
                         (3,0),
                         (1,1),
                         (2,2));
begin
      output <= ROM(0,0);
end BEHAVIOR;
Gast #388592
Lesenswert?

-ROM ist eindimensional, deshalb wird der zweidimensionale Index
bemeckert. Richtig ist:

output <= C_ROM(0)(0);

-wenn Du Memory zweidimensional deklarierst kannst du auch einen
zweidimensionalen Index verwenden (siehe MEM_2D)

-das vorletzte semikolon in der Portlist ist zuviel.

-Konstante und Entity haben den selben namen -> OK, aber nicht gut.


[vhdl]
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;

ENTITY ROM IS
  PORT(
    -- Input signals
    address : IN  STD_LOGIC_VECTOR(1 DOWNTO 0);
    -- Output signals
    output  : OUT INTEGER RANGE -3 TO 3    );
END ENTITY ROM;

ARCHITECTURE BEHAVIOR OF ROM IS
  TYPE BLOC IS ARRAY (0 TO 1) OF INTEGER RANGE -3 TO 3;
  TYPE MEMORY IS ARRAY (0 TO 3) OF BLOC;
  TYPE MEM_2D IS ARRAY (0 TO 1,0 to 3) OF INTEGER RANGE -3 TO 3;
  CONSTANT C_ROM : MEMORY := ((1, 2),
                           (3, 0),
                           (1, 1),
                           (2, 2));

CONSTANT C_ROM_2D : MEM_2D := ((1,3,1,2),(2,0,1,2));

BEGIN
  output <= C_ROM(0)(0) when address = "00" else
            C_ROM_2D(0,0);
END BEHAVIOR;
[\vhdl]
Gast #388593
Lesenswert?

Hallo,
vielen Dank für die Hilfe!!!!
Die 2D Array Schreibweise kannte ich auch noch nicht.
Aus Übersichtsgründen wollte ich aber eine Schreibweise, wo die Werte
aus einer Zeile immer nebeneinander stehen (wie man es in meinem
Code-Schnipsel sieht).

PS.: da ich ein blutiger Anfänger bin wollte ich mal fragen, ob du
vielleicht ein paar Literaturtips für mich hast?

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