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

Subversion Repositories k68

[/] [k68/] [trunk/] [rtl/] [verilog/] [k68_soc.v] - Blame information for rev 2

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

Line No. Rev Author Line
1 2 sybreon
//                              -*- Mode: Verilog -*-
2
// Filename        : k68_soc.v
3
// Description     : k68 SOC Top Level
4
// Author          : Shawn Tan
5
// Created On      : Sat Feb  8 20:58:34 2003
6
// Last Modified By: .
7
// Last Modified On: .
8
// Update Count    : 0
9
// Status          : Unknown, Use with caution!
10
/////////////////////////////////////////////////////////////////////
11
////                                                             ////
12
//// Copyright (C) 2002 to Shawn Tan Ser Ngiap.                  ////
13
////                       shawn.tan@aeste.net                   ////
14
////                                                             ////
15
//// This source file may be used and distributed without        ////
16
//// restriction provided that this copyright statement is not   ////
17
//// removed from the file and that any derivative work contains ////
18
//// the original copyright notice and the associated disclaimer.////
19
////                                                             ////
20
////     THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY     ////
21
//// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED   ////
22
//// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS   ////
23
//// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR      ////
24
//// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,         ////
25
//// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES    ////
26
//// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE   ////
27
//// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR        ////
28
//// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF  ////
29
//// LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT  ////
30
//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT  ////
31
//// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE         ////
32
//// POSSIBILITY OF SUCH DAMAGE.                                 ////
33
////                                                             ////
34
/////////////////////////////////////////////////////////////////////
35
 
36
`include "k68_defines.v"
37
 
38
module k68_soc (/*AUTOARG*/
39
   // Outputs
40
   add_o, dat_o, we_o, tx_o, rts_o, clk_o, rst_o,
41
   // Inputs
42
   dat_i, rst_i, clk_i, rx_i, cts_i, int_i
43
   ) ;
44
   parameter aw = `k68_ADDR_W;
45
   parameter dw = `k68_DATA_W;
46
 
47
   output [aw-1:0] add_o;
48
   input [dw-1:0]  dat_i;
49
   output [dw-1:0] dat_o;
50
   output          we_o;
51
 
52
   input           rst_i, clk_i;
53
   input [1:0]      rx_i,cts_i;
54
   output [1:0]    tx_o,rts_o;
55
   input [2:0]      int_i;
56
   output          clk_o;
57
   output          rst_o;
58
 
59
   wire            cs;
60
   wire [aw-1:0]   m_add_o;
61
   wire [dw-1:0]   m_dat_o;
62
   wire [dw-1:0]   m_dat_i;
63
   wire            m_we_o;
64
   wire            m_cs_o;
65
 
66
 
67
   wire [9:0]       a_dat_i, b_dat_i;
68
   wire            r_cs_o, r_we_o, a_cs_o, b_cs_o, a_we_o, b_we_o;
69
 
70
   wire            rst;
71
   wire [31:0]      d_dat_o,d_dat_i;
72
 
73
   assign          add_o = m_add_o;
74
   assign          dat_o = m_dat_o;
75
   assign          we_o = r_we_o;
76
 
77
   //
78
   // Arbiter
79
   //
80
   k68_arb arb0 (
81
                 .m_we_o(r_we_o),
82
                 .m_cs_o(r_cs_o),
83
                 .m_dat_i(dat_i),
84
 
85
                 .a_we_o(a_we_o),
86
                 .a_cs_o(a_cs_o),
87
                 .a_dat_i(a_dat_i),
88
 
89
                 .b_we_o(b_we_o),
90
                 .b_cs_o(b_cs_o),
91
                 .b_dat_i(b_dat_i),
92
 
93
                 .m_add_i(m_add_o),
94
                 .m_we_i(m_we_o),
95
                 .m_dat_o(m_dat_i),
96
 
97
                 .rst_i(rst_o)
98
                 );
99
 
100
   //
101
   // Instantiate CPU
102
   //
103
   k68_cpu cpu0(
104
                .add_o(m_add_o),
105
                .dat_o(m_dat_o),
106
                .dat_i(m_dat_i),
107
                .we_o(m_we_o),
108
 
109
                .int_i(int_i),
110
                .cs_o(cs),
111
                .clk_o(clk_o), .rst_o(rst_o),
112
                .clk_i(clk_i), .rst_i(rst_i)
113
                );
114
 
115
 
116
 
117
`ifdef k68_UART
118
   //
