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

Subversion Repositories raytrac

[/] [raytrac/] [trunk/] [fpbranch/] [arithpack.vhd] - Blame information for rev 219

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

Line No. Rev Author Line
1 23 jguarin200
--! @file arithpack.vhd
2 43 jguarin200
--! @author Julian Andres Guarin Reyes
3
--! @brief Este package contiene la descripcion de los parametros y los puertos de las entidades: uf, opcoder, multiplicador, sumador, cla_logic_block y rca_logic_block.
4 82 jguarin200
-- RAYTRAC (FP BRANCH)
5 16 jguarin200
-- Author Julian Andres Guarin
6
-- arithpack.vhd
7
-- This file is part of raytrac.
8
-- 
9
--     raytrac is free software: you can redistribute it and/or modify
10
--     it under the terms of the GNU General Public License as published by
11
--     the Free Software Foundation, either version 3 of the License, or
12
--     (at your option) any later version.
13
-- 
14
--     raytrac is distributed in the hope that it will be useful,
15
--     but WITHOUT ANY WARRANTY; without even the implied warranty of
16
--     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17
--     GNU General Public License for more details.
18
-- 
19
--     You should have received a copy of the GNU General Public License
20
--     along with raytrac.  If not, see <http://www.gnu.org/licenses/>.library ieee;
21
 
22
 
23 23 jguarin200
--! Biblioteca de definicion de senales y tipos estandares, comportamiento de operadores aritmeticos y logicos. 
24 22 jguarin200
library ieee;
25 23 jguarin200
--! Paquete de definicion estandard de logica.
26 2 jguarin200
use ieee.std_logic_1164.all;
27 60 jguarin200
use ieee.math_real.all;
28 2 jguarin200
 
29 49 jguarin200
--use ieee.std_logic_unsigned.conv_integer;
30
 
31
 
32 43 jguarin200
--! Biblioteca de definicion de memorias de altera
33
library altera_mf;
34 52 jguarin200
 
35 43 jguarin200
--! Paquete para manejar memorias internas tipo M9K
36 47 jguarin200
use altera_mf.all;
37 8 jguarin200
 
38 47 jguarin200
--! Biblioteca de modulos parametrizados.
39
library lpm;
40
use lpm.all;
41 49 jguarin200
 
42
--! Package de entrada y salida de texto.
43
use std.textio.all;
44
 
45
 
46
 
47 43 jguarin200
--! Package con las definiciones de constantes y entidades, que conformaran el Rt Engine. Tambien con algunas descripciones para realizar test bench.
48 8 jguarin200
 
49 23 jguarin200
--! En general el package cuenta con entidades para instanciar, multiplicadores, sumadores/restadores y un decodificador de operaciones. 
50 2 jguarin200
package arithpack is
51 10 jguarin200
 
52 45 jguarin200
        --! TestBenchState
53
        type tbState is (abcd,axb,cxd,stop);
54
 
55 52 jguarin200
        --! Constante con el nivel l&oacute;gico de reset.
56 74 jguarin200
        constant rstMasterValue : std_logic := '0';
57 40 jguarin200
 
58 52 jguarin200
        --! Constante: periodo del reloj, para una frecuencia de 50 MHz 
59 49 jguarin200
        constant tclk : time := 20 ns;
60 52 jguarin200
 
61
        --! Constante: medio periodo de reloj.
62 49 jguarin200
        constant tclk2: time := tclk/2;
63 52 jguarin200
 
64
        --! Constante: cuarto de periodo del reloj.
65 49 jguarin200
        constant tclk4: time := tclk/4;
66
 
67 76 jguarin200
        --! Path del directorio donde se encuentra
68 81 jguarin200
        --constant memoryPath: string := "../../../MinGW/MSys/1.0/home/julian/code/testbench/trunk/sqrtdiv/";
