OpenCores
URL https://opencores.org/ocsvn/xilinx_virtex_fp_library/xilinx_virtex_fp_library/trunk

Subversion Repositories xilinx_virtex_fp_library

[/] [xilinx_virtex_fp_library/] [trunk/] [SinglePrecision/] [shift.vhd] - Blame information for rev 16

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 bigsascha3
----------------------------------------------------------------------------------
2
-- Company: 
3
-- Engineer: 
4
-- 
5
-- Create Date:    19:08:09 02/02/2013 
6
-- Design Name: 
7
-- Module Name:    right_shift - Behavioral 
8
-- Project Name: 
9
-- Target Devices: 
10
-- Tool versions: 
11
-- Description: 
12
--
13
-- Dependencies: 
14
--
15
-- Revision: 
16
-- Revision 0.01 - File Created
17
-- Additional Comments: 
18
--
19
----------------------------------------------------------------------------------
20
library IEEE;
21
use IEEE.STD_LOGIC_1164.ALL;
22
use IEEE.std_logic_unsigned.all;
23
use IEEE.numeric_std.all;
24
use IEEE.math_real.all;
25
 
26
 
27
-- Uncomment the following library declaration if using
28
-- arithmetic functions with Signed or Unsigned values
29
--use IEEE.NUMERIC_STD.ALL;
30
 
31
-- Uncomment the following library declaration if instantiating
32
-- any Xilinx primitives in this code.
33
--library UNISIM;
34
--use UNISIM.VComponents.all;
35
 
36
entity shift is
37
        generic (INPUT_SIZE : natural := 13;
38
                                SHIFT_SIZE : natural := 4;
39
                                OUTPUT_SIZE : natural := 24;
40
                                DIRECTION : natural := 1;  -- 1 for left shift; 0 for right shift
41
                                PIPELINE : natural := 1; -- 1 if pipelined , 0 no pipeline
42
                                POSITION : std_logic_vector(7 downto 0) := "00000100"); -- the position of pipeline registers
43
        port (clk, rst : in std_logic;
44
                        a : in std_logic_vector (INPUT_SIZE - 1 downto 0);
45
                        arith : in std_logic;
46
                        shft : in std_logic_vector (SHIFT_SIZE - 1 downto 0);
47
                        shifted_a : out std_logic_vector (OUTPUT_SIZE - 1 downto 0));
48
end shift;
49
 
50
architecture Behavioral of shift is
51
 
52
        type shift_results is array (0 to SHIFT_SIZE) of std_logic_vector(OUTPUT_SIZE - 1 downto 0);
53
 
54
        component d_ff
55
                generic (N: natural := 8);
56
                port (clk, rst : in std_logic;
57
                                d : in std_logic_vector (N-1 downto 0);
58
                                q : out std_logic_vector (N-1 downto 0));
59
        end component;
60
 
61
 
62
        signal a_temp_d : shift_results;
63
        signal a_temp_q : shift_results;
64
 
65
begin
66
 
67
        a_temp_q (0) (OUTPUT_SIZE - 1 downto OUTPUT_SIZE - INPUT_SIZE) <= a;
68
        a_temp_q (0) (OUTPUT_SIZE - 1 - INPUT_SIZE downto 0) <= (others => arith);
69
 
70
        BARREL_SHIFTER_GENERATION:
71
                for i in 0 to SHIFT_SIZE - 1 generate
72
                        LEFT : if DIRECTION = 1 generate
73
                                                MUX_GEN_L:
74
                                                        for j in 0 to OUTPUT_SIZE - 1 generate
75
                                                                ZERO_INS_L:
76
                                                                        if j < 2**i generate
77
                                                                                MUX_L1: a_temp_d(i)(j) <= a_temp_q(i)(j) when shft(i) = '0' else
78
                                                                                                                                                arith;
79
                                                                        end generate ZERO_INS_L;
80
 
81
                                                                BIT_INS_L:
82
                                                                        if j >= 2**i generate
83
                                                                                MUX_L2: a_temp_d(i)(j) <= a_temp_q(i)(j) when shft(i) = '0' else
84
                                                                                                                                                a_temp_q(i)(j-2**i);
85
                                                                        end generate BIT_INS_L;
86
                                                        end generate MUX_GEN_L;
87
                        end generate LEFT;
88
 
89
                        RIGHT : if DIRECTION = 0 generate
90
                                MUX_GEN_R:
91
                                                        for j in 0 to OUTPUT_SIZE - 1 generate
92
                                                                ZERO_INS_R:
93
                                                                        if OUTPUT_SIZE - 1 < 2**i + j generate
94
                                                                                MUX_R1: a_temp_d(i)(j) <= a_temp_q(i)(j) when shft(i) = '0' else
95
                                                                                                                                                arith;
96
                                                                        end generate ZERO_INS_R;
97
 
98
                                                                BIT_INS_R:
99
                                                                        if  OUTPUT_SIZE - 1 >= 2**i + j generate
100
                                                                                MUX_R2: a_temp_d(i)(j) <= a_temp_q(i)(j) when shft(i) = '0' else
101
                                                                                                                                                a_temp_q(i)(j+2**i);
102
                                                                        end generate BIT_INS_R;
103
 
104
                                        end generate MUX_GEN_R;
105
                        end generate RIGHT;
106
 
107
                        PIPELINE_INSERTION:
108
                                if PIPELINE /= 0 generate
109
                                                        LATCH :
110
                                                                        if (POSITION (i) = '1') generate
111
                                                                                D_INS: d_ff     generic map (N => OUTPUT_SIZE)
112
                                                                                                                        port map ( clk => clk, rst => rst,
113
                                                                                                                                d => a_temp_d(i), q => a_temp_q(i+1));
114
                                                                        end generate LATCH;
115
                                                        NO_LATCH:
116
                                                                        if (POSITION (i) = '0' ) generate
117
                                                                                ASSIGN : a_temp_q(i+1) <= a_temp_d(i);
118
                                                                        end generate NO_LATCH;
119
 
120
                                end generate PIPELINE_INSERTION;
121
 
122
                        NO_PIPELINE:
123
                                if PIPELINE = 0 generate
124
                                        NO_INS: a_temp_q(i+1) <= a_temp_d(i);
125
                                end generate NO_PIPELINE;
126
 
127
                end generate BARREL_SHIFTER_GENERATION;
128
 
129
        shifted_a <= a_temp_q(SHIFT_SIZE);
130
 
131
 
132
 
133
end Behavioral;
134
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.