FF

フリップフロップはprocess 文で表しますが、ここで独立して取り上げます。
process文の()内にはクロックと非同期入力のみ入り、それ以外の入力はクロックの立ち上がりで変化します。


例としてJKフリップフロップの全プログラムを下に示します。
if と case 両命令を使います。

library IEEE;
use IEEE.std_logic_1164.all;

entity jkFf is
 port (
    Clk   : in std_logic;
    Rst_n  : in std_logic;
    J    : in std_logic;
    K    : in std_logic;
    Qout  : out std_logic);
end jkFf;

architecture RTL of jkFf is

 signal q   : std_logic;
 signal jk  : std_logic_vector (1 downto 0);

begin

 Qout <= q;
 jk <= J & K;

 process (Rst_n, Clk) begin       --()内にはクロックと非同期入力のみ入る
  if Rst_n = '0' then
   q <= '0';              --非同期入力設定
  elsif (clk'event and clk='1') then  --以降はクロックの立ち上がり時にのみ変わる
   case jk is
    when "00"   => q  <= q;
    when "01"   => q  <= '0';
    when "10"   => q  <= '1';
    when "11"   => q  <= not q;
    when others  => q  <= q;
   end case;
  end if;
 end process;

end RTL;


もう1つ、上位階層からビット数を指定できるカウンタの全文を書きます。

library ieee;
 use ieee.std_logic_1164.all;
 use ieee.std_logic_unsigned.all;
 use ieee.std_logic_misc.all;

entity Ncuntr is
 generic ( n : integer :=1);

 port (
    Clk   : in std_logic;
    Rst_n  : in std_logic;   --system asynchronous reset
    Syncz_n : in std_logic;   --synchronous all 0 negative
    Cnten  : in std_logic;   --counter enable
    Qout  : out std_logic_vector (n-1 downto 0)
    Carry  :out  std_logic);

end Ncuntr;

architecture RTL of n_cuntr is

 signal q   : std_logic_vector (n-1 downto 0);

 begin

  Qout <= q;
  Carry <= and_reduce(q);

 process (reset, clk) begin
  if Rst_n  = '0' then
   q  <= (others => '0');
  elsif (clk'event and clk='1') then
   if (Syncz_n = '0') then
    q  <= (others  => '0');
   elsif (cnten = '1') then
    q  <= q + '1';
   end if;
  end if;
 end process;

end RTL;


VHDL目次          MAIL  HOME