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

Subversion Repositories raytrac

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

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

powered by: WebSVN 2.1.0

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