Differences
This shows you the differences between two versions of the page.
| Next revision | Previous revision | ||
| dt-code-sequ [2011/01/10 13:10] – created beckmanf | dt-code-sequ [2014/01/08 11:02] (current) – flipflop process -> concurrent beckmanf | ||
|---|---|---|---|
| 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 " | ||
| + | wenn das Signal " | ||
| Line 13: | Line 16: | ||
| in_i : | in_i : | ||
| 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_i : | ||
| + | out_o : out std_ulogic); | ||
| + | end entity flipflop; | ||
| + | |||
| + | architecture rtl of fliplfop is | ||
| + | signal q : std_ulogic; | ||
| + | begin | ||
| + | |||
| + | q <= ' | ||
| + | |||
| + | out_o <= q; | ||
| + | end architecture rtl; | ||
| </ | </ | ||
| | | ||
| == 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 |
| <code vhdl> | <code vhdl> | ||
| Line 45: | Line 69: | ||
| begin | begin | ||
| - | ff_p : process(clk, | + | q <= ' |
| - | begin | + | |
| - | if reset_n | + | |
| - | q <= ' | + | |
| - | elsif rising_edge(clk) | + | |
| - | q <= new_q; | + | |
| - | end if; | + | |
| - | end process ff_p; | + | |
| new_q <= not q; | new_q <= not q; | ||
| + | end architecture rtl; | ||
| + | |||
| + | </ | ||
| + | |||
| + | == 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 | ||
| + | cnt1_o | ||
| 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 <= ' | ||
| + | c1 <= ' | ||
| + | |||
| + | c0_new <= not c0; | ||
| + | l <= c0 xor c1; | ||
| + | cnt0_o <= c0; | ||
| + | cnt1_o <= c1 xor c0; | ||
| + | c1_new <= l when s_i = ' | ||
| + | |||
| + | end architecture rtl; | ||
| </ | </ | ||
| + | |||
| + | 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. | ||