移位暫存器
通用長度的移位暫存器。序列輸入和序列輸出。
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity SHIFT_REG is
generic(
LENGTH: natural := 8
);
port(
SHIFT_EN : in std_logic;
SO : out std_logic;
SI : in std_logic;
clk : in std_logic;
rst : in std_logic
);
end entity SHIFT_REG;
architecture Behavioral of SHIFT_REG is
signal reg : std_logic_vector(LENGTH-1 downto 0) := (others => '0');
begin
main_process : process(clk) is
begin
if rising_edge(clk) then
if rst = '1' then
reg <= (others => '0');
else
if SHIFT_EN = '1' then
--Shift
reg <= reg(LENGTH-2 downto 0) & SI;
else
reg <= reg;
end if;
end if;
end if;
end process main_process;
SO <= reg(LENGTH-1);
end architecture Behavioral;
對於平行輸出,
--In port
DOUT: out std_logic_vector(LENGTH-1 downto 0);--In architecture
DOUT <= REG;
移位暫存器,帶方向控制,並聯負載,並聯輸出。 (使用 Variable 而不是 signal)
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity SHIFT_REG_UNIVERSAL is
generic(
LENGTH : integer := 8
);
port(
DIN : in std_logic_vector(LENGTH - 1 downto 0);
DOUT : out std_logic_vector(LENGTH - 1 downto 0);
MODE : in std_logic_vector(1 downto 0);
SI : in std_logic;
clk : in std_logic;
rst : in std_logic
);
end entity SHIFT_REG_UNIVERSAL;
architecture RTL of SHIFT_REG_UNIVERSAL is
begin
main : process(clk, rst) is
variable reg : std_logic_vector(LENGTH - 1 downto 0) := (others => '0');
begin
if rst = '1' then
reg := (others => '0');
elsif rising_edge(clk) then
case MODE is
when "00" =>
-- Hold Value
reg := reg;
when "01" =>
-- Shift Right
reg := SI & reg(LENGTH - 1 downto 1);
when "10" =>
-- Shift Left
reg := reg(LENGTH - 2 downto 0) & SI;
when "11" =>
-- Parallel Load
reg := DIN;
when others =>
null;
end case;
end if;
DOUT <= reg;
end process main;
end architecture RTL;