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

Subversion Repositories eco32

[/] [eco32/] [trunk/] [fpga/] [mc-vl/] [src/] [eco32/] [eco32.v] - Blame information for rev 308

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 308 hellwig
//
2
// eco32.v -- ECO32 top-level description
3
//
4
 
5
 
6
`timescale 1ns/10ps
7
`default_nettype none
8
 
9
 
10
module eco32(clk_in, rst_in_n);
11
    input clk_in;                       // clock input
12
    input rst_in_n;                     // reset input
13
 
14
  // clk_rst
15
  wire clk;                             // system clock
16
  wire rst;                             // system reset
17
  // cpu
18
  wire bus_stb /* verilator isolate_assignments */;
19
                                        // bus strobe
20
  wire bus_we;                          // bus write enable
21
  wire [31:2] bus_addr /* verilator isolate_assignments */;
22
                                        // bus address (word address)
23
  wire [31:0] bus_addr32;                // bus address (byte address)
24
  wire [31:0] bus_din;                   // bus data input, for reads
25
  wire [31:0] bus_dout;                  // bus data output, for writes
26
  wire bus_ack;                         // bus acknowledge
27
  wire [15:0] bus_irq;                   // bus interrupt requests
28
  // ram
29
  wire ram_stb;                         // ram strobe
30
  wire [31:0] ram_dout;                  // ram data output
31
  wire ram_ack;                         // ram acknowledge
32
  // rom
33
  wire rom_stb;                         // rom strobe
34
  wire [31:0] rom_dout;                  // rom data output
35
  wire rom_ack;                         // rom acknowledge
36
  // i/o
37
  wire i_o_stb;                         // i/o strobe
38
  // tmr0
39
  wire tmr0_stb;                        // tmr 0 strobe
40
  wire [31:0] tmr0_dout;         // tmr 0 data output
41
  wire tmr0_ack;                        // tmr 0 acknowledge
42
  wire tmr0_irq;                        // tmr 0 interrupt request
43
  // tmr1
44
  wire tmr1_stb;                        // tmr 1 strobe
45
  wire [31:0] tmr1_dout;         // tmr 1 data output
46
  wire tmr1_ack;                        // tmr 1 acknowledge
47
  wire tmr1_irq;                        // tmr 1 interrupt request
48
  // dsp
49
  wire dsp_stb;                         // dsp strobe
50
  wire [15:0] dsp_dout;                  // dsp data output
51
  wire dsp_ack;                         // dsp acknowledge
52
  // kbd
53
  wire kbd_stb;                         // kbd strobe
54
  wire [7:0] kbd_dout;                   // kbd data output
55
  wire kbd_ack;                         // kbd acknowledge
56
  wire kbd_irq;                         // kbd interrupt request
57
  // ser0
58
  wire ser0_stb;                        // ser 0 strobe
59
  wire [7:0] ser0_dout;                  // ser 0 data output
60
  wire ser0_ack;                        // ser 0 acknowledge
61
  wire ser0_irq_r;                      // ser 0 rcv interrupt request
62
  wire ser0_irq_t;                      // ser 0 xmt interrupt request
63
  // ser1
64
  wire ser1_stb;                        // ser 1 strobe
65
  wire [7:0] ser1_dout;                  // ser 1 data output
66
  wire ser1_ack;                        // ser 1 acknowledge
67
  wire ser1_irq_r;                      // ser 1 rcv interrupt request
68
  wire ser1_irq_t;                      // ser 1 xmt interrupt request
69
 
70
  //--------------------------------------
71
  // module instances
72
  //--------------------------------------
73
 
74
  clk_rst clk_rst_1(
75
    .clk_in(clk_in),
76
    .rst_in_n(rst_in_n),
77
    .clk(clk),
78
    .rst(rst)
79
  );
80
 
81
  cpu cpu_1(
82
    .clk(clk),
83
    .rst(rst),
84
    .bus_stb(bus_stb),
85
    .bus_we(bus_we),
86
    .bus_addr(bus_addr[31:2]),
87
    .bus_din(bus_din[31:0]),
88
    .bus_dout(bus_dout[31:0]),
89
    .bus_ack(bus_ack),
90
    .bus_irq(bus_irq[15:0])
91
  );
