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

Subversion Repositories raytrac

[/] [raytrac/] [branches/] [fp_sgdma/] [raytrac.vhd] - Blame information for rev 217

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

Line No. Rev Author Line
1 150 jguarin200
library ieee;
2
use ieee.std_logic_1164.all;
3 211 jguarin200
use ieee.std_logic_unsigned.all;
4 150 jguarin200
 
5 211 jguarin200
library altera_mf;
6
use altera_mf.altera_mf_components.all;
7
 
8
library lpm;
9
use lpm.lpm_components.all;
10
 
11
 
12 217 jguarin200
entity raytrac is
13 211 jguarin200
        generic (
14
                wd      :       integer := 32;
15
                sl      :       integer := 5;   --! Arith Sync Chain Long 2**sl
16
                ln      :       integer := 12;  --! Max Transfer Length = 2**ln = n_outputbuffers * 256
17
                fd      :       integer := 8;   --! Result Fifo Depth = 2**fd =256
18
                mb      :       integer := 4;   --! Max Burst Length = 2**mb            
19
                nr      :       integer := 4    --! Number of Registers = 2**nr
20
        );
21 150 jguarin200
        port (
22 211 jguarin200
                clk:    in std_logic;
23
                rst:    in std_logic;
24 150 jguarin200
 
25 211 jguarin200
                --! Avalon MM Slave
26
                slave_address                   :       in      std_logic_vector(3 downto 0);
27
                slave_read                              :       in      std_logic;
28
                slave_write                             :       in      std_logic;
29
                slave_readdata                  :       out std_logic_vector(31 downto 0);
30
                slave_writedata                 :       in      std_logic_vector(31 downto 0);
31
 
32
                --! Avalon MM Master (Read & Write common signals)      
33
                master_address                  :       out std_logic_vector(31 downto 0);
34
                master_burstcount               :       out std_logic_vector(4 downto 0);
35
                master_waitrequest              :       in      std_logic;
36 150 jguarin200
 
37 211 jguarin200
                --! Avalon MM Master (Read Stage)
38
                master_read                             :       out     std_logic;
39
                master_readdata                 :       in      std_logic_vector(31 downto 0);
40
                master_readdatavalid    :       in      std_logic;
41 202 jguarin200
 
42 211 jguarin200
                --! Avalon MM Master (Write Stage)
43
                master_write                    :       out     std_logic;
44
                master_writedata                :       out std_logic_vector(31 downto 0);
45 150 jguarin200
 
46 211 jguarin200
                --! Avalon IRQ
47
                irq                                             :       out std_logic
48 150 jguarin200
 
49 211 jguarin200
 
50
 
51 150 jguarin200
        );
52
end entity;
53
 
54
 
55 217 jguarin200
architecture raytrac_arch of raytrac is
56 211 jguarin200
 
57
        --! Altera Compiler Directive, to avoid m9k autoinferring thanks to the guys at http://www.alteraforum.com/forum/archive/index.php/t-30784.html .... 
58
        attribute altera_attribute : string;
59 217 jguarin200
        attribute altera_attribute of raytrac_arch : architecture is "-name AUTO_SHIFT_REGISTER_RECOGNITION OFF";
60 161 jguarin200
 
61 211 jguarin200
 
62
        subtype xfloat32                is std_logic_vector(wd-1 downto 0);
63
        type    registerblock   is array ((2**nr)-1 downto 0) of xfloat32;
64
        type    transferState   is (IDLE,SINK,SOURCE);
65 202 jguarin200
 
66 211 jguarin200
        constant rstMasterValue : std_logic :='0';
67 202 jguarin200
 
68
 
69 211 jguarin200
        constant reg_ctrl                               :       integer:=00;
70
        constant reg_vz                                 :       integer:=01;
71
        constant reg_vy                                 :       integer:=02;
72
        constant reg_vx                                 :       integer:=03;
73
        constant reg_scalar                             :       integer:=04;
74
        constant reg_scratch00                  :       integer:=05;
75
        constant reg_outputcounter              :       integer:=06;
76
        constant reg_inputcounter               :       integer:=07;
77
        constant reg_fetchstart                 :       integer:=08;
78
        constant reg_sinkstart                  :       integer:=09;
79
        constant reg_ax                                 :       integer:=10;
80
        constant reg_ay                                 :       integer:=11;
81
        constant reg_az                                 :       integer:=12;
82
        constant reg_bx                                 :       integer:=13;
83
        constant reg_by                                 :       integer:=14;
84
        constant reg_bz                                 :       integer:=15;
85
 
86
 
87 172 jguarin200
 
88 211 jguarin200
        constant reg_ctrl_cmb                   :       integer:=00;    --! CMB bit : Combinatorial Instruction.
89
        constant reg_ctrl_s                             :       integer:=01;    --! S bit of the DCS field.
90
        constant reg_ctrl_c                             :       integer:=02;    --! C bit of the DCS field.
91
        constant reg_ctrl_d                             :       integer:=03;    --! D bit of the DCS field.
92 202 jguarin200
 
93 211 jguarin200
        constant reg_ctrl_sc                    :       integer:=04;    --! SC bit of the VTSC field.
94
        constant reg_ctrl_vt                    :       integer:=05;    --! VT bit of the VTSC field.
95 217 jguarin200
        constant reg_ctrl_dma                   :       integer:=06;    --! DMA bit.
96 211 jguarin200
        constant reg_ctrl_flags_fc              :       integer:=07;    --! Flood Condition Flag.
97 202 jguarin200
 
98 211 jguarin200
        constant reg_ctrl_flags_dc              :       integer:=08;    --! Drain Condition Flag.       
99
        constant reg_ctrl_flags_wp              :       integer:=09;    --! Write on Memory Pending Flag.
100
        constant reg_ctrl_flags_pp              :       integer:=10;    --! Pipeline Pending Flag.
101
        constant reg_ctrl_flags_pl              :       integer:=11;    --! Load Parameter Pending Flag.
102 202 jguarin200
 
103 211 jguarin200
        constant reg_ctrl_flags_dp              :       integer:=12;    --! Data Pending flag.
104
        constant reg_ctrl_flags_ap              :       integer:=13;    --! Address Pending Flag.
105
        constant reg_ctrl_rlsc                  :       integer:=14;    --! RLSC bit : Reload Load Sync Chain.
106
        constant reg_ctrl_rom                   :       integer:=15;    --! ROM bit : Read Only Mode bit.
107 202 jguarin200
 
108 211 jguarin200
        constant reg_ctrl_nfetch_low    :       integer:=16;    --! NFETCH_LOW : Lower bit to program the number of addresses to load in the interconnection.
109
        constant reg_ctrl_nfetch_high   :       integer:=30;    --! NFETCH_HIGH : Higher bit to program the number of addresses to load in the interconnection. 
110
        constant reg_ctrl_irq                   :       integer:=31;    --! IRQ bit : Interrupt Request Signal.
111
 
112
 
113
        --! Avalon MM Slave
