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


von Tobias (Gast)


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.

von Xenu (Gast)


Lesenswert?

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

von Tobias (Gast)


Lesenswert?

OK.....aber was wäre eine Lösung des Problems??
Danke.

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


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:
1
 IF (clk'event and clk = '1') THEN
2
     rechteck_out <= "100000000000000000000";
3
 ELSIF (clk'event and clk = '0') THEN
4
     rechteck_out <= "011111111111111111111";
5
 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:
1
ARCHITECTURE behavior OF rechteck IS
2
signal rechteck : std_logic := '0';
3
BEGIN
4
  process (clk) begin
5
    IF (clk'event and clk = '1') THEN
6
      rechteck <= not rechteck; -- nur interne Signale können auch gelesen werden.
7
    END IF;
8
  end process;
9
10
  rechteck_out <= "0000" & rechteck & x"0000"; -- wenns schon unbedingt der Ausgang 16 sein soll
11
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:
1
ARCHITECTURE behavior OF rechteck IS
2
signal rechteck : std_logic_vector(20 downto 0) := "10000000000000000";
3
BEGIN
4
  process (clk) begin
5
    IF (clk'event and clk = '1') THEN
6
      rechteck <= not rechteck; -- nur interne Signale können auch gelesen werden.
7
    END IF;
8
  end process;
9
10
  rechteck_out <= rechteck;
11
END behavior;

Richtig schön lesbar wirds so:
1
ARCHITECTURE behavior OF rechteck IS
2
signal rechteck : std_logic_vector(20 downto 0) := "10000000000000000";
3
BEGIN
4
  process begin
5
    wait until rising_edge(clk);
6
    rechteck <= not rechteck; -- nur interne Signale können auch gelesen werden.
7
  end process;
8
9
  rechteck_out <= rechteck;
10
END behavior;
Aber über Schönheit lässt sich streiten.

von Tobias (Gast)


Lesenswert?

Vielen Dank!!

Werde es mal durcharbeiten...

von Xenu (Gast)


Lesenswert?

>Welches Bauteil soll das können?

Zum Beispiel die Coolrunner II von Xilinx.

von Tobias (Gast)


Lesenswert?

Nochmals Danke!
Jetzt klappt es.
Gruß
Tobias

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


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.
1
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:
1
Each macrocell has the ability to double its input clock switching frequency.
2
CoolRunner-II CPLD DET registers can be used for logic
3
functions that include shift registers, counters, comparators,
4
and state machines.

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

von Matthias G. (mgottke)


Lesenswert?

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

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.