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

Subversion Repositories raytrac

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

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 16 jguarin200
-- RAYTRAC
5
-- 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 42 jguarin200
        --! Generacion de Clock y de Reset.
72
        component clock_gen
73 49 jguarin200
                generic (tclk : time := tclk);
74 42 jguarin200
                port    (clk,rst : out std_logic);
75
        end component;
76
 
77 44 jguarin200
        --! Ray Trac: Implementacion del Rt Engine
78
        component raytrac
79
        generic (
80 50 jguarin200
                testbench_generation : string := "NO";
81 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). 
82
        );
83
        port (
84
                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. 
85
                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. 
86
                clk,rst,ena                     : in std_logic;                                                 --! Las senales de control usual. The usual control signals.
87
                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.
88
 
89
 
90
        );
91
        end component;
92 42 jguarin200
 
93 47 jguarin200
        --! componente memoria instanciado mediante la biblioteca de altera
94 43 jguarin200
        component altsyncram
95 40 jguarin200
        generic (
96 43 jguarin200
                address_aclr_a          : string;
97
                clock_enable_input_a            : string;
98
                clock_enable_output_a           : string;
99
                init_file               : string;
100
                intended_device_family          : string;
101
                lpm_hint                : string;
102
                lpm_type                : string;
103
                numwords_a              : natural;
104
                operation_mode          : string;
105
                outdata_aclr_a          : string;
106
                outdata_reg_a           : string;
107
                ram_block_type          : string;
108
                widthad_a               : natural;
109
                width_a         : natural;
110
                width_byteena_a         : natural
111 40 jguarin200
        );
112 43 jguarin200
        port (
113
                        clock0  : in std_logic ;
114
                        address_a       : in std_logic_vector (8 downto 0);
115
                        q_a     : out std_logic_vector (17 downto 0)
116
        );
117 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). 
118 43 jguarin200
 
119 8 jguarin200
        component uf
120 27 jguarin200
        generic (
121 32 jguarin200
                        use_std_logic_signed    : string := "NO";
122 50 jguarin200
                        testbench_generation    : string := "NO";
123 32 jguarin200
                        carry_logic     : string := "CLA"
124 27 jguarin200
        );
125 8 jguarin200
        port (
126
                opcode          : in std_logic;
127 12 jguarin200
                m0f0,m0f1,m1f0,m1f1,m2f0,m2f1,m3f0,m3f1,m4f0,m4f1,m5f0,m5f1 : in std_logic_vector(17 downto 0);
128 77 jguarin200
                cpx,cpy,cpz,dp0,dp1,kvx0,kvy0,kvz0,kvx1,kvy1,kvz1  : out std_logic_vector(31 downto 0);
129
                clk,rst         : in std_logic
130 8 jguarin200
        );
131
        end component;
132
 
133 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.
134 8 jguarin200
        component opcoder
135 25 jguarin200
        generic (
136
                width : integer := 18;
137
                structuralDescription : string:= "NO"
138 26 jguarin200
        );
139 8 jguarin200
        port (
140
                Ax,Bx,Cx,Dx,Ay,By,Cy,Dy,Az,Bz,Cz,Dz : in std_logic_vector (17 downto 0);
141 14 jguarin200
                m0f0,m0f1,m1f0,m1f1,m2f0,m2f1,m3f0,m3f1,m4f0,m4f1,m5f0,m5f1 : out std_logic_vector (17 downto 0);
142 8 jguarin200
                opcode,addcode : in std_logic
143
        );
144
        end component;
145 24 jguarin200
 
146
        --! Multiplexor estructural.
147 26 jguarin200
        component fastmux is
148 24 jguarin200
        generic (
149
                width : integer := 18
150 26 jguarin200
        );
151 24 jguarin200
        port (
152 26 jguarin200
                a,b:in std_logic_vector(width-1 downto 0);
153 24 jguarin200
                s:in std_logic;
154 26 jguarin200
                c: out std_logic_vector(width-1 downto 0)
155
        );
156
        end component;
157 50 jguarin200
 
158
 
159 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. 
160 50 jguarin200
        component lpm_mult
161 47 jguarin200
        generic (
162 50 jguarin200
                lpm_hint                : string;
163
                lpm_pipeline            : natural;
164
                lpm_representation              : string;
165
                lpm_type                : string;
166
                lpm_widtha              : natural;
167
                lpm_widthb              : natural;
168
                lpm_widthp              : natural
169 47 jguarin200
        );
170 2 jguarin200
        port (
171 59 jguarin200
                aclr    : in std_logic ;
172
                clock   : in std_logic ;
173
                datab   : in std_logic_vector (17 downto 0);
174
                dataa   : in std_logic_vector (17 downto 0);
175
                result  : out std_logic_vector (31 downto 0)
176 2 jguarin200
        );
177
        end component;
178 50 jguarin200
 
179 23 jguarin200
 
180 50 jguarin200
 
181
 
182 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. 
183 2 jguarin200
        component cla_logic_block
184 27 jguarin200
        generic ( width: integer:=4);
185 2 jguarin200
        port (
186 27 jguarin200
                p,g:in std_logic_vector(width-1 downto 0);
187 2 jguarin200
                cin:in std_logic;
188 27 jguarin200
                c:out std_logic_vector(width downto 1)
189 2 jguarin200
        );
190
        end component;
191 23 jguarin200
 
192 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.
193 2 jguarin200
        component rca_logic_block
194 27 jguarin200
        generic ( width : integer := 4);
195 2 jguarin200
        port (
196 27 jguarin200
                p,g: in std_logic_vector(width-1 downto 0);
197 2 jguarin200
                cin: in std_logic;
198 27 jguarin200
                c: out std_logic_vector(width downto 1)
199 2 jguarin200
        );
200
        end component;
