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

Subversion Repositories turbo8051

[/] [turbo8051/] [trunk/] [rtl/] [uart/] [uart_cfg.v] - Blame information for rev 9

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

Line No. Rev Author Line
1 9 dinesha
//////////////////////////////////////////////////////////////////////
2
////                                                              ////
3
////  Tubo 8051 cores UART Interface Module                       ////
4
////                                                              ////
5
////  This file is part of the Turbo 8051 cores project           ////
6
////  http://www.opencores.org/cores/turbo8051/                   ////
7
////                                                              ////
8
////  Description                                                 ////
9
////  Turbo 8051 definitions.                                     ////
10
////                                                              ////
11
////  To Do:                                                      ////
12
////    nothing                                                   ////
13
////                                                              ////
14
////  Author(s):                                                  ////
15
////      - Dinesh Annayya, dinesha@opencores.org                 ////
16
////                                                              ////
17
//////////////////////////////////////////////////////////////////////
18
////                                                              ////
19
//// Copyright (C) 2000 Authors and 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
module uart_cfg (
45
 
46
             mclk,
47
             reset_n,
48
 
49
        // Reg Bus Interface Signal
50
             reg_cs,
51
             reg_wr,
52
             reg_addr,
53
             reg_wdata,
54
             reg_be,
55
 
56
            // Outputs
57
            reg_rdata,
58
            reg_ack,
59
 
60
 
61
       // configuration
62
            cfg_tx_enable,
63
            cfg_rx_enable,
64
            cfg_stop_bit ,
65
            cfg_pri_mod  ,
66
 
67
            frm_error_o,
68
            par_error_o,
69
            rx_fifo_full_err_o
70
 
71
        );
72
 
73
 
74
 
75
input         mclk;
76
input         reset_n;
77
 
78
       // configuration
79
output        cfg_tx_enable       ; // Tx Enable
80
output        cfg_rx_enable       ; // Rx Enable
81
output        cfg_stop_bit        ; // 0 -> 1 Stop, 1 -> 2 Stop
82
output  [1:0] cfg_pri_mod         ; // priority mode, 0 -> nop, 1 -> Even, 2 -> Odd
83
 
84
input         frm_error_o         ; // framing error
85
input         par_error_o         ; // par error
86
input         rx_fifo_full_err_o  ; // rx fifo full error
87
 
88
//---------------------------------
89
// Reg Bus Interface Signal
90
//---------------------------------
91
input             reg_cs         ;
92
input             reg_wr         ;
93
input [3:0]       reg_addr       ;
94
input [31:0]      reg_wdata      ;
95
input [3:0]       reg_be         ;
96
 
97
// Outputs
98
output [31:0]     reg_rdata      ;
99
output            reg_ack     ;
100
 
101
 
102
 
103
//-----------------------------------------------------------------------
104
// Internal Wire Declarations
105
//-----------------------------------------------------------------------
106
 
107
wire           sw_rd_en;
108
wire           sw_wr_en;
109
wire  [3:0]    sw_addr ; // addressing 16 registers
110
wire  [3:0]    wr_be   ;
111
 
112
reg   [31:0]  reg_rdata      ;
113
reg           reg_ack     ;
114
 
115
wire [31:0]    reg_0;  // Software_Reg_0
116
wire [31:0]    reg_1;  // Software-Reg_1
117
wire [31:0]    reg_2;  // Software-Reg_2
118
wire [31:0]    reg_3;  // Software-Reg_3
119
wire [31:0]    reg_4;  // Software-Reg_4
120
wire [31:0]    reg_5;  // Software-Reg_5
121
wire [31:0]    reg_6;  // Software-Reg_6
122
wire [31:0]    reg_7;  // Software-Reg_7
123
wire [31:0]    reg_8;  // Software-Reg_8
124
wire [31:0]    reg_9;  // Software-Reg_9
125
wire [31:0]    reg_10; // Software-Reg_10
126
wire [31:0]    reg_11; // Software-Reg_11
127
wire [31:0]    reg_12; // Software-Reg_12
128
wire [31:0]    reg_13; // Software-Reg_13
129
wire [31:0]    reg_14; // Software-Reg_14
130
wire [31:0]    reg_15; // Software-Reg_15
131
reg  [31:0]    reg_out;
132
 
133
//-----------------------------------------------------------------------
134
// Main code starts here
135
//-----------------------------------------------------------------------
136
 
