====== SHIFTERs library ====== The SHIFTERs library consists of the following 4 generic components: * [[.:shifters#siso]]: N-bit serial-in / serial-out register * [[.:shifters#piso]]: N-bit serial & parallel-in / serial-out register * [[.:shifters#sispo]]: N-bit serial-in / serial & parallel-out register * [[.:shifters#spispo]]: N-bit serial & parallel-in / serial & parallel-out register The SHIFTERs library can be verified with this testbench: [[.:shifters#testbench|test_shifters]] ===== siso ===== -- ############################################################################ -- # Project : Leonardo CBT-Kernel # -- # # -- # Filename : shifters.vhd # -- # # -- # Component : siso : Serial in - Serial Out shift register with # -- # direction control. # -- # # -- # Model : rtl # -- # # -- # Designer : S. Theoharis,N. Zervas # -- # Institute : VLSI Design Lab., University of Patras # -- # Date : 01.05.1999 # -- ############################################################################ library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_arith.all; -- siso Entity Description ENTITY siso IS GENERIC(x : INTEGER := 8); PORt( CLK,R,DIR_R,SE,SI: in std_ulogic; SO: out std_ulogic ); END siso; -- siso Architecture Description ARCHITECTURE rtl OF siso IS SIGNAL pre_Q : std_ulogic_vector((x-1) DOWNTO 0) := (OTHERS => 'X'); begin SHIFT_REGISTER_Process: process(CLK,R) BEGIN IF (R = '1') THEN pre_Q <= (OTHERS => '0'); ELSIF (CLK'event AND (CLK = '1') AND (CLK'last_value = '0')) THEN IF (SE = '1') AND (DIR_R = '1') THEN pre_Q(x-1) <= SI; pre_Q((x-2) DOWNTO 0) <= pre_Q((x-1) DOWNTO 1); ELSIF (SE = '1') AND (DIR_R = '0') THEN pre_Q((x-1) DOWNTO 1) <= pre_Q((x-2) DOWNTO 0); pre_Q(0) <= SI; END IF; END IF; END process SHIFT_REGISTER_Process; SO <= pre_Q(0) WHEN DIR_R = '1' ELSE pre_Q(x-1) WHEN DIR_R = '0' ELSE 'X'; END rtl; ===== piso ===== -- ############################################################################ -- # Project : Leonardo CBT-Kernel # -- # # -- # Filename : shifters.vhd # -- # # -- # Component : piso : Parallel in - Serial Out shift register with # -- # direction control. # -- # # -- # Model : rtl # -- # # -- # Designer : S. Theoharis,N. Zervas # -- # Institute : VLSI Design Lab., University of Patras # -- # Date : 01.05.1999 # -- ############################################################################ library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_arith.all; --************************** -- piso Entity Description * --************************** ENTITY piso IS GENERIC(x : INTEGER := 8); PORt( DIN: IN std_ulogic_vector(x-1 DOWNTO 0); CLK,LD,R,DIR_R,SE: IN STD_ULOGIC; SO: OUT STD_ULOGIC ); END piso; -- piso Architecture Description ARCHITECTURE rtl of PISO IS SIGNAL pre_Q : std_ulogic_vector((x-1) DOWNTO 0) := (OTHERS => 'X'); BEGIN SHIFT_REGISTER_Process: PROCESS(CLK,R) BEGIN IF (R = '1') THEN pre_Q <= (OTHERS => '0'); ELSIF (CLK'event and (CLK = '1') AND (CLK'last_value = '0')) THEN IF (LD = '1') THEN pre_Q <= DIN; ELSIF (SE = '1') AND (DIR_R = '1') THEN pre_Q(x-1) <= '0'; pre_Q((x-2) DOWNTO 0) <= pre_Q((x-1) DOWNTO 1); ELSIF (SE = '1') AND (DIR_R = '0') THEN pre_Q((x-1) DOWNTO 1) <= pre_Q((x-2) DOWNTO 0); pre_Q(0) <= '0'; END IF; END IF; END PROCESS SHIFT_REGISTER_Process; SO <= pre_Q(0) WHEN DIR_R = '1' ELSE pre_Q(x-1) WHEN DIR_R = '0' ELSE 'X'; END rtl; ===== sispo ===== -- ############################################################################ -- # Project : Leonardo CBT-Kernel # -- # # -- # Filename : shifters.vhd # -- # # -- # Component : sispo : Serial in - Serial/Parallel Out shift register # -- # with direction control. # -- # # -- # Model : rtl # -- # # -- # Designer : S. Theoharis,N. Zervas # -- # Institute : VLSI Design Lab., University of Patras # -- # Date : 01.05.1999 # -- ############################################################################ library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_arith.all; -- sispo Entity Description ENTITY sispo IS GENERIC(x : INTEGER := 8); port( DOUT: OUT std_ulogic_vector((x-1) DOWNTO 0); CLK,R,DIR_R,SE,SI: IN STD_ULOGIC; SO: OUT STD_ULOGIC ); END sispo; -- sispo Architecture Description ARCHITECTURE rtl OF sispo IS SIGNAL pre_Q : std_ulogic_vector((x-1) DOWNTO 0) := (OTHERS => 'X'); BEGIN SHIFT_REGISTER_Process: PROCESS(CLK,R) BEGIN IF (R = '1') THEN pre_Q <= (OTHERS => '0'); ELSIF (CLK'event AND (CLK = '1') AND (CLK'last_value = '0')) THEN IF (SE = '1') AND (DIR_R = '1') THEN pre_Q((x-1)) <= SI; pre_Q((x-2) DOWNTO 0) <= pre_Q((x-1) DOWNTO 1); ELSIF (SE = '1') AND (DIR_R = '0') THEN pre_Q((x-1) DOWNTO 1) <= pre_Q((x-2) DOWNTO 0); pre_Q(0) <= SI; END IF; END IF; END PROCESS SHIFT_REGISTER_Process; -- Assign outputs DOUT <= pre_Q; SO <= pre_Q(0) WHEN DIR_R = '1' ELSE pre_Q((x-1)) WHEN DIR_R = '0' ELSE 'X'; end rtl; ===== spispo ===== -- ############################################################################ -- # Project : Leonardo CBT-Kernel # -- # # -- # Filename : shifters.vhd # -- # # -- # Component : spispo : Serial/Parallel In/Out shift register # -- # with direction control. # -- # # -- # Model : rtl # -- # # -- # Designer : S. Theoharis,N. Zervas # -- # Institute : VLSI Design Lab., University of Patras # -- # Date : 01.05.1999 # -- ############################################################################ library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_arith.all; -- spispo Entity Description ENTITY spispo IS GENERIC(x : INTEGER := 8); port( DIN: IN std_ulogic_vector((x-1) DOWNTO 0); DOUT: OUT std_ulogic_vector((x-1) DOWNTO 0); CLK,LD,R,DIR_R,SE,SI: IN STD_ULOGIC; SO: OUT STD_ULOGIC ); END spispo; -- spisp Architecture Description ARCHITECTURE rtl OF spispo IS SIGNAL pre_Q : std_ulogic_vector((x-1) DOWNTO 0) := (OTHERS => 'X'); BEGIN SHIFT_REGISTER_Process: PROCESS(CLK,R) BEGIN IF (R = '1') THEN pre_Q <= (OTHERS => '0'); ELSIF (CLK'event AND (CLK = '1') AND (CLK'last_value = '0')) THEN IF (LD = '1') THEN pre_Q <= DIN; ELSIF (SE = '1') AND (DIR_R = '1') THEN pre_Q((x-1)) <= SI; pre_Q((x-2) DOWNTO 0) <= pre_Q((x-1) DOWNTO 1); ELSIF (SE = '1') AND (DIR_R = '0') THEN pre_Q((x-1) DOWNTO 1) <= pre_Q((x-2) DOWNTO 0); pre_Q(0) <= SI; END IF; END IF; END PROCESS SHIFT_REGISTER_Process; -- Assign outputs DOUT <= pre_Q; SO <= pre_Q(0) WHEN DIR_R = '1' ELSE pre_Q((x-1)) WHEN DIR_R = '0' ELSE 'X'; END rtl; ===== Testbench ===== -- ############################################################################ -- # Project : Leonardo CBT-Kernel # -- # # -- # Filename : test_shifters.vhd # -- # # -- # Component : test_shifters : Test Bench for various shifters. # -- # # -- # Model : rtl # -- # # -- # Designer : S. Theoharis,N. Zervas # -- # Institute : VLSI Design Lab., University of Patras # -- # Date : 01.05.1999 # -- ############################################################################ library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_arith.all; entity test_shifters IS END test_shifters; ARCHITECTURE rtl OF test_shifters IS COMPONENT pis GENERIC(x : INTEGER); PORT( DIN: in std_ulogic_vector (x-1 DOWNTO 0); LD,CLK,R,DIR_R,SE: in std_ulogic; SO: out std_ulogic ); END COMPONENT; COMPONENT sis GENERIC(x : INTEGER); PORT( CLK,R,DIR_R,SE,SI: in std_ulogic; SO: out std_ulogic ); END COMPONENT; COMPONENT sisp GENERIC(x : INTEGER); PORt( DOUT: OUT STD_ULOGIC_VECTOR ( x-1 DOWNTO 0); CLK,R,DIR_R,SE,SI: in std_ulogic; SO: out std_ulogic ); END COMPONENT; COMPONENT spisp GENERIC(x : INTEGER); PORt( DIN: in std_ulogic_vector (x-1 DOWNTO 0); DOUT: OUT STD_ULOGIC_VECTOR ( x-1 DOWNTO 0); LD,CLK,R,DIR_R,SE,SI: in std_ulogic; SO: out std_ulogic ); END COMPONENT; FOR siso : sis USE ENTITY WORK.siso(rtl); FOR piso : pis USE ENTITY WORK.piso(rtl); FOR sispo : sisp USE ENTITY WORK.sispo(rtl); FOR spispo : spisp USE ENTITY WORK.spispo(rtl); SIGNAL CLK : std_ulogic := '0'; SIGNAL R : std_ulogic; SIGNAL DIR_R : std_ulogic; SIGNAL LD : std_ulogic; SIGNAL SE : std_ulogic; SIGNAL SI : std_ulogic; SIGNAL SO1 : std_ulogic; SIGNAL SO2 : std_ulogic; SIGNAL SO3 : std_ulogic; SIGNAL SO4 : std_ulogic; SIGNAL DIN : std_ulogic_vector( 7 DOWNTO 0); SIGNAL DOUT1 : std_ulogic_vector( 7 DOWNTO 0); SIGNAL DOUT2 : std_ulogic_vector( 7 DOWNTO 0); BEGIN piso: pis GENERIC MAP (x => 8) PORT MAP ( DIN => DIN, CLK => CLK, R => R, DIR_R => DIR_R, SE => SE, LD => LD, SO => SO1 ); siso: sis GENERIC MAP (x => 8) PORT MAP ( CLK => CLK, R => R, DIR_R => DIR_R, SI => SI, SE => SE, SO => SO2 ); sispo: sisp GENERIC MAP (x => 8) PORT MAP ( DOUT => DOUT1, CLK => CLK, R => R, DIR_R => DIR_R, SI => SI, SE => SE, SO => SO3 ); spispo: spisp GENERIC MAP (x => 8) PORT MAP ( DIN => DIN, DOUT => DOUT2, CLK => CLK, R => R, DIR_R => DIR_R, SI => SI, SE => SE, LD => LD, SO => SO4 ); SI <= '1' AFTER 40 ns, '0' AFTER 60 ns, '1' AFTER 80 ns, '0' AFTER 100 ns, '1' AFTER 120 ns, '0' AFTER 140 ns, '1' AFTER 160 ns; DIN <= "01010101" AFTER 50 ns; LD <= '1' AFTER 60 ns, '0' AFTER 80 ns; SE <= '1' AFTER 180 ns, '0' AFTER 340 ns; R <= '1' AFTER 20 ns, '0' AFTER 40 ns; DIR_R <= '1' AFTER 180 ns, '0' AFTER 220 ns; CLK <= NOT CLK AFTER 10 ns; END rtl;