und
1 | clk'event and clk'last_value = '0' and clk='1'
|
sind Schlüsselformulierungen für die Synthese.
Daran wird erkannt, dass ein FF eingebaut werden soll.
Mit der folgenden Beschreibung wird zwar alles korrekt simuliert (Bild).
Die Synthese macht aber nur aus den ersten beiden Beschreibungen FFs
(v1, v2). Die beiden Prozesse v3 und v4 werden gar nicht erst
implementiert (Bild RTL-Schematics).
1 | library IEEE;
|
2 | use IEEE.STD_LOGIC_1164.ALL;
|
3 | use IEEE.STD_LOGIC_ARITH.ALL;
|
4 | use IEEE.STD_LOGIC_UNSIGNED.ALL;
|
5 |
|
6 | entity flanke is
|
7 |
|
8 | port (clk : in std_logic;
|
9 | d,e,f,g : in std_logic;
|
10 | q,p,r,s : out std_logic);
|
11 |
|
12 | -- Funktion rising_edge() aus IEEE, aber mit anderem Namen
|
13 | FUNCTION pos_edge (SIGNAL s : std_ulogic) RETURN BOOLEAN IS
|
14 | BEGIN
|
15 | RETURN (s'EVENT AND (To_X01(s) = '1') AND
|
16 | (To_X01(s'LAST_VALUE) = '0'));
|
17 | END;
|
18 |
|
19 | -- aus Post von Psycho Dad
|
20 | function pos_flanke (signal s : std_logic)
|
21 | return boolean is
|
22 | variable result : boolean; -- Rückgabevariable
|
23 | begin
|
24 | if (s'event) and (s = '1') and -- Flankendetektion
|
25 | (s'last_value = '0') then result := true; -- Wert vor letzter Signaländerung
|
26 | else result := false;
|
27 | end if;
|
28 | return result; -- Rückgabe
|
29 | end function pos_flanke;
|
30 |
|
31 | end entity flanke;
|
32 |
|
33 | architecture verhalten of flanke is
|
34 | begin
|
35 | -- Synthese OK
|
36 | v1: process(clk)
|
37 | begin
|
38 | if rising_edge(clk) then p <= e; -- IEEE-Funktionsaufruf
|
39 | end if;
|
40 | end process;
|
41 |
|
42 | v2: process(clk)
|
43 | begin
|
44 | if clk'event and clk'last_value = '0' and clk='1' then r <= f; -- händisch
|
45 | end if;
|
46 | end process;
|
47 |
|
48 |
|
49 | -- Synthese nicht brauchbar
|
50 | v3: process(clk)
|
51 | begin
|
52 | if pos_edge(clk) then q <= d; -- Funktionsaufruf
|
53 | end if;
|
54 | end process;
|
55 |
|
56 | v4: process(clk)
|
57 | begin
|
58 | if pos_flanke(clk) then s <= g; -- Funktionsaufruf
|
59 | end if;
|
60 | end process;
|
61 |
|
62 | end architecture verhalten;
|
Die verwendetete Testbench:
1 | clk <= not clk after 10 ns;
|
2 |
|
3 | tb : PROCESS
|
4 | BEGIN
|
5 | d<='1';
|
6 | wait for 100 ns;
|
7 | e<='1';
|
8 | wait for 100 ns;
|
9 | f<='1';
|
10 | wait for 100 ns;
|
11 | g<='1';
|
12 | wait for 100 ns;
|
13 |
|
14 | d<='0';
|
15 | wait for 100 ns;
|
16 | e<='0';
|
17 | wait for 100 ns;
|
18 | f<='0';
|
19 | wait for 100 ns;
|
20 | g<='0';
|
21 | wait for 100 ns;
|
22 | END PROCESS;
|