69 76 jguarin200
        --constant memoryPath: string := "X:/Tesis/Workspace/hw/rt_lib/arith/src/trunk/sqrtdiv/"
70 81 jguarin200
        constant memoryPath: string := "";
71 82 jguarin200
 
72
 
73
        --!Par&aacute;metros de punto de flotante
74
        constant mantissaWidth:integer:=23;
75
        constant mantissaWidthCycloneIIITrunking:integer:=6;
76
        constant mantissaMSB:string:="HIDDEN";
77
        constant exponentWidth:integer:=8;
78
        constant fpWidth:integer:=32;
79
        constant fpExponentBias:integer:=127;
80
        constant factorWidthCycloneIII:integer:=18;
81
 
82
 
83
 
84
 
85 42 jguarin200
        --! Generacion de Clock y de Reset.
86
        component clock_gen
87 49 jguarin200
                generic (tclk : time := tclk);
88 42 jguarin200
                port    (clk,rst : out std_logic);
89
        end component;
90
 
91 93 jguarin200
 
92
        component sadd3
93
        port (
94
                a,b,c:in std_logic_vector(24 downto 0);
95
                dpc:in std_logic;
96
                res:out std_logic_vector(24 downto 0)
97
        );
98
        end component;
99
 
100 44 jguarin200
        --! Ray Trac: Implementacion del Rt Engine
101
        component raytrac
102
        generic (
103 50 jguarin200
                testbench_generation : string := "NO";
104 44 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). 
105
        );
106
        port (
107
                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. 
108
                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. 
109
                clk,rst,ena                     : in std_logic;                                                 --! Las senales de control usual. The usual control signals.
110
                CPX,CPY,CPZ,DP0,DP1 : 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.
111
 
112
 
113
        );
114
        end component;
115 42 jguarin200
 
116 47 jguarin200
        --! componente memoria instanciado mediante la biblioteca de altera
117 43 jguarin200
        component altsyncram
118 40 jguarin200
        generic (
119 43 jguarin200
                address_aclr_a          : string;
120
                clock_enable_input_a            : string;
121
                clock_enable_output_a           : string;
122
                init_file               : string;
123
                intended_device_family          : string;
124
                lpm_hint                : string;
125
                lpm_type                : string;
126
                numwords_a              : natural;
127
                operation_mode          : string;
128
                outdata_aclr_a          : string;
129
                outdata_reg_a           : string;
130
                ram_block_type          : string;
131
                widthad_a               : natural;
132
                width_a         : natural;
133
                width_byteena_a         : natural
134 40 jguarin200
        );
135 43 jguarin200
        port (
136
                        clock0  : in std_logic ;
137
                        address_a       : in std_logic_vector (8 downto 0);
138
                        q_a     : out std_logic_vector (17 downto 0)
139
        );
140 52 jguarin200
        end component;  --! Entidad uf: sus siglas significan undidad funcional. La unidad funcional se encarga de realizar las diferentes operaciones vectoriales (producto cruz &oacute; producto punto). 
141 43 jguarin200
 
142 8 jguarin200
        component uf
143 27 jguarin200
        generic (
144 32 jguarin200
                        use_std_logic_signed    : string := "NO";
145 50 jguarin200
                        testbench_generation    : string := "NO";
146 32 jguarin200
                        carry_logic     : string := "CLA"
147 27 jguarin200
        );
148 8 jguarin200
        port (
149
                opcode          : in std_logic;
150 12 jguarin200
                m0f0,m0f1,m1f0,m1f1,m2f0,m2f1,m3f0,m3f1,m4f0,m4f1,m5f0,m5f1 : in std_logic_vector(17 downto 0);
151 77 jguarin200
                cpx,cpy,cpz,dp0,dp1,kvx0,kvy0,kvz0,kvx1,kvy1,kvz1  : out std_logic_vector(31 downto 0);
152
                clk,rst         : in std_logic
153 8 jguarin200
        );
154
        end component;
155
 
156 52 jguarin200
        --! Entidad opcoder: opcoder decodifica la operaci&oacute;n que se va a realizar. Para tal fin coloca en la entrada de uf (unidad funcional), cuales van a ser los operandos de los multiplicadores con los que uf cuenta y adem‡s escribe en el selector de operaci&oacute;n de uf, el tipo de operaci&oacute;n a realizar.
157 8 jguarin200
        component opcoder
158 25 jguarin200
        generic (
159
                width : integer := 18;
160
                structuralDescription : string:= "NO"
161 26 jguarin200
        );
162 8 jguarin200
        port (
163
                Ax,Bx,Cx,Dx,Ay,By,Cy,Dy,Az,Bz,Cz,Dz : in std_logic_vector (17 downto 0);
164 14 jguarin200
                m0f0,m0f1,m1f0,m1f1,m2f0,m2f1,m3f0,m3f1,m4f0,m4f1,m5f0,m5f1 : out std_logic_vector (17 downto 0);
165 8 jguarin200
                opcode,addcode : in std_logic
166
        );
167
        end component;
168 24 jguarin200
 
169
        --! Multiplexor estructural.
170 26 jguarin200
        component fastmux is
171 24 jguarin200
        generic (
172
                width : integer := 18
173 26 jguarin200
        );
174 24 jguarin200
        port (
175 26 jguarin200
                a,b:in std_logic_vector(width-1 downto 0);
176 24 jguarin200
                s:in std_logic;
177 26 jguarin200
                c: out std_logic_vector(width-1 downto 0)
178
        );
179
        end component;
180 50 jguarin200
 
181
 
182 52 jguarin200
        --! Esta entidad corresponde al multiplicador que se instanciar&iacute;a dentro de la unidad funcional. El multiplicador registra los operandos a la entrada y el respectivo producto de la multiplicaci&oacute;n a la salida. 
183 50 jguarin200
        component lpm_mult
184 47 jguarin200
        generic (
185 50 jguarin200
                lpm_hint                : string;
186
                lpm_pipeline            : natural;
187
                lpm_representation              : string;
188
                lpm_type                : string;
189
                lpm_widtha              : natural;
190
                lpm_widthb              : natural;
191
                lpm_widthp              : natural
192 47 jguarin200
        );
193 2 jguarin200
        port (
194 59 jguarin200
                aclr    : in std_logic ;
195
                clock   : in std_logic ;
196
                datab   : in std_logic_vector (17 downto 0);
197
                dataa   : in std_logic_vector (17 downto 0);
198
                result  : out std_logic_vector (31 downto 0)
199 2 jguarin200
        );
200
        end component;
201 50 jguarin200
 
202 23 jguarin200
 
203 50 jguarin200
 
204
 
205 52 jguarin200
        --! cla_logic_block corresponde a un bloque de l&oacute;gica Carry look Ahead. Se instancia y utiliza dentro de un sumador cualquiera, pues sirve para calcular los carry out de la operaci&oacute;n. 
206 2 jguarin200
        component cla_logic_block
207 27 jguarin200
        generic ( width: integer:=4);
208 2 jguarin200
        port (
209 27 jguarin200
                p,g:in std_logic_vector(width-1 downto 0);
210 2 jguarin200
                cin:in std_logic;
211 27 jguarin200
                c:out std_logic_vector(width downto 1)
212 2 jguarin200
        );
213
        end component;
214 23 jguarin200
 
215 52 jguarin200
        --! rca_logic_block corresponde a un bloque de l&oacute;gica Ripple Carry Adder. Se instancia y utiliza dentro de un sumador cualquiera, pues sirve para calcular los carry out de la operaci&oacute;n.
216 2 jguarin200
        component rca_logic_block
217 27 jguarin200
        generic ( width : integer := 4);
