Error (10819) VHDL

Gast #1230285
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.
Moderator (Firma: Titel) Persönliche Seite #1230303
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.
Moderator (Firma: Titel) Persönliche Seite #1230603
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)   ;-)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren