Forum: FPGA, VHDL & Co. Problem mit Integer in VHDL


von Paul Jensen (Gast)


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;

von FPGAküchle (Gast)


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]

von Paul Jensen (Gast)


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?

von FPGAküchle (Gast)


Lesenswert?

Erste Wahl ist für mich "HDL Chip Design" wie hier besprochen:

http://wikihost.org/wikis/fpgakueche/programm/gebo.prg?name=books_main



Das IMHO beste deutsche Buch für den Einstieg ist:

Bernd Schwarz, VHDL-Synthese
ISBN: 3486273841

z.B. hier:
http://www.alphamusic.de/3097574.html

Nicht Empfehlenswert obwohl der Titel viel verspricht ist:

FPGA-Kochbuch von Wannemacher

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.