Forum: FPGA, VHDL & Co. VHDL: "Incompatible arrays"


von Rüdiger Knörig (Gast)


Lesenswert?

Ich versuche mich gerade etwas in VHDL einzuarbeiten und benutze dazu 
FreeHDL. Das unten angegebene Programm läßt sich zwar übersetzen, der 
erzeugte Simulator bricht aber mit den Meldungen

default component instantiation for unit 
':singentest_arch:testreset:g0'. Using 'work.singen'!
default component instantiation for unit 
':singentest_arch:g0:singen_arch:tabelle:z0'. Using 'work.zaehler'!
Incompatible arrays

ab. Die aufgezeigte Hierarchie (:singentest_arch:testreset:g0 bzw. 
:singentest_arch:g0:singen_arch:tabelle:z0) macht mich schon etwas 
stutzig, anscheinend ist der FreeHDL-Compiler durcheinandergeraten. 
Leider sind seine Fehlermeldungen auch etwas spartanisch (jetzt bitte 
keine Altera-Empfehlung...)
1
library ieee;
2
use ieee.std_logic_1164.all;
3
USE ieee.numeric_std.ALL;
4
use ieee.math_real.all;
5
6
entity Zaehler is
7
  
8
  generic ( NBits : integer := 8 );              -- Bitbreite
9
10
  port (
11
    ausgang : out unsigned(NBits-1 downto 0);  -- Ausgangsvektor
12
    takt    : in  std_logic;            -- Taktsignal
13
    reset   : in  std_logic);           -- Reset-Signal (aktiv L)
14
15
end Zaehler;
16
17
architecture Zaehler_arch of Zaehler is
18
  signal zaehlstand : unsigned(NBits-1 downto 0) := to_unsigned(0,8);  -- Zaehlstand
19
begin  -- Zaehler_arch
20
  
21
  process(takt)
22
    begin
23
      if(rising_edge(takt)) then
24
        if(reset = '0') then
25
          zaehlstand <= (others => '0');
26
        else
27
          zaehlstand <= zaehlstand + 1;
28
        end if;
29
      end if;
30
    end process;
31
    ausgang <= zaehlstand;
32
end Zaehler_arch;
33
34
35
library ieee;
36
use ieee.std_logic_1164.all;
37
USE ieee.numeric_std.ALL;
38
use work.Zaehler;
39
use ieee.math_real.all;
40
41
entity SinGen is
42
43
  generic(
44
    NsinLog2 : integer := 4;        -- Number of sinus values
45
    Nbits : integer := 8        -- Bit resolution for the sine
46
    );
47
  
48
  port (
49
    ausgang : out unsigned(Nbits-1 downto 0);  -- Ausgangssignal
50
    takt    : in  std_logic;    -- Taktsignal
51
    reset   : in  std_logic);   -- Reset
52
53
end SinGen;
54
55
architecture SinGen_arch of SinGen is
56
  constant Nsin : integer := 2**NsinLog2;
57
  constant A : real := 2.0**(real(Nbits-1))-1.0;  -- Amplitude for the sine.
58
  constant Omega : real := 2.0*MATH_PI/real(Nsin);  -- Phase angular velocity
59
  type RomType is array (0 to Nsin-1) of unsigned(Nbits-1 downto 0);  -- ROM datatype
60
  signal SinusTabelle : RomType;
61
  component Zaehler
62
    generic (NBits : integer := 8);              -- Bitbreite
63
64
    port (
65
      ausgang : out unsigned(NBits-1 downto 0);  -- Ausgangsvektor
66
      takt    : in  std_logic;            -- Taktsignal
67
      reset   : in  std_logic);           -- Reset-Signal (aktiv L)    
68
  end component;
69
  signal zaehlstand : unsigned(NBits-1 downto 0) := (others => '0');  -- Zählstand
70
begin  -- SinGen_arch
71
72
  tabelle: for i in 0 to Nsin-1 generate
73
    SinusTabelle(i) <= to_unsigned(integer(A*(1.0+sin(Omega*real(i)))),Nbits);
74
  end generate tabelle;
75
  
76
  Z0 : Zaehler generic map (NBits => NSinLog2) port map (
77
    ausgang => zaehlstand,
78
    takt => takt,
79
    reset => reset);
80
81
  ausgang <= SinusTabelle(to_integer(zaehlstand));
82
    
83
end SinGen_arch;
84
85
library ieee;
86
use ieee.std_logic_1164.all;
87
USE ieee.numeric_std.ALL;
88
use work.Zaehler;
89
use work.SinGen;
90
use ieee.math_real.all;
91
92
entity SinGenTest is
93
end SinGenTest;
94
95
architecture SinGenTest_arch of SinGenTest is
96
  constant Nbits : integer := 8;              -- Bitaufloesung
97
  constant NSinLog2 : integer := 4;     -- log_2(Anzahl der Sinuswerte)
98
  component SinGen
99
    generic (
100
      NsinLog2 : integer;
101
      NBits    : integer);
102
    port (
103
      ausgang : out unsigned(Nbits-1 downto 0);
104
      takt    : in  std_logic;
105
      reset   : in  std_logic);
106
  end component;
107
108
  signal testausgang : unsigned(Nbits-1 downto 0) := (others => '0');  -- Ausgangssignal
109
  signal testtakt : std_logic := '0';       -- Taktsignal
110
  signal testreset : std_logic := '0';      -- Reset-Signal
111
begin  -- SinGenTest_arch
112
113
  G0 : SinGen generic map (
114
    NsinLog2 => NSinLog2,
115
    Nbits     => Nbits) port map (
116
      ausgang => testausgang,
117
      takt    => testtakt,
118
      reset   => testreset);
119
  
120
  testtakt <= not(testtakt) after 10 ns;
121
  testreset <= '0' after 0 ns, '1' after 15 ns;
122
  
123
end SinGenTest_arch;

von Karl Könner (Gast)


Lesenswert?

>  constant Nbits : integer := 8;
> constant NSinLog2 : integer := 4;

> signal zaehlstand : unsigned(NBits-1 downto 0) := (others => '0');  -- Zählstand

>  Z0 : Zaehler generic map (NBits => NSinLog2) port map (
>    ausgang => zaehlstand,


NSinLog2 ist 4 nicht 8

damit ist ausgang 4 bit breit, zaehlstan dagegen 8

MfG

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


Lesenswert?

ISIM sagt da schon mehr:
ERROR:HDLCompiler:1566 - "C:/.../singen.vhd" Line 77: Expression has 8 
elements ; formal ausgang expects 4
Und die Zeile 77 ist die hier:
    ausgang => zaehlstand,

Allerdings geht es hier schon schief:
    generic map (NBits => NSinLog2)

von Rüdiger Knörig (Gast)


Lesenswert?

Ah vielen Dank! Ich bin für den FreeHDL-Compiler sehr dankbar, aber an 
der Fehlerbehandlung (oft auch durch Abstürze in der Compilierstufe) 
sollte man noch arbeiten.

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.