Habe einen komischen Fehler in VHDL, welcher so nicht auftreten sollte?
Bei mir komm tin VHDL der Folgende Fehler, bei folgendem Code, und ich kann mir nicht erklären warum
line 36:5:warning: instance "low_counter" of component "genericcounter" is not bound [-Wbinding]
low_counter: GenericCounter123
^
line 14:14:warning: (in default configuration of sekundenzaehler(rtl))
line 49:5:warning: instance "high_counter" of component "genericcounter123" is not bound [-Wbinding]
high_counter: GenericCounter123
^
line 14:14:warning: (in default configuration of sekundenzaehler(rtl))
-----
ERROR: ELABORATION
Folgender Code wurde analysiert: 1: library ieee;
2: use ieee.std_logic_1164.all;
3: use ieee.numeric_std.all;
4:
5: entity SekundenZaehler is
6: port(
7: clk : in std_logic;
8: reset : in std_logic;
9: count_1 : out std_logic_vector(3 downto 0);
10: count_10 : out std_logic_vector(3 downto 0)
11: );
12: end SekundenZaehler;
13:
14: architecture rtl of SekundenZaehler is
15:
16: component GenericCounter is
17: generic (
18: Count_max : integer
19: );
20: port(
21: clk : in std_logic;
22: enable : in std_logic;
23: reset : in std_logic;
24: count : out std_logic_vector(3 downto 0);
25: overflow : out std_logic
26: );
27: end component;
28:
29: --Zähler und Overflowsignale
30: signal five_count : std_logic_vector(3 downto 0);
31: signal nine_count : std_logic_vector(3 downto 0);
32: signal five_overflow : std_logic;
33: signal nine_overflow : std_logic;
34:
35: begin
36: low_counter: GenericCounter
37: generic map (
38: Count_max => 9 -- Zählt von 0 bis 9 (Einerstelle)
39: )
40: port map (
41: clk => clk,
42: enable => '1',
43: reset => reset,
44: count => nine_count,
45: overflow => nine_overflow
46: );
47:
48: --Zehnerzähler (Zählt von 0 bis 5)
49: high_counter: GenericCounter123
50: generic map (
51: Count_max => 5 -- Zählt von 0 bis 5 (Zehnerstelle)
52: )
53: port map (
54: clk => clk,
55: enable => nine_overflow,
56: reset => reset,
57: count => five_count,
58: overflow => five_overflow
59: );
60:
61: --Zuordnung der Ausgänge
62: count_1 <= nine_count; -- Einerstellen
63: count_10 <= five_count; -- Zehnerstellen
64: end architecture rtl;
65:
2 Antworten
Ist (leider) verdammt lnage her bei mir.
Werden die Eingänge clk/reset der entity 'automagisch' versorgt? Denn das wäre das einzige, wo ich keine Zuordnung sehe.
Sonst scheint alles zu matchen und belegt zu werden.
Verstehe. Wie gesagt, ich sehe sonst auch kein Mismatch, die Cases der Namen scheinen zu passen etc. pp. - Und ja, es ist auffällig, daß es beide Instanziierungen betrifft.
Kann eien fehlende Abhängigkeit einen Fehler beim Bindign erzeugen?
Das kann sein, aber ich sehe keine fehlende Abhängigkeit, was mich verwirrt
Für high_counter instanzierst du eine unbekannte Komponente GenericCounter123. Dort sollte sicherlich nur GenericCounter stehen.
Da in der Fehlermeldung auch für low_counter der Typ GenericCounter123 angegeben wird, obwohl dort in deinem Code GenericCounter steht, kann man wohl davon ausgehen, dass die Fehlermeldung zu einem anderen Code generiert wurde.
Du hast recht, bei GenericCounter123 kommt ein anderer Fehler, wenn ich GenericCounter123 jedoch zu GenericCounter ändere kommt genau dieser oben stehende fehler
Ich denke, dass dir noch eine Entität für GenericCounter fehlt, die die Komponente implementiert. Also sowas wie:
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity GenericCounter is
generic (
Count_max : integer := 9 -- default
);
port (
clk : in std_logic;
enable : in std_logic;
reset : in std_logic;
count : out std_logic_vector(3 downto 0);
overflow : out std_logic
);
end GenericCounter;
architecture Behavioral of GenericCounter is
begin
process(clk, reset)
end Behavioral;
Das kann sein, sehe aber keinen Fehler in der Komponente, kann es sein, dass es nicht geht, weil das generic nicht in der entity steht (welche ich auch nicht verändern darf)
Da deine Entität SekundenZaehler die GenericCounter-Instanzen nur nutzt, aber nicht selbst deren Implementation darstellt, braucht es keine Deklaration von generic.
Nimm dieses Beispiel von Intel. Verglichen mit deinem Code wäre top = SekundenZaehler und logic = GenericCounter. Die Entität top nutzt eine Instanz von logic (low_logic), sie stellt keine Implementation dar. Die Entität logic hingegen implementiert die Komponente logic. Daher muss sie dieselbe Portliste definieren, wie die Komponente. Würde man der Komponente noch eine generic-Klausel spendieren, müsste die Entität logic ebenso eine solche Klausel beinhalten, die auf die der Komponente passt.
Ja, werden sie, der Fehler liegt irgendwie an der Instanzausführung jeweils, aber eigentlich sollte das einfach so gehen, da ja der Instanzname keine Rolle spielt...