119
   // k68_sasc
120
   //
121
 
122
   wire [7:0]       brg0,brg1;
123
   assign          brg0 = `k68_div0;
124
   assign          brg1 = `k68_div1;
125
 
126
   k68_sasc uart0(
127
                  .tx_o(tx_o[0]),
128
                  .rts_o(rts_o[0]),
129
                  .dat_i({brg1,brg0,m_dat_o[7:0]}),
130
                  .dat_o(a_dat_i),
131
                  .cts_i(cts_i[0]),
132
                  .rx_i(rx_i[0]),
133
                  .cs_i(a_cs_o),
134
                  .we_i(a_we_o),
135
                  .clk_i(clk_o),.rst_i(rst_o)
136
                  );
137
 
138
   k68_sasc uart1(
139
                  .tx_o(tx_o[1]),
140
                  .rts_o(rts_o[1]),
141
                  .dat_i({brg1,brg0,m_dat_o[7:0]}),
142
                  .dat_o(b_dat_i),
143
                  .cts_i(cts_i[1]),
144
                  .rx_i(rx_i[1]),
145
                  .cs_i(b_cs_o),
146
                  .we_i(b_we_o),
147
                  .clk_i(clk_o),.rst_i(rst_o)
148
                  );
149
`endif
150
 
151
 
152
endmodule // k68_soc
153
 
154
/*
155
 *
156
 * Synchronous Bus Arbiter
157
 * Consider placing 0xFF000000 - 0xFFFFFFFF to Peripheral space
158
 *
159
 * 0xFF000000 - GPIO
160
 * 0xFF010000 - UARTA
161
 * 0xFF020000 - UARTB
162
 * 0xFF030000 - DES
163
 *
164
 * Others Reserved
165
 *
166
 */
167
 
168
module k68_arb (/*AUTOARG*/
169
   // Outputs
170
   m_dat_o, m_we_o, m_cs_o, g_we_o, g_cs_o, a_we_o, a_cs_o, b_we_o,
171
   b_cs_o,
172
   // Inputs
173
   rst_i, m_add_i, m_we_i, m_dat_i, g_dat_i, a_dat_i, b_dat_i
174
   ) ;
175
   parameter aw = `k68_ADDR_W;
176
   parameter dw = `k68_DATA_W;
177
   parameter ow = `k68_OP_W;
178
 
179
   // Program Memory
180
   //input [dw-1:0]  p_dat_i;
181
   input     rst_i;
182
 
183
   // Data Memory
184
   output [dw-1:0] m_dat_o;
185
   input [aw-1:0]  m_add_i;
186
   input           m_we_i;
187
   reg [dw-1:0]    m_dat_o;
188
 
189
   // SPRAM
190
   input [dw-1:0]  m_dat_i;
191
   output          m_we_o;
192
   output          m_cs_o;
193
   reg             m_we_o, m_cs_o;
194
 
195
   // 
196
   // Peripherals
197
   //
198
 
199
   // GPIO PORTS
200
   input [15:0]    g_dat_i;
201
   output          g_we_o, g_cs_o;
202
   reg             g_we_o, g_cs_o;
203
 
204
   // UART A
205
   input [9:0]      a_dat_i;
206
   output          a_we_o, a_cs_o;
207
   reg             a_we_o, a_cs_o;
208
 
209
   // UART B
