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

Subversion Repositories raytrac

[/] [raytrac/] [trunk/] [raytrac.vhd] - Blame information for rev 78

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 16 jguarin200
------------------------------------------------
2
--! @file
3 18 jguarin200
--! @brief Entidad top del Rt Engine \n Rt Engine's top hierarchy.
4 22 jguarin200
--! @author Julián Andrés Guarín Reyes
5 16 jguarin200
--------------------------------------------------
6
 
7
 
8 11 jguarin200
-- RAYTRAC
9
-- Author Julian Andres Guarin
10
-- raytrac.vhd
11
-- This file is part of raytrac.
12
-- 
13
--     raytrac is free software: you can redistribute it and/or modify
14
--     it under the terms of the GNU General Public License as published by
15
--     the Free Software Foundation, either version 3 of the License, or
16
--     (at your option) any later version.
17
-- 
18
--     raytrac is distributed in the hope that it will be useful,
19
--     but WITHOUT ANY WARRANTY; without even the implied warranty of
20
--     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21
--     GNU General Public License for more details.
22
-- 
23
--     You should have received a copy of the GNU General Public License
24 16 jguarin200
--     along with raytrac.  If not, see <http://www.gnu.org/licenses/>
25 11 jguarin200
 
26 18 jguarin200
--! Libreria de definicion de senales y tipos estandares, comportamiento de operadores aritmeticos y logicos.\n Signal and types definition library. This library also defines 
27 11 jguarin200
library ieee;
28 16 jguarin200
--! Paquete de definicion estandard de logica. Standard logic definition pack.
29 11 jguarin200
use ieee.std_logic_1164.all;
30 77 jguarin200
use ieee.std_logic_signed.all;
31 16 jguarin200
 
32 27 jguarin200
 
33
 
34 18 jguarin200
--! Se usaran en esta descripcion los componentes del package arithpack.vhd.\n It will be used in this description the components on the arithpack.vhd package. 
35 11 jguarin200
use work.arithpack.all;
36
 
37 18 jguarin200
--! La entidad raytrac es la top en la jerarquia de descripcion del Rt Engine.\n Raytrac entity is the top one on the Rt Engine description hierarchy.
38 11 jguarin200
 
39 16 jguarin200
--! RayTrac es basicamente una entidad que toma las entradas de cuatro vectores: A,B,C,D y las entradas opcode y addcode.
40 18 jguarin200
--! En el momento de la carga se llevaran a cabo las siguientes operaciones: \n
41
--! - Producto Cruz (opcode = 1):
42 77 jguarin200
--! - Producto Punto (opcode = 0):
43 18 jguarin200
--! \n\n
44
--! \t Los resultados apareceran 3 clocks despues de la carga de los operadores y el codigo operacion
45
--! \n\n  
46
--! <table>
47
--! <tr>
48
--! <th></th>
49
--! <th></th><th>addcode=0</th><th></th>
50
--! </tr>
51
--! <tr>
52
--! <th>Opcode 1</th>
53
--! <td>CPX <= AxB<B> i</B></td>
54
--! <td>CPY <= AxB<B> j</B></td>
55
--! <td>CPZ <= AxB<B> k</B></td>
56
--! </tr>
57
--! </table>
58
--! \n
59
--! <table>
60
--! <tr>
61
--! <th></th>
62
--! <th></th><th>addcode=1</th><th></th>
63
--! </tr>
64
--! <tr>
65
--! <th>Opcode 1</th>
66
--! <td>CPX <= CxD<B> i</B></td>
67
--! <td>CPY <= CxD<B> j</B></td>
68
--! <td>CPZ <= CxD<B> k</B></td>
69
--! </tr>
70
--! </table>
71
--! \n
72
--! - Producto Punto (opcode = 0):
73
--! - Dot Product (opcode = 0):
74
--! \n\n
75 20 jguarin200
--! \t Los resultados se encontraran en DP0 y DP1 4 clocks despues de la carga.
76
--! \n\n 
77 18 jguarin200
--! <table>
78
--! <tr>
79
--! <th></th><th>addcode, ignorar</th> 
80
--! </tr>
81
--! <tr>
82
--! <th>opcode=0</th><td> DP0 = A.B, DP1 = C.D</td>
83
--! </tr>
84
--! </table>
85 77 jguarin200
--! \n\n
86
--! A partir de la revision 77 (30 de Mayo de 2011) se defini'o funcionalidad extra que le a&ntilde;ade las operaciones de suma de vectores y la posibilidad de tener en la salida los valores de los multiplicadores de la etapa M del UF. Esta funcionalidad extra se puede usar sin necesidad de usar las se&ntilde;ales opcode y addcode.
87
--! \n\n
88
--! Suma de vectores: Las salidas addAB y addCD, son los valores que contienen el resultado de las operaciones vectoriales A+B y C+D respectivamente. Este valor aparecer'a un periodo de reloj despu'es de que se registran los operandos y su representaci'on en punto fijo es A(7,10). 
89
--! \n\n
90
--! Valor de los productos de los multiplicadores: La utilidad principal de esta salida es multiplicar un vector por un escalar. Para ello la unidad se debe programar en modo producto punto (opcode=0) y uno de los vectores -A 'o B y C 'o D- debe tener todos sus componentes con el valor escalar por el cual se desea multiplicar.   
91 18 jguarin200
 
