Hallo! Ich habe heute eine Frage zum Thema abgeleiteter Takt. Im folgenden VHDL Modell wird intern durch einen Zähler ein langsamer Takt aus dem Systemtakt abgeleitet und dieser langsame Takt dann auf die Sensitivitätsliste und die rising_edge() Funktion des folgenden Prozesses gegeben.
1 | library ieee; |
2 | use ieee.std_logic_1164. all; |
3 | use ieee.numeric_std. all; |
4 | entity design is |
5 | port ( |
6 | clk, reset : in std_logic; |
7 | a, b : in std_logic; |
8 | output : out std_logic); |
9 | end design; |
10 | |
11 | architecture derived_clk_arch of design is |
12 | signal clk_cnt_s : unsigned (3 downto 0); |
13 | signal clk_derived : std_logic; |
14 | |
15 | begin
|
16 | |
17 | -- purpose: This process sets up a counter to derive
|
18 | -- the slow clock (clk_derived) from the
|
19 | -- global clock (clk)
|
20 | -- type : sequential
|
21 | proc_generate_gated_clock : process (clk, reset) |
22 | begin
|
23 | if (reset = '1') then |
24 | clk_derived <= '0'; |
25 | clk_cnt_s <= (others => '0'); |
26 | elsif rising_edge(clk) then |
27 | if clk_cnt_s = to_unsigned(7, clk_cnt_s'length) then |
28 | clk_cnt_s <= (others => '0'); |
29 | clk_derived <= not clk_derived; -- toggle clock |
30 | else
|
31 | clk_cnt_s <= clk_cnt_s + to_unsigned(1, clk_cnt_s'length); |
32 | end if; |
33 | end if; |
34 | end process proc_generate_gated_clock; |
35 | |
36 | -- purpose: This process is sensitive to clk_derived
|
37 | -- type : sequential
|
38 | proc_sensitive_to_clk_derived : process (clk_derived, reset) is |
39 | begin -- process proc_sensitive_to_clk_derived |
40 | if reset = '1' then |
41 | output <= '0'; |
42 | elsif rising_edge(clk_derived) then -- rising clock edge |
43 | output <= a and b; |
44 | end if; |
45 | end process proc_sensitive_to_clk_derived; |
46 | |
47 | end derived_clk_arch; |
Ist ein solches abgeleitetes Signal in der Sensitivitätsliste eines Prozesses zulässig, oder handele ich mir so irgendwelche Nachteile bezüglich Clock Skew / Glitches ein. Vorweg: Ich hätte im 1. Prozess ein Clock-Enable Signal erzeugt und dieses im 2. Prozess nach rising(edge) in einer if-Abfrage verwandt.