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

Subversion Repositories pci

[/] [pci/] [tags/] [rel_3/] [rtl/] [verilog/] [pci_target32_sm.v] - Blame information for rev 6

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

Line No. Rev Author Line
1 2 mihad
//////////////////////////////////////////////////////////////////////
2
////                                                              ////
3
////  File name: pci_target32_sm.v                                ////
4
////                                                              ////
5
////  This file is part of the "PCI bridge" project               ////
6
////  http://www.opencores.org/cores/pci/                         ////
7
////                                                              ////
8
////  Author(s):                                                  ////
9
////      - Tadej Markovic, tadej@opencores.org                   ////
10
////                                                              ////
11
////  All additional information is avaliable in the README.txt   ////
12
////  file.                                                       ////
13
////                                                              ////
14
////                                                              ////
15
//////////////////////////////////////////////////////////////////////
16
////                                                              ////
17
//// Copyright (C) 2000 Tadej Markovic, tadej@opencores.org       ////
18
////                                                              ////
19
//// This source file may be used and distributed without         ////
20
//// restriction provided that this copyright statement is not    ////
21
//// removed from the file and that any derivative work contains  ////
22
//// the original copyright notice and the associated disclaimer. ////
23
////                                                              ////
24
//// This source file is free software; you can redistribute it   ////
25
//// and/or modify it under the terms of the GNU Lesser General   ////
26
//// Public License as published by the Free Software Foundation; ////
27
//// either version 2.1 of the License, or (at your option) any   ////
28
//// later version.                                               ////
29
////                                                              ////
30
//// This source is distributed in the hope that it will be       ////
31
//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
32
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
33
//// PURPOSE.  See the GNU Lesser General Public License for more ////
34
//// details.                                                     ////
35
////                                                              ////
36
//// You should have received a copy of the GNU Lesser General    ////
37
//// Public License along with this source; if not, download it   ////
38
//// from http://www.opencores.org/lgpl.shtml                     ////
39
////                                                              ////
40
//////////////////////////////////////////////////////////////////////
41
//
42
// CVS Revision History
43
//
44
// $Log: not supported by cvs2svn $
45 6 mihad
// Revision 1.1.1.1  2001/10/02 15:33:47  mihad
46
// New project directory structure
47 2 mihad
//
48 6 mihad
//
49 2 mihad
 
50
`define FSM_BITS 2 // number of bits needed for FSM states
51
 
52
 
53
`include "bus_commands.v"
54
`include "constants.v"
55 6 mihad
`include "timescale.v"
56 2 mihad
 
57
module PCI_TARGET32_SM
58
(
59
    // system inputs
60
    clk_in,
61
    reset_in,
62
    // master inputs
63
    pci_frame_in,
64
    pci_irdy_in,
65
    pci_idsel_in,
66
    pci_frame_reg_in,
67
    pci_irdy_reg_in,
68
    pci_idsel_reg_in,
69
    // target response outputs
70
    pci_trdy_out,
71
    pci_stop_out,
72
    pci_devsel_out,
73
    pci_trdy_en_out,
74
    pci_stop_en_out,
75
    pci_devsel_en_out,
76
    pci_target_load_out,
77
    // address, data, bus command, byte enable in/outs
78
    pci_ad_reg_in,
79
    pci_ad_out,
80
    pci_ad_en_out,
81
    pci_cbe_reg_in,
82
    bckp_trdy_en_in,
83
    bckp_devsel_in,
84
    bckp_trdy_in,
85
    bckp_stop_in,
86
 
87
    // backend side of state machine with control signals to pci_io_mux ...
88
    address_out,
89
    addr_claim_in,
90
    bc_out,
91
    bc0_out,
92
    data_out,
93
    data_in,
94
    be_out,
95
    req_out,
96
    rdy_out,
97
    addr_phase_out,
98
    bckp_trdy_out,
99
    last_reg_out,
100
    frame_reg_out,
101
    fetch_pcir_fifo_out,
102
    load_medium_reg_out,
103
    sel_fifo_mreg_out,
104
    sel_conf_fifo_out,
105
    fetch_conf_out,
106
    load_to_pciw_fifo_out,
107
    load_to_conf_out,
108
        same_read_in,
109
        norm_access_to_config_in,
110
        read_completed_in,
111
        read_processing_in,
112
        target_abort_in,
113
        disconect_wo_data_in,
114
        target_abort_set_out,
115
        pciw_fifo_full_in,
116
        pcir_fifo_data_err_in,
117
        wbw_fifo_empty_in,
118
        wbu_frame_en_in
119
 
120
) ;
121
 
