[[dt-code-sequ]]

VHDL Code für sequentielle Schaltungen

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. 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.

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
 
ff_p : process(clk, reset_n)
begin
  if reset_n = '0' then
    q <= '0';
  elsif rising_edge(clk) then
    q <= in_i;
  end if;
end process ff_p;
 
out_o <= q; 
 
end architecture rtl; 

Ein Flipflop kann alternativ mit einem concurrent statement beschrieben werden.

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; 
Flipflop, dessen Zustand in jedem Takt invertiert wird

In diesem Bespiel wird der Ausgang des Flipflops mit einem Inverter an den Eingang zurückgeführt.

architecture rtl of toggle-flip-flop is
  signal q     : std_ulogic;
  signal new_q : std_ulogic;
begin
 
q <= '0' when reset_n = '0' else new_q when rising_edge(clk); 
 
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.

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; 
 
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; 

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.

  • dt-code-sequ.txt
  • Last modified: 2014/01/08 11:02
  • by beckmanf