114
        signal  sreg_block                      :       registerblock;
115
        signal  sslave_read                     :       std_logic;
116
        signal  sslave_write            :       std_logic;
117
        signal  sslave_writedata        :       xfloat32;
118
        signal  sslave_address          :       std_logic_vector        (nr-1 downto 0);
119
        signal  sslave_waitrequest      :       std_logic;
120 217 jguarin200
 
121 211 jguarin200
        --! Avalon MM Master
122
        signal  smaster_write           :       std_logic;
123
        signal  smaster_read            :       std_logic;
124 202 jguarin200
 
125 211 jguarin200
        --! State Machine and event signaling
126
        signal sm                                       :       transferState;
127
 
128
        signal sres_ack                         :       std_logic;
129
        signal soutb_ack                        :       std_logic;
130
 
131
        signal sres_q                           :       std_logic_vector(4*wd-1 downto 0);
132
 
133
        signal sres_d                           :       std_logic_vector(4*wd-1 downto 0);
134
        signal soutb_d                          :       std_logic_vector(wd-1 downto 0);
135
 
136
 
137
        signal sres_w                           :       std_logic;
138
        signal soutb_w                          :       std_logic;
139
 
140
        signal sres_e                           :       std_logic;
141
        signal soutb_e                          :       std_logic;
142
        signal soutb_ae                         :       std_logic;
143
        signal soutb_af                         :       std_logic;
144
 
145 217 jguarin200
 
146 211 jguarin200
        signal soutb_usedw                      :       std_logic_vector(fd-1 downto 0);
147
 
148
        signal ssync_chain_1            :       std_logic;
149
        signal ssync_chain_pending      :       std_logic;
150
        signal sfetch_data_pending      :       std_logic;
151
        signal sload_add_pending        :       std_logic;
152
        signal spipeline_pending        :       std_logic;
153
        signal swrite_pending           :   std_logic;
154
        signal sparamload_pending       :       std_logic;
155
        signal sZeroTransit                     :       std_logic;
156
 
157
 
158
        --!Unload Control
159 217 jguarin200
        type upload_chain is (VX,VY,VZ,SC,DMA);
160 211 jguarin200
        signal supload_chain    : upload_chain;
161
        signal supload_start    : upload_chain;
162 202 jguarin200
 
163 211 jguarin200
        --!Señales de apoyo:
164
        signal zero : std_logic_vector(31 downto 0);
165
 
166
        --!High Register Bank Control Signals or AKA Load Sync Chain Control
167
        type download_chain is (AX,AY,AZ,BX,BY,BZ,AXBX,AYBY,AZBZ);
168
        signal sdownload_chain  : download_chain;
169
        signal sdownload_start  : download_chain;
170
        signal srestart_chain   : std_logic;
171
        --!State Machine Hysteresis Control Signals
172
        signal sdrain_condition         : std_logic;
173
        signal sdrain_burstcount        : std_logic_vector(mb downto 0);
174
        signal sdata_fetch_counter      : std_logic_vector(reg_ctrl_nfetch_high downto reg_ctrl_nfetch_low);
175
        signal sburstcount_sink         : std_logic_vector(mb downto 0);
176
 
177
        signal sflood_condition         : std_logic;
178
        signal sflood_burstcount        : std_logic_vector(mb downto 0);
179 177 jguarin200
 
180 211 jguarin200
 
181
begin
182
 
183
        --! Unos y ceros
184
        zero    <= (others => '0');
185
 
186
        --! Salidas no asignadas
187
 
188
        --! Mientras tanto
189
        ssync_chain_pending <= ssync_chain_1;
190
        sres_d ((wd*1)-1 downto wd*0)<= sreg_block(reg_bz) ;
191
        sres_d ((wd*2)-1 downto wd*1)<= sreg_block(reg_by) ;
192
        sres_d ((wd*3)-1 downto wd*2)<= sreg_block(reg_bx) ;
193
        sres_d ((wd*4)-1 downto wd*3)<= sreg_block(reg_ax) ;
194
        sres_w <= ssync_chain_1;
195
 
196
 
197
 
198
--! *************************************************************************************************************************************************************************************************************************************************************
199
--! AVALON MEMORY MAPPED MASTER INTERFACE BEGIN  =>  =>  =>  =>  =>  =>  =>  =>  =>  =>  =>  =>  =>  =>  =>  =>  =>  =>  =>  =>  =>  =>  =>  =>  =>  =>  =>  =>  =>  =>  =>  =>  =>  =>  =>  =>  =>  =>  =>  =>  =>  =>  =>  =>  => 
200
--! *************************************************************************************************************************************************************************************************************************************************************
201
--! ******************************************************************************************************************************************************                                              
202
--! TRANSFER CONTROL RTL CODE
203
--! ******************************************************************************************************************************************************                                              
204
        TRANSFER_CONTROL:
205
        process(clk,rst,master_waitrequest,soutb_ae,soutb_usedw,spipeline_pending,soutb_e,zero,soutb_af,sfetch_data_pending,sreg_block,sslave_write,sslave_address,sslave_writedata,ssync_chain_pending,sres_e,smaster_read,smaster_write,sdata_fetch_counter,sload_add_pending,swrite_pending,sdownload_chain)
206
        begin
207 202 jguarin200
 
208 211 jguarin200
                --! Conexi&oacuteln a se&ntilde;ales externas. 
209
                irq <= sreg_block(reg_ctrl)(reg_ctrl_irq);
210
                master_read <= smaster_read;
211
                master_write <= smaster_write;
212 202 jguarin200
 
213 217 jguarin200
                --! Direct Memory Access Selector.
214 150 jguarin200
 
215 217 jguarin200
 
216
 
217 211 jguarin200
                --! ZERO_TRANSIT: Cuando todos los elementos de sincronizaci&oacute;n est&aacute;n en cero menos la cola de sincronizaci&oacute;n de carga de parametros.
218
                sZeroTransit <= not(sload_add_pending or sfetch_data_pending or spipeline_pending or swrite_pending);
219 202 jguarin200
 
220 211 jguarin200
                --! ELEMENTO DE SINCRONIZACION OUT QUEUE: Datos pendientes por cargar a la memoria a trav&eacute;s de la interconexi&oacute;n
221
                swrite_pending <= not(soutb_e);
222 202 jguarin200
 
223 211 jguarin200
                --! ELEMENTO DE SINCRONIZACION ARITH PIPELINE: Hay datos transitando por el pipeline aritm&eacute;tico.
224
                if ssync_chain_pending='1' or sres_e='0' then
225
                        spipeline_pending <= '1';
226
                else
227
                        spipeline_pending <= '0';
228
                end if;
229 202 jguarin200
 
230 211 jguarin200
                --! ELEMENTO DE SINCRONIZACION DESCARGA DE DATOS: Hay datos pendientes por descargar desde la memoria a trav&eacute;s de la interconexi&oacute;n.
231
                if sdata_fetch_counter=zero(reg_ctrl_nfetch_high downto reg_ctrl_nfetch_low) then
