Problem mit Integer in VHDL

Gast #388591
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
-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
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

Eine eigene Frage? Dieser Thread ist über 20 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.