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

Subversion Repositories eco32

[/] [eco32/] [tags/] [eco32-0.23/] [fpga/] [src/] [busctrl/] [busctrl.v] - Blame information for rev 157

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 67 hellwig
//
2
// busctrl.v -- bus controller
3
//
4
 
5 124 hellwig
 
6 67 hellwig
module busctrl(cpu_en, cpu_wr, cpu_size, cpu_addr,
7
               cpu_data_out, cpu_data_in, cpu_wt,
8
               ram_en, ram_wr, ram_size, ram_addr,
9
               ram_data_in, ram_data_out, ram_wt,
10
               rom_en, rom_wr, rom_size, rom_addr,
11
               rom_data_out, rom_wt,
12 70 hellwig
               tmr0_en, tmr0_wr, tmr0_addr,
13
               tmr0_data_in, tmr0_data_out, tmr0_wt,
14
               tmr1_en, tmr1_wr, tmr1_addr,
15
               tmr1_data_in, tmr1_data_out, tmr1_wt,
16 67 hellwig
               dsp_en, dsp_wr, dsp_addr,
17
               dsp_data_in, dsp_data_out, dsp_wt,
18
               kbd_en, kbd_wr, kbd_addr,
19
               kbd_data_in, kbd_data_out, kbd_wt,
20
               ser0_en, ser0_wr, ser0_addr,
21
               ser0_data_in, ser0_data_out, ser0_wt,
22
               ser1_en, ser1_wr, ser1_addr,
23
               ser1_data_in, ser1_data_out, ser1_wt,
24
               dsk_en, dsk_wr, dsk_addr,
25
               dsk_data_in, dsk_data_out, dsk_wt);
26 27 hellwig
    // cpu
27
    input cpu_en;
28
    input cpu_wr;
29
    input [1:0] cpu_size;
30
    input [31:0] cpu_addr;
31
    input [31:0] cpu_data_out;
32
    output [31:0] cpu_data_in;
33
    output cpu_wt;
34
    // ram
35
    output ram_en;
36
    output ram_wr;
37
    output [1:0] ram_size;
38
    output [24:0] ram_addr;
39
    output [31:0] ram_data_in;
40
    input [31:0] ram_data_out;
41
    input ram_wt;
42
    // rom
43
    output rom_en;
44
    output rom_wr;
45
    output [1:0] rom_size;
46
    output [20:0] rom_addr;
47
    input [31:0] rom_data_out;
48
    input rom_wt;
49 70 hellwig
    // tmr0
50
    output tmr0_en;
51
    output tmr0_wr;
52
    output [3:2] tmr0_addr;
53
    output [31:0] tmr0_data_in;
54
    input [31:0] tmr0_data_out;
55
    input tmr0_wt;
56
    // tmr1
57
    output tmr1_en;
58
    output tmr1_wr;
59
    output [3:2] tmr1_addr;
60
    output [31:0] tmr1_data_in;
61
    input [31:0] tmr1_data_out;
62
    input tmr1_wt;
63 27 hellwig
    // dsp
64
    output dsp_en;
65
    output dsp_wr;
66
    output [13:2] dsp_addr;
67
    output [15:0] dsp_data_in;
68
    input [15:0] dsp_data_out;
69
    input dsp_wt;
70
    // kbd
71
    output kbd_en;
72
    output kbd_wr;
73 67 hellwig
    output kbd_addr;
74 27 hellwig
    output [7:0] kbd_data_in;
75
    input [7:0] kbd_data_out;
76
    input kbd_wt;
77
    // ser0
78
    output ser0_en;
79
    output ser0_wr;
80
    output [3:2] ser0_addr;
81
    output [7:0] ser0_data_in;
82
    input [7:0] ser0_data_out;
83
    input ser0_wt;
84
    // ser1
85
    output ser1_en;
86
    output ser1_wr;
87
    output [3:2] ser1_addr;
88
    output [7:0] ser1_data_in;
89
    input [7:0] ser1_data_out;
90
    input ser1_wt;
91
    // dsk
92
    output dsk_en;
93
    output dsk_wr;
94
    output [19:2] dsk_addr;
95
    output [31:0] dsk_data_in;
96
    input [31:0] dsk_data_out;
97
    input dsk_wt;
98
 
99
  wire i_o_en;
100
 
101 67 hellwig
  //
102
  // address decoder
103
  //
104
  // RAM: architectural limit = 512 MB
105
  //      board limit         =  32 MB
106 27 hellwig
  assign ram_en =