232
                        sfetch_data_pending <= '0';
233
                else
234
                        sfetch_data_pending <= '1';
235
                end if;
236
 
237
                --! ELEMENTO DE SINCRONIZACION CARGA DE DIRECCIONES: Hay direcciones pendientes por cargar a la interconexi&oacute;n?
238
                if sreg_block(reg_ctrl)(reg_ctrl_nfetch_high downto reg_ctrl_nfetch_low)=zero(reg_ctrl_nfetch_high downto reg_ctrl_nfetch_low) then
239
                        sload_add_pending <= '0';
240
                else
241
                        sload_add_pending <= '1';
242
                end if;
243 202 jguarin200
 
244 211 jguarin200
                --! ELEMENTO DE SINCRONIZACION CARGA DE OPERANDOS: Se est&aacute;n cargando los operandos que ser&aacute;n operados en el pipeline aritm&eacute;tico.
245
                if sdownload_chain /= AX and sdownload_chain /= AXBX then
246
                        sparamload_pending <= '1';
247
                else
248
                        sparamload_pending <= '0';
249
                end if;
250
 
251
                --! Se debe iniciar una transacci&oacute;n de descarga de datos desde la memoria externa?
252
                if soutb_af='0' and sload_add_pending='1' then
253
                        --! Flow Control : La saturaci&oacute;n de la cola de resultados continuar&aacute; si no est&aacute; tan llena y adem&aacute;s hay pendientes datos por ser descargados.
254
                        sflood_condition <= '1';
255
                else
256
                        --! Flow Control : La saturaci&oacute;n de la cola de resultados debe parar porque est&aacute; cas&iacute; llena.       
257
                        sflood_condition <= '0';
258
                end if;
259
                if sreg_block(reg_ctrl)(reg_ctrl_nfetch_high downto reg_ctrl_nfetch_low+mb)/=zero(reg_ctrl_nfetch_high downto reg_ctrl_nfetch_low+mb) then
260
                        --! Flow Control: Si el n&uacute;mero de descargas pendientes es mayor o igual al max burst length, entonces cargar max burst en el contador.
261
                        sflood_burstcount <= '1'&zero(mb-1 downto 0);
262
                else
263
                        --! Flow Control: Si le n&uacute;mero de descargas pendientes es inferior a Max Burst Count entonces cargar los bits menos significativos del registro de descargas pendientes.
264
                        sflood_burstcount <= '0'&sreg_block(reg_ctrl)(reg_ctrl_nfetch_low+mb-1 downto reg_ctrl_nfetch_low);
265
                end if;
266 202 jguarin200
 
267 211 jguarin200
                --! Se debe iniciar una transacci&oacute;n de carga de datos hacia la memoria externa?
268
                if soutb_ae='1' then
269
                        --! Flow Control : Cuando se est&eacute; drenando la cola de resultados, si la cola est&aacute; cas&iacute; vac&iaute;a, la longitud del burst ser&aacute;n los bits menos significativos del contador de la cola.  
270
                        sdrain_burstcount <= soutb_usedw(mb downto 0);
271
                        --! Flow Control: El drenado de datos continuar&aacute; si el n&uacute;mero de datos en la cola bajo y no hay datos transitando por el pipeline, ni datos pendientes por cargar desde la memoria.   
272
                        sdrain_condition <= not(sload_add_pending) and not(sfetch_data_pending) and not(spipeline_pending) and swrite_pending;
273
                else
274
                        --! Flow Control: Cuando se est&eacute; drenando la cola de resultados, si la cola de tiene una cantidad de datos mayor al burst count entonces se har&aacute; una transacci&oacute;n de longitud equivalente al burst count.
275
                        sdrain_burstcount <= '1'&zero(mb-1 downto 0);
276
                        --! Flow Control: El drenado de datos continuar&aacute; si el n&uacute;mero de datos en la cola es mayor o igual a 2**mb O si hay muy pocos datos y no hay datos transitando por el pipeline.   
277
                        sdrain_condition <= '1';
278
                end if;
279 202 jguarin200
 
280 211 jguarin200
                --! Restart param load chain
281
                srestart_chain <= sreg_block(reg_ctrl)(reg_ctrl_irq) and sreg_block(reg_ctrl)(reg_ctrl_rlsc);
282 202 jguarin200
 
283 217 jguarin200
                --! Data dumpster: Descaratar dato de upload una vez la interconexi&oacute;n haya enganchado el dato.
284 211 jguarin200
                if sm=SINK and master_waitrequest='0' and smaster_write='1' then
285
                        soutb_ack <= '1';
286
                else
287
                        soutb_ack <= '0';
288
                end if;
289 202 jguarin200
 
290 217 jguarin200
 
291
 
292 211 jguarin200
                --! Flow Control State Machine.
293
                if rst=rstMasterValue then
294
 
295
                        --! State Machine 
296
                        sm <= IDLE;
297
 
298
 
299
                        --! Master Write & Read Common Signals Reset Value
300
                        master_burstcount       <= (others => '0');
301
                        master_address          <= (others => '0');
302
                        sdata_fetch_counter     <= (others => '0');
303
                        sburstcount_sink        <= (others => '0');
304 150 jguarin200
 
305 211 jguarin200
                        --! Master Read Only Signals Reset Value
306
                        smaster_read            <= '0';
307
 
308
                        --! Master Write Only Signals
309
                        smaster_write           <= '0';
310
 
311
                        --! Reg Ctrl & Fetch address and writeaddress
312
                        --! Sinking address
313
                        sreg_block(reg_sinkstart) <= (others => '0');
314
                        --! Sourcing address
315
                        sreg_block(reg_fetchstart) <= (others => '0');
316
                        --! Control and Status Register
317
                        sreg_block(reg_ctrl) <= (others => '0');
318
                        --! Contador Overall
319
                        sreg_block(reg_inputcounter) <= (others => '0');
320
                        sreg_block(reg_outputcounter) <= (others => '0');
321
 
322
 
323
                elsif clk'event and clk='1' then
324 150 jguarin200
 
325 211 jguarin200
                        --! Nevermind the State, discount the incoming valid data counter.
326
                        sdata_fetch_counter <= sdata_fetch_counter-master_readdatavalid;
327
 
328
                        --! Debug Counter.
329
                        sreg_block(reg_inputcounter) <= sreg_block(reg_inputcounter) + master_readdatavalid;
330
                        sreg_block(reg_outputcounter) <= sreg_block(reg_outputcounter) + soutb_ack;
331 152 jguarin200
 
332 211 jguarin200
                        --! Flags
333
 
334
 
335
                        case sm is
336
                                when SOURCE =>
337
                                        --! ******************************************************************************************************************************************************                                              
338
                                        --! Flooding the pipeline ........
339
                                        --! ******************************************************************************************************************************************************                                              
340
                                        if smaster_read='0' then
341
                                                if sflood_condition = '1' then
342
                                                        --! Flow Control: Hay suficiente espacio en el buffer de salida y hay descargas pendientes por hacer
343
                                                        smaster_read <= '1';
344
                                                        master_address <= sreg_block(reg_fetchstart);
345
                                                        master_burstcount <= sflood_burstcount;
346
                                                        sdata_fetch_counter <= sdata_fetch_counter+sflood_burstcount-master_readdatavalid;
347
                                                        --! Context Saving:
348
                                                        sreg_block(reg_fetchstart) <= sreg_block(reg_fetchstart) + (sflood_burstcount&"00");
349
                                                        sreg_block(reg_ctrl)(reg_ctrl_nfetch_high downto reg_ctrl_nfetch_low) <= sreg_block(reg_ctrl)(reg_ctrl_nfetch_high downto reg_ctrl_nfetch_low) - sflood_burstcount;
350
                                                else
351
                                                        --! Flow Control : Cambiar al estado SINK, porque o est&aacute; muy llena la cola de salida o no hay descargas pendientes por realizar.
352
                                                        sm <= SINK;
353
                                                end if;
354
                                        else --master_read=1;
355
                                                if master_waitrequest='0' then
356
                                                        --! Las direcciones de lectura est&aacute;n cargadas. Terminar la transferencia.
357
                                                        smaster_read <= '0';
358
                                                end if;
359
                                        end if;
360
                                when SINK =>
361
 
362
                                        --! ******************************************************************************************************************************************************                                              
363
                                        --! Draining the pipeline ........
364
                                        --! ******************************************************************************************************************************************************                                              
365
                                        if smaster_write='0' then
366
 
367
                                                if sdrain_condition='1' then
368
                                                        --! Flow Control : Hay muchos datos aun en la cola de resultados &Oacute; la cola de resultados est&aacute; cas&iacute; vac&iacute;a y no hay datos transitando en el pipeline aritm&eetico.
369
                                                        smaster_write <= '1';
370
                                                        master_address <= sreg_block(reg_sinkstart);
371
                                                        master_burstcount <= sdrain_burstcount;
372 150 jguarin200
 
373 211 jguarin200
                                                        --!Context Saving
374
                                                        sreg_block(reg_sinkstart) <= sreg_block(reg_sinkstart) + (sdrain_burstcount&"00");
375
                                                        sburstcount_sink <= sdrain_burstcount-1;
376
                                                else
377
                                                        --! Flow Control: Son muy pocos los datos que hay en el buffer de salida y existen aun datos transitando en el resto del pipe ir al estado SOURCE.
378
                                                        if sZeroTransit='1' then
379
 
380
                                                                --! Flow Control: Finalizada la instrucci&oacute;n, generar una interrupci&oacute;n e ir al estado IDLE.
381
                                                                sm <= IDLE;
382
                                                                sreg_block(reg_ctrl)(reg_ctrl_irq) <= '1';
383
                                                                sreg_block(reg_ctrl)(reg_ctrl_rom) <= '0';
384 217 jguarin200
                                                                sreg_block(reg_ctrl)(reg_ctrl_flags_dc downto reg_ctrl_flags_fc) <= sdrain_condition & sflood_condition;
385 211 jguarin200
                                                                sreg_block(reg_ctrl)(reg_ctrl_flags_ap downto reg_ctrl_flags_wp) <= sload_add_pending & sfetch_data_pending & sparamload_pending & spipeline_pending & swrite_pending;
386
 
387
                                                        else
388
 
389
                                                                --! Flow Control: Cambiar a Source porque aun hay elementos transitando.
390
                                                                sm <= SOURCE;
391
                                                        end if;
392
 
393
                                                end if;
394
                                        else --!smaster_write=1 
395
                                                if master_waitrequest = '0' then
396
 
397
                                                        --! Descartar datos : revisar antes de este proceso secuencial la parte combinatoria (Data Dumpster).
398
 
399
 
400
                                                        if sburstcount_sink/=zero(mb downto 0) then
401
 
402
                                                                --! Datos pendientes por transmitir aun en el burst. Restar uno 
403
                                                                sburstcount_sink <= sburstcount_sink-1;
404
                                                        else
405
 
406
                                                                --! No escribir mas. Finalizar la transmisi&oacute;n
407
                                                                smaster_write <= '0';
408
 
409
                                                                --! Si no hay transito de dato se con terminada la instrucci&oacute;n siempre que el estado de control de flujo est&eacute; sidera  
410
                                                                if sZeroTransit='1' then
411
 
412
                                                                        --! Flow Control: Finalizada la instrucci&oacute;n, generar una interrupci&oacute;n e ir al estado IDLE.
413
                                                                        sm <= IDLE;
414
                                                                        sreg_block(reg_ctrl)(reg_ctrl_irq) <= '1';
415
                                                                        sreg_block(reg_ctrl)(reg_ctrl_rom) <= '0';
416 217 jguarin200
                                                                        sreg_block(reg_ctrl)(reg_ctrl_flags_dc downto reg_ctrl_flags_fc) <= sdrain_condition & sflood_condition;
417 211 jguarin200
                                                                        sreg_block(reg_ctrl)(reg_ctrl_flags_ap downto reg_ctrl_flags_wp) <= sload_add_pending & sfetch_data_pending & sparamload_pending & spipeline_pending & swrite_pending;
418
 
419
                                                                end if;
420
                                                        end if;
421
                                                end if;
422
                                        end if;
423
 
424
                                when IDLE =>
425
                                        --! ******************************************************************************************************************************************************                                              
426
                                        --! Programming the pipeline
427
                                        --! ******************************************************************************************************************************************************                                              
428
                                        --! El registro de control en sus campos fetch e irq, es escribile solo cuando estamos en estado IDLE.           
429
                                        if sslave_write='1' then
430
                                                case sslave_address is
431
                                                        when x"0" =>
432
                                                                --! Solo se permitira escribir en el registro de control si no hay una interrupci&oacute;n activa o si la hay solamente si se esta intentando desactivar la interrupci&acute;n 
433
                                                                if sreg_block(reg_ctrl)(reg_ctrl_irq)='0' or sslave_writedata(reg_ctrl_irq)='0' then
434
                                                                        sreg_block(reg_ctrl)(reg_ctrl_irq downto reg_ctrl_nfetch_low) <= sslave_writedata(reg_ctrl_irq downto reg_ctrl_nfetch_low);
435
                                                                        sreg_block(reg_ctrl)(reg_ctrl_flags_wp-1 downto reg_ctrl_cmb) <= sslave_writedata(reg_ctrl_flags_wp-1 downto reg_ctrl_cmb);
436
                                                                end if;
437
                                                        when x"6" => sreg_block(reg_outputcounter) <= sslave_writedata;
438
                                                        when x"7" => sreg_block(reg_inputcounter) <= sslave_writedata;
439
                                                        when x"8" => sreg_block(reg_fetchstart) <= sslave_writedata;
440
                                                        when x"9" => sreg_block(reg_sinkstart) <= sslave_writedata;
441
                                                        when others => null;
442
                                                end case;
443
                                        else
444
 
