Example: Shifter
Shifter.VHD
-------------------------------------------------------
-- 8-bit barrel shifter
--
-- This example circuit demonstrates the behavior level
-- of abstraction. The operation of the barrel shifter
-- is described as the circuit's response to stimulus
-- (such as clock and reset events) over time.
--
-- This circuit is synthesizable. To test the circuit with
-- the supplied test bench (testshif.vhd), be sure to
-- compile this source file into library 'work'.
--
-- Copyright 1995, Accolade Design Automation, Inc.
--
library ieee;
use ieee.std_logic_1164.all;
entity shifter is
port( Clk, Rst, Load: in std_ulogic;
Data: std_ulogic_vector(0 to 7);
Q: out std_ulogic_vector(0 to 7));
end shifter;
architecture behavior of shifter is
begin
-- We use a process to describe the operation of
-- the shifter over time, in response to its inputs...
reg: process(Rst,Clk)
-- Using a variable simplifies register feedback...
variable Qreg: std_ulogic_vector(0 to 7);
begin
if Rst = '1' then -- Async reset
Qreg := "00000000";
elsif rising_edge(Clk) then
if Load = '1' then
Qreg := Data;
else
Qreg := Qreg(1 to 7) & Qreg(0);
end if;
end if;
Q <= Qreg;
end process;
end behavior;
Testshif.VHD
-------------------------------------------------------
-- Test bench for 8-bit barrel shifter
--
-- Copyright 1995, Accolade Design Automation, Inc.
--
library ieee; use ieee.std_logic_1164.all;
use work.all; -- Get the shifter out of library 'work'
entity testrot is
end testrot;
architecture stimulus of testrot is
component shifter
port(Clk, Rst, Load: in std_ulogic;
Data: std_ulogic_vector(0 to 7);
Q: out std_ulogic_vector(0 to 7));
end component;
--
constant PERIOD: time := 40 ns;
--
signal Clk,Rst,Load: std_ulogic;
signal Data: std_ulogic_vector(0 to 7);
signal Q: std_ulogic_vector(0 to 7);
--
begin
DUT: shifter port map(Clk,Rst,Load,Data,Q);
-- This test bench uses two processes to describe
-- the stimulus. This first process describes a
-- constantly running clock of 40 ns cycle time...
CLOCK: process
begin
Clk <= '1';
wait for PERIOD / 2;
Clk <= '0';
wait for PERIOD / 2;
end process;
-- This process applies a sequence of inputs to the
-- circuit to exercise this shift and load features...
INPUTS: process
begin
wait for PERIOD / 2;
Rst <= '1';
Data <= "00000000";
Load <= '0';
wait for PERIOD;
Rst <= '0';
wait for PERIOD;
Data <= "00001111";
Load <= '1';
wait for PERIOD;
Load <= '0';
wait for PERIOD * 4;
Rst <= '1';
Data <= "00000000";
Load <= '0';
wait for PERIOD;
Rst <= '0';
wait for PERIOD;
Data <= "10101010";
Load <= '1';
wait for PERIOD;
Load <= '0';
wait for PERIOD * 4;
Rst <= '1';
Data <= "00000000";
Load <= '0';
wait for PERIOD;
Rst <= '0';
wait for PERIOD;
Data <= "10000001";
Load <= '1';
wait for PERIOD;
Load <= '0';
wait for PERIOD * 4;
wait;
end process;
end stimulus;