201 23 jguarin200
 
202
        --! 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.
203 2 jguarin200
        component adder
204
        generic (
205 27 jguarin200
                width                                   : integer := 4;
206 14 jguarin200
                carry_logic                             : string := "CLA";
207
                substractor_selector    : string := "YES"
208 2 jguarin200
        );
209
        port (
210 27 jguarin200
                a,b             :       in std_logic_vector (width-1 downto 0);
211 2 jguarin200
                s,ci    :       in      std_logic;
212 27 jguarin200
                result  :       out std_logic_vector (width-1 downto 0);
213 2 jguarin200
                cout    :       out std_logic
214
        );
215
        end component;
216 49 jguarin200
 
217 59 jguarin200
        --! Entidad raiz cuadrada para enteros de 32 bits. no worries 'jhonny g' aint no thy recepie!. 
218
        --! No es una entidad de aproximaci&acute;on, posee: etapa de decodificaci&acute e imparidad;on de direcciones,
219
        --! etapa de calculo de la raiz cuadrada mediante memoria, etapa: 
220
        component sqrt
221
 
222
        port (
223
                clk,rst :       in std_logic;   -- se&ntilde;ales de control.
224
                r               :       in std_logic_vector (31 downto 0);       --radicando
225
                s               :       out std_logic_vector (15 downto 0)
226
        );
227
        end component;
228
 
229 52 jguarin200
        --! Procedimiento para escribir std_logic_vectors en formato hexadecimal.
230 49 jguarin200
        procedure hexwrite_0(l:inout line; h: in std_logic_vector);
231 73 jguarin200
 
232
        --! 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.
233
        component shifter
234 59 jguarin200
        generic (
235 60 jguarin200
                address_width   : integer       := 9;
236
                width                   : integer       := 32;
237
                even_shifter    : string        := "YES"
238 59 jguarin200
        );
239
        port (
240
                data                    : in std_logic_vector(width - 1 downto 0);
241 60 jguarin200
                exp                             : out std_logic_vector(integer(ceil(log(real(width),2.0)))-1 downto 0);
242 59 jguarin200
                address                 : out std_logic_vector (address_width-1 downto 0);
243 60 jguarin200
                zero                    : out std_logic
244 59 jguarin200
        );
245
        end component;
246
 
247 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. 
248 81 jguarin200
        component  funcsqrt
249 73 jguarin200
        generic (
250 74 jguarin200
                memoryfilepath : string :="X:/Tesis/Workspace/hw/rt_lib/arith/src/trunk/sqrtdiv/memsqrt.mif";
251
                awidth : integer := 9;
252
                qwidth : integer := 18
253 73 jguarin200
        );
254
        port (
255 74 jguarin200
                ad0,ad1 : in std_logic_vector (awidth-1 downto 0) := (others => '0');
256
                clk     : in std_logic;
257
                q0,q1   : out std_logic_vector(qwidth-1 downto 0)
258 73 jguarin200
        );
259
        end component;
260 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. 
261
        component  funcinvr
262
        generic (
263
                memoryfilepath : string :="X:/Tesis/Workspace/hw/rt_lib/arith/src/trunk/sqrtdiv/meminvr.mif";
264
                awidth : integer := 9;
265
                qwidth : integer := 18
266
        );
267
        port (
268
                ad0     : in std_logic_vector (awidth-1 downto 0) := (others => '0');
269
                clk : in std_logic;
270
                q0      : out std_logic_vector(qwidth-1 downto 0)
271
        );
272
        end component;
273 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. 
274
        --! 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.
275
 
276
        component shifter2xstage is
277
        generic (
278
                address_width   : integer := 9;
279
                width                   : integer := 32
280
        );
281
        port (
282
                data    : in std_logic_vector (width-1 downto 0);
283
                exp             : out std_logic_vector (2*integer(ceil(log(real(width),2.0)))-1 downto 0);
284
                add             : out std_logic_vector (2*address_width-1 downto 0);
285
                zero    : out std_logic
286
        );
287 74 jguarin200
        end component;
288
 
289
        component RLshifter
290
        generic (
291
                shiftFunction   : string  := "SQUARE_ROOT";
292
                mantissa_width  : integer := 18;
293
                iwidth                  : integer := 32;
294
                owidth                  : integer := 16
295
 
296
        );
297
        port (
298
                exp             : in std_logic_vector (integer(ceil(log(real(iwidth),2.0)))-1 downto 0);
299
                mantis  : in std_logic_vector (mantissa_width-1 downto 0);
300
                result  : out std_logic_vector (owidth-1 downto 0)
301
        );
302
        end component;
303 2 jguarin200
end package;
304 49 jguarin200
 
305 52 jguarin200
--! Funciones utilitarias, relacionadas sobre todo con el testbench
306 49 jguarin200
package body arithpack is
307 52 jguarin200
 
308 49 jguarin200
        constant hexchars : string (1 to 16) := "0123456789ABCDEF";
309
 
310
        procedure hexwrite_0(l:inout line;h:in std_logic_vector) is
311 50 jguarin200
                variable index_high,index_low,highone : integer;
312
 
313 49 jguarin200
        begin
314 50 jguarin200
                highone := h'high-h'low;
315
                for i in (highone)/4 downto 0 loop
316 49 jguarin200
                        index_low:=i*4;
317 50 jguarin200
                        if (index_low+3)>highone then
318
                                index_high := highone;
319 49 jguarin200
                        else
320
                                index_high := i*4+3;
321
                        end if;
322 50 jguarin200
                        write(l,hexchars(1+ieee.std_logic_unsigned.conv_integer(h(index_high+h'low downto index_low+h'low))));
323 49 jguarin200
                end loop;
324 73 jguarin200
        end procedure;
325
 
326
 
327 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.