445
                                                if sZeroTransit='0' then
446
 
447
 
448
                                                        --! Flow Control: Existe un n&uacute;mero de descargas programadas por el sistema, comenzar a realizarlas.
449
                                                        --! Ir al estado Source.
450
                                                        sm <= SOURCE;
451
                                                        sreg_block(reg_ctrl)(reg_ctrl_rom) <= '1';
452
 
453
                                                end if;
454
                                        end if;
455
                                when others =>
456
                                        null;
457
                        end case;
458
                end if;
459
        end process;
460
--! ******************************************************************************************************************************************************                                              
461
--! FLOW CONTROL RTL CODE
462
--! ******************************************************************************************************************************************************                                              
463
--! Colas de resultados y buffer de salida
464
--! ******************************************************************************************************************************************************                                              
465
        res:scfifo
466
        generic map     (lpm_numwords => 2**fd, lpm_showahead => "ON", lpm_width => 128, lpm_widthu     => fd, overflow_checking => "ON", underflow_checking => "ON", use_eab => "ON")
467
        port map        (rdreq => sres_ack, aclr => '0', empty => sres_e, clock => clk, q => sres_q,     wrreq => sres_w, data => sres_d);
468
        output_buffer:scfifo
469
        generic map (almost_empty_value => 2**mb,almost_full_value => (2**fd)-52, lpm_widthu => fd, lpm_numwords => 2**fd, lpm_showahead => "ON", lpm_width => 32, overflow_checking => "ON", underflow_checking => "ON", use_eab => "ON")
470
        port map        (empty => soutb_e, aclr => '0', clock => clk, rdreq      => soutb_ack, wrreq     => soutb_w,     q => master_writedata, usedw    => soutb_usedw, almost_full => soutb_af, almost_empty => soutb_ae, data => soutb_d);
471
--! ******************************************************************************************************************************************************                                              
472
--! PROCESO DE CONTROL DE FLUJO ENTRE EL BUFFER DE RESULTADOS Y EL BUFFER DE SALIDA
473
--! ******************************************************************************************************************************************************                                              
474
 
475
        FLOW_CONTROL_OUTPUT_STAGE:
476 217 jguarin200
        process (clk,rst,master_readdata, master_readdatavalid,sres_e,sreg_block(reg_ctrl)(reg_ctrl_vt downto reg_ctrl_sc),sm,supload_chain,zero,ssync_chain_pending,sres_q,supload_start)
477 211 jguarin200
        begin
478
 
479
 
480
                --! Compute initial State.
481
 
482
                --! Escribir en el output buffer.
483 217 jguarin200
                if supload_chain=DMA then
484
                        --! Modo DMA escribir los datos de entrada directamente en el buffer.
485
                        soutb_w <= master_readdatavalid;
486
                else
487
                        --!Modo Arithmetic Pipeline 
488
                        soutb_w <= not(sres_e);
489
                end if;
490 211 jguarin200
 
491
                --! Control de lectura de la cola de resultados.
492
                if sres_e='0' then
493
                        --!Hay datos en la cola de resultados.
494
                        if (supload_chain=VZ and sreg_block(reg_ctrl)(reg_ctrl_sc)='0') or supload_chain=SC then
495
                                --!Se transfiere el ultimo componente vectorial y no se estan cargando resultados escalares.
496
                                sres_ack <= '1';
497
                        end if;
498
                else
499
                        sres_ack <= '0';
500
                end if;
501
 
502 217 jguarin200
 
503 211 jguarin200
                --! Decodificar que salida de la cola de resultados se conecta a la entrada del otput buffer
504 217 jguarin200
                --! DMA Path Control: Si se encuentra habilitado el modo dma entonces conectar la entrada del buffer de salida a la interconexi&oacute;n
505 211 jguarin200
                case supload_chain is
506
                        when VX =>
507
                                soutb_d <= sres_q ((wd*1)-1 downto wd*0);
508
                        when VY =>
509
                                soutb_d <= sres_q ((wd*2)-1 downto wd*1);
510
                        when VZ =>
511
                                soutb_d <= sres_q ((wd*3)-1 downto wd*2);
512
                        when SC =>
513
                                soutb_d <= sres_q ((wd*4)-1 downto wd*3);
514 217 jguarin200
                        when DMA =>
515
                                soutb_d <= master_readdata;
516 211 jguarin200
                end case;
517
 
518
 
519
                case sreg_block(reg_ctrl)(reg_ctrl_vt downto reg_ctrl_sc) is
520
                        when "01" =>
521
                                supload_start <= SC;
522
                        when others =>
523
                                supload_start <= VX;
524
                end case;
525
 
526
 
527
                --! M&aacute;quina de estados para el width adaptation RES(128) -> OUTPUTBUFFER(32).    
528
                if rst=rstMasterValue then
529
                        supload_chain <= VX;
530 217 jguarin200
                elsif clk'event and clk='1' and sreg_block(reg_ctrl)(reg_ctrl_dma)='0' then
531
                        --! Modo de operaci&oacute;n normal.
532 211 jguarin200
                        case supload_chain is
533
                                when VX =>
534
                                        if sres_e='1' then
535
                                                supload_chain <= supload_start;
536
                                        else
537
                                                supload_chain <= VY;
538
                                        end if;
539
                                when VY =>
540
                                        supload_chain <= VZ;
541
                                when VZ =>
542
                                        if sreg_block(reg_ctrl)(reg_ctrl_sc)='0' then
543
                                                supload_chain <= VX;
544
                                        else
545
                                                supload_chain <= SC;
546
                                        end if;
547 217 jguarin200
                                when SC|DMA =>
548 211 jguarin200
                                        supload_chain <= supload_start;
549 217 jguarin200
 
550 211 jguarin200
                        end case;
551 217 jguarin200
 
552
                elsif clk'event and clk='1' then
553
                        --! Modo DMA
554
                        supload_chain <= DMA;
555 211 jguarin200
                end if;
556
 
557
 
558
        end process;
559
--! ******************************************************************************************************************************************************                                              
560
--! PROCESO DE CONTROL DE FLUJO ENTRE LA ENTRADA DESDE LA INTERCONEXI&OACUTE;N Y LOS PARAMETROS DE ENTRADA EN EL PIPELINE ARITMETICO
561
--! ******************************************************************************************************************************************************                                              
562
        FLOW_CONTROL_INPUT_STAGE:
563 217 jguarin200
        process(clk,rst,master_readdatavalid,master_readdata,sreg_block(reg_ctrl)(reg_ctrl_dma downto reg_ctrl_s),sslave_write,sslave_address,supload_chain)
564 211 jguarin200
        begin
565
                --! Est&aacute; ocurriendo un evento de transici&oacute;n del estado TX al estado FETCH: Programar el enganche de par&aacute;metros que vienen de la interconexi&oacute;n.
566
                --! Mirar como es la carga inicial. Si es Normalizacion o Magnitud (dcs=110) entonces cargar AXBX de lo contrario solo AX.