92
 
93
  // show the full 32-bit address in the simulation results
94
  assign bus_addr32[31:0] = { bus_addr[31:2], 2'b00 };
95
 
96
  ram ram_1(
97
    .clk(clk),
98
    .rst(rst),
99
    .stb(ram_stb),
100
    .we(bus_we),
101
    .addr(bus_addr[24:2]),
102
    .data_in(bus_dout[31:0]),
103
    .data_out(ram_dout[31:0]),
104
    .ack(ram_ack)
105
  );
106
 
107
  rom rom_1(
108
    .clk(clk),
109
    .rst(rst),
110
    .stb(rom_stb),
111
    .we(bus_we),
112
    .addr(bus_addr[15:2]),
113
    .data_out(rom_dout[31:0]),
114
    .ack(rom_ack)
115
  );
116
 
117
  tmr tmr_1(
118
    .clk(clk),
119
    .rst(rst),
120
    .stb(tmr0_stb),
121
    .we(bus_we),
122
    .addr(bus_addr[3:2]),
123
    .data_in(bus_dout[31:0]),
124
    .data_out(tmr0_dout[31:0]),
125
    .ack(tmr0_ack),
126
    .irq(tmr0_irq)
127
  );
128
 
129
  tmr tmr_2(
130
    .clk(clk),
131
    .rst(rst),
132
    .stb(tmr1_stb),
133
    .we(bus_we),
134
    .addr(bus_addr[3:2]),
135
    .data_in(bus_dout[31:0]),
136
    .data_out(tmr1_dout[31:0]),
137
    .ack(tmr1_ack),
138
    .irq(tmr1_irq)
139
  );
140
 
141
  dsp dsp_1(
142
    .clk(clk),
143
    .rst(rst),
144
    .stb(dsp_stb),
145
    .we(bus_we),
146
    .addr(bus_addr[13:2]),
147
    .data_in(bus_dout[15:0]),
148
    .data_out(dsp_dout[15:0]),
149
    .ack(dsp_ack)
150
  );
151
 
152
  kbd kbd_1(
153
    .clk(clk),
154
    .rst(rst),
155
    .stb(kbd_stb),
156
    .we(bus_we),
157
    .addr(bus_addr[2]),
158
    .data_in(bus_dout[7:0]),
159
    .data_out(kbd_dout[7:0]),
160
    .ack(kbd_ack),
161
    .irq(kbd_irq)
162
  );
163
 
164
  ser ser_1(
165
    .i(0),
166
    .clk(clk),
167
    .rst(rst),
168
    .stb(ser0_stb),
169
    .we(bus_we),
170
    .addr(bus_addr[3:2]),
171
    .data_in(bus_dout[7:0]),
172
    .data_out(ser0_dout[7:0]),
173
    .ack(ser0_ack),
174
    .irq_r(ser0_irq_r),
175
    .irq_t(ser0_irq_t)
176
  );
177
 
178
  ser ser_2(
179
    .i(1),
180
    .clk(clk),
181
    .rst(rst),
182
    .stb(ser1_stb),
183
    .we(bus_we),
184
    .addr(bus_addr[3:2]),
185
    .data_in(bus_dout[7:0]),
186
    .data_out(ser1_dout[7:0]),
187
    .ack(ser1_ack),
188
    .irq_r(ser1_irq_r),
189
    .irq_t(ser1_irq_t)
190
  );
191
 
192
  //--------------------------------------
193
  // address decoder
194
  //--------------------------------------
195
 
196
  // RAM: architectural limit  = 512 MB
197
  //      implementation limit =  32 MB
198
  assign ram_stb =
199
    (bus_stb == 1 && bus_addr[31:29] == 3'b000
200
                  && bus_addr[28:25] == 4'b0000) ? 1 : 0;
201
 
202
  // ROM: architectural limit  = 256 MB
203
  //      implementation limit =  64 KB
204
  assign rom_stb =
205
    (bus_stb == 1 && bus_addr[31:28] == 4'b0010
206
                  && bus_addr[27:16] == 12'b000000000000) ? 1 : 0;
207
 
208
  // I/O: architectural limit  = 256 MB
209
  assign i_o_stb =
210
    (bus_stb == 1 && bus_addr[31:28] == 4'b0011) ? 1 : 0;
211
  assign tmr0_stb =
212
    (i_o_stb == 1 && bus_addr[27:20] == 8'h00
213
                  && bus_addr[19:12] == 8'h00) ? 1 : 0;
214
  assign tmr1_stb =
215
    (i_o_stb == 1 && bus_addr[27:20] == 8'h00
216
                  && bus_addr[19:12] == 8'h01) ? 1 : 0;
217
  assign dsp_stb =
218
    (i_o_stb == 1 && bus_addr[27:20] == 8'h01) ? 1 : 0;
219
  assign kbd_stb =
220
    (i_o_stb == 1 && bus_addr[27:20] == 8'h02) ? 1 : 0;
221
  assign ser0_stb =
222
    (i_o_stb == 1 && bus_addr[27:20] == 8'h03
223
                  && bus_addr[19:12] == 8'h00) ? 1 : 0;
224
  assign ser1_stb =
225
    (i_o_stb == 1 && bus_addr[27:20] == 8'h03
226
                  && bus_addr[19:12] == 8'h01) ? 1 : 0;
227
 
228
  //--------------------------------------
229
  // data and acknowledge multiplexers
230
  //--------------------------------------
231
 
232
  assign bus_din[31:0] =
233
    (ram_stb == 1)  ? ram_dout[31:0] :
234
    (rom_stb == 1)  ? rom_dout[31:0] :
235
    (tmr0_stb == 1) ? tmr0_dout[31:0] :
236
    (tmr1_stb == 1) ? tmr1_dout[31:0] :
237
    (dsp_stb == 1)  ? { 16'h0000, dsp_dout[15:0] } :
238
    (kbd_stb == 1)  ? { 24'h000000, kbd_dout[7:0] } :
239
    (ser0_stb == 1) ? { 24'h000000, ser0_dout[7:0] } :
240
    (ser1_stb == 1) ? { 24'h000000, ser1_dout[7:0] } :
241
    32'h00000000;
242
 
243
  assign bus_ack =
244
    (ram_stb == 1)  ? ram_ack :
245
    (rom_stb == 1)  ? rom_ack :
246
    (tmr0_stb == 1) ? tmr0_ack :
247
    (tmr1_stb == 1) ? tmr1_ack :
248
    (dsp_stb == 1)  ? dsp_ack :
249
    (kbd_stb == 1)  ? kbd_ack :
250
    (ser0_stb == 1) ? ser0_ack :
251
    (ser1_stb == 1) ? ser1_ack :
252
    0;
253
 
254
  //--------------------------------------
255
  // bus interrupt request assignments
256
  //--------------------------------------
257
 
258
  assign bus_irq[15] = tmr1_irq;
259
  assign bus_irq[14] = tmr0_irq;
260
  assign bus_irq[13] = 0;
261
  assign bus_irq[12] = 0;
262
  assign bus_irq[11] = 0;
263
  assign bus_irq[10] = 0;
264
  assign bus_irq[ 9] = 0;
265
  assign bus_irq[ 8] = 0;
266
  assign bus_irq[ 7] = 0;
267
  assign bus_irq[ 6] = 0;
268
  assign bus_irq[ 5] = 0;
269
  assign bus_irq[ 4] = kbd_irq;
270
  assign bus_irq[ 3] = ser1_irq_r;
271
  assign bus_irq[ 2] = ser1_irq_t;
272
  assign bus_irq[ 1] = ser0_irq_r;
273
  assign bus_irq[ 0] = ser0_irq_t;
274
 
275
endmodule

powered by: WebSVN 2.1.0

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