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

Subversion Repositories raytrac

[/] [raytrac/] [branches/] [fp/] [arithpack.vhd] - Blame information for rev 152

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

Line No. Rev Author Line
1 151 jguarin200
library ieee;
2
use ieee.std_logic_1164.all;
3
 
4
--! Memory Compiler Library
5
library lpm;
6
use lpm.all;
7
 
8
 
9
 
10
package arithpack is
11
        --! Estados para la maquina de estados.
12
        type macState is (LOAD_INSTRUCTION,FLUSH_ARITH_PIPELINE,EXECUTE_INSTRUCTION);
13
        --! Estados para el controlador de interrupciones.
14
        type iCtrlState is (WAITING_FOR_AN_EVENT,FIRING_INTERRUPTIONS,SUSPEND);
15 152 jguarin200
 
16
        --! Float data blocks
17
        constant floatwidth : integer := 32;
18
        constant widthadmemblock : integer := 9;
19
 
20
        type    vectorblock12 is array (11 downto 0) of std_logic_vector(floatwidth-1 downto 0);
21
        type    vectorblock08 is array (07 downto 0) of std_logic_vector(floatwidth-1 downto 0);
22
        type    vectorblock06 is array (05 downto 0) of std_logic_vector(floatwidth-1 downto 0);
23
        type    vectorblock04 is array (03 downto 0) of std_logic_vector(floatwidth-1 downto 0);
24
        type    vectorblock03 is array (02 downto 0) of std_logic_vector(floatwidth-1 downto 0);
25
        type    vectorblock02 is array (01 downto 0) of std_logic_vector(floatwidth-1 downto 0);
26
        type    vectorblockadd02 is array (01 downto 0) of std_logic_vector(widthadmemblock-1 downto 0);
27
 
28
 
29 151 jguarin200
        --! Constante de reseteo
30
        constant rstMasterValue : std_logic :='0';
31
        --! Constantes periodicas.
32
        constant tclk   : time := 20 ns;
33
        constant tclk_2 : time := tclk/2;
34
        constant tclk_4 : time := tclk/4;
35
 
36 152 jguarin200
 
37
        component raytrac
38
        port (
39
 
40
                clk : in std_logic;
41
                rst : in std_logic;
42
 
43
                --! Señal de lectura de alguna de las colas de resultados.
44
                rd      : in std_logic;
45
 
46
                --! Señal de escritura en alguno de los bloques de memoria de operandos o en la cola de instrucciones.
47
                wr      : in std_logic;
48
 
49
                --! Direccion de escritura o lectura
50
                add : in std_logic_vector (12 downto 0);
51
 
52
                --! datos de entrada
53
                d       : in std_logic_vector (31 downto 0);
54
 
55
                --! Interrupciones
56
                int     : out std_logic_vector (7 downto 0);
57
 
58
                --! Salidas
59
                q : out std_logic_vector (31 downto 0)
60
 
61
 
62
 
63
        );
64
        end component;
65
 
66
        --! Componentes Aritméticos
67
 
68
        component fadd32
69
        port (
70
                clk : in std_logic;
71
                dpc : in std_logic;
72
                a32 : in std_logic_vector (31 downto 0);
73
                b32 : in std_logic_vector (31 downto 0);
74
                c32 : out std_logic_vector (31 downto 0)
75
        );
76
        end component;
77
        component fmul32
78
        port (
79
                clk : in std_logic;
80
                a32 : in std_logic_vector (31 downto 0);
81
                b32 : in std_logic_vector (31 downto 0);
82
                p32 : out std_logic_vector (31 downto 0)
83
        );
84
        end component;
85
 
86
 
87
        --! Contadores para la máquina de estados.
88
 
89 151 jguarin200
        component customCounter
90
        generic (
91
                EOBFLAG         : string ;
92
                ZEROFLAG        : string ;
93
                BACKWARDS       : string ;
94
                EQUALFLAG       : string ;
95
                subwidth        : integer;
96
                width           : integer
97
 
98
        );
99
        port (
100
                clk,rst,go,set  : in std_logic;
101
                setValue,cmpBlockValue          : in std_Logic_vector(width-1 downto subwidth);
102
                zero_flag,eob_flag,eq_flag      : out std_logic;
103
                count                   : out std_logic_vector(width-1 downto 0)
104
        );
105
        end component;
106
 
107
        --! LPM Memory Compiler.
108
        component scfifo
109
        generic (
110
                add_ram_output_register :string;
111
                almost_full_value               :natural;
112
                allow_wrcycle_when_full :string;
113
                intended_device_family  :string;
114
                lpm_hint                                :string;
115
                lpm_numwords                    :natural;
116
                lpm_showahead                   :string;
117
                lpm_type                                :string;
118
                lpm_width                               :natural;
119
                lpm_widthu                              :natural;
120
                overflow_checking               :string;
121
                underflow_checking              :string;
122
                use_eab                                 :string
123
        );