210
   input [9:0]      b_dat_i;
211
   output          b_we_o, b_cs_o;
212
   reg             b_we_o, b_cs_o;
213
 
214
   always @ ( /*AUTOSENSE*/a_dat_i or b_dat_i or g_dat_i or m_add_i
215
             or m_dat_i or m_we_i or rst_i) begin
216
    if (rst_i) begin
217
      /*AUTORESET*/
218
      // Beginning of autoreset for uninitialized flops
219
      a_cs_o <= 0;
220
      a_we_o <= 0;
221
      b_cs_o <= 0;
222
      b_we_o <= 0;
223
      g_cs_o <= 0;
224
      g_we_o <= 0;
225
      m_cs_o <= 0;
226
      m_dat_o <= 0;
227
      m_we_o <= 0;
228
      // End of automatics
229
    end else begin // if (rst_i)
230
       /*AUTORESET*/
231
       // Beginning of autoreset for uninitialized flops
232
       a_cs_o <= 0;
233
       a_we_o <= 0;
234
       b_cs_o <= 0;
235
       b_we_o <= 0;
236
       g_cs_o <= 0;
237
       g_we_o <= 0;
238
       m_cs_o <= 0;
239
       m_dat_o <= 0;
240
       m_we_o <= 0;
241
       // End of automatics
242
 
243
      case (m_add_i[aw-1])
244
        1'b1:
245
          case (m_add_i[31:24])
246
            8'hFF:
247
              case (m_add_i[23:16])
248
                8'h00: begin // GPIO
249
                   g_cs_o <= 1'b1;
250
                   g_we_o <= m_we_i;
251
                   m_dat_o <= g_dat_i;
252
                end
253
`ifdef k68_UART
254
                8'h01: begin // UART A
255
                   a_cs_o <= 1'b1;
256
                   a_we_o <= m_we_i;
257
                   m_dat_o <= a_dat_i;
258
                end
259
 
260
                8'h02: begin // UART B
261
                   b_cs_o <= 1'b1;
262
                   b_we_o <= m_we_i;
263
                   m_dat_o <= b_dat_i;
264
                end
265
`endif
266
 
267
                default: begin
268
                   /*AUTORESET*/
269
                   // Beginning of autoreset for uninitialized flops
270
                   a_cs_o <= 0;
271
                   a_we_o <= 0;
272
                   b_cs_o <= 0;
273
                   b_we_o <= 0;
274
                   g_cs_o <= 0;
275
                   g_we_o <= 0;
276
                   m_cs_o <= 0;
277
                   m_dat_o <= 0;
278
                   m_we_o <= 0;
279
                   // End of automatics
280
                end
281
              endcase // case(m_add_i)
282
            default: begin
283
               m_we_o <= m_we_i;
284
               m_cs_o <= 1'b1;
285
               m_dat_o <= m_dat_i;
286
            end
287
          endcase // case(m_add_i[31:24])
288
        default:
289
          case (m_add_i[1])
290
            1'b1: begin
291
               m_dat_o <= {m_dat_i[31:16], m_dat_i[31:16]};
292
               m_we_o <= 1'b0;
293
               m_cs_o <= 1'b0;
294
               a_cs_o <= 1'b0;
295
               b_cs_o <= 1'b0;
296
               g_cs_o <= 1'b0;
297
 
298
            end
299
            default: begin
300
               m_dat_o <= {m_dat_i[15:0], m_dat_i[15:0]};
301
               m_we_o <= 1'b0;
302
               m_cs_o <= 1'b0;
303
               a_cs_o <= 1'b0;
304
               b_cs_o <= 1'b0;
305
               g_cs_o <= 1'b0;
306
 
307
            end
308
          endcase // case(m_add_i[1])
309
      endcase // case(m_add_i[31])
310
    end
311
   end
312
 
313
endmodule // k68_arb
314
 

powered by: WebSVN 2.1.0

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