122
/*----------------------------------------------------------------------------------------------------------------------
123
Various parameters needed for state machine and other stuff
124
----------------------------------------------------------------------------------------------------------------------*/
125
parameter               S_IDLE                  = `FSM_BITS'h0 ;
126
parameter               S_WAIT                  = `FSM_BITS'h1 ;
127
parameter               S_TRANSFERE             = `FSM_BITS'h2 ;
128
parameter               S_BACKOFF               = `FSM_BITS'h3 ;
129
 
130
 
131
/*==================================================================================================================
132
System inputs.
133
==================================================================================================================*/
134
// PCI side clock and reset
135
input   clk_in,
136
        reset_in ;
137
 
138
 
139
/*==================================================================================================================
140
PCI interface signals - bidirectional signals are divided to inputs and outputs in I/O cells instantiation
141
module. Enables are separate signals.
142
==================================================================================================================*/
143
// master inputs
144
input   pci_frame_in,
145
                pci_irdy_in,
146
                pci_idsel_in ;
147
input   pci_frame_reg_in,
148
                pci_irdy_reg_in,
149
                pci_idsel_reg_in ;
150
 
151
// target response outputs
152
output  pci_trdy_out,
153
        pci_stop_out,
154
        pci_devsel_out ;
155
output  pci_trdy_en_out,
156
        pci_stop_en_out,
157
        pci_devsel_en_out ;
158
output  pci_target_load_out ;
159
 
160
// address, data, bus command, byte enable in/outs
161
input   [31:0]  pci_ad_reg_in ;
162
output  [31:0]  pci_ad_out ;
163
output          pci_ad_en_out ;
164
input   [3:0]   pci_cbe_reg_in ;
165
input                   bckp_trdy_en_in ;
166
input                   bckp_devsel_in ;
167
input                   bckp_trdy_in ;
168
input                   bckp_stop_in ;
169
 
170
 
171
/*==================================================================================================================
172
Other side of PCI Target state machine
173
==================================================================================================================*/
174
// Data, byte enables, bus commands and address ports
175
output  [31:0]  address_out ;            // current request address output - registered
176
input           addr_claim_in ;         // current request address claim input
177
output  [3:0]   bc_out ;                 // current request bus command output - registered
178
output                  bc0_out ;                       // current cycle RW signal output
179
input   [31:0]  data_in ;                // for read operations - current dataphase data input
180
output  [31:0]  data_out ;               // for write operations - current request data output - registered
181
output   [3:0]  be_out ;                 // current dataphase byte enable outputs - registered
182
// Port connection control signals from PCI FSM
183
output          req_out ;               // Read is requested to WB master
184
output          rdy_out ;               // DATA / ADDRESS selection when read or write - registered
185
output                  addr_phase_out ;        // Indicates address phase and also fast-back-to-back address phase - registered    
186
output                  bckp_trdy_out ;         // TRDY output (which is registered) equivalent                                     
187
output                  last_reg_out ;          // Indicates last data phase - registered                                           
188
output                  frame_reg_out ;         // FRAME output signal - registered                                                  
189
output              fetch_pcir_fifo_out ;// Read enable for PCIR_FIFO when when read is finishen on WB side                   
190
output              load_medium_reg_out ;// Load data from PCIR_FIFO to medium register (first data must be prepared on time) 
191
output              sel_fifo_mreg_out ; // Read data selection between PCIR_FIFO and medium register                        
192
output              sel_conf_fifo_out ; // Read data selection between Configuration registers and "FIFO"                   
193
output              fetch_conf_out ;    // Read enable for configuration space registers                                    
194
output              load_to_pciw_fifo_out ;// Write enable to PCIW_FIFO 
195
output              load_to_conf_out ;  // Write enable to Configuration space registers                                    
196
 
197
 
198
/*==================================================================================================================
199
Status
200
==================================================================================================================*/
201
input                   same_read_in ;                          // Indicates the same read request (important when read is finished on WB side)
202
input                   norm_access_to_config_in ;      // Indicates the access to Configuration space with MEMORY commands            
203
input                   read_completed_in ;                     // Indicates that read request is completed on WB side                         
204
input                   read_processing_in ;            // Indicates that read request is processing on WB side                        
205
input                   target_abort_in ;                       // Indicates target abort termination                                          
206
input                   disconect_wo_data_in ;          // Indicates disconnect with OR without data termination                       
207
input                   pciw_fifo_full_in ;                     // Indicates that write PCIW_FIFO is full                                      
208
input                   pcir_fifo_data_err_in ;         // Indicates data error on current data read from PCIR_FIFO                    
209
input                   wbw_fifo_empty_in ;                     // Indicates that WB SLAVE UNIT has no data to be written to PCI bus                
210
input                   wbu_frame_en_in ;                       // Indicates that WB SLAVE UNIT is accessing the PCI bus (important if 
211
                                                                                        //   address on PCI bus is also claimed by decoder in this PCI TARGET UNIT
212
output                  target_abort_set_out ;          // Signal used to be set in configuration space registers
213
 
214
/*==================================================================================================================
215
END of input / output PORT DEFINITONS !!!
216
==================================================================================================================*/
217
 
218
// Delayed frame signal for determining the address phase
219
reg                             previous_frame ;
220
// Delayed read completed signal for preparing the data from pcir fifo
221
reg                             read_completed_reg ;
222
// Delayed disconnect with/without data for stop loading data to PCIW_FIFO 
223
reg                             disconect_wo_data_reg ;
224
 
225
// Delayed frame signal for determining the address phase!
226
always@(posedge clk_in or posedge reset_in)
227
begin
228
    if (reset_in)
229
        begin
230
        previous_frame <= 1'b1 ;
231
        read_completed_reg <= 1'b0 ;
232
        disconect_wo_data_reg <= 1'b0 ;
233
        end
234
    else
235
        begin
236
        previous_frame <= pci_frame_reg_in ;
237
        read_completed_reg <= read_completed_in ;
238
        disconect_wo_data_reg <= disconect_wo_data_in ;
239
        end
240
end
241
 
242
// Address phase is when previous frame was 1 and this frame is 0 and frame isn't generated from pci master (in WBU)
243
wire    addr_phase = (previous_frame && ~pci_frame_reg_in && ~wbu_frame_en_in) ;
244
 
245
// Wire tells when there is configuration (read or write) command with IDSEL signal active
246
wire    config_access = ((pci_idsel_reg_in && pci_cbe_reg_in[3]) && (~pci_cbe_reg_in[2] && pci_cbe_reg_in[1])) ;
247
 
248
// Signal for loadin data to medium register from pcir fifo when read completed from WB side!
249
wire    prepare_rd_fifo_data = (read_completed_in && ~read_completed_reg) ;
250
 
251
// Write and read progresses are used for determining next state
252
wire    write_progress  =       (
253
                                                        (norm_access_to_config_in) || (read_completed_in && ~pciw_fifo_full_in) ||
254
                                                        (~read_processing_in && ~pciw_fifo_full_in)
255
                                                        ) ;
256
wire    read_progress   =       ((~read_completed_in && norm_access_to_config_in) || (read_completed_in && wbw_fifo_empty_in)) ;
257
 
258
// Write allowed to PCIW_FIFO
259
wire    write_to_fifo   =       ((read_completed_in && ~pciw_fifo_full_in) || (~read_processing_in && ~pciw_fifo_full_in)) ;
260
// Read allowed from PCIR_FIFO
261
wire    read_from_fifo  =       (read_completed_in && wbw_fifo_empty_in) ;
262
// Read request is allowed to be proceed regarding the WB side
263
wire    read_request    =       (~read_completed_in && ~read_processing_in && ~norm_access_to_config_in) ;
264
 
265
// Critically calculated signals are latched in this clock period (address phase) to be used in the next clock period
266
reg                             rw_cbe0 ;
267
reg                             wr_progress ;
268
reg                             rd_progress ;
269
reg                             rd_from_fifo ;
270
reg                             rd_request ;
271
reg                             wr_to_fifo ;
272
reg                             norm_access_to_conf_reg ;
273
reg                             same_read_reg ;
274
reg                             cnf_progress ;
275
reg                             addr_claim_reg ;
276
 
277
always@(posedge clk_in or posedge reset_in)
278
begin
279
    if (reset_in)
280
        begin
281
                rw_cbe0                                                 <= 1'b0 ;
282
                wr_progress                                             <= 1'b0 ;
283
                rd_progress                                             <= 1'b0 ;
284
                rd_from_fifo                                    <= 1'b0 ;
285
                rd_request                                              <= 1'b0 ;
286
                wr_to_fifo                                              <= 1'b0 ;
287
                norm_access_to_conf_reg                 <= 1'b0 ;
288
                same_read_reg                                   <= 1'b0 ;
289
                cnf_progress                                    <= 1'b0 ;
290
                addr_claim_reg                                  <= 1'b0 ;
291
        end
292
        else
293
        begin
294
                if (addr_phase)
295
                begin
296
                        rw_cbe0                                         <= pci_cbe_reg_in[0] ;
297
                        wr_progress                                     <= write_progress ;
298
                        rd_progress                                     <= read_progress ;
299
                        rd_from_fifo                            <= read_from_fifo ;
300
                        rd_request                                      <= read_request ;
301
                        wr_to_fifo                                      <= write_to_fifo ;
302
                        norm_access_to_conf_reg         <= norm_access_to_config_in ;
303
                        same_read_reg                           <= same_read_in ;
304
                        cnf_progress                            <= config_access ;
305
                        addr_claim_reg                          <= addr_claim_in ;
306
                end
307
        end
308
end
309
 
310
// Signal used in S_WAIT state to determin next state
311
wire s_wait_progress =  (
312
                                                (~cnf_progress && rw_cbe0 && wr_progress && ~target_abort_in) ||
313
                                                (~cnf_progress && ~rw_cbe0 && same_read_reg && rd_progress && ~target_abort_in) ||
314
                                                (~cnf_progress && ~rw_cbe0 && ~same_read_reg && norm_access_to_conf_reg && ~target_abort_in) ||
315
                                                (cnf_progress && ~target_abort_in)
316
                                                ) ;
317
 
318
// Signal used in S_TRANSFERE state to determin next state
319
wire s_tran_progress =  (
320
                                                (rw_cbe0 && ~disconect_wo_data_in) ||
321
                                                (~rw_cbe0 && ~disconect_wo_data_in && ~target_abort_in && ~pcir_fifo_data_err_in)
322
                                                ) ;
323
 
324
// Clock enable for PCI state machine driven directly from critical inputs - FRAME and IRDY
325
wire                    pcit_sm_clk_en ;
326
// FSM states signals indicating the current state
327
reg                     state_idle ;
328
reg                     state_wait ;
329
reg                     state_transfere ;
330
reg                     state_backoff ;
331
reg                     state_default ;
332
// Clock enable module used for preserving the architecture because of minimum delay for critical inputs
333
PCI_TARGET32_CLK_EN                     pci_target_clock_en
334
(
335
    .addr_phase                         (addr_phase),
336
    .config_access                      (config_access),
337
    .addr_claim_in                      (addr_claim_in),
338
    .disconect_wo_data_in       (disconect_wo_data_in),
339
    .pcir_fifo_data_err_in      (pcir_fifo_data_err_in),
340
    .rw_cbe0                            (rw_cbe0),
341
    .pci_frame_in                       (pci_frame_in),
342
    .pci_irdy_in                        (pci_irdy_in),
343
    .state_wait                         (state_wait),
344
    .state_transfere            (state_transfere),
345
    .state_backoff                      (state_backoff),
346
    .state_default                      (state_default),
347
    .clk_enable                         (pcit_sm_clk_en)
348
);
349
 
