【VHDL】シフトレジスタの記述方法

FPGAで回路を記述する際、タイミングを調整したり、同期化したりするためにシフトレジスタを使用することはよくあります。

その記述方法ですが、初めて自分がRTL記述したときには次のような方法でした。

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

entity shift_reg0 is
	port	(
        srstn_i : in    std_logic;
        clk_i   : in    std_logic;
        data_i  : in    std_logic;
        data_o  : out   std_logic
		);
end shift_reg0;

architecture rtl of shift_reg0 is

signal data_ff      :   std_logic;
signal data_2ff     :   std_logic;
signal data_3ff     :   std_logic;
signal data_4ff     :   std_logic;
signal data_5ff     :   std_logic;

begin

process (clk_i) begin
    if (rising_edge(clk_i)) then
        if (srstn_i = '0') then
            data_ff     <= '0';
            data_2ff    <= '0';
            data_3ff    <= '0';
            data_4ff    <= '0';
            data_5ff    <= '0';
        else
            data_ff     <= data_i;
            data_2ff    <= data_ff;
            data_3ff    <= data_2ff;
            data_4ff    <= data_3ff;
            data_5ff    <= data_4ff;
        end if;
    end if;
end process;

data_o  <= data_5ff;

end rtl;

次に今の書き方です。

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

entity shift_reg1 is
	port	(
        srstn_i : in    std_logic;
        clk_i   : in    std_logic;
        data_i  : in    std_logic;
        data_o  : out   std_logic
		);
end shift_reg1;

architecture rtl of shift_reg1 is

signal data_ff  :   std_logic_vector (4 downto 0);

begin

process (clk_i) begin
    if (rising_edge(clk_i)) then
        if (srstn_i = '0') then
            data_ff <= (others => '0');
        else
            data_ff <= data_ff(3 downto 0) & data_i;
        end if;
    end if;
end process;

data_o  <= data_ff(4);

end rtl;

記述量が大幅に減ってミスがなくなりますし、修正もしやすいのでこのような書き方にしています。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする