Hallo,
ich habe mal ein wenig mit VHDL herumgespielt und dabei ist mir eine
Sache aufgefallen, für die ich keine Lösung finde.
Folgender Code soll nur auf Tastendruck einen Ausgang ein- und
ausschalten. Ist also eine Statemachine mit 4 Zuständen.
1 | library ieee;
|
2 | use ieee.std_logic_1164.all;
|
3 |
|
4 | entity switch is
|
5 | port( clock, reset : in std_logic;
|
6 | x : in std_logic;
|
7 | y : out std_logic);
|
8 | end entity switch;
|
9 |
|
10 | architecture behaviour of switch is
|
11 | type state_type is (z0, z1, z2, z3);
|
12 | signal state : state_type := z0;
|
13 | begin
|
14 |
|
15 | seq: process (clock, reset) is
|
16 | begin
|
17 | if (reset = '0') then
|
18 | state <= z0;
|
19 | elsif rising_edge(clock) then
|
20 | case state is
|
21 | when z0 =>
|
22 | if (x = '0') then state <= z1;
|
23 | else state <= z0;
|
24 | end if;
|
25 | when z1 =>
|
26 | if (x = '1') then state <= z2;
|
27 | else state <= z1;
|
28 | end if;
|
29 | when z2 =>
|
30 | if (x = '0') then state <= z3;
|
31 | else state <= z2;
|
32 | end if;
|
33 | when z3 =>
|
34 | if (x = '1') then state <= z0;
|
35 | else state <= z3;
|
36 | end if;
|
37 | end case;
|
38 | end if;
|
39 | end process;
|
40 |
|
41 | proc: process(state) is
|
42 | begin
|
43 | case state is
|
44 | when z0 =>
|
45 | y <= '0';
|
46 | when z1 =>
|
47 | y <= '1';
|
48 | when z2 =>
|
49 | y <= '1';
|
50 | when z3 =>
|
51 | y <= '0';
|
52 | end case;
|
53 | end process;
|
54 | end architecture;
|
Wenn ich die auf Papier als Digitalschaltung entwerfe und mit dem
Diagramm-Designer in Altera Quartus zeichne reichen 2 Flip-Flops aus.
Aus dem VHDL-Code wird aber für jeden Zustand ein Flip-Flop, also 4
Stück, erzeugt.
Übersehe ich irgendwelche Randbedingungen, die ihn daran hindern das zu
optimieren? Oder ist das einfach so?
Es funktionieren jedenfalls beide Varianten auf der Hardware.
Viele Grüße
test