350
reg [(`FSM_BITS - 1):0]  c_state ; //current state register
351
reg [(`FSM_BITS - 1):0]  n_state ; //next state input to current state register
352
 
353
// state machine register control
354
always@(posedge clk_in or posedge reset_in)
355
begin
356
    if (reset_in) // reset state machine to S_IDLE state
357
        c_state <= #`FF_DELAY S_IDLE ;
358
    else
359
        if (pcit_sm_clk_en) // if conditions are true, then FSM goes to next state!
360
            c_state <= #`FF_DELAY n_state ;
361
end
362
 
363
// state machine logic
364
always@(c_state or
365
                s_wait_progress or
366
                s_tran_progress
367
                )
368
begin
369
        case (c_state)
370
        S_IDLE :
371
        begin
372
                state_idle              <= 1'b1 ;
373
                state_wait              <= 1'b0 ;
374
                state_transfere <= 1'b0 ;
375
                state_backoff   <= 1'b0 ;
376
                state_default   <= 1'b0 ;
377
                n_state <= S_WAIT ;
378
        end
379
        S_WAIT :
380
        begin
381
                state_idle              <= 1'b0 ;
382
                state_wait              <= 1'b1 ;
383
                state_transfere <= 1'b0 ;
384
                state_backoff   <= 1'b0 ;
385
                state_default   <= 1'b0 ;
386
                if (s_wait_progress)
387
                        n_state <= S_TRANSFERE ;
388
                else
389
                        n_state <= S_BACKOFF ;
390
        end
391
        S_TRANSFERE :
392
        begin
393
                state_idle              <= 1'b0 ;
394
                state_wait              <= 1'b0 ;
395
                state_transfere <= 1'b1 ;
396
                state_backoff   <= 1'b0 ;
397
                state_default   <= 1'b0 ;
398
                if (s_tran_progress)
399
                        n_state <= S_IDLE ;
400
                else
401
                        n_state <= S_BACKOFF ;
402
        end
403
        S_BACKOFF :
404
        begin
405
                state_idle              <= 1'b0 ;
406
                state_wait              <= 1'b0 ;
407
                state_transfere <= 1'b0 ;
408
                state_backoff   <= 1'b1 ;
409
                state_default   <= 1'b0 ;
410
                n_state <= S_IDLE ;
411
        end
412
        default :
413
        begin
414
                state_idle              <= 1'b0 ;
415
                state_wait              <= 1'b0 ;
416
                state_transfere <= 1'b0 ;
417
                state_backoff   <= 1'b0 ;
418
                state_default   <= 1'b1 ;
419
                n_state <= S_IDLE ;
420
        end
421
        endcase
422
end
423
 
424
        // if not retry and not target abort
425
        // NO CRITICAL SIGNALS
426
wire    trdy_w                  =       (
427
                (state_wait && ~cnf_progress && rw_cbe0 && wr_progress && ~target_abort_in) ||
428
        (state_wait && ~cnf_progress && ~rw_cbe0 && same_read_reg && rd_progress && ~target_abort_in) ||
429
        (state_wait && ~cnf_progress && ~rw_cbe0 && ~same_read_reg && norm_access_to_conf_reg && ~target_abort_in) ||
430
        (state_wait && cnf_progress && ~target_abort_in)
431
                                                ) ;
432
        // if not disconnect without data and not target abort (only during reads)
433
        // MUST BE ANDED WITH CRITICAL ~FRAME
434
wire    trdy_w_frm              =       (
435
        (state_transfere && ~disconect_wo_data_in) ||
436
        (state_transfere && disconect_wo_data_in && pci_irdy_reg_in) ||
437
        (state_transfere && ~rw_cbe0 && ~pcir_fifo_data_err_in)
438
                                                ) ;
439
        // if not disconnect without data and not target abort (only during reads)
440
        // MUST BE ANDED WITH CRITICAL ~FRAME AND IRDY
441
wire    trdy_w_frm_irdy =       (
442
        (state_transfere && disconect_wo_data_in) ||
443
        (state_transfere && ~rw_cbe0 && pcir_fifo_data_err_in) ||
444
                (state_backoff && ~bckp_trdy_in)
445
                                                        ) ;
