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

Subversion Repositories turbo8051

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

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 76 dinesha
////  Revision : Mar 2, 2011                                      //// 
18
////                                                              ////
19 9 dinesha
//////////////////////////////////////////////////////////////////////
20
////                                                              ////
21
//// Copyright (C) 2000 Authors and OPENCORES.ORG                 ////
22
////                                                              ////
23
//// This source file may be used and distributed without         ////
24
//// restriction provided that this copyright statement is not    ////
25
//// removed from the file and that any derivative work contains  ////
26
//// the original copyright notice and the associated disclaimer. ////
27
////                                                              ////
28
//// This source file is free software; you can redistribute it   ////
29
//// and/or modify it under the terms of the GNU Lesser General   ////
30
//// Public License as published by the Free Software Foundation; ////
31
//// either version 2.1 of the License, or (at your option) any   ////
32
//// later version.                                               ////
33
////                                                              ////
34
//// This source is distributed in the hope that it will be       ////
35
//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
36
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
37
//// PURPOSE.  See the GNU Lesser General Public License for more ////
38
//// details.                                                     ////
39
////                                                              ////
40
//// You should have received a copy of the GNU Lesser General    ////
41
//// Public License along with this source; if not, download it   ////
42
//// from http://www.opencores.org/lgpl.shtml                     ////
43
////                                                              ////
44
//////////////////////////////////////////////////////////////////////
45
 
46
module uart_cfg (
47
 
48
             mclk,
49
             reset_n,
50
 
51
        // Reg Bus Interface Signal
52
             reg_cs,
53
             reg_wr,
54
             reg_addr,
55
             reg_wdata,
56
             reg_be,
57
 
58
            // Outputs
59
            reg_rdata,
60
            reg_ack,
61
 
62
 
63
       // configuration
64
            cfg_tx_enable,
65
            cfg_rx_enable,
66
            cfg_stop_bit ,
67
            cfg_pri_mod  ,
68
 
69
            frm_error_o,
70
            par_error_o,
71
            rx_fifo_full_err_o
72
 
73
        );
74
 
75
 
76
 
77
input         mclk;
78
input         reset_n;
79
 
80
       // configuration
81
output        cfg_tx_enable       ; // Tx Enable
82
output        cfg_rx_enable       ; // Rx Enable
83
output        cfg_stop_bit        ; // 0 -> 1 Stop, 1 -> 2 Stop
84
output  [1:0] cfg_pri_mod         ; // priority mode, 0 -> nop, 1 -> Even, 2 -> Odd
85
 
86
input         frm_error_o         ; // framing error
87
input         par_error_o         ; // par error
88
input         rx_fifo_full_err_o  ; // rx fifo full error
89
 
90
//---------------------------------
91
// Reg Bus Interface Signal
92
//---------------------------------
93
input             reg_cs         ;
94
input             reg_wr         ;
95
input [3:0]       reg_addr       ;
96
input [31:0]      reg_wdata      ;
97
input [3:0]       reg_be         ;
98
 
99
// Outputs
100
output [31:0]     reg_rdata      ;
101
output            reg_ack     ;
102
 
103
 
104
 
105
//-----------------------------------------------------------------------
106
// Internal Wire Declarations
107
//-----------------------------------------------------------------------
108
 
109
wire           sw_rd_en;
110
wire           sw_wr_en;
111
wire  [3:0]    sw_addr ; // addressing 16 registers
112
wire  [3:0]    wr_be   ;
113
 
114
reg   [31:0]  reg_rdata      ;
115
reg           reg_ack     ;
116
 
117
wire [31:0]    reg_0;  // Software_Reg_0
118
wire [31:0]    reg_1;  // Software-Reg_1
119
wire [31:0]    reg_2;  // Software-Reg_2
120
wire [31:0]    reg_3;  // Software-Reg_3
121
wire [31:0]    reg_4;  // Software-Reg_4
122
wire [31:0]    reg_5;  // Software-Reg_5
123
wire [31:0]    reg_6;  // Software-Reg_6
124
wire [31:0]    reg_7;  // Software-Reg_7
125
wire [31:0]    reg_8;  // Software-Reg_8
126
wire [31:0]    reg_9;  // Software-Reg_9
127
wire [31:0]    reg_10; // Software-Reg_10
128
wire [31:0]    reg_11; // Software-Reg_11
129
wire [31:0]    reg_12; // Software-Reg_12
130
wire [31:0]    reg_13; // Software-Reg_13
131
wire [31:0]    reg_14; // Software-Reg_14
132
wire [31:0]    reg_15; // Software-Reg_15
133
reg  [31:0]    reg_out;
134
 
135
//-----------------------------------------------------------------------
136
// Main code starts here
137
//-----------------------------------------------------------------------
138
 
139
//-----------------------------------------------------------------------
140
// Internal Logic Starts here
141
//-----------------------------------------------------------------------
142
    assign sw_addr       = reg_addr [3:0];
143
    assign sw_rd_en      = reg_cs & !reg_wr;
144
    assign sw_wr_en      = reg_cs & reg_wr;
145
    assign wr_be         = reg_be;
146
 
147
 
148
//-----------------------------------------------------------------------
149
// Read path mux
150
//-----------------------------------------------------------------------
151
 
152
always @ (posedge mclk or negedge reset_n)
153
begin : preg_out_Seq
154
   if (reset_n == 1'b0)
155
   begin
156
      reg_rdata [31:0]  <= 32'h0000_0000;
157
      reg_ack           <= 1'b0;
158
   end
159
   else if (sw_rd_en && !reg_ack)
160
   begin
161
      reg_rdata [31:0]  <= reg_out [31:0];
162
      reg_ack           <= 1'b1;
163
   end
164
   else if (sw_wr_en && !reg_ack)
165
      reg_ack           <= 1'b1;
166
   else
167
   begin
168
      reg_ack        <= 1'b0;
169
   end
170
end
171
 
172
 
173
//-----------------------------------------------------------------------
174
// register read enable and write enable decoding logic
175
//-----------------------------------------------------------------------
176
wire   sw_wr_en_0 = sw_wr_en & (sw_addr == 4'h0);
177
wire   sw_rd_en_0 = sw_rd_en & (sw_addr == 4'h0);
178
wire   sw_wr_en_1 = sw_wr_en & (sw_addr == 4'h1);
179
wire   sw_rd_en_1 = sw_rd_en & (sw_addr == 4'h1);
180
wire   sw_wr_en_2 = sw_wr_en & (sw_addr == 4'h2);
181
wire   sw_rd_en_2 = sw_rd_en & (sw_addr == 4'h2);
182
wire   sw_wr_en_3 = sw_wr_en & (sw_addr == 4'h3);
183
wire   sw_rd_en_3 = sw_rd_en & (sw_addr == 4'h3);
184
wire   sw_wr_en_4 = sw_wr_en & (sw_addr == 4'h4);
185
wire   sw_rd_en_4 = sw_rd_en & (sw_addr == 4'h4);
186
wire   sw_wr_en_5 = sw_wr_en & (sw_addr == 4'h5);
187
wire   sw_rd_en_5 = sw_rd_en & (sw_addr == 4'h5);
188
wire   sw_wr_en_6 = sw_wr_en & (sw_addr == 4'h6);
189
wire   sw_rd_en_6 = sw_rd_en & (sw_addr == 4'h6);
190
wire   sw_wr_en_7 = sw_wr_en & (sw_addr == 4'h7);
191
wire   sw_rd_en_7 = sw_rd_en & (sw_addr == 4'h7);
192
wire   sw_wr_en_8 = sw_wr_en & (sw_addr == 4'h8);
193
wire   sw_rd_en_8 = sw_rd_en & (sw_addr == 4'h8);
194
wire   sw_wr_en_9 = sw_wr_en & (sw_addr == 4'h9);
195
wire   sw_rd_en_9 = sw_rd_en & (sw_addr == 4'h9);
196
wire   sw_wr_en_10 = sw_wr_en & (sw_addr == 4'hA);
197
wire   sw_rd_en_10 = sw_rd_en & (sw_addr == 4'hA);
198
wire   sw_wr_en_11 = sw_wr_en & (sw_addr == 4'hB);
199
wire   sw_rd_en_11 = sw_rd_en & (sw_addr == 4'hB);
200
wire   sw_wr_en_12 = sw_wr_en & (sw_addr == 4'hC);
201
wire   sw_rd_en_12 = sw_rd_en & (sw_addr == 4'hC);
202
wire   sw_wr_en_13 = sw_wr_en & (sw_addr == 4'hD);
203
wire   sw_rd_en_13 = sw_rd_en & (sw_addr == 4'hD);
204
wire   sw_wr_en_14 = sw_wr_en & (sw_addr == 4'hE);
205
wire   sw_rd_en_14 = sw_rd_en & (sw_addr == 4'hE);
206
wire   sw_wr_en_15 = sw_wr_en & (sw_addr == 4'hF);
207
wire   sw_rd_en_15 = sw_rd_en & (sw_addr == 4'hF);
208
 
209
 
210
always @( *)
211
begin : preg_sel_Com
212
 
213
  reg_out [31:0] = 32'd0;
214
 
215
  case (sw_addr [3:0])
216
    4'b0000 : reg_out [31:0] = reg_0 [31:0];
217
    4'b0001 : reg_out [31:0] = reg_1 [31:0];
218
    4'b0010 : reg_out [31:0] = reg_2 [31:0];
219
    4'b0011 : reg_out [31:0] = reg_3 [31:0];
220
    4'b0100 : reg_out [31:0] = reg_4 [31:0];
221
    4'b0101 : reg_out [31:0] = reg_5 [31:0];
222
    4'b0110 : reg_out [31:0] = reg_6 [31:0];
223
    4'b0111 : reg_out [31:0] = reg_7 [31:0];
224
    4'b1000 : reg_out [31:0] = reg_8 [31:0];
225
    4'b1001 : reg_out [31:0] = reg_9 [31:0];
226
    4'b1010 : reg_out [31:0] = reg_10 [31:0];
227
    4'b1011 : reg_out [31:0] = reg_11 [31:0];
228
    4'b1100 : reg_out [31:0] = reg_12 [31:0];
229
    4'b1101 : reg_out [31:0] = reg_13 [31:0];
230
    4'b1110 : reg_out [31:0] = reg_14 [31:0];
231
    4'b1111 : reg_out [31:0] = reg_15 [31:0];
232
  endcase
233
end
234
 
235
 
236
 
237
//-----------------------------------------------------------------------
238
// Individual register assignments
239
//-----------------------------------------------------------------------
240
// Logic for Register 0 : uart Control Register
241
//-----------------------------------------------------------------------
242
wire [1:0]   cfg_pri_mod     = reg_0[4:3]; // priority mode, 0 -> nop, 1 -> Even, 2 -> Odd
243
wire         cfg_stop_bit    = reg_0[2];   // 0 -> 1 Stop, 1 -> 2 Stop
244
wire         cfg_rx_enable   = reg_0[1];   // Rx Enable
245
wire         cfg_tx_enable   = reg_0[0];   // Tx Enable
246
 
247
generic_register #(5,0  ) u_uart_ctrl_be0 (
248
              .we            ({5{sw_wr_en_0 &
249
                                 wr_be[0]   }}  ),
250
              .data_in       (reg_wdata[4:0]    ),
251
              .reset_n       (reset_n           ),
252
              .clk           (mclk              ),
253
 
254
              //List of Outs
255
              .data_out      (reg_0[4:0]        )
256
          );
257
 
258
 
259
assign reg_0[31:5] = 27'h0;
260
 
261
//-----------------------------------------------------------------------
262
// Logic for Register 1 : uart interrupt status
263
//-----------------------------------------------------------------------
264
stat_register u_intr_bit0 (
265
                 //inputs
266
                 . clk        (mclk            ),
267
                 . reset_n    (reset_n         ),
268
                 . cpu_we     (sw_wr_en_1 &
269
                               wr_be[0]        ),
270
                 . cpu_ack    (reg_wdata[0]    ),
271
                 . hware_req  (frm_error_o     ),
272
 
273
                 //outputs
274
                 . data_out   (reg_1[0]        )
275
                 );
276
 
277
stat_register u_intr_bit1 (
278
                 //inputs
279
                 . clk        (mclk            ),
280
                 . reset_n    (reset_n         ),
281
                 . cpu_we     (sw_wr_en_1 &
282
                               wr_be[0]        ),
283
                 . cpu_ack    (reg_wdata[1]    ),
284
                 . hware_req  (par_error_o     ),
285
 
286
                 //outputs
287
                 . data_out   (reg_1[1]        )
288
                 );
289
 
290
stat_register u_intr_bit2 (
291
                 //inputs
292
                 . clk        (mclk                ),
293
                 . reset_n    (reset_n             ),
294
                 . cpu_we     (sw_wr_en_1 &
295
                               wr_be[0]            ),
296
                 . cpu_ack    (reg_wdata[2]        ),
297
                 . hware_req  (rx_fifo_full_err_o  ),
298
 
299
                 //outputs
300
                 . data_out   (reg_1[2]            )
301
                 );
302
 
303
assign reg_1[31:3] = 29'h0;
304
 
305
 
306
 
307
 
308
endmodule

powered by: WebSVN 2.1.0

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