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.
Steht doch in der Fehlermeldung: Du versuchst beide Taktflanken zu benutzen, und das geht nicht.
> 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.
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) ;-)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.