446
// TRDY critical module used for preserving the architecture because of minimum delay for critical inputs
447
PCI_TARGET32_TRDY_CRIT          pci_target_trdy_critical
448
(
449
    .trdy_w                                     (trdy_w),
450
    .trdy_w_frm                         (trdy_w_frm),
451
    .trdy_w_frm_irdy            (trdy_w_frm_irdy),
452
    .pci_frame_in                       (pci_frame_in),
453
    .pci_irdy_in                        (pci_irdy_in),
454
    .pci_trdy_out                       (pci_trdy_out)
455
);
456
 
457
                // if target abort or retry
458
        // NO CRITICAL SIGNALS
459
wire    stop_w                  =       (
460
                (state_wait && target_abort_in) ||
461
                (state_wait && ~cnf_progress && rw_cbe0 && ~wr_progress) ||
462
                (state_wait && ~cnf_progress && ~rw_cbe0 && same_read_reg && ~rd_progress) ||
463
                (state_wait && ~cnf_progress && ~rw_cbe0 && ~same_read_reg && ~norm_access_to_conf_reg)
464
                                                        ) ;
465
                // if asserted, wait for deactivating the frame
466
        // MUST BE ANDED WITH CRITICAL ~FRAME
467
wire    stop_w_frm              =       (
468
                (state_backoff && ~bckp_stop_in)
469
                                                        ) ;
470
                // if target abort or if disconnect without data (after data transfere)
471
        // MUST BE ANDED WITH CRITICAL ~FRAME AND ~IRDY
472
wire    stop_w_frm_irdy =       (
473
                (state_transfere && disconect_wo_data_in) ||
474
                (state_transfere && ~rw_cbe0 && pcir_fifo_data_err_in)
475
                                                        ) ;
476
// STOP critical module used for preserving the architecture because of minimum delay for critical inputs
477
PCI_TARGET32_STOP_CRIT          pci_target_stop_critical
478
(
479
    .stop_w                                     (stop_w),
480
    .stop_w_frm                         (stop_w_frm),
481
    .stop_w_frm_irdy            (stop_w_frm_irdy),
482
    .pci_frame_in                       (pci_frame_in),
483
    .pci_irdy_in                        (pci_irdy_in),
484
    .pci_stop_out                       (pci_stop_out)
485
);
486
 
487
                // if OK to respond and not target abort 
488
        // NO CRITICAL SIGNALS
489
wire    devs_w                  =       (
490
                (addr_phase && config_access) ||
491
                (addr_phase && ~config_access && addr_claim_in) ||
492
                (state_wait && ~target_abort_in)
493
                                                        ) ;
494
                // if not target abort (only during reads) or if asserted, wait for deactivating the frame
495
        // MUST BE ANDED WITH CRITICAL ~FRAME
496
wire    devs_w_frm              =       (
497
                (state_transfere && rw_cbe0) ||
498
                (state_transfere && ~rw_cbe0 && ~pcir_fifo_data_err_in) ||
499
                (state_backoff && ~bckp_devsel_in)
500
                                                        ) ;
501
                // if not target abort (only during reads)
502
        // MUST BE ANDED WITH CRITICAL ~FRAME AND IRDY
503
wire    devs_w_frm_irdy =       (
504
                (state_transfere && ~rw_cbe0 && pcir_fifo_data_err_in)
505
                                                        ) ;
506
// DEVSEL critical module used for preserving the architecture because of minimum delay for critical inputs
507
PCI_TARGET32_DEVS_CRIT          pci_target_devsel_critical
508
(
509
    .devs_w                                     (devs_w),
510
    .devs_w_frm                         (devs_w_frm),
511
    .devs_w_frm_irdy            (devs_w_frm_irdy),
512
    .pci_frame_in                       (pci_frame_in),
513
    .pci_irdy_in                        (pci_irdy_in),
514
    .pci_devsel_out                     (pci_devsel_out)
515
);
516
 
517
                // if address is claimed when read
518
        // NO CRITICAL SIGNALS
