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; |
| + | </code> | ||
| + | |||
| + | 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. | ||