567
                case sreg_block(reg_ctrl)(reg_ctrl_d downto reg_ctrl_s) is
568
                        when "110" | "100"      =>      sdownload_start <= AXBX;
569
                        when others                     =>      sdownload_start <= AX;
570
                end case;
571
                if rst=rstMasterValue then
572
                        ssync_chain_1 <= '0';
573
                        sdownload_chain <= AX;
574
                        for i in reg_bz downto reg_ax loop
575
                                sreg_block(i) <= (others => '0');
576
                        end loop;
577
                elsif clk'event and clk='1' then
578
                        ssync_chain_1   <= '0';
579 217 jguarin200
                        if master_readdatavalid='1' and sreg_block(reg_ctrl)(reg_ctrl_dma)='0' then
580 211 jguarin200
                                --! El dato en la interconexi&oacute;n es valido, se debe enganchar. 
581
                                case sdownload_chain is
582
                                        when AX | AXBX  =>
583
                                                --! Cargar el operando correspondiente al componente "X" del vector "A" 
584
                                                ssync_chain_1 <= '0';
585
                                                sreg_block(reg_ax) <= master_readdata;
586
                                                if sdownload_start = AXBX then
587
                                                        --! Operaci&oacute;n Unaria por ejemplo magnitud de un vector
588
                                                        --! Escribir en el registro bx adicionalmente. 
589
                                                        sreg_block(reg_bx) <= master_readdata;
590
                                                        --! El siguiente estado es cargar el componente "Y" de del operando a ejecutar. 
591
                                                        sdownload_chain <= AYBY;
592
                                                else
593
                                                        --! Operaci&oacute;n de dos operandos. Por ejemplo Producto Cruz.
594
                                                        --! El siguiente estado es cargar el vector "Y" del operando "A".
595
                                                        sdownload_chain <= AY;
596
                                                end if;
597
                                        when AY | AYBY =>
598
                                                sreg_block(reg_ay) <= master_readdata;
599
                                                ssync_chain_1 <= '0';
600
                                                if sdownload_chain = AYBY then
601
                                                        sreg_block(reg_by) <= master_readdata;
602
                                                        sdownload_chain <= AZBZ;
603
                                                else
604
                                                        sdownload_chain <= AZ;
605
                                                end if;
606
                                        when AZ  | AZBZ =>
607
                                                sreg_block(reg_az) <= master_readdata;
608
                                                if sdownload_chain=AZBZ then
609
                                                        ssync_chain_1 <= '1';
610
                                                        sreg_block(reg_bz) <= master_readdata;
611
                                                        sdownload_chain <= AXBX;
612
                                                else
613
                                                        ssync_chain_1 <= '0';
614
                                                        sdownload_chain <= BX;
615
                                                end if;
616
                                        when BX  =>
617
                                                ssync_chain_1 <= '0';
618
                                                sreg_block(reg_bx) <= master_readdata;
619
                                                sdownload_chain <= BY;
620
                                        when BY =>
621
                                                ssync_chain_1 <= '0';
622
                                                sreg_block(reg_by) <= master_readdata;
623
                                                sdownload_chain <= BZ;
624
                                        when BZ =>
625
                                                sreg_block(reg_bz) <= master_readdata;
626
                                                ssync_chain_1 <= '1';
627
                                                if sreg_block(reg_ctrl)(reg_ctrl_cmb)='1' then
628
                                                        sdownload_chain <= BX;
629
                                                else
630
                                                        sdownload_chain <= AX;
631
                                                end if;
632
                                        when others =>
633
                                                null;
634
                                end case;
635
 
636
                                if srestart_chain='1' then
637
                                        sdownload_chain <= sdownload_start;
638
                                end if;
639
 
640
                        end if;
641
                end if;
642
        end process;
643
--! *************************************************************************************************************************************************************************************************************************************************************
644
--! AVALON MEMORY MAPPED MASTER FINISHED
645
--! *************************************************************************************************************************************************************************************************************************************************************
646
--! *************************************************************************************************************************************************************************************************************************************************************
647
--! AVALON MEMORY MAPPED SLAVE BEGINS =>  =>  =>  =>  =>  =>  =>  =>  =>  =>  =>  =>  =>  =>  =>  =>  =>  =>  =>  =>  =>  =>  =>  =>  =>  =>  =>  =>  =>  =>  =>  =>  =>  =>  =>  =>  =>  =>  =>  =>  =>  =>  =>  =>  =>  =>  =>
648
--! *************************************************************************************************************************************************************************************************************************************************************
649
        --! Master Slave Process: Proceso para la escritura y lectura de registros desde el NIOS II.
650
        low_register_bank:
651
        process (clk,rst,sreg_block)
652
        begin
653
                if rst=rstMasterValue then
654
                        for i in reg_scratch00 downto reg_vz loop
655
                                sreg_block(i) <= (others => '0');
656
                        end loop;
657
 
658
                        slave_readdata <= (others => '0');
659
                        sslave_address <= (others => '0');
660
                        sslave_writedata <= (others => '0');
661
                        sslave_write <= '0';
662
                        sslave_read <= '0';
663
                elsif clk'event and clk='1' then
664
 
665
 
666
                        sslave_address          <= slave_address;
667
                        sslave_write            <= slave_write;
668
                        sslave_read                     <= slave_read;
669
                        sslave_writedata        <= slave_writedata;
670
                        for i in reg_scratch00 downto reg_vz loop
671
                                if sslave_address=i then
672
                                        if sslave_write='1' then
673
                                                sreg_block(i) <= sslave_writedata;
674
                                        end if;
675
                                end if;
676
                        end loop;
677
                        for i in 15 downto 0 loop
678
                                if sslave_address=i then
679
                                        if sslave_read='1' then
680
                                                slave_readdata <= sreg_block(i);
681
                                        end if;
682
                                end if;
683
                        end loop;
684
                end if;
685
        end process;
686
--! *************************************************************************************************************************************************************************************************************************************************************
687
--! AVALON MEMORY MAPPED SLAVE FINISHED
688
--! *************************************************************************************************************************************************************************************************************************************************************
689
        --!---------|-----------|-------------------------------------------------------------------------------------------------------------------
690 217 jguarin200
        --! Control Register (reg_ctrl) BASE_ADDRESS + 0x0                                                                                                                                                                                              |
691 211 jguarin200
        --!---------|-----------|-------------------------------------------------------------------------------------------------------------------
692
        --! Bit No.     | Nombre        | Descripci&oacute;n                                                                                                                                                                                            |
693
        --!---------|-----------|-------------------------------------------------------------------------------------------------------------------
694 217 jguarin200
        --! 0           | cmb (rw)      | 1:    La operaci&oacute;n es combinatoria, por lo tanto cargan los primeros 3 valores en el Operando A y el           |
695
        --!                     |                       |               de vectores en el operando B.                                                                                                                                                           |
696 211 jguarin200
        --!                     |                       | 0:    La operaci&oacute;n no es combinatoria, se cargan vectores en los operandos A y B.                                                      |
