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

Subversion Repositories pci

[/] [pci/] [tags/] [rel_6/] [rtl/] [verilog/] [pci_wb_decoder.v] - Blame information for rev 154

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 77 mihad
//////////////////////////////////////////////////////////////////////
2
////                                                              ////
3
////  File name: decoder.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
////      - Tilen Novak, tilen@opencores.org                      ////
11
////                                                              ////
12
////  All additional information is avaliable in the README.txt   ////
13
////  file.                                                       ////
14
////                                                              ////
15
////                                                              ////
16
//////////////////////////////////////////////////////////////////////
17
////                                                              ////
18
//// Copyright (C) 2000 Tadej Markovic, tadej@opencores.org       ////
19
////                    Tilen Novak, tilen@opencores.org          ////
20
////                                                              ////
21
//// This source file may be used and distributed without         ////
22
//// restriction provided that this copyright statement is not    ////
23
//// removed from the file and that any derivative work contains  ////
24
//// the original copyright notice and the associated disclaimer. ////
25
////                                                              ////
26
//// This source file is free software; you can redistribute it   ////
27
//// and/or modify it under the terms of the GNU Lesser General   ////
28
//// Public License as published by the Free Software Foundation; ////
29
//// either version 2.1 of the License, or (at your option) any   ////
30
//// later version.                                               ////
31
////                                                              ////
32
//// This source is distributed in the hope that it will be       ////
33
//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
34
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
35
//// PURPOSE.  See the GNU Lesser General Public License for more ////
36
//// details.                                                     ////
37
////                                                              ////
38
//// You should have received a copy of the GNU Lesser General    ////
39
//// Public License along with this source; if not, download it   ////
40
//// from http://www.opencores.org/lgpl.shtml                     ////
41
////                                                              ////
42
//////////////////////////////////////////////////////////////////////
43
//
44
// CVS Revision History
45
//
46
// $Log: not supported by cvs2svn $
47
// Revision 1.3  2002/02/01 15:25:12  mihad
48
// Repaired a few bugs, updated specification, added test bench files and design document
49
//
50
// Revision 1.2  2001/10/05 08:14:28  mihad
51
// Updated all files with inclusion of timescale file for simulation purposes.
52
//
53
// Revision 1.1.1.1  2001/10/02 15:33:46  mihad
54
// New project directory structure
55
//
56
//
57
 
58
`include "pci_constants.v"
59
 
60
// synopsys translate_off
61
`include "timescale.v"
62
// synopsys translate_on
63
 
64
module pci_wb_decoder (hit, addr_out, addr_in, base_addr, mask_addr, tran_addr, at_en) ;
65
 
66
// Decoding address size parameter - for FPGAs 1MegByte is recommended
67
//   MAXIMUM is 20 (4KBytes), length 12 is 1 MByte !!!
68
parameter               decode_len     = 12 ;
69
 
70
//###########################################################################################################
71
// ALL COMMENTS are written as there were decode_len 20. This number and 12 (32 - 20) are assigning the
72
// numbers of decoded and compared bits, etc.
73
//###########################################################################################################
74
 
75
/*-----------------------------------------------------------------------------------------------------------
76
DECODER interface decodes input address (ADDR_IN); what means that it validates (HIT), if input address
77
falls within the defined image space boundaries. Image space boundarie is defined with image base address
78
register (BASE_ADDR) and address mask register (MASK_ADDR).
79
Beside that, it also translates (maps) the input address to the output address (ADDR_OUT), regarding the
80
translation address register (TRAN_ADDR) and the address mask register.
81
-----------------------------------------------------------------------------------------------------------*/
82
 
83
// output control
84
output  hit ;
85
// output address
86
output  [31:0]   addr_out ;
87
// input address
88
input   [31:0]   addr_in ;
89
 
90
// input registers - 12 LSbits are not valid since the smallest possible size is 4KB !
91
input   [31:(32-decode_len)]    base_addr ;
92
input   [31:(32-decode_len)]    mask_addr ;
93
input   [31:(32-decode_len)]    tran_addr ;
94
 
95
// input bit[2] of the Image Control register used to enable the address translation !
96
input   at_en ;
97
/*-----------------------------------------------------------------------------------------------------------
98
Internal signals !
99
-----------------------------------------------------------------------------------------------------------*/
100
 
101
// bit[31] if address mask register is IMAGE ENABLE bit (img_en)
102
wire    img_en ;
103
 
104
// addr_in_compare are masked input address bits that are compared with masked base_addr
105
wire    [31:(32-decode_len)]    addr_in_compare ;
106
// base_addr_compare are masked base address bits that are compared with masked addr_in
107
wire    [31:(32-decode_len)]    base_addr_compare ;
108
 
109
/*-----------------------------------------------------------------------------------------------------------
110
Decoding the input address!
111
This logic produces the loghest path in this module!
112
 
113
20 MSbits of input addres are as well as base address (20 bits) masked with corrected address mask. Only
114
masked bits of each vector are actually logically compared.
115
Bit[31] of address mask register is used to enable the image space !
116
-----------------------------------------------------------------------------------------------------------*/
117
 
118
assign addr_in_compare = (addr_in[31:(32-decode_len)] & mask_addr) ;
119
 
120
assign base_addr_compare = (base_addr & mask_addr) ;
121
 
122
assign img_en = mask_addr[31] ;
123
 
124
assign hit = { 1'b1, addr_in_compare } == { img_en, base_addr_compare } ;
125
 
126
/*-----------------------------------------------------------------------------------------------------------
127
Translating the input address!
128
 
129
Translation of input address is not implemented if ADDR_TRAN_IMPL is not defined
130
 
131
20 MSbits of input address are masked with negated value of the corrected address mask in order to get
132
address bits of the input address which won't be replaced with translation address bits.
133
Translation address bits (20 bits) are masked with corrected address mask. Only masked bits of vector are
134
actually valid, all others are zero.
135
Boath vectors are bit-wise ORed in order to get the valid translation address with an offset of an input
136
address.
137
12 LSbits of an input address are assigned to 12 LSbits of an output addres.
138
-----------------------------------------------------------------------------------------------------------*/
139
 
140
`ifdef ADDR_TRAN_IMPL
141
    // if Address Translation Enable bit is set, then translation address is used othervise input address is used!
142
    // addr_in_combine input address bits are not replaced with translation address!
143
    wire        [31:(32-decode_len)] addr_in_combine ;
144
    // tran_addr_combine are masked and combined with addr_in_combine!
145
    reg         [31:(32-decode_len)] tran_addr_combine ;
146
 
147
    assign addr_in_combine = (addr_in[31:(32-decode_len)] & ~mask_addr) ;
148
    always@(at_en or tran_addr or mask_addr or addr_in)
149
        begin
150
            if (at_en)
151
                        begin
152
                                tran_addr_combine <= (tran_addr & mask_addr) ;
153
                end
154
        else
155
                        begin
156
                                tran_addr_combine <= (addr_in[31:(32-decode_len)] & mask_addr) ;
157
                        end
158
        end
159
 
160
    assign addr_out[31:(32-decode_len)] = addr_in_combine | tran_addr_combine ;
161
    assign addr_out[(31-decode_len):0] = addr_in [(31-decode_len):0] ;
162
`else
163
    assign addr_out = addr_in ;
164
`endif
165
 
166
endmodule
167
 

powered by: WebSVN 2.1.0

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