137
//-----------------------------------------------------------------------
138
// Internal Logic Starts here
139
//-----------------------------------------------------------------------
140
    assign sw_addr       = reg_addr [3:0];
141
    assign sw_rd_en      = reg_cs & !reg_wr;
142
    assign sw_wr_en      = reg_cs & reg_wr;
143
    assign wr_be         = reg_be;
144
 
145
 
146
//-----------------------------------------------------------------------
147
// Read path mux
148
//-----------------------------------------------------------------------
149
 
150
always @ (posedge mclk or negedge reset_n)
151
begin : preg_out_Seq
152
   if (reset_n == 1'b0)
153
   begin
154
      reg_rdata [31:0]  <= 32'h0000_0000;
155
      reg_ack           <= 1'b0;
156
   end
157
   else if (sw_rd_en && !reg_ack)
158
   begin
159
      reg_rdata [31:0]  <= reg_out [31:0];
160
      reg_ack           <= 1'b1;
161
   end
162
   else if (sw_wr_en && !reg_ack)
163
      reg_ack           <= 1'b1;
164
   else
165
   begin
166
      reg_ack        <= 1'b0;
167
   end
168
end
169
 
170
 
171
//-----------------------------------------------------------------------
172
// register read enable and write enable decoding logic
173
//-----------------------------------------------------------------------
174
wire   sw_wr_en_0 = sw_wr_en & (sw_addr == 4'h0);
175
wire   sw_rd_en_0 = sw_rd_en & (sw_addr == 4'h0);
176
wire   sw_wr_en_1 = sw_wr_en & (sw_addr == 4'h1);
177
wire   sw_rd_en_1 = sw_rd_en & (sw_addr == 4'h1);
178
wire   sw_wr_en_2 = sw_wr_en & (sw_addr == 4'h2);
179
wire   sw_rd_en_2 = sw_rd_en & (sw_addr == 4'h2);
180
wire   sw_wr_en_3 = sw_wr_en & (sw_addr == 4'h3);
181
wire   sw_rd_en_3 = sw_rd_en & (sw_addr == 4'h3);
182
wire   sw_wr_en_4 = sw_wr_en & (sw_addr == 4'h4);
183
wire   sw_rd_en_4 = sw_rd_en & (sw_addr == 4'h4);
184
wire   sw_wr_en_5 = sw_wr_en & (sw_addr == 4'h5);
185
wire   sw_rd_en_5 = sw_rd_en & (sw_addr == 4'h5);
186
wire   sw_wr_en_6 = sw_wr_en & (sw_addr == 4'h6);
187
wire   sw_rd_en_6 = sw_rd_en & (sw_addr == 4'h6);
188
wire   sw_wr_en_7 = sw_wr_en & (sw_addr == 4'h7);
189
wire   sw_rd_en_7 = sw_rd_en & (sw_addr == 4'h7);
190
wire   sw_wr_en_8 = sw_wr_en & (sw_addr == 4'h8);
191
wire   sw_rd_en_8 = sw_rd_en & (sw_addr == 4'h8);
192
wire   sw_wr_en_9 = sw_wr_en & (sw_addr == 4'h9);
193
wire   sw_rd_en_9 = sw_rd_en & (sw_addr == 4'h9);
194
wire   sw_wr_en_10 = sw_wr_en & (sw_addr == 4'hA);
195
wire   sw_rd_en_10 = sw_rd_en & (sw_addr == 4'hA);
196
wire   sw_wr_en_11 = sw_wr_en & (sw_addr == 4'hB);
197
wire   sw_rd_en_11 = sw_rd_en & (sw_addr == 4'hB);
198
wire   sw_wr_en_12 = sw_wr_en & (sw_addr == 4'hC);
199
wire   sw_rd_en_12 = sw_rd_en & (sw_addr == 4'hC);
200
wire   sw_wr_en_13 = sw_wr_en & (sw_addr == 4'hD);
201
wire   sw_rd_en_13 = sw_rd_en & (sw_addr == 4'hD);
202
wire   sw_wr_en_14 = sw_wr_en & (sw_addr == 4'hE);
203
wire   sw_rd_en_14 = sw_rd_en & (sw_addr == 4'hE);
204
wire   sw_wr_en_15 = sw_wr_en & (sw_addr == 4'hF);
205
wire   sw_rd_en_15 = sw_rd_en & (sw_addr == 4'hF);
206
 
207
 
208
always @( *)
209
begin : preg_sel_Com
210
 
211
  reg_out [31:0] = 32'd0;
212
 
213
  case (sw_addr [3:0])
214
    4'b0000 : reg_out [31:0] = reg_0 [31:0];
215
    4'b0001 : reg_out [31:0] = reg_1 [31:0];
216
    4'b0010 : reg_out [31:0] = reg_2 [31:0];
217
    4'b0011 : reg_out [31:0] = reg_3 [31:0];
218
    4'b0100 : reg_out [31:0] = reg_4 [31:0];
219
    4'b0101 : reg_out [31:0] = reg_5 [31:0];
220
    4'b0110 : reg_out [31:0] = reg_6 [31:0];
221
    4'b0111 : reg_out [31:0] = reg_7 [31:0];
222
    4'b1000 : reg_out [31:0] = reg_8 [31:0];
223
    4'b1001 : reg_out [31:0] = reg_9 [31:0];
224
    4'b1010 : reg_out [31:0] = reg_10 [31:0];
225
    4'b1011 : reg_out [31:0] = reg_11 [31:0];
226
    4'b1100 : reg_out [31:0] = reg_12 [31:0];
227
    4'b1101 : reg_out [31:0] = reg_13 [31:0];
228
    4'b1110 : reg_out [31:0] = reg_14 [31:0];
229
    4'b1111 : reg_out [31:0] = reg_15 [31:0];
230
  endcase
231
end
232
 
233
 
234
 
235
//-----------------------------------------------------------------------
236
// Individual register assignments
237
//-----------------------------------------------------------------------
238
// Logic for Register 0 : uart Control Register
239
//-----------------------------------------------------------------------
240
wire [1:0]   cfg_pri_mod     = reg_0[4:3]; // priority mode, 0 -> nop, 1 -> Even, 2 -> Odd
241
wire         cfg_stop_bit    = reg_0[2];   // 0 -> 1 Stop, 1 -> 2 Stop
242
wire         cfg_rx_enable   = reg_0[1];   // Rx Enable
243
wire         cfg_tx_enable   = reg_0[0];   // Tx Enable
244
 
245
generic_register #(5,0  ) u_uart_ctrl_be0 (
246
              .we            ({5{sw_wr_en_0 &
247
                                 wr_be[0]   }}  ),
248
              .data_in       (reg_wdata[4:0]    ),
249
              .reset_n       (reset_n           ),
250
              .clk           (mclk              ),
251
 
252
              //List of Outs
253
              .data_out      (reg_0[4:0]        )
254
          );
255
 
256
 
257
assign reg_0[31:5] = 27'h0;
258
 
259
//-----------------------------------------------------------------------
260
// Logic for Register 1 : uart interrupt status
261
//-----------------------------------------------------------------------
262
stat_register u_intr_bit0 (
263
                 //inputs
264
                 . clk        (mclk            ),
265
                 . reset_n    (reset_n         ),
266
                 . cpu_we     (sw_wr_en_1 &
267
                               wr_be[0]        ),
268
                 . cpu_ack    (reg_wdata[0]    ),
269
                 . hware_req  (frm_error_o     ),
270
 
271
                 //outputs
272
                 . data_out   (reg_1[0]        )
273
                 );
274
 
275
stat_register u_intr_bit1 (
276
                 //inputs
277
                 . clk        (mclk            ),
278
                 . reset_n    (reset_n         ),
279
                 . cpu_we     (sw_wr_en_1 &
280
                               wr_be[0]        ),
281
                 . cpu_ack    (reg_wdata[1]    ),
282
                 . hware_req  (par_error_o     ),
283
 
284
                 //outputs
285
                 . data_out   (reg_1[1]        )
286
                 );
287
 
288
stat_register u_intr_bit2 (
289
                 //inputs
290
                 . clk        (mclk                ),
291
                 . reset_n    (reset_n             ),
292
                 . cpu_we     (sw_wr_en_1 &
293
                               wr_be[0]            ),
294
                 . cpu_ack    (reg_wdata[2]        ),
295
                 . hware_req  (rx_fifo_full_err_o  ),
296
 
297
                 //outputs
298
                 . data_out   (reg_1[2]            )
299
                 );
300
 
301
assign reg_1[31:3] = 29'h0;
302
 
303
 
304
 
305
 
306
endmodule

powered by: WebSVN 2.1.0

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