697
        --!---------|-----------|-------------------------------------------------------------------------------------------------------------------|
698
        --!                     |                       |               Configuraci&oacute;n del Datapath, Interconexi&oacute;n del Pipeline Aritm&eacute;tico y Cadena de Carga        |
699
        --!                     |                       |               Dependiendo del valor de estos 3 bits se configura la operaci&oacute;n a ejecutar.                                                      |
700
        --!                     |                       |                                                                                                                                                                                                                                       |
701
        --! [3:1]       | dcs (rw)      | 011:  Producto Cruz                                                                                                                                                                                           |
702
        --!                     |                       | 000:  Suma Vectorial                                                                                                                                                                                          |
703
        --!                     |                       | 001:  Resta Vectorial                                                                                                                                                                                         |
704
        --!                     |                       | 110:  Normalizaci&oacute;n Vectorial y c&aacute;lculo de Magnitud Vectorial                                                                           |
705
        --!                     |                       | 100:  Producto Punto                                                                                                                                                                                          |
706
        --!                     |                       | 111:  Producto Simple                                                                                                                                                                                         |
707
        --!---------|-----------|-------------------------------------------------------------------------------------------------------------------|
708
        --! [5:4]       | vtsc (rw)     | 00:   Solo leer los resultados vectoriales.                                                                                                                                           |
709
        --!                     |                       | 01:   Solo leer los resultados escalares.                                                                                                                                                     |
710
        --!                     |                       | 10:   Solo leer los resultados vectoriales.                                                                                                                                           |
711
        --!                     |                       | 11:   Leer los resultados escalares y vectoriales.                                                                                                                            |
712
        --!---------|-----------|-------------------------------------------------------------------------------------------------------------------|
713 217 jguarin200
        --! 6           | dma (rw)      |  1:   Modo DMA: Los datos que ingresan se leen desde la direcci&oacute;n FETCHSTART (BASE+0x08) y se escriben en  |
714
        --!                     |                       |               la direcci&oacute;n SINKSTART (BASE+0x09).                                                                                                                                      |
715
        --!                     |                       |  0:   Modo Arithmetic Pipeline: Los datos ingresan en grupos de a 6 valores para 2 vectores de 3 valores cada uno,|
716
        --!                     |                       |               cuando se usa en modo uno a uno (cmb=1), &oacute; en grupos de 3 valores para 1 vector de 3 valores,            |
717
        --!                     |                       |               pero con el operando A fijado con el valor de la primera carga de valores en modo combinatorio (cmb=1).         |
718
        --!                     |                       |               De la misma manera que en modo DMA se cargan los operandos en la direcci&oacute;n FETCHSTART y se escriben      |
719
        --!                     |                       |               los resultados en la direcci&oacute;n SINKSTART.                                                                                                                        |
720
        --!---------|-----------|-------------------------------------------------------------------------------------------------------------------|
721
        --! 7           | flag_fc(r)|  1:       Al momento de generar una interrupci&oacute;n este bit se coloca en 1 si se cumplen las condiciones de          |
722
        --!                     |                       |               descarga de datos de la memoria (revisar el net signal sflood_condition). Si se encuentra en uno se                     |
723
        --!                     |                       |               tratar&iacute;a de una inconsistencia puesto que la interrupci&oacute;n se dispara una vez se ha terminado      |
724
        --!             |                       |               de ejecutar una instrucci&oacute;n y el que la bandera este en uno significa que hay transacciones de           |       
725
        --!                     |                       |               descarga de datos desde la memoria pendientes.                                                                                                                          |
726
        --!                     |                       |                                                                                                                                                                                                                                       |
727
        --!                     |                       |               En general que cualquiera de estas banderas se coloque en uno es una se&ntilde;alizacion de error, puesto       |
728
        --!                     |                       |               que una vez se ha terminado de ejecutar una instrucci&oacute;n no deben haber transacciones pendientes.         |
729
        --!                     |                       |               La raz&oacute;n de ser de estas banderas es hacer depuraci&oacute;n del hardware mas que del software.          |
730
        --!                     |                       |                                                                                                                                                                                                                                       |
731
        --!                     |                       |  0:   Flood Condition off.                                                                                                                                                                            |
732
        --!---------|-----------|-------------------------------------------------------------------------------------------------------------------|
733
        --! 8           | flag_dc(r)|  1:       Error, la instrucci&oacute;n ya se ejecut&oacute; y hay datos transitando en el buffer de salida aun.           |
734
        --!                     |                       |  0:   Drain Condition off.                                                                                                                                                                            |
735
        --!---------|-----------|-------------------------------------------------------------------------------------------------------------------|
736
        --! 9           | wp(r)         |  1:   Error, la instrucci&oacute;n ya se ejecut&oacute; y hay datos transitando en el buffer de salida aun.           |                                                                                                                                                                                       
737
        --!                     |                       |  0:   Write on Memory not pending.                                                                                                                                                            |
738
        --!---------|-----------|-------------------------------------------------------------------------------------------------------------------|
739
        --! 10          | pp(r)         |  1:   Error, la instrucci&oacute;n ya se ejecut&oacute;n y hay datos transitando el pipeline aritm&eacute;tico.       |
740
        --!                     |                       |  0:   Pipeline not pending.                                                                                                                                                                           |
741
        --!---------|-----------|-------------------------------------------------------------------------------------------------------------------|
742
        --! 11          | pl(r)         |  1:   La carga de parametros no se complet&oacute;. Esto por lo general pasa cuando uno va a realizar una                     |
743
        --!             |                       |               operaci&acute;n combinatoria y solo cargo el primer operando, el A, esto puede ocurrir porque por ejemplo       |
744
        --!                     |                       |               se puede desear sumar un conjunto de vectores a un vector de referencia. Este vector de referencia puede        |
745
        --!                     |                       |               estar en un area de memoria distinta, que el resto de los vectores. Por lo tanto el pseudo codigo para          |
746
        --!                     |                       |               ejecutar una operaci&oacute;n de este tipo seria:                                                                                                                       |
747
        --!                     |                       |                                                                                                                                                                                                                                       |       
748
        --!                     |                       |               ld vect,add,cmb;        //Resultados solo vectoriales, ejecutar operaci&oacute;n suma en modo combinatorio              |
749
        --!                     |                       |               ld &A;                          //Cargar la direccion del Vector A.                                                                                                             |
750
        --!                     |                       |               ld 3;                           //Cargar 3 valores, o sea el Vector A.                                                                                                  | 
751
        --!                     |                       |               wait int;                       //Esperar a que se ejecute la interrupcion. Una vez se termine de ejecutar si la bandera|
752
        --!                     |                       |                                                       //pl est&aacute; en uno se vuelve a comenzar y se deshecha el dato que hay como                 |
753
        --!                     |                       |                                                       //par&aacute;metro.     Para este ejemplo se asume que est&aacute en uno                                        |
754
        --!                     |                       |               ld &B;                          //Cargar la direcci&oacute;n donde se encuentran los vectores B                                                 |