218 2 jguarin200
        port (
219 27 jguarin200
                p,g: in std_logic_vector(width-1 downto 0);
220 2 jguarin200
                cin: in std_logic;
221 27 jguarin200
                c: out std_logic_vector(width downto 1)
222 2 jguarin200
        );
223
        end component;
224 23 jguarin200
 
225
        --! Entidad sumador. Esta entidad tiene un proposito bien claro: sumar. Es altamente parametrizable. Hay 3 cosas que se pueden parametrizar: el ancho del sumador, el tipo de circuito que queremos realice la suma y si el sumador estar‡ en capacidad de realizar mediante un selector restas.
226 2 jguarin200
        component adder
227
        generic (
228 27 jguarin200
                width                                   : integer := 4;
229 14 jguarin200
                carry_logic                             : string := "CLA";
230
                substractor_selector    : string := "YES"
231 2 jguarin200
        );
232
        port (
233 27 jguarin200
                a,b             :       in std_logic_vector (width-1 downto 0);
234 2 jguarin200
                s,ci    :       in      std_logic;
235 27 jguarin200
                result  :       out std_logic_vector (width-1 downto 0);
236 2 jguarin200
                cout    :       out std_logic
237
        );
238
        end component;
239 49 jguarin200
 
240 59 jguarin200
        --! Entidad raiz cuadrada para enteros de 32 bits. no worries 'jhonny g' aint no thy recepie!. 
241
        --! No es una entidad de aproximaci&acute;on, posee: etapa de decodificaci&acute e imparidad;on de direcciones,
242
        --! etapa de calculo de la raiz cuadrada mediante memoria, etapa: 
243
        component sqrt
244
 
245
        port (
246
                clk,rst :       in std_logic;   -- se&ntilde;ales de control.
247
                r               :       in std_logic_vector (31 downto 0);       --radicando
248
                s               :       out std_logic_vector (15 downto 0)
249
        );
250
        end component;
251
 
252 52 jguarin200
        --! Procedimiento para escribir std_logic_vectors en formato hexadecimal.
253 49 jguarin200
        procedure hexwrite_0(l:inout line; h: in std_logic_vector);
254 73 jguarin200
 
255
        --! SqrtDiv Unit::shifter, esta unidad transforma el n&uacute;mero entero A, en terminos de 2^N * m = A. El literal m corresponde al valor de la mantissa. En terminos de representaci'on binaria, la mantissa es el valor de la direcci'on de memoria que contiene el valor f(mantissa). El literal N corresponde al valor entero mayor m'as cercano del logaritmo en base 2 del n'umero entero A.
256
        component shifter
257 59 jguarin200
        generic (
258 60 jguarin200
                address_width   : integer       := 9;
259
                width                   : integer       := 32;
260
                even_shifter    : string        := "YES"
261 59 jguarin200
        );
262
        port (
263
                data                    : in std_logic_vector(width - 1 downto 0);
264 60 jguarin200
                exp                             : out std_logic_vector(integer(ceil(log(real(width),2.0)))-1 downto 0);
265 59 jguarin200
                address                 : out std_logic_vector (address_width-1 downto 0);
266 60 jguarin200
                zero                    : out std_logic
267 59 jguarin200
        );
268
        end component;
269
 
270 73 jguarin200
        --! SqrtDiv Unit::func, func, es una memoria que almacena alguna funci'on en el rango de [1,2). Los valores de la funci'on evaluada en este rango se encuentran almacenados en una memoria ROM que seleccione el desarrollador. 
271 81 jguarin200
        component  funcsqrt
272 73 jguarin200
        generic (
273 74 jguarin200
                memoryfilepath : string :="X:/Tesis/Workspace/hw/rt_lib/arith/src/trunk/sqrtdiv/memsqrt.mif";
274
                awidth : integer := 9;
275
                qwidth : integer := 18
276 73 jguarin200
        );