124
        port(
125
                rdreq           : in std_logic;
126
                aclr            : in std_logic;
127
                empty           : out std_logic;
128
                clock           : in std_logic;
129
                q                       : out std_logic_vector(lpm_width-1 downto 0);
130
                wrreq           : in std_logic;
131
                data            : in std_logic_vector(lpm_width-1 downto 0);
132
                almost_full : out std_logic;
133
                full            : out std_logic
134
        );
135
        end component;
136
 
137
 
138
        component altsyncram
139
        generic (
140
                address_aclr_b                  : string;
141
                address_reg_b                   : string;
142
                clock_enable_input_a    : string;
143
                clock_enable_input_b    : string;
144
                clock_enable_output_b   : string;
145
                intended_device_family  : string;
146
                lpm_type                                : string;
147
                numwords_a                              : natural;
148
                numwords_b                              : natural;
149
                operation_mode                  : string;
150
                outdata_aclr_b                  : string;
151
                outdata_reg_b                   : string;
152
                power_up_uninitialized  : string;
153
                ram_block_type                  : string;
154
                rdcontrol_reg_b                 : string;
155
                read_during_write_mode_mixed_ports      : string;
156
                widthad_a                               : natural;
157
                widthad_b                               : natural;
158
                width_a                                 : natural;
159
                width_b                                 : natural;
160
                width_byteena_a                 : natural
161
        );
162
        port (
163
                wren_a          : in std_logic;
164
                clock0          : in std_logic;
165
                address_a       : in std_logic_vector(8 downto 0);
166
                address_b       : in std_logic_vector(8 downto 0);
167
                rden_b          : in std_logic;
168
                q_b                     : out std_logic_vector(31 downto 0);
169
                data_a          : in std_logic_vector(31 downto 0)
170
 
171
        );
172
        end component;
173
 
174
        --! Maquina de Estados.
175
        component sm
176 152 jguarin200
 
177 151 jguarin200
        port (
178
 
179
                --! Señales normales de secuencia.
180
                clk,rst:                        in std_logic;
181 152 jguarin200
                --! Vector con las instrucción codficada
182 151 jguarin200
                instrQq:in std_logic_vector(31 downto 0);
183 152 jguarin200
                --! Señal de cola vacia.
184 151 jguarin200
                instrQ_empty:in std_logic;
185
                adda,addb:out std_logic_vector (8 downto 0);
186
                sync_chain_0,instrRdAckd:out std_logic;
187
                full_r:         in std_logic;   --! Indica que la cola de resultados no puede aceptar mas de 32 elementos.
188
                --! End Of Instruction Event
189
                eoi     : out std_logic;
190
 
191
                --! DataPath Control uca code.
192
                dpc_uca : out std_logic_vector (2 downto 0);
193
                state   : out macState
194
        );
195
        end component;
196
        --! Maquina de Interrupciones
197
        component im
198
        generic (
199
                num_events : integer ;
200
                cycles_to_wait : integer
201
        );
202
        port (
203
                clk,rst:                in std_logic;
204
                rfull_events:   in std_logic_vector(num_events-1 downto 0);      --! full results queue events
205
                eoi_events:             in std_logic_vector(num_events-1 downto 0);      --! end of instruction related events
206
                eoi_int:                out std_logic_vector(num_events-1 downto 0);--! end of instruction related interruptions
207
                rfull_int:              out std_logic_vector(num_events-1downto 0);      --! full results queue related interruptions
208
                state:                  out iCtrlState
209
        );
210
        end component;
211
        --! Bloque de memorias
212
        component memblock
213
        generic (
214
                blocksize                                       : integer;
215
                external_writeable_blocks       : integer;
216
                external_readable_blocks        : integer;
217
                external_readable_widthad       : integer;
218
                external_writeable_widthad      : integer
219
        );
220
        port (
221
 
222
 
223
                clk,rst,dpfifo_rd,normfifo_rd,dpfifo_wr,normfifo_wr : in std_logic;
224
                instrfifo_rd : in std_logic;
225
                resultfifo_wr: in std_logic_vector(external_readable_blocks-1 downto 0);
226
                instrfifo_empty: out std_logic; ext_rd,ext_wr: in std_logic;
227
                ext_wr_add : in std_logic_vector(external_writeable_widthad+widthadmemblock-1 downto 0);
228
                ext_rd_add : in std_logic_vector(external_readable_widthad-1 downto 0);
229 152 jguarin200
                ext_d: in std_logic_vector(floatwidth-1 downto 0);
230
                int_d : in std_logic_vector(external_readable_blocks*floatwidth-1 downto 0);
231 151 jguarin200
                resultfifo_full  : out std_logic_vector(3 downto 0);
232 152 jguarin200
                ext_q,instrfifo_q : out std_logic_vector(floatwidth-1 downto 0);
233
                int_q : out std_logic_vector(external_writeable_blocks*floatwidth-1 downto 0);
234 151 jguarin200
                int_rd_add : in std_logic_vector(2*widthadmemblock-1 downto 0);
235 152 jguarin200
                dpfifo_d : in std_logic_vector(floatwidth*2-1 downto 0);
236
                normfifo_d : in std_logic_vector(floatwidth*3-1 downto 0);
237
                dpfifo_q : out std_logic_vector(floatwidth*2-1 downto 0);
238
                normfifo_q : out std_logic_vector(floatwidth*3-1 downto 0)
239 151 jguarin200
        );
