mikrocontroller.net

Forum: FPGA, VHDL & Co. Error (10819) VHDL


Autor: Tobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo.

Habe folgendes Problem:

Ich möchte eine simple Rechteckschwingung mit VHDL erzeugen.

Leider erhalte ich bei der Compilation folgende Fehlermeldung:

Error (10819): Netlist error at rechteck.vhd(25): can't infer register 
for rechteck_out[16] because it changes value on both rising and falling 
edges of the clock.



Hier mein Quellcode:

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
use ieee.std_logic_unsigned.all;

ENTITY rechteck IS
PORT(
clk : IN STD_LOGIC;

rechteck_out : OUT STD_LOGIC_VECTOR(20 DOWNTO 0)
);
END rechteck;

ARCHITECTURE behavior OF rechteck IS

BEGIN

PROCESS(clk)

BEGIN

IF (clk'event and clk = '1') THEN

rechteck_out <= "100000000000000000000";

ELSIF (clk'event and clk = '0') THEN

rechteck_out <= "011111111111111111111";

END IF;


END PROCESS;
END behavior;





Bitte um Hilfe.

Danke.

Autor: Xenu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Steht doch in der Fehlermeldung: Du versuchst beide Taktflanken zu 
benutzen, und das geht nicht.

Autor: Tobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK.....aber was wäre eine Lösung des Problems??
Danke.

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

Bewertung
0 lesenswert
nicht lesenswert
> Ich möchte eine simple Rechteckschwingung mit VHDL erzeugen.
Das kann dein Code. Das lässt sich sogar simulieren :-o

Aber wenn du es in Hardware abbilden willst:
 IF (clk'event and clk = '1') THEN
     rechteck_out <= "100000000000000000000";
 ELSIF (clk'event and clk = '0') THEN
     rechteck_out <= "011111111111111111111";
 END IF;
Welches Bauteil soll das können?

Du hast in einem FPGA/CPLD nur FFs, die entweder auf die positive oder 
die negative Flanke reagieren können. Sieh dir mal entsprechende 
Literatur an.

Mach es besser so:
ARCHITECTURE behavior OF rechteck IS
signal rechteck : std_logic := '0';
BEGIN
  process (clk) begin
    IF (clk'event and clk = '1') THEN
      rechteck <= not rechteck; -- nur interne Signale können auch gelesen werden.
    END IF;
  end process;

  rechteck_out <= "0000" & rechteck & x"0000"; -- wenns schon unbedingt der Ausgang 16 sein soll
END behavior;

BTW
> rechteck_out : OUT STD_LOGIC_VECTOR(20 DOWNTO 0)
Dir ist schon klar, dass der Vektor 21 Bit breit ist?

EDIT
Eben erst gesehen:
Es soll der ganze Vektor invertiert werden :-O
Dann eben so:
ARCHITECTURE behavior OF rechteck IS
signal rechteck : std_logic_vector(20 downto 0) := "10000000000000000";
BEGIN
  process (clk) begin
    IF (clk'event and clk = '1') THEN
      rechteck <= not rechteck; -- nur interne Signale können auch gelesen werden.
    END IF;
  end process;

  rechteck_out <= rechteck;
END behavior;

Richtig schön lesbar wirds so:
ARCHITECTURE behavior OF rechteck IS
signal rechteck : std_logic_vector(20 downto 0) := "10000000000000000";
BEGIN
  process begin
    wait until rising_edge(clk);
    rechteck <= not rechteck; -- nur interne Signale können auch gelesen werden.
  end process;

  rechteck_out <= rechteck;
END behavior;
Aber über Schönheit lässt sich streiten.

Autor: Tobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank!!

Werde es mal durcharbeiten...

Autor: Xenu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Welches Bauteil soll das können?

Zum Beispiel die Coolrunner II von Xilinx.

Autor: Tobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nochmals Danke!
Jetzt klappt es.
Gruß
Tobias

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

Bewertung
0 lesenswert
nicht lesenswert
Xenu wrote:
>>Welches Bauteil soll das können?
> Zum Beispiel die Coolrunner II von Xilinx.
Sachen gibts...

Allerdings habe ich die Beschreibung oben mal ausprobiert.
Ergebnis: sie wird nicht synthetisiert.
Signal rechteck_out cannot be synthesized, bad synchronous description.


Im DS zum CoolrunnerII ist die Funktion des Double Edge Triggered FF 
dann auch etwas anders beschrieben:
Each macrocell has the ability to double its input clock switching frequency.
CoolRunner-II CPLD DET registers can be used for logic
functions that include shift registers, counters, comparators,
and state machines.

Mit einem Zähler klappts tatsächlich:
architecture Behavioral of CR2RFE is
signal cnt : integer;
begin
  process (clk) begin
    IF    (clk'event and clk = '1') THEN
      cnt <= cnt+1;
    ELSIF (clk'event and clk = '0') THEN
      cnt <= cnt+1;
    END IF;
  end process;
end Behavioral;
Cool, schade dass die aussterben (werden)   ;-)

Autor: Matthias G. (mgottke)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Lothar,
mit den vorgeschlagenen Designs von Dir halbiert sich auch die 
Rechteckfrequenz.
Alternativ kann man am Ausgang dann auch asynchron arbeiten:
rechteck_out <= "100000000000000000000" when clk = '1' else "011111111111111111111";
Also mit einem Mux.

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.