フリップフロップは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;