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

Subversion Repositories raytrac

[/] [raytrac/] [trunk/] [fpbranch/] [unrm/] [shftr.vhd] - Blame information for rev 107

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

Line No. Rev Author Line
1 106 jguarin200
library ieee;
2
use ieee.std_logic_1164.all;
3
 
4
 
5
 
6
entity shftr is
7
        port (
8 107 jguarin200
                sgndelta,signa,sgnb             : in std_logic;
9
                places  : in std_logic_vector (4 downto 0);
10
                data24a,data24b : in std_logic_vector (22 downto 0);
11 106 jguarin200
                data40  : out std_logic_vector (39 downto 0)
12
        );
13
end shftr;
14
 
15
 
16
architecture shftr_arch of shftr is
17
 
18
        component lpm_mult
19
        generic (
20
                lpm_hint                        : string;
21
                lpm_representation      : string;
22
                lpm_type                        : string;
23
                lpm_widtha                      : natural;
24
                lpm_widthb                      : natural;
25
                lpm_widthp                      : natural
26
        );
27
        port (
28
                dataa   : in std_logic_vector ( lpm_widtha-1 downto 0 );
29
                datab   : in std_logic_vector ( lpm_widthb-1 downto 0 );
30
                result  : out std_logic_vector( lpm_widthp-1 downto 0 )
31
        );
32
        end component;
33
 
34 107 jguarin200
        signal pha,phb : std_logic_vector(26 downto 0);
35
        signal sfactora,sfactorb,sfactor : std_logic_vector(8 downto 0);
36
        signal sma,smb,ssma,ssmb,ssm : std_logic_vector(24 downto 0);
37
        signal slaba,slabb : std_logic_vector(14 downto 0);
38
        signal shiftslab : std_logic_vector(23 downto 0);
39
        signal xplaces,splaces : std_logic_vector (4 downto 0);
40 106 jguarin200
 
41
begin
42
 
43 107 jguarin200
        --! Decodificar la magnitud del corrimiento
44
        process (sgndelta,places,signa,signb)
45 106 jguarin200
        begin
46 107 jguarin200
                for i in 4 downto 0 loop
47
                        xplaces(i) <= places(i) xor sgndelta;
48
                end loop;
49
                splaces  <= xplaces+("0000"&sgndelta);
50
                if sgndelta='1' then
51
                        shiftslab <= signa;
52
                else
53
                        shiftslab <= signb;
54
                end if;
55
        end process;
56
        --! Decodificar el factor de corrimiento
57
        process (shftslab,splaces)
58
        begin
59
                case splaces(2 downto 0) is
60
                        when x"0" => sfactor(8 downto 0) <= shiftslab(0 downto 0) & "10000000";
61
                        when x"1" => sfactor(8 downto 0) <= shiftslab(1 downto 0) & "1000000";
62
                        when x"2" => sfactor(8 downto 0) <= shiftslab(2 downto 0) & "100000";
63
                        when x"3" => sfactor(8 downto 0) <= shiftslab(3 downto 0) & "10000";
64
                        when x"4" => sfactor(8 downto 0) <= shiftslab(4 downto 0) & "1000";
65
                        when x"5" => sfactor(8 downto 0) <= shiftslab(5 downto 0) & "100";
66
                        when x"6" => sfactor(8 downto 0) <= shiftslab(6 downto 0) & "10";
67
                        when others => sfactor(8 downto 0) <=shiftslab(7 downto 0) &"1";
68 106 jguarin200
                end case;
69
        end process;
70 107 jguarin200
        --! Asignar el factor de corrimiento  las mantissas
71
        process (sgndelta,signa,signb)
72 106 jguarin200
        begin
73
 
74
 
75 107 jguarin200
 
76
                case sgndelta is
77
                        when '1' => -- Negativo b>a : se corre a delta espacios a la derecha y b se queda quieto
78
                                sfactorb <= signb&"10000000";
79
                                sfactora <= sfactor;
80
                        when others => -- Positivo a>=b : se corre a delta espacios a la derecha y a se queda quieto
81
                                sfactorb <= sfactor;
82
                                sfactora <= signa&"10000000";
83
                end case;
84 106 jguarin200
 
85 107 jguarin200
                slaba <= (others => signa);
86
                slabb <= (others => signb);
87
 
88
 
89
        end process
90
 
91
 
92
 
93
        --! Correr las mantissas y calcularlas.
94
 
95
        hmulta: lpm_mult
96
        generic map ("DEDICATED_MULTIPLIER_CIRCUITRY=YES,MAXIMIZE_SPEED=9","SIGNED","LPM_MULT",9,18,27)
97
        port    map (sfactora,signa&'1'&data24a(22 downto 0),pha);
98
        lmulta: lpm_mult
99
        generic map ("DEDICATED_MULTIPLIER_CIRCUITRY=YES,MAXIMIZE_SPEED=9","SIGNED","LPM_MULT",9,9,27)
100
        port    map (sfactora,signa&'1'&data24a(6 downto 0),pla);
101
        hmultb: lpm_mult
102
        generic map ("DEDICATED_MULTIPLIER_CIRCUITRY=YES,MAXIMIZE_SPEED=9","SIGNED","LPM_MULT",9,18,27)
103
        port    map (sfactorb,signb&'1'&data24b(22 downto 0),phb);
104
        lmultb: lpm_mult
105
        generic map ("DEDICATED_MULTIPLIER_CIRCUITRY=YES,MAXIMIZE_SPEED=9","SIGNED","LPM_MULT",9,9,27)
106
        port    map (sfactorb,signb&'1'&data24b(6 downto 0),plb);
107
 
108
        sma <= pha(24 downto 0) + (slaba&pla(17 downto 8));
109
        smb <= phb(24 downto 0) + (slabb&plb(17 downto 8));
110
 
111
        --! Sumar las mantissas signadas y colocar los 0's que hagan falta 
112
        process (sgndelta,sma,smb,splaces(4 downto 3))
113
        begin
114
                splaces <= places+sgndelta;
115
 
116
                case sgndelta is
117
                        when '1' => -- Negativo b>a : se corre a delta espacios a la derecha y b se queda quieto 
118
                                ssmb <= smb;
119
                                case splaces(4 downto 3) is
120
                                        when x"3" => ssma <= (sma(24)&shiftslab(23 downto 0));
121
                                        when x"2" => ssma <= (sma(24)&shiftslab(15 downto 0)&sma(23 downto 16));
122
                                        when x"1" => ssma <= (sma(24)&shiftslab(7 downto 0)&sma(23 downto 8));
123
                                        when others => ssma <= sma;
124
                                end case;
125
                        when others => -- Positivo a>=b : se corre a delta espacios a la derecha y a se queda quieto
126
                                case splaces(4 downto 3) is
127
                                        when x"3" => ssmb <= (smb(24)&shiftslab(23 downto 0));
128
                                        when x"2" => ssmb <= (smb(24)&shiftslab(15 downto 0)&smb(23 downto 16));
129
                                        when x"1" => ssmb <= (smb(24)&shiftslab(7 downto 0)&smb(23 downto 8));
130
                                        when others => ssmb <= smb;
131
                                end case;
132
                end case;
133
                ssm <= ssma+ssmb;
134
 
135 106 jguarin200
        end process;
136
 
137 107 jguarin200
        --! Mantissas sumadas, denormalizar
138 106 jguarin200
 
139 107 jguarin200
 
140 106 jguarin200
 
141
 
142
end shftr_arch;
143
 
144
 
145
 
146
 
147
 
148
 
149
 

powered by: WebSVN 2.1.0

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