755
        --!                     |                       |               ld &C;                          //Cargar la direcci&oacute;n donde se exribiran los resultados.                                                 |
756
        --!                     |                       |               ld 24;                          //Cargar los siguientes 24 valores a partir de &B correspondiente a 8 vectores                  |
757
        --!                     |                       |                                                       //ejecutando 8 sumas vectoriales que se escribir&iacute;n a apartir de &C                               |
758
        --!                     |                       |               wait int;                       //Esperar a que termine la ejecuci&oacute;n de las sumas.                                                               |
759
        --!                     |                       |                                                                                                                                                                                                                                       |
760
        --!                     |                       |  0:   Los operandos se cargaron integros se cargo del todo y no hubo que desechar parametros.                                         |
761
        --!---------|-----------|-------------------------------------------------------------------------------------------------------------------|
762
        --! 12          | dp (r)        |  1:   Error, la instrucci&oacute;n se termino y aun hay datos pendientes por ser descargados                                          |
763
        --!                     |                       |  0:   No hay datos pendientes por ser descargados.                                                                                                                            |
764
        --!---------|-----------|-------------------------------------------------------------------------------------------------------------------|
765
        --! 13          | ap (r)        |  1:   Carga de direcciones en la interconexi&oacute;n a&uacute;n est&aacute; pendiente y la instrucci&oacute; ya      |
766
        --!                     |                       |               se ejecut&oacute;                                                                                                                                                                                       |
767
        --!                     |                       |  0:   No hay direcciones pendientes por cargar.                                                                                                                                       |
768
        --!---------|-----------|-------------------------------------------------------------------------------------------------------------------|
769 211 jguarin200
        --! 14          | rlsc (rw)     | 1:    El sistema est&aacute; configurado para resetear la recarga sincronizada de par&aacute;metros una vez           |
770
        --!                     |                       |               concluya la instrucci&oacute;n                                                                                                                                                          |
771
        --!                     |                       |                                                                                                                                                                                                                                       |
772 217 jguarin200
        --!                     |                       | 0:    El sistema est&aacute; configurado para no resetear la cadena de sincronizaci&oacute;n de carga.                        |
773 211 jguarin200
        --!---------|-----------|-------------------------------------------------------------------------------------------------------------------|
774 217 jguarin200
        --! 15          | rom (r)       | 1: Los registros solo se pueden leer no se pueden escribir. Etsado SINK y SOURCE                                                                      |
775 211 jguarin200
        --!                     |                       | 0: Los registros se pueden leer y escribir.                                                                                                                                           |
776
        --!---------|-----------|-------------------------------------------------------------------------------------------------------------------|
777
        --! [30:16]     | nfetch(rw)| Cantidad de direcciones a cargar en la interconex&oacute;n para realizar la posterior descarga de datos de la     |
778
        --!                     |                       | memoria al RayTrac.
779
        --!---------|-----------|-------------------------------------------------------------------------------------------------------------------|
780
        --!     31              | irq           | 1:    Evento de interrupci&oacute;n. El usuario debe hacer clear de este bit para dar la interrupci&o;n por           |
781
        --!                     |                       |               por atendida. Este bit se pone en uno cuando el sistema pasa de estado TX a FETCH o FETCH a TX.                         |
782
        --!                     |                       |                                                                                                                                                                                                                                       |
783
        --!                     |                       | 0:    El RayTrac se encuentra en operaci&oacute;n Normal.                                                                                                                     |
784
        --!---------|-----------|-------------------------------------------------------------------------------------------------------------------
785 217 jguarin200
        --! Result Vector Z component (reg_vz)  BASE_ADDRESS + 0x4                                                                                                                                                                      |
786 211 jguarin200
        --!---------|-----------|-------------------------------------------------------------------------------------------------------------------|
787 217 jguarin200
        --! Result Vector Y component (reg_vy) BASE_ADDRESS + 0x8                                                                                                                                                                       |
788 211 jguarin200
        --!---------|-----------|-------------------------------------------------------------------------------------------------------------------|
789 217 jguarin200
        --! Result Vector X component (reg_vx) BASE_ADDRESS + 0xC                                                                                                                                                                       |
790 211 jguarin200
        --!---------|-----------|-------------------------------------------------------------------------------------------------------------------|
791 217 jguarin200
        --! Result Vector Scalar component (reg_scalar) BASE_ADDRESS + 0x10                                                                                                                                                     |
792 211 jguarin200
        --!---------|-----------|-------------------------------------------------------------------------------------------------------------------|
793 217 jguarin200
        --! Scratch Vector 00   (reg_scratch00) BASE_ADDRESS +  0x14                                                                                                                                                            |
794 211 jguarin200
        --!---------|-----------|-------------------------------------------------------------------------------------------------------------------|
795 217 jguarin200
        --! output Data Counter (reg_outputcounter) BASE_ADDRESS + 0x18                                                                                                                                                         |
796 211 jguarin200
        --!---------|-----------|-------------------------------------------------------------------------------------------------------------------|
797 217 jguarin200
        --! Input Data Counter  (reg_inputcounter) BASE_ADDRESS + 0x1C                                                                                                                                                          |
798
        --!---------|-----------|-------------------------------------------------------------------------------------------------------------------|
799
        --! Data Fetch Start Address (reg_fetchstart) BASE_ADDRESS + 0x20                                                                                                                                                       |
800
        --!---------|-----------|-------------------------------------------------------------------------------------------------------------------|
801
        --! Data Write Start Address (reg_sinkstart) BASE_ADDRESS + 0x24                                                                                                                                                        |
802
        --!---------|-----------|-------------------------------------------------------------------------------------------------------------------|
803
        --! Parameter Ax component (reg_ax) BASE_ADDRESS + 0x28                                                                                                                                                                         |
804
        --!---------|-----------|-------------------------------------------------------------------------------------------------------------------|
805
        --! Parameter Ay component (reg_ay) BASE_ADDRESS + 0x2C                                                                                                                                                                         |
806
        --!---------|-----------|-------------------------------------------------------------------------------------------------------------------|
807
        --! Parameter Az component (reg_az) BASE_ADDRESS + 0x30                                                                                                                                                                         |
808
        --!---------|-----------|-------------------------------------------------------------------------------------------------------------------|
809
        --! Parameter Bx component (reg_bx) BASE_ADDRESS + 0x34                                                                                                                                                                         |
810
        --!---------|-----------|-------------------------------------------------------------------------------------------------------------------|
811
        --! Parameter By component (reg_by) BASE_ADDRESS + 0x38                                                                                                                                                                         |
812
        --!---------|-----------|-------------------------------------------------------------------------------------------------------------------|
813
        --! Parameter Bz component (reg_bz) BASE_ADDRESS + 0x3C                                                                                                                                                                         |
814
        --!---------|-----------|-------------------------------------------------------------------------------------------------------------------|   
815
 
816
 
817
 
818
 
819
 
820
 
821
end architecture;
822
 

powered by: WebSVN 2.1.0

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