> 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.