www.mikrocontroller.net

Forum: FPGA, VHDL & Co. VHDL: Integer an eine Component übergeben


Autor: full well (realjey)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich möchte einen Frequenzteiler in ein eigenes Untermodul packen. Dabei 
habe ich mich an die Clock Enable-Generierung welche hier auf der Seite 
vorgeschlagen wird gehalten. Nun möchte ich das Teilverhältnis nicht als 
constant haben, sondern aus der top_entity "übergeben" (als 
Integerwert). Leider gibt mir ISE immer einen Fehler aus beim 
compilieren.

Folgenbde Ziele möchte ich realisieren:

-Das Untermodul FreqDiv_test soll

a) den selben Clock wie das Topmodul verwenden
b) das Teilverhältnis von Topmodul "übergeben" bekommen
c) den geteilten Takt an das Topmodule "zurückgeben" (fdiv_out)

Hier mein Code

a) Topmodule

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

entity FPA_172h is
  port (
  Clk: in std_logic);
end entity FPA_172h;

architecture Behavioral of FPA_172h is

  component FreqDiv_test
  port (
      Clk: in std_logic;
      cnt_div: in integer;
      fdiv_out: out std_logic
  };
  end component;

begin

  Teiler : FreqDiv_test port map (Clk, cnt_div, fdiv_out);

end Behavioral;




b) Untermodule

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

entity FreqDiv_test is
port
(
  Clk: in std_logic;
  cnt_div: in integer;
  fdiv_out: out std_logic
);
end FreqDiv_test;

architecture Behavioral of FreqDiv_test is
signal   cnt:     integer range 0 to cnt_div-1; -- Zähler für Teiler
signal   ce:      std_logic;

begin
process(Clk)
begin
        if rising_edge(Clk) then
    if ce='1' then
            fdiv_out <= '1';
    end if;
  end if;
end process;

process(Clk)
  begin
  if rising_edge(Clk) then
    if cnt=cnt_div-1 then
      ce  <= '1';
      cnt <= 0;
    else
      ce  <= '0';
      cnt <= cnt +1 ;
    end if;
  end if;
end process;

end Behavioral;




Ich bekomme immer einer Fehlermeldung im Topmodule am Ende der 
Component-Deklaration:

Line 37. Unexpected symbol read: }.
Line 38. parse error, unexpected END, expecting IDENTIFIER


component FreqDiv_test
port (
    Clk: in std_logic;
    cnt_div: in integer;
    fdiv_out: out std_logic
};    -- =>Line 37
end component; -- => Line 38

Ich schätze mal ich mache hier generell noch etwas falsch und es ist 
kein einfacherer Syntax-Error...

Thx for Help
jey

Autor: Oliver Punk (Firma: UAS Merseburg) (olipunk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falsche Klammer "}" nach Portdeklaration?

Autor: full well (realjey)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ah doch so einfach, hast recht war ne geschweifte Klammer. Jetzt kamen 
aber neue Probleme: Ich musste für den Aufruf der Komponente

Teiler : FreqDiv_test port map (Clk, cnt_div, fdiv_out);

jetzt die Signale noch in der Entity des top_modules deklarieren.

entity FPA_172h is
  port (
  Clk: in std_logic;
  cnt_div: integer:=2;
  fdiv_out: ?);
end entity FPA_172h;

Jetzt eine Frage: fdiv_out soll ja die geteilte Frequenz sein die die 
FreqDiv-Komponente für das top_module generiert. Wie muss ich dieses 
Signal denn nun in der entity des top_module deklarieren? Ich möchte 
dieses Signal ja nun weiter im top_module verwenden.

Autor: full well (realjey)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und noch ein Problem:

die Übergabe funktioniert zwar jetzt allerdings erwartet die Zeile:

signal   cnt:     integer range 0 to cnt_div-1; -- Zähler für Teiler

das cnt_div eine Konstante ist. Ich habe diese aber ja als "in Integer" 
definiert. Wie löse ich dieses Problem, kann ich auch eine Konstante in 
der Portliste übergeben?

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jey Soon schrieb:
> Wie löse ich dieses Problem, kann ich auch eine Konstante in
> der Portliste übergeben?
Das wird üblicherweise als Generic gemacht...

In der Portliste kannst du das nicht übergeben, denn dann müsste der 
Synthesizer die Zählerbreite abhängig vom übergebenen Wert quasi 
dynamisch umstellen können. Dass das eine Konstante ist bzw. sein 
könnte, sieht der Synthesizer zum Übersetzungszeitpunkt nicht.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.