Differences
This shows you the differences between two versions of the page.
Next revision | Previous revision | ||
dt-code-sequ [2011/01/10 13:10] beckmanf created |
dt-code-sequ [2014/01/08 11:02] (current) beckmanf flipflop process -> concurrent |
||
---|---|---|---|
Line 3: | Line 3: | ||
Flipflops werden im VHDL Code durch einen Prozess, der sensitiv auf den Takt und den asynchronen Reset ist, | Flipflops werden im VHDL Code durch einen Prozess, der sensitiv auf den Takt und den asynchronen Reset ist, | ||
beschrieben. Alle Signalzuweisungen in diesem Prozess führen in der Schaltungssynthese zu Flipflops. | beschrieben. Alle Signalzuweisungen in diesem Prozess führen in der Schaltungssynthese zu Flipflops. | ||
+ | Diese Beschreibung führt zu einem D-Flipflop, das bei steigender Taktflanke die Daten übernimmt. Dieses | ||
+ | Flipflop hat einen asynchronen Reset "reset_n", der low aktiv ist. Das bedeutet das Flipflop wird zurückgesetzt | ||
+ | wenn das Signal "reset_n" auf "0" gesetzt wird. | ||
Line 13: | Line 16: | ||
in_i : in std_ulogic; | in_i : in std_ulogic; | ||
out_o : out std_ulogic); | out_o : out std_ulogic); | ||
- | end; | + | end entity flipflop; |
architecture rtl of fliplfop is | architecture rtl of fliplfop is | ||
Line 30: | Line 33: | ||
out_o <= q; | out_o <= q; | ||
- | end; | + | end architecture rtl; Ìý |
+ | &±ô³Ù;/³¦´Ç»å±ð&²µ³Ù;Ìý | ||
+ | Ìý | ||
+ | Ein Flipflop kann alternativ mit einem concurrent statement beschrieben werden. Ìý | ||
+ | Ìý | ||
+ | <code vhdl>Ìý | ||
+ | entity flipflop is Ìý | ||
+ | port(Ìý | ||
+ | clk : in std_ulogic;Ìý | ||
+ | reset_n : in std_ulogic;Ìý | ||
+ | in_i : in std_ulogic; Ìý | ||
+ | out_o : out std_ulogic);Ìý | ||
+ | end entity flipflop;Ìý | ||
+ | Ìý | ||
+ | architecture rtl of fliplfop isÌý | ||
+ | signal q : std_ulogic;Ìý | ||
+ | beginÌý | ||
+ | Ìý | ||
+ | q <= '0' when reset_n = '0' else in_i when rising_edge(clk); Ìý | ||
+ | Ìý | ||
+ | out_o <= q; | ||
+ | end architecture rtl; | ||
</code> | </code> | ||
| | ||
== Flipflop, dessen Zustand in jedem Takt invertiert wird == | == Flipflop, dessen Zustand in jedem Takt invertiert wird == | ||
- | In diese Bespiel wird der Ausgang des Flipflops mit einem Inverter an den Eingang zurückgeführt. | + | In diesem Bespiel wird der Ausgang des Flipflops mit einem Inverter an den Eingang zurückgeführt. |
<code vhdl> | <code vhdl> | ||
Line 45: | Line 69: | ||
begin | begin | ||
- | ff_p : process(clk, reset_n)Ìý | + | q <= '0' when reset_n = '0' else new_q when rising_edge(clk); |
- | beginÌý | + | |
- | if reset_n = '0' thenÌý | + | |
- | q <= '0';Ìý | + | |
- | elsif rising_edge(clk) thenÌý | + | |
- | q <= new_q; Ìý | + | |
- | end if;Ìý | + | |
- | end process ff_p; | + | |
new_q <= not q; | new_q <= not q; | ||
+ | end architecture rtl; | ||
+ | |||
+ | </code> | ||
+ | |||
+ | == Beispiel: Seltsamer Zähler == | ||
+ | |||
+ | Was macht die Schaltung in diesem folgenden Beispiel? Versuchen Sie zunächst die Funktion aus dem VHDL Code zu erarbeiten. | ||
+ | |||
+ | |||
+ | <code vhdl> | ||
+ | library ieee; | ||
+ | use ieee.std_logic_1164.all; | ||
+ | |||
+ | -- Strange Counter | ||
+ | |||
+ | entity strangecnt is | ||
+ | port ( | ||
+ | clk : in std_ulogic; | ||
+ | rst_n : in std_ulogic; | ||
+ | s_i : in std_ulogic; | ||
+ | cnt0_o : out std_ulogic; | ||
+ | cnt1_o : out std_ulogic); | ||
end; | end; | ||
+ | architecture rtl of strangecnt is | ||
+ | signal c0, c0_new : std_ulogic; | ||
+ | signal c1, c1_new : std_ulogic; | ||
+ | signal l : std_ulogic; | ||
+ | begin | ||
+ | | ||
+ | c0 <= '0' when rst_n = '0' else c0_new when rising_edge(clk); | ||
+ | c1 <= '0' when rst_n = '0' else c1_new when rising_edge(clk); | ||
+ | |||
+ | c0_new <= not c0; | ||
+ | l <= c0 xor c1; | ||
+ | cnt0_o <= c0; | ||
+ | cnt1_o <= c1 xor c0; | ||
+ | c1_new <= l when s_i = '1' else not l; | ||
+ | |||
+ | end architecture rtl; | ||
</code> | </code> | ||
+ | |||
+ | a) Zeichnen Sie die Schaltung! Handelt es sich um einen Moore oder Mealy Automaten? | ||
+ | |||
+ | b) Zeichnen Sie den Graphen! | ||
+ | |||
+ | c) Zeichnen Sie ein Timingdiagramm! | ||
+ | |||
+ | |||
+ | Dieses Codebeispiel ist funktional ein steuerbarer Zähler. Wenn s_i=0 ist, dann zählt der Zähler vorwärts, ansonsten rückwärts. Nur ist hier eine ungewöhnliche Zustandskodierung gewählt, die dann aber zusammen mit der Ausgangslogik den Zähler ergibt. | ||