107
    (cpu_en == 1 && cpu_addr[31:29] == 3'b000
108
                 && cpu_addr[28:25] == 4'b0000) ? 1 : 0;
109 67 hellwig
  // ROM: architectural limit = 256 MB
110
  //      board limit         =   2 MB
111 27 hellwig
  assign rom_en =
112
    (cpu_en == 1 && cpu_addr[31:28] == 4'b0010
113
                 && cpu_addr[27:21] == 7'b0000000) ? 1 : 0;
114 67 hellwig
  // I/O: architectural limit = 256 MB
115 27 hellwig
  assign i_o_en =
116
    (cpu_en == 1 && cpu_addr[31:28] == 4'b0011) ? 1 : 0;
117 70 hellwig
  assign tmr0_en =
118
    (i_o_en == 1 && cpu_addr[27:20] == 8'h00
119
                 && cpu_addr[19:12] == 8'h00) ? 1 : 0;
120
  assign tmr1_en =
121
    (i_o_en == 1 && cpu_addr[27:20] == 8'h00
122
                 && cpu_addr[19:12] == 8'h01) ? 1 : 0;
123 27 hellwig
  assign dsp_en =
124
    (i_o_en == 1 && cpu_addr[27:20] == 8'h01) ? 1 : 0;
125
  assign kbd_en =
126
    (i_o_en == 1 && cpu_addr[27:20] == 8'h02) ? 1 : 0;
127
  assign ser0_en =
128
    (i_o_en == 1 && cpu_addr[27:20] == 8'h03
129 67 hellwig
                 && cpu_addr[19:12] == 8'h00) ? 1 : 0;
130 27 hellwig
  assign ser1_en =
131
    (i_o_en == 1 && cpu_addr[27:20] == 8'h03
132 67 hellwig
                 && cpu_addr[19:12] == 8'h01) ? 1 : 0;
133 27 hellwig
  assign dsk_en =
134
    (i_o_en == 1 && cpu_addr[27:20] == 8'h04) ? 1 : 0;
135
 
136
  // to cpu
137
  assign cpu_wt =
138
    (ram_en == 1) ? ram_wt :
139
    (rom_en == 1) ? rom_wt :
140 70 hellwig
    (tmr0_en == 1) ? tmr0_wt :
141
    (tmr1_en == 1) ? tmr1_wt :
142 27 hellwig
    (dsp_en == 1) ? dsp_wt :
143
    (kbd_en == 1) ? kbd_wt :
144
    (ser0_en == 1) ? ser0_wt :
145
    (ser1_en == 1) ? ser1_wt :
146
    (dsk_en == 1) ? dsk_wt :
147
    1;
148
  assign cpu_data_in[31:0] =
149
    (ram_en == 1) ? ram_data_out[31:0] :
150
    (rom_en == 1) ? rom_data_out[31:0] :
151 70 hellwig
    (tmr0_en == 1) ? tmr0_data_out[31:0] :
152
    (tmr1_en == 1) ? tmr1_data_out[31:0] :
153 27 hellwig
    (dsp_en == 1) ? { 16'h0000, dsp_data_out[15:0] } :
154
    (kbd_en == 1) ? { 24'h000000, kbd_data_out[7:0] } :
155
    (ser0_en == 1) ? { 24'h000000, ser0_data_out[7:0] } :
156
    (ser1_en == 1) ? { 24'h000000, ser1_data_out[7:0] } :
157
    (dsk_en == 1) ? dsk_data_out[31:0] :
158
    32'h00000000;
159
 
160
  // to ram
161
  assign ram_wr = cpu_wr;
162
  assign ram_size[1:0] = cpu_size[1:0];
163
  assign ram_addr[24:0] = cpu_addr[24:0];
164
  assign ram_data_in[31:0] = cpu_data_out[31:0];
165
 
166
  // to rom
167
  assign rom_wr = cpu_wr;
168
  assign rom_size[1:0] = cpu_size[1:0];
169
  assign rom_addr[20:0] = cpu_addr[20:0];
170
 
171 70 hellwig
  // to tmr0
172
  assign tmr0_wr = cpu_wr;
173
  assign tmr0_addr[3:2] = cpu_addr[3:2];
174
  assign tmr0_data_in[31:0] = cpu_data_out[31:0];
175 27 hellwig
 
176 70 hellwig
  // to tmr1
177
  assign tmr1_wr = cpu_wr;
178
  assign tmr1_addr[3:2] = cpu_addr[3:2];
179
  assign tmr1_data_in[31:0] = cpu_data_out[31:0];
180
 
181 27 hellwig
  // to dsp
182
  assign dsp_wr = cpu_wr;
183
  assign dsp_addr[13:2] = cpu_addr[13:2];
184
  assign dsp_data_in[15:0] = cpu_data_out[15:0];
185
 
186
  // to kbd
187
  assign kbd_wr = cpu_wr;
188 67 hellwig
  assign kbd_addr = cpu_addr[2];
189 27 hellwig
  assign kbd_data_in[7:0] = cpu_data_out[7:0];
190
 
191
  // to ser0
192
  assign ser0_wr = cpu_wr;
193
  assign ser0_addr[3:2] = cpu_addr[3:2];
194
  assign ser0_data_in[7:0] = cpu_data_out[7:0];
195
 
196
  // to ser1
197
  assign ser1_wr = cpu_wr;
198
  assign ser1_addr[3:2] = cpu_addr[3:2];
199
  assign ser1_data_in[7:0] = cpu_data_out[7:0];
200
 
201
  // to dsk
202
  assign dsk_wr = cpu_wr;
203
  assign dsk_addr[19:2] = cpu_addr[19:2];
204
  assign dsk_data_in[31:0] = cpu_data_out[31:0];
205
 
206
endmodule

powered by: WebSVN 2.1.0

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