92 11 jguarin200
entity raytrac is
93
        generic (
94 50 jguarin200
                testbench_generation : string := "NO";
95 37 jguarin200
                registered : string := "NO" --! Este parametro, por defecto "YES", indica si se registran o cargan en registros los vectores A,B,C,D y los codigos de operacion opcode y addcode en vez de ser conectados directamente al circuito combinatorio. \n This parameter, by default "YES", indicates if vectors A,B,C,D and operation code inputs opcode are to be loaded into a register at the beginning of the pipe rather than just connecting them to the operations decoder (opcoder). 
96 11 jguarin200
        );
97
        port (
98 77 jguarin200
                A,B,C,D                 : in std_logic_vector(18*3-1 downto 0);                                                                  --! Vectores de entrada A,B,C,D, cada uno de tamano fijo: 3 componentes x 18 bits. \n Input vectors A,B,C,D, each one of fixed size: 3 components x 18 bits. 
99
                opcode,addcode  : in std_logic;                                                                                                                 --! Opcode and addcode input bits, opcode selects what operation is going to perform one of the entities included in the design and addcode what operands are going to be involved in such. \n Opcode & addcode, opcode selecciona que operacion se va a llevar a cabo dentro de una de las entidades referenciadas dentro de la descripcion, mientras que addcode decide cuales van a ser los operandos que realizaran tal. 
100
                clk,rst,ena             : in std_logic;                                                                                                                 --! Las senales de control usual. The usual control signals.
101 78 jguarin200
                sqrt0,sqrt1             : out std_logic_vector(17 downto 0);
102 77 jguarin200
                addABx,addABy,addABz,addCDx,addCDy,addCDz                       : out std_logic_vector(17 downto 0);--! Suma de vectores. 
103
                subABx,subABy,subABz,subCDx,subCDy,subCDz                       : out std_logic_vector(17 downto 0);--! Suma de vectores. 
104 78 jguarin200
                CPX,CPY,CPZ,DP0,DP1,kvx0,kvy0,kvz0,kvx1,kvy1,kvz1       : out std_logic_vector(31 downto 0) --! Salidas que representan los resultados del RayTrac: pueden ser dos resultados, de dos operaciones de producto punto, o un producto cruz. Por favor revisar el documento de especificacion del dispositivo para tener mas claridad.\n  Outputs representing the result of the RayTrac entity: can be the results of two parallel dot product operations or the result of a single cross product, in order to clarify refere to the entity specification documentation.
105 11 jguarin200
 
106 14 jguarin200
 
107 11 jguarin200
        );
108
end raytrac;
109
 
110 18 jguarin200
--! Arquitectura general del RayTrac. \n RayTrac general architecture.
111
 
112
--! La Arquitectura general de RayTrac se consiste en 3 componentes esenciales:
113
--! - Etapa de registros para la carga de los operadores y el codigo de operacion.
114
--! - Etapa combinatoria para la seleccion de operadores, dependiendo del codigo de operacion.
115 20 jguarin200
--! - Etapa aritmetica del calculo del producto punto o el producto cruz segun el caso.
116
--! \n\n
117 21 jguarin200
--! Las senales referidas en la arquitectura simplemente son conectores asignadas en la instanciaci&oacute;n de los componentes y en la asignacion entre ellas mismas en los procesos explicitos.
118 20 jguarin200
--! \n\n
119
--! RayTrac general architecture is made of 3 essential components: 
120
--! - Register stage to load operation code and operators.
121
--! - Combinatory Stage to operator selection, depending on the operation code.
122
--! - Arithmetic stage to calculate dot product or cross product, depending on the case.
123
--! \n\n 
124
--! Referred signals in the architecture are simple connectors assigned in the components intantiation and in the assignation among them in explicit processes.  
125
 
126 18 jguarin200
 
127 11 jguarin200
architecture raytrac_arch of raytrac is
128 20 jguarin200
        signal SA,SB,SC,SD                      : std_logic_vector(18*3-1 downto 0); --! Signal to register or bypass the vector inputs.  
129 11 jguarin200
        signal sopcode,saddcode         : std_logic;
130
        signal smf00,smf01,smf10,smf11,smf20,smf21,smf30,smf31,smf40,smf41,smf50,smf51  : std_logic_vector(17 downto 0);