277
        port (
278 74 jguarin200
                ad0,ad1 : in std_logic_vector (awidth-1 downto 0) := (others => '0');
279
                clk     : in std_logic;
280
                q0,q1   : out std_logic_vector(qwidth-1 downto 0)
281 73 jguarin200
        );
282
        end component;
283 81 jguarin200
        --! SqrtDic Unit::func, func, es una memoria que almacena alguna funci'on en el rango de [1,2). Los valores de la funci'on evaluada en este rango se encuentran almacenados en una memoria ROM que seleccione el desarrollador. 
284
        component  funcinvr
285
        generic (
286
                memoryfilepath : string :="X:/Tesis/Workspace/hw/rt_lib/arith/src/trunk/sqrtdiv/meminvr.mif";
287
                awidth : integer := 9;
288
                qwidth : integer := 18
289
        );
290
        port (
291
                ad0     : in std_logic_vector (awidth-1 downto 0) := (others => '0');
292
                clk : in std_logic;
293
                q0      : out std_logic_vector(qwidth-1 downto 0)
294
        );
295
        end component;
296 73 jguarin200
        --! SqrtDiv Unit::shifter2xstage, esta unidad funciona tal cual la unidad shifter, pero al doble de la velocidad. El problema es que la entidad entrega dos valores de N: exp es un std_logic_vector la primera mitad entregar'a exp0 y la mitad mas significativa ser'a exp1. 
297
        --! De estos dos valores no signados, el valor que representa a N es el mayor de los 2. As'i mismo ocurre con las mantissas. Si el exp0 es mayor que exp1 se escoge add0 en vez de add1 y viceversa.
298
 
299
        component shifter2xstage is
300
        generic (
301
                address_width   : integer := 9;
302
                width                   : integer := 32
303
        );
304
        port (
305
                data    : in std_logic_vector (width-1 downto 0);
306
                exp             : out std_logic_vector (2*integer(ceil(log(real(width),2.0)))-1 downto 0);
307
                add             : out std_logic_vector (2*address_width-1 downto 0);
308
                zero    : out std_logic
309
        );
310 74 jguarin200
        end component;
311
 
312
        component RLshifter
313
        generic (
314
                shiftFunction   : string  := "SQUARE_ROOT";
315
                mantissa_width  : integer := 18;
316
                iwidth                  : integer := 32;
317
                owidth                  : integer := 16
318
 
319
        );
320
        port (
321
                exp             : in std_logic_vector (integer(ceil(log(real(iwidth),2.0)))-1 downto 0);
322
                mantis  : in std_logic_vector (mantissa_width-1 downto 0);
323
                result  : out std_logic_vector (owidth-1 downto 0)
324
        );
325
        end component;
326 2 jguarin200
end package;
327 49 jguarin200
 
328 52 jguarin200
--! Funciones utilitarias, relacionadas sobre todo con el testbench
329 49 jguarin200
package body arithpack is
330 52 jguarin200
 
331 49 jguarin200
        constant hexchars : string (1 to 16) := "0123456789ABCDEF";
332
 
333
        procedure hexwrite_0(l:inout line;h:in std_logic_vector) is
334 50 jguarin200
                variable index_high,index_low,highone : integer;
335
 
336 49 jguarin200
        begin
337 50 jguarin200
                highone := h'high-h'low;
338
                for i in (highone)/4 downto 0 loop
339 49 jguarin200
                        index_low:=i*4;
340 50 jguarin200
                        if (index_low+3)>highone then
341
                                index_high := highone;
342 49 jguarin200
                        else
343
                                index_high := i*4+3;
344
                        end if;
345 50 jguarin200
                        write(l,hexchars(1+ieee.std_logic_unsigned.conv_integer(h(index_high+h'low downto index_low+h'low))));
346 49 jguarin200
                end loop;
347 73 jguarin200
        end procedure;
348
 
349
 
350 49 jguarin200
end package body arithpack;

powered by: WebSVN 2.1.0

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