240
        end component;
241
        --! Bloque decodificacion DataPath Control.
242
        component dpc
243
        port (
244
                clk,rst                                 : in    std_logic;
245 152 jguarin200
                paraminput                              : in    std_logic_vector ((12*floatwidth)-1 downto 0);   --! Vectores A,B,C,D
246
                prd32blko                               : in    std_logic_vector ((06*floatwidth)-1 downto 0);   --! Salidas de los 6 multiplicadores.
247
                add32blko                               : in    std_logic_vector ((04*floatwidth)-1 downto 0);   --! Salidas de los 4 sumadores.
248
                sqr32blko,inv32blko             : in    std_logic_vector (floatwidth-1 downto 0);                --! Salidas de la raiz cuadradas y el inversor.
249
                fifo32x23_q                             : in    std_logic_vector (03*floatwidth-1 downto 0);             --! Salida de la cola intermedia.
250
                fifo32x09_q                             : in    std_logic_vector (02*floatwidth-1 downto 0);     --! Salida de las colas de producto punto. 
251 151 jguarin200
                unary,crossprod,addsub  : in    std_logic;                                                                      --! Bit con el identificador del bloque AB vs CD e identificador del sub bloque (A/B) o (C/D). 
252 152 jguarin200
                sync_chain_0                    : in    std_logic;                                                                      --! Señal de dato valido que se va por toda la cadena de sincronizacion.
253
                eoi_int                                 : in    std_logic;                                                                      --! Señal de interrupción de final de instrucci&ocaute;n.
254
                eoi_demuxed_int                 : out   std_logic_vector (3 downto 0);                           --! Señal de interrup&ocaute;n de final de instrucción pero esta vez va asociada a la instruccón UCA.
255
                sqr32blki,inv32blki             : out   std_logic_vector (floatwidth-1 downto 0);                --! Salidas de las 2 raices cuadradas y los 2 inversores.
256
                fifo32x26_d                             : out   std_logic_vector (03*floatwidth-1 downto 0);             --! Entrada a la cola intermedia para la normalización.
257
                fifo32x09_d                             : out   std_logic_vector (02*floatwidth-1 downto 0);             --! Entrada a las colas intermedias del producto punto.         
258
                prd32blki                               : out   std_logic_vector ((12*floatwidth)-1 downto 0);   --! Entrada de los 12 factores en el bloque de multiplicación respectivamente.
259
                add32blki                               : out   std_logic_vector ((08*floatwidth)-1 downto 0);   --! Entrada de los 8 sumandos del bloque de 4 sumadores.  
260 151 jguarin200
                resw                                    : out   std_logic_vector (4 downto 0);                           --! Salidas de escritura y lectura en las colas de resultados.
261
                fifo32x09_w                             : out   std_logic;
262
                fifo32x23_w,fifo32x09_r : out   std_logic;
263
                fifo32x23_r                             : out   std_logic;
264
                resf_vector                             : in    std_logic_vector(3 downto 0);                            --! Entradas de la señal de full de las colas de resultados. 
265
                resf_event                              : out   std_logic;                                                                      --! Salida decodificada que indica que la cola de resultados de la operación que está en curso.
266 152 jguarin200
                resultoutput                    : out   std_logic_vector ((08*floatwidth)-1 downto 0)    --! 8 salidas de resultados, pues lo máximo que podrá calcularse por cada clock son 2 vectores.
267 151 jguarin200
        );
268
        end component;
269
        --! Bloque Aritmetico de Sumadores y Multiplicadores (madd)
270
        component arithblock
271
        port (
272
 
273
                clk     : in std_logic;
274
                rst : in std_logic;
275
 
276
                dpc : in std_logic;
277
 
278
                f       : in std_logic_vector (12*32-1 downto 0);
279
                a       : in std_logic_vector (8*32-1 downto 0);
280
 
281
                s       : out std_logic_vector (4*32-1 downto 0);
282
                p       : out std_logic_vector (6*32-1 downto 0)
283
 
284
        );
285
        end component;
286
        --! Bloque de Raiz Cuadrada
287
        component sqrt32
288
        port (
289
 
290
                clk     : in std_logic;
291
                rd32: in std_logic_vector(31 downto 0);
292
                sq32: out std_logic_vector(31 downto 0)
293
        );
294
        end component;
295
        --! Bloque de Inversores.
296
        component invr32
297
        port (
298
 
299
                clk             : in std_logic;
300
                dvd32   : in std_logic_vector(31 downto 0);
301
                qout32  : out std_logic_vector(31 downto 0)
302
        );
303
        end component;
304
end package;
305
 

powered by: WebSVN 2.1.0

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