131
 
132
begin
133
 
134
        reg:
135
        if registered="YES" generate
136 20 jguarin200
 
137
                --! By default: the inputs are going to be registered or loaded. This process describes how the register loading is to be make. \n Por defecto: las entradas se van a registrar o cargar. Este proceso describe como la carga de los registros con los valores de las entradas se va a realizar. 
138 14 jguarin200
                procReg:
139 11 jguarin200
                process(clk,rst)
140
                begin
141
                        if rst=rstMasterValue then
142
                                SA <= (others => '0');
143
                                SB <= (others => '0');
144
                                SC <= (others => '0');
145
                                SD <= (others => '0');
146 14 jguarin200
                                sopcode <= '0';
147
                                saddcode <= '0';
148 11 jguarin200
                        elsif clk'event and clk='1' then
149 31 jguarin200
                                if ena = '1' then
150 11 jguarin200
                                        SA <= A;
151
                                        SB <= B;
152
                                        SC <= C;
153
                                        SD <= D;
154
                                        sopcode <= opcode;
155
                                        saddcode <= addcode;
156
                                end if;
157
                        end if;
158 14 jguarin200
                end process procReg;
159 11 jguarin200
        end generate reg;
160 20 jguarin200
 
161
        notreg:
162
        if registered="NO" generate
163
                --! Just bypass or connect the inputs to the opcoder.
164
                procNotReg:
165
                process (A,B,C,D,opcode,addcode)
166
                begin
167
                        SA <= A;
168
                        SB <= B;
169
                        SC <= C;
170
                        SD <= D;
171
                        sopcode <= opcode;
172
                        saddcode <= addcode;
173
                end process procNotReg;
174
        end generate notreg;
175 77 jguarin200
        --! El siguiente sumador es un sumador de 18 bits por lo tanto no se utiliza el sumador de 32 bits en la etapa SR del UF.
176 20 jguarin200
 
177 78 jguarin200
        procaddsub:
178
        process (clk,rst,SA,SB,SC,SD)
179
        begin
180
 
181
                if rst=rstMasterValue then
182
                        addABx  <= (others => '0');
183
                        addABy  <= (others => '0');
184
                        addABz  <= (others => '0');
185
                        subABx  <= (others => '0');
186
                        subABy  <= (others => '0');
187
                        subABz  <= (others => '0');
188
                elsif clk'event and clk='1' then
189
                        addABx <= SA(17 downto 0) + SB(17 downto 0);
190
                        addABy <= SA(35 downto 18) + SB(35 downto 18);
191
                        addABz <= SA(53 downto 36) + SB(53 downto 36);
192
                        addCDx <= SC(17 downto 0) + SD(17 downto 0);
193
                        addCDy <= SC(35 downto 18) + SD(35 downto 18);
194
                        addCDz <= SC(53 downto 36) + SD(53 downto 36);
195
                        subABx <= SA(17 downto 0) - SB(17 downto 0);
196
                        subABy <= SA(35 downto 18) - SB(35 downto 18);
197
                        subABz <= SA(53 downto 36) - SB(53 downto 36);
198
                        subCDx <= SC(17 downto 0) - SD(17 downto 0);
199
                        subCDy <= SC(35 downto 18) - SD(35 downto 18);
200
                        subCDz <= SC(53 downto 36) - SD(53 downto 36);
201
                end if;
202
 
203
        end process procaddsub;
204
 
205 20 jguarin200
        --! Instantiate Opcoder 
206 11 jguarin200
        opcdr : opcoder
207 50 jguarin200
 
208 11 jguarin200
        port map (
209
                SA(17 downto 0),SB(17 downto 0),SC(17 downto 0),SD(17 downto 0),SA(35 downto 18),SB(35 downto 18),SC(35 downto 18),SD(35 downto 18),SA(53 downto 36),SB(53 downto 36),SC(53 downto 36),SD(53 downto 36),
210
                smf00,smf01,smf10,smf11,smf20,smf21,smf30,smf31,smf40,smf41,smf50,smf51,
211
                sopcode,saddcode
212
        );
213 20 jguarin200
        --! Instantiate uf, cross product and dot product functional unit.
214 32 jguarin200
        uf0 : uf
215 50 jguarin200
        generic map ("YES",testbench_generation,"RCA")
216 11 jguarin200
        port map (
217
                sopcode,
218
                smf00,smf01,smf10,smf11,smf20,smf21,smf30,smf31,smf40,smf41,smf50,smf51,
219 77 jguarin200
                CPX,CPY,CPZ,DP0,DP1,kvx0,kvy0,kvz0,kvx1,kvy1,kvz1
220 11 jguarin200
                clk,rst
221
        );
222
 
223
end raytrac_arch;
224
 
225
 
226
 

powered by: WebSVN 2.1.0

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