519
wire    ad_en_w                 =       (
520
                (addr_phase && config_access && ~pci_cbe_reg_in[0]) ||
521
        (addr_phase && ~config_access && addr_claim_in && ~pci_cbe_reg_in[0]) ||
522
        (state_wait && ~rw_cbe0)
523
                                                ) ;
524
        // if read
525
        // MUST BE ANDED WITH CRITICAL ~FRAME
526
wire    ad_en_w_frm             =       (
527
        (state_transfere && ~rw_cbe0) ||
528
        (state_backoff && ~rw_cbe0)
529
                                                ) ;
530
// AD enable module used for preserving the architecture because of minimum delay for critical inputs
531
PCI_TARGET32_AD_EN_CRIT         pci_target_ad_enable_critical
532
(
533
    .ad_en_w                            (ad_en_w),
534
    .ad_en_w_frm                        (ad_en_w_frm),
535
    .pci_frame_in                       (pci_frame_in),
536
    .pci_ad_en_out                      (pci_ad_en_out)
537
);
538
 
539
wire fast_back_to_back  =       (addr_phase && ~pci_irdy_reg_in) ;
540
 
541
                // if cycle will progress or will not be stopped
542
        // NO CRITICAL SIGNALS
543
wire    ctrl_en_w               =       (
544
                (~wbu_frame_en_in && fast_back_to_back) ||
545
        (addr_phase && config_access) ||
546
        (addr_phase && ~config_access && addr_claim_in) ||
547
                (state_wait) ||
548
                (state_transfere && ~pci_frame_reg_in) ||
549
                (state_backoff && ~pci_frame_reg_in)
550
                                                ) ;
551
                // if cycle is progressing
552
        // MUST BE ANDED WITH CRITICAL ~IRDY
553
wire    ctrl_en_w_irdy  =       (
554
                (state_transfere) ||
555
                (state_backoff)
556
                                                ) ;
557
// Clock enable module used for preserving the architecture because of minimum delay for critical inputs
558
PCI_TARGET32_CTRL_EN_CRIT               pci_target_control_enable_critical
559
(
560
    .ctrl_en_w                          (ctrl_en_w),
561
    .ctrl_en_w_irdy                     (ctrl_en_w_irdy),
562
    .pci_irdy_in                        (pci_irdy_in),
563
    .pci_trdy_en_out            (pci_trdy_en_out),
564
    .pci_stop_en_out            (pci_stop_en_out),
565
    .pci_devsel_en_out          (pci_devsel_en_out)
566
);
567
 
568
// target ready output signal delayed for one clock used in conjunction with irdy_reg to select which
569
//   data are registered in io mux module - from fifo or medoum register
570
reg                             bckp_trdy_reg ;
571
// delayed indicators for states transfere and backoff
572
reg                             state_transfere_reg ;
573
reg                             state_backoff_reg ;
574
always@(posedge clk_in or posedge reset_in)
575
begin
576
    if (reset_in)
577
    begin
578
                bckp_trdy_reg <= 1'b1 ;
579
                state_transfere_reg <= 1'b0 ;
580
                state_backoff_reg <= 1'b0 ;
581
        end
582
        else
583
        begin
584
                bckp_trdy_reg <= bckp_trdy_in ;
585
                state_transfere_reg <= state_transfere ;
586
                state_backoff_reg <= state_backoff ;
587
        end
588
end
589
 
590
// Read control signals assignments
591
assign
592
        fetch_pcir_fifo_out =   (
593
                (prepare_rd_fifo_data) ||
594
                (state_wait && ~cnf_progress && ~rw_cbe0 && same_read_reg && rd_from_fifo && ~target_abort_in) ||
595
                (bckp_trdy_en_in && ~bckp_trdy_reg && ~cnf_progress && ~rw_cbe0 && same_read_reg && rd_from_fifo && ~pci_irdy_reg_in)
596
                                                        ) ;
597
 
598
        // NO CRITICAL SIGNALS
599
wire    tar_load_out_w          =       (state_wait) ;
600
        // MUST BE ANDED WITH CRITICAL ~IRDY
601
wire    tar_load_out_w_irdy     =       (bckp_trdy_en_in && ~rw_cbe0) ;
602
        // NO CRITICAL SIGNALS
