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/] [HalfPrecision/] [exponent_align.vhd] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 bigsascha3
----------------------------------------------------------------------------------
2
-- Company: 
3
-- Engineer: 
4
-- 
5
-- Create Date:    09:32:21 02/06/2013 
6
-- Design Name: 
7
-- Module Name:    exponent_align - 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_SIGNED.all;
23
use ieee.std_logic_arith.all;
24
-- Uncomment the following library declaration if using
25
-- arithmetic functions with Signed or Unsigned values
26
--use IEEE.NUMERIC_STD.ALL;
27
 
28
-- Uncomment the following library declaration if instantiating
29
-- any Xilinx primitives in this code.
30
--library UNISIM;
31
--use UNISIM.VComponents.all;
32
 
33
entity exponent_align is
34
        generic (SIZE_EXP : natural := 5;
35
                                PIPELINE : natural := 2); -- nr of pipeline registers -- max 2
36
        port (clk, rst : in std_logic;
37
                        exp_a, exp_b : in std_logic_vector (SIZE_EXP - 1 downto 0);
38
                        exp_c : in std_logic_vector (SIZE_EXP - 1 downto 0);
39
                        align : out std_logic_vector (SIZE_EXP - 1 downto 0);
40
                        exp_int : out std_logic_vector (SIZE_EXP downto 0);
41
                        comp : out std_logic);
42
end exponent_align;
43
 
44
architecture Behavioral of exponent_align is
45
 
46
        component d_ff
47
                generic (N: natural := 8);
48
                port (clk, rst : in std_logic;
49
                                d : in std_logic_vector (N-1 downto 0);
50
                                q : out std_logic_vector (N-1 downto 0));
51
        end component;
52
 
53
        signal exp_a_x_b_bias : std_logic_vector(SIZE_EXP downto 0);
54
        signal exp_a_x_b_d1, exp_a_x_b_q1 : std_logic_vector (SIZE_EXP downto 0);
55
        signal exp_a_x_b_q2 : std_logic_vector (SIZE_EXP downto 0);
56
 
57
        signal exp_c_d1 : std_logic_vector (SIZE_EXP downto 0);
58
        signal exp_c_q1, exp_c_q2 : std_logic_vector (SIZE_EXP downto 0);
59
 
60
        signal exp_dif_d, exp_dif_q : std_logic_vector(SIZE_EXP downto 0);
61
 
62
        signal bias : std_logic_vector(SIZE_EXP downto 0);
63
 
64
begin
65
 
66
        bias_gen:
67
                for i in 0 to SIZE_EXP - 2 generate
68
                        one_bit : bias (i) <= '1';
69
                end generate;
70
 
71
        bias (SIZE_EXP downto SIZE_EXP - 1) <= "00";
72
 
73
        exp_a_x_b_bias <= ("0" & exp_a) + ("0" & exp_b);
74
        exp_a_x_b_d1 <= exp_a_x_b_bias;
75
 
76
        exp_c_d1 <= ("0" & exp_c) + bias;
77
 
78
        exp_dif_d <= exp_c_q1 - exp_a_x_b_q1;
79
 
80
 
81
        exp_int <= exp_c_q2 when exp_dif_q(SIZE_EXP) = '0' else
82
                                exp_a_x_b_q2;
83
 
84
        comp <= exp_dif_q(SIZE_EXP);
85
 
86
        align <= exp_dif_q (SIZE_EXP - 1 downto 0) when exp_dif_q(SIZE_EXP) = '0' else
87
                         -(exp_dif_q (SIZE_EXP - 1 downto 0));
88
 
89
        --PIPELINING
90
        ONE_STAGE:
91
                if (PIPELINE = 1) generate
92
                        A_X_B_1S : D_FF generic map (N => SIZE_EXP+1)
93
                                                                port map (clk => clk, rst => rst,
94
                                                                                d => exp_a_x_b_d1, q => exp_a_x_b_q1);
95
                        C_1S: D_FF generic map (N => SIZE_EXP + 1)
96
                                                                port map (clk => clk, rst => rst,
97
                                                                                d => exp_c_d1, q => exp_c_q1);
98
                        ASSIGN_A_X_B_1S : exp_a_x_b_q2 <= exp_a_x_b_q1;
99
                        ASSIGN_C_1S :   exp_c_q2 <= exp_c_q1;
100
                        ASSIGN_dif_1S : exp_dif_q <= exp_dif_d;
101
                end generate;
102
 
103
        TWO_STAGE:
104
                if (PIPELINE = 2) generate
105
                        A_X_B_2S_1 : D_FF generic map (N => SIZE_EXP+1)
106
                                                                port map (clk => clk, rst => rst,
107
                                                                                d => exp_a_x_b_d1, q => exp_a_x_b_q1);
108
                        C_2S_1: D_FF generic map (N => SIZE_EXP+1)
109
                                                                port map (clk => clk, rst => rst,
110
                                                                                d => exp_c_d1, q => exp_c_q1);
111
                        A_X_B_2S_2 : D_FF generic map (N => SIZE_EXP+1)
112
                                                                port map (clk => clk, rst => rst,
113
                                                                                d => exp_a_x_b_q1, q => exp_a_x_b_q2);
114
                        C_2S_2: D_FF generic map (N => SIZE_EXP+1)
115
                                                                port map (clk => clk, rst => rst,
116
                                                                                d => exp_c_q1, q => exp_c_q2);
117
                        DIF_2S : D_FF generic map (N => SIZE_EXP+1)
118
                                                                port map (clk => clk, rst => rst,
119
                                                                                d => exp_dif_d, q => exp_dif_q);
120
                end generate;
121
 
122
        NO_STAGE:
123
                if (PIPELINE = 0) generate
124
                        ASSIGN_A_X_B_NOS_1 : exp_a_x_b_q1 <= exp_a_x_b_d1;
125
                        ASSIGN_C_NOS_1 :        exp_c_q1 <= exp_c_d1;
126
                        ASSIGN_A_X_B_NOS_2 : exp_a_x_b_q2 <= exp_a_x_b_q1;
127
                        ASSIGN_C_NOS_2 :        exp_c_q2 <= exp_c_q1;
128
                        ASSIGN_dif_NOS : exp_dif_q <= exp_dif_d;
129
                end generate;
130
 
131
 
132
end Behavioral;
133
 

powered by: WebSVN 2.1.0

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