603
wire    load_med_reg_w          =       (
604
                (prepare_rd_fifo_data) ||
605
                (state_wait && ~cnf_progress && ~rw_cbe0 && same_read_reg && rd_from_fifo && ~target_abort_in)
606
                                                                ) ;
607
        // MUST BE ANDED WITH CRITICAL ~IRDY
608
wire    load_med_reg_w_irdy     =
609
                (bckp_trdy_en_in && ~bckp_trdy_in && ~cnf_progress && ~rw_cbe0 && same_read_reg && rd_from_fifo) ;
610
// Clock enable module used for preserving the architecture because of minimum delay for critical inputs
611
PCI_TARGET32_LOAD_CRIT                  pci_target_load_critical
612
(
613
    .tar_load_out_w                     (tar_load_out_w),
614
    .tar_load_out_w_irdy        (tar_load_out_w_irdy),
615
    .load_med_reg_w                     (load_med_reg_w),
616
    .load_med_reg_w_irdy        (load_med_reg_w_irdy),
617
    .pci_irdy_in                        (pci_irdy_in),
618
    .pci_target_load_out        (pci_target_load_out),
619
    .load_medium_reg_out        (load_medium_reg_out)
620
);
621
 
622
assign  sel_fifo_mreg_out = (~pci_irdy_reg_in && ~bckp_trdy_reg) ;
623
 
624
assign  sel_conf_fifo_out = (cnf_progress || norm_access_to_conf_reg) ;
625
 
626
assign  fetch_conf_out = ((cnf_progress || norm_access_to_conf_reg) && ~rw_cbe0 && ~bckp_devsel_in) ;
627
 
628
// Write control signals assignments
629
assign
630
        load_to_pciw_fifo_out = (
631
                (state_wait && (~cnf_progress && ~norm_access_to_conf_reg) && rw_cbe0 && wr_to_fifo && ~target_abort_in) ||
632
                (state_transfere_reg && ~state_backoff && rw_cbe0 && wr_to_fifo && ~disconect_wo_data_reg && ~pci_irdy_reg_in && ~bckp_trdy_reg && (~cnf_progress && ~norm_access_to_conf_reg)) ||
633
                ((state_backoff || state_backoff_reg) && rw_cbe0 && wr_to_fifo && ~pci_irdy_reg_in && ~bckp_trdy_reg && (~cnf_progress && ~norm_access_to_conf_reg))
634
                                                        ) ;
635
 
636
assign  load_to_conf_out =      (
637
                        (state_transfere_reg && cnf_progress && rw_cbe0 && ~pci_irdy_reg_in && ~bckp_trdy_reg) ||
638
                        (state_transfere_reg && norm_access_to_conf_reg && rw_cbe0 && ~pci_irdy_reg_in && ~bckp_trdy_reg)
639
                                                        ) ;
640
 
641
// General control sigal assignments
642
assign  addr_phase_out = addr_phase ;
643
assign  last_reg_out = (pci_frame_reg_in && ~pci_irdy_reg_in) ;
644
assign  frame_reg_out = pci_frame_reg_in ;
645
assign  bckp_trdy_out = bckp_trdy_in ;
646
assign  target_abort_set_out = (bckp_devsel_in && bckp_trdy_in && ~bckp_stop_in) ;
647
// request signal for delayed sinc. module
648
assign  req_out = (state_wait && ~cnf_progress && ~norm_access_to_conf_reg && ~rw_cbe0 && rd_request && ~target_abort_in) ;
649
// ready tells when address or data are written into fifo - RDY ? DATA : ADDRESS
650
assign  rdy_out = ~bckp_trdy_reg ;
651
 
652
// data and address outputs assignments!
653
assign  pci_ad_out = data_in ;
654
 
655
assign  data_out = pci_ad_reg_in ;
656
assign  be_out = pci_cbe_reg_in ;
657
assign  address_out = pci_ad_reg_in ;
658
assign  bc_out = pci_cbe_reg_in ;
659
assign  bc0_out = rw_cbe0 ;
660
 
661
 
662
endmodule

powered by: WebSVN 2.1.0

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