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

Subversion Repositories uart6551

[/] [uart6551/] [trunk/] [trunk/] [rtl/] [uart6551_x12.sv] - Blame information for rev 5

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

Line No. Rev Author Line
1 5 robfinch
// ============================================================================
2
//        __
3
//   \\__/ o\    (C) 2005-2022  Robert Finch, Waterloo
4
//    \  __ /    All rights reserved.
5
//     \/_//     robfinch@finitron.ca
6
//       ||
7
//
8
//
9
// BSD 3-Clause License
10
// Redistribution and use in source and binary forms, with or without
11
// modification, are permitted provided that the following conditions are met:
12
//
13
// 1. Redistributions of source code must retain the above copyright notice, this
14
//    list of conditions and the following disclaimer.
15
//
16
// 2. Redistributions in binary form must reproduce the above copyright notice,
17
//    this list of conditions and the following disclaimer in the documentation
18
//    and/or other materials provided with the distribution.
19
//
20
// 3. Neither the name of the copyright holder nor the names of its
21
//    contributors may be used to endorse or promote products derived from
22
//    this software without specific prior written permission.
23
//
24
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
25
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
27
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
28
// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29
// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
30
// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
31
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
32
// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
33
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34
//
35
// ============================================================================
36
//
37
`define UART_TRB                4'd0    // transmit/receive buffer
38
`define UART_STAT               4'd1
39
`define UART_CMD                4'd2
40
`define UART_CTRL               4'd3
41
`define UART_IRQS               4'd4
42
`define UART_MS                 4'd5
43
`define UART_LS                 4'd6
44
`define UART_CMD1               4'd7
45
`define UART_CMD2               4'd8
46
`define UART_CMD3               4'd9
47
`define UART_CTRL1      4'd10
48
`define UART_CTRL2      4'd11
49
`define UART_CTRL3      4'd12
50
`define UART_CLK1               4'd13
51
`define UART_CLK2               4'd14
52
 
53
module uart6551_x12 (rst_i, clk_i, cs_i, irq_o,
54
        cyc_i, stb_i, ack_o, we_i, adr_i, dat_i, dat_o,
55
        cts_ni, rts_no, dsr_ni, dcd_ni, dtr_no, ri_ni,
56
        rxd_i, txd_o, data_present,
57
        rxDRQ_o, txDRQ_o,
58
        xclk_i, RxC_i
59
);
60
parameter pCounterBits = 24;
61
parameter pFifoSize = 1024;
62
parameter pClkDiv = 24'd1302;   // 9.6k baud, 200.000MHz clock
63
parameter HIGH = 1'b1;
64
parameter LOW = 1'b0;
65
input rst_i;
66
input clk_i;                    // eg 50.000MHz
67
input cs_i;             // circuit select
68
// WISHBONE -------------------------------
69
input cyc_i;            // bus cycle valid
70
input stb_i;
71
output ack_o;
72
input we_i;                     // 1 = write
73
input [3:0] adr_i;      // register address
74
input [11:0] dat_i;     // data input bus
75
output reg [11:0] dat_o;        // data output bus
76
//------------------------------------------
77
output reg irq_o;               // interrupt request
78
input cts_ni;                   // clear to send - (flow control) active low
79
output reg rts_no;              // request to send - (flow control) active low
80
input dsr_ni;   // data set ready - active low
81
input dcd_ni;   // data carrier detect - active low
82
output reg dtr_no;      // data terminal ready - active low
83
input ri_ni;            // ring indicator
84
input rxd_i;            // serial data in
85
output txd_o;           // serial data out
86
output data_present;
87
output rxDRQ_o; // reciever DMA request
88
output txDRQ_o; // transmitter DMA request
89
input xclk_i;           // external clock source
90
input RxC_i;            // external receiver clock source
91
 
92
reg accessCD;           // clock multiplier access flag
93
reg llb;                        // local loopback mode
94
reg dmaEnable;
95
// baud rate clock control
96
reg [4:0] baudRateSel;
97
reg selCD;                              // Use clock multiplier register
98
reg [pCounterBits-1:0] c;       // current count
99
reg [pCounterBits-1:0] ckdiv;   // baud rate clock divider
100
reg [pCounterBits-1:0] clkdiv;  // clock multiplier register
101
reg [1:0] xclks;        // synchronized external clock
102
reg [1:0] RxCs;         // synchronized external receiver clock
103
reg baud16;                     // 16x baud rate clock
104
wire baud16rx;          // reciever clock
105
reg xClkSrc;            // uart baud clock is external
106
reg rxClkSrc;           // receiver clock is external
107
 
108
// frame format registers
109
reg [3:0] wordLength;
110
reg stopBit;
111
reg [2:0] stopBits;
112
reg [2:0] parityCtrl;
113
reg [8:0] frameSize;
114
 
115
reg txBreak;            // transmit a break
116
 
117
wire rxFull;
118
wire rxEmpty;
119
wire txFull;
120
wire txEmpty;
121
reg hwfc;                       // hardware flow control enable
122
wire [11:0] lineStatusReg;
123
wire [11:0] modemStatusReg;
124
wire [11:0] irqStatusReg;
125
// interrupt
126
reg rxIe;
127
reg txIe;
128
reg modemStatusChangeIe;
129
wire modemStatusChange;
130
reg lineStatusChangeIe;
131
wire lineStatusChange;
132
reg rxToutIe;           // receiver timeout interrupt enable
133
reg [3:0] rxThres;      // receiver threshold for interrupt
134
reg [3:0] txThres;      // transmitter threshold for interrupt
135
reg rxTout;                     // receiver timeout
136
wire [9:0] rxCnt;       // reciever counter value
137
reg [7:0] rxToutMax;
138
reg [2:0] irqenc;       // encoded irq cause
139
wire rxITrig;           // receiver interrupt trigger level
140
wire txITrig;           // transmitter interrupt trigger level
141
// reciever errors
142
wire parityErr;         // reciever detected a parity error
143
wire frameErr;          // receiver char framing error
144
wire overrun;           // receiver over run
145
wire rxBreak;           // reciever detected a break
146
wire rxGErr;            // global error: there is at least one error in the reciever fifo
147
// modem controls
148
reg [1:0] ctsx;         // cts_n sampling
149
reg [1:0] dcdx;
150
reg [1:0] dsrx;
151
reg [1:0] rix;
152
reg deltaCts;
153
reg deltaDcd;
154
reg deltaDsr;
155
reg deltaRi;
156
 
157
// fifo
158
reg rxFifoClear;
159
reg txFifoClear;
160
reg fifoEnable;
161
wire [3:0] rxQued;
162
wire [3:0] txQued;
163
 
164
// test
165
wire txd1;
166
 
167
assign data_present = ~rxEmpty;
168
 
169
assign rxITrig = rxQued >= rxThres;
170
assign txITrig = txQued <= txThres;
171
wire rxDRQ1 = (fifoEnable ? rxITrig : ~rxEmpty);
172
wire txDRQ1 = (fifoEnable ? txITrig : txEmpty);
173
assign rxDRQ_o = dmaEnable & rxDRQ1;
174
assign txDRQ_o = dmaEnable & txDRQ1;
175
wire rxIRQ = rxIe & rxDRQ1;
176
wire txIRQ = txIe & txDRQ1;
177
 
178
reg [11:0] cmd0, cmd1, cmd2, cmd3;
179
reg [11:0] ctrl0, ctrl1, ctrl2, ctrl3;
180
 
181
always_ff @(posedge clk_i)
182
        irq_o <=
183
          rxIRQ
184
        | txIRQ
185
        | (rxTout & rxToutIe)
186
        | (lineStatusChange & lineStatusChangeIe)
187
        | (modemStatusChange & modemStatusChangeIe)
188
        ;
189
 
190
// Hold onto address and data an extra cycle.
191
// The extra cycle updates or reads the serial transmit / receive.
192
reg [11:0] dati;
193
always_ff @(posedge clk_i)
194
        dati <= dat_i;
195
reg [3:0] adr_h;
196
always_ff @(posedge clk_i)
197
        adr_h <= adr_i;
198
reg we;
199
always_ff @(posedge clk_i)
200
        we <= we_i;
201
 
202
wire [11:0] rx_do;
203
wire rdrx = ack_o && adr_h==`UART_TRB && ~we;
204
wire txrx = ack_o && adr_h==`UART_TRB;
205
 
206
wire cs = cs_i & cyc_i & stb_i;
207
 
208
ack_gen #(
209
        .READ_STAGES(1),
210
        .WRITE_STAGES(0),
211
        .REGISTER_OUTPUT(1)
212
) uag1
213
(
214
        .rst_i(rst_i),
215
        .clk_i(clk_i),
216
        .ce_i(1'b1),
217
        .i(cs),
218
        .we_i(cs & we),
219
        .o(ack_o),
220
        .rid_i(0),
221
        .wid_i(0),
222
        .rid_o(),
223
        .wid_o()
224
);
225
 
226
uart6551Rx_x12 uart_rx0
227
(
228
        .rst(rst_i),
229
        .clk(clk_i),
230
        .cyc(cyc_i),
231
        .cs(rdrx),
232
        .wr(we),
233
        .dout(rx_do),
234
        .ack(),
235
        .fifoEnable(fifoEnable),
236
        .fifoClear(rxFifoClear),
237
        .clearGErr(1'b0),
238
        .wordLength(wordLength),
239
        .parityCtrl(parityCtrl),
240
        .frameSize(frameSize),
241
        .stop_bits(stopBits),
242
        .baud16x_ce(baud16rx),
243
        .clear(1'b0),
244
        .rxd(llb ? txd1 : rxd_i),
245
        .full(),
246
        .empty(rxEmpty),
247
        .frameErr(frameErr),
248
        .overrun(overrun),
249
        .parityErr(parityErr),
250
        .break_o(rxBreak),
251
        .gerr(rxGErr),
252
        .qcnt(rxQued),
253
        .cnt(rxCnt)
254
);
255
 
256
uart6551Tx_x12 uart_tx0
257
(
258
        .rst(rst_i),
259
        .clk(clk_i),
260
        .cyc(cyc_i),
261
        .cs(txrx),
262
        .wr(we),
263
        .din(dati),
264
        .ack(),
265
        .fifoEnable(fifoEnable),
266
        .fifoClear(txFifoClear),
267
        .txBreak(txBreak),
268
        .frameSize(frameSize),  // 16 x 10 bits
269
        .wordLength(wordLength),// 8 bits
270
        .parityCtrl(parityCtrl),// no parity
271
        .baud16x_ce(baud16),
272
        .cts(ctsx[1]|~hwfc),
273
        .clear(clear),
274
        .txd(txd1),
275
        .full(txFull),
276
        .empty(txEmpty),
277
        .qcnt(txQued)
278
);
279
 
280
assign txd_o = llb ? 1'b1 : txd1;
281
 
282
assign lineStatusReg = {4'h0,rxGErr,1'b0,txFull,rxBreak,1'b0,1'b0,1'b0,1'b0};
283
assign modemStatusChange = deltaDcd|deltaRi|deltaDsr|deltaCts;  // modem status delta
284
assign modemStatusReg = {4'h0,1'b0,~rix[1],1'b0,~ctsx[1],deltaDcd, deltaRi, deltaDsr, deltaCts};
285
assign irqStatusReg = {irq_o,3'b0,irq_o,2'b00,irqenc,2'b00};
286
 
287
// mux the reg outputs
288
always_ff @(posedge clk_i)
289
if (cs) begin
290
        case(adr_h)
291
        `UART_TRB:      dat_o <= {4'h0,rx_do};  // receiver holding register
292
        `UART_STAT:     dat_o <= {irq_o,3'h0,irq_o,dsrx[1],dcdx[1],fifoEnable ? ~txFull : txEmpty,~rxEmpty,overrun,frameErr,parityErr};
293
        `UART_CMD:      dat_o <= cmd0;
294
        `UART_CTRL:     dat_o <= ctrl0;
295
        `UART_IRQS:     dat_o <= irqStatusReg;
296
        `UART_MS:               dat_o <= modemStatusReg;
297
        `UART_LS:               dat_o <= lineStatusReg;
298
        `UART_CMD1:     dat_o <= cmd1;
299
        `UART_CMD2:     dat_o <= cmd2;
300
        `UART_CMD3:     dat_o <= cmd3;
301
        `UART_CTRL1:    dat_o <= ctrl1;
302
        `UART_CTRL2:    dat_o <= ctrl2;
303
        `UART_CTRL3:    dat_o <= ctrl3;
304
        `UART_CLK1:             dat_o <= clkdiv[23:12];
305
        `UART_CLK2:             dat_o <= clkdiv[11: 0];
306
        default:        dat_o <= 12'h0;
307
        endcase
308
end
309
else
310
        dat_o <= 12'h0;
311
 
312
 
313
// register updates
314
always_ff @(posedge clk_i)
315
if (rst_i) begin
316
        rts_no <= HIGH;
317
        dtr_no <= HIGH;
318
        // interrupts
319
        rxIe                            <= 1'b0;
320
        txIe                            <= 1'b0;
321
        modemStatusChangeIe     <= 1'b0;
322
        lineStatusChangeIe      <= 1'b0;
323
        hwfc                            <= 1'b0;
324
        modemStatusChangeIe     <= 1'b0;
325
        lineStatusChangeIe      <= 1'b0;
326
        dmaEnable                       <= 1'b0;
327
        // clock control
328
        baudRateSel <= 5'h0;
329
        rxClkSrc        <= 1'b0;                // ** 6551 defaults to zero (external receiver clock)
330
        clkdiv <= pClkDiv;
331
        // frame format
332
        wordLength      <= 4'd8;        // 8 bits
333
        stopBit         <= 1'b0;                // 1 stop bit
334
        parityCtrl      <= 3'd0;        // no parity
335
 
336
        txBreak         <= 1'b0;
337
        // Fifo control
338
        txFifoClear     <= 1'b1;
339
        rxFifoClear <= 1'b1;
340
        fifoEnable      <= 1'b1;
341
        // Test
342
        llb                     <= 1'b0;
343
        selCD           <= 1'b0;
344
        accessCD   <= 1'b0;
345
end
346
else begin
347
 
348
        //llb <= 1'b1;
349
        rxFifoClear <= 1'b0;
350
        txFifoClear <= 1'b0;
351
        ctrl2[1] <= 1'b0;
352
        ctrl2[2] <= 1'b0;
353
 
354
        if (cs & we) begin
355
                case (adr_h)    // synopsys full_case parallel_case
356
 
357
                `UART_TRB:      ;
358
                `UART_CLK2:     clkdiv[11: 0] <= dati;
359
                `UART_CLK1:     clkdiv[23:12] <= dati;
360
 
361
                // Writing to the status register does a software reset of some bits.
362
                `UART_STAT:
363
                        begin
364
                                dtr_no <= HIGH;
365
                                rxIe <= 1'b0;
366
                                rts_no <= HIGH;
367
                                txIe <= 1'b0;
368
                                txBreak <= 1'b0;
369
                                llb <= 1'b0;
370
                        end
371
                `UART_CMD:
372
        begin
373
                cmd0 <= dati[7:0];
374
                                        dtr_no <= ~dati[0];
375
                rxIe   <= ~dati[1];
376
                case(dati[3:2])
377
                2'd0:   begin rts_no <= 1'b1; txIe <= 1'b0; txBreak <= 1'b0; end
378
                2'd1: begin rts_no <= 1'b0; txIe <= 1'b1; txBreak <= 1'b0; end
379
                2'd2: begin rts_no <= 1'b0; txIe <= 1'b0; txBreak <= 1'b0; end
380
                2'd3: begin rts_no <= 1'b0; txIe <= 1'b0; txBreak <= 1'b1; end
381
                endcase
382
                llb <= dati[4];
383
          parityCtrl <= dati[7:5];    //000=none,001=odd,011=even,101=force 1,111 = force 0
384
        end
385
    `UART_CMD1:
386
        begin
387
                cmd1 <= dati;
388
                lineStatusChangeIe  <= dati[0];
389
                modemStatusChangeIe <= dati[1];
390
                rxToutIe <= dati[2];
391
        end
392
    `UART_CMD2:
393
        cmd2 <= dati;
394
    `UART_CMD3:
395
                cmd3 <= dati;
396
 
397
    `UART_CTRL:
398
                begin
399
                        ctrl0 <= dati;
400
                baudRateSel[3:0] <= dati[3:0];
401
                                rxClkSrc <= dati[4];                            // 1 = baud rate generator, 0 = external
402
        //11=5,10=6,01=7,00=8
403
        case({dati[8],dati[6:5]})
404
        3'd0:   wordLength <= 4'd8;
405
        3'd1:   wordLength <= 4'd7;
406
        3'd2:   wordLength <= 4'd6;
407
        3'd3:   wordLength <= 4'd5;
408
        3'd4:   wordLength <= 4'd12;
409
        3'd5:   wordLength <= 4'd11;
410
        3'd6:   wordLength <= 4'd10;
411
        3'd7:   wordLength <= 4'd9;
412
        endcase
413
        stopBit    <= dati[7];      //0=1,1=1.5 or 2
414
        end
415
    `UART_CTRL1:
416
                // Extended word length, values beyond 11 not supported.
417
                ctrl1 <= dati;
418
        `UART_CTRL2:
419
        begin
420
                ctrl2 <= dati;
421
        fifoEnable <= dati[0];
422
        rxFifoClear <= dati[1];
423
        txFifoClear <= dati[2];
424
        case (dati[5:4])
425
        2'd0:   txThres <= 4'd1;                // one-byte
426
        2'd1:   txThres <= pFifoSize / 4;       // one-quarter full
427
        2'd2:   txThres <= pFifoSize / 2;       // one-half full
428
        2'd3:   txThres <= pFifoSize * 3 / 4;   // three-quarters full
429
        endcase
430
        case (dati[7:6])
431
        2'd0:   rxThres <= 4'd1;                // one-byte
432
        2'd1:   rxThres <= pFifoSize / 4;       // one-quarter full
433
        2'd2:   rxThres <= pFifoSize / 2;       // one-half full
434
        2'd3:   rxThres <= pFifoSize * 3 / 4;   // three quarters full
435
        endcase
436
      end
437
    `UART_CTRL3:
438
      begin
439
        ctrl3 <= dati;
440
                                hwfc <= dati[0];
441
                                dmaEnable <= dati[2];
442
                baudRateSel[4] <= dati[3];
443
                selCD <= dati[6];
444
                accessCD <= dati[7];
445
        end
446
                default:
447
                        ;
448
                endcase
449
        end
450
end
451
 
452
// ----------------------------------------------------------------------------
453
// Baud rate control.
454
// ----------------------------------------------------------------------------
455
 
456
always_ff @(posedge clk_i)
457
        xClkSrc <= baudRateSel==5'd0;
458
 
459
wire [pCounterBits-1:0] bclkdiv;
460
uart6551BaudLUT #(pCounterBits) ublt1 (.a(baudRateSel), .o(bclkdiv));
461
 
462
reg [pCounterBits-1:0] clkdiv2;
463
always_ff @(posedge clk_i)
464
        clkdiv2 <= selCD ? clkdiv : bclkdiv;
465
 
466
always_ff @(posedge clk_i)
467
if (rst_i)
468
        c <= 1'd1;
469
else begin
470
        c <= c + 2'd1;
471
        if (c >= clkdiv2)
472
                c <= 2'd1;
473
end
474
 
475
// for detecting an edge on the baud clock
476
wire ibaud16 = c == 2'd1;
477
 
478
// Detect an edge on the external clock
479
wire xclkEdge;
480
edge_det ed1(.rst(rst_i), .clk(clk_i), .ce(1'b1), .i(xclks[1]), .pe(xclkEdge), .ne() );
481
 
482
// Detect an edge on the external clock
483
wire rxClkEdge;
484
edge_det ed2(.rst(rst_i), .clk(clk_i), .ce(1'b1), .i(RxCs[1]), .pe(rxClkEdge), .ne() );
485
 
486
always_comb
487
if (xClkSrc)            // 16x external clock (xclk)
488
        baud16 <= xclkEdge;
489
else
490
        baud16 <= ibaud16;
491
 
492
assign baud16rx = rxClkSrc ? baud16 : rxClkEdge;
493
 
494
//------------------------------------------------------------
495
// external signal synchronization
496
//------------------------------------------------------------
497
 
498
// External receiver clock
499
always_ff @(posedge clk_i)
500
        RxCs <= {RxCs[1:0],RxC_i};
501
 
502
// External baud clock
503
always_ff @(posedge clk_i)
504
        xclks <= {xclks[1:0],xclk_i};
505
 
506
 
507
always_ff @(posedge clk_i)
508
        ctsx <= {ctsx[0],llb?~rts_no:~cts_ni};
509
 
510
always_ff @(posedge clk_i)
511
        dcdx <= {dcdx[0],~dcd_ni};
512
 
513
always_ff @(posedge clk_i)
514
        dsrx <= {dsrx[0],llb?~dtr_no:~dsr_ni};
515
 
516
always_ff @(posedge clk_i)
517
        rix <= {rix[0],~ri_ni};
518
 
519
//------------------------------------------------------------
520
// state change detectors
521
//------------------------------------------------------------
522
 
523
wire ne_stat;
524
edge_det ued3 (
525
        .rst(rst_i),
526
        .clk(clk_i),
527
        .ce(1'b1),
528
        .i(ack_o && adr_i==`UART_MS && ~we_i),
529
        .pe(),
530
        .ne(ne_stat),
531
        .ee()
532
);
533
 
534
// detect a change on the dsr signal
535
always_ff @(posedge clk_i)
536
if (rst_i)
537
        deltaDsr <= 1'b0;
538
else begin
539
        if (ne_stat)
540
                deltaDsr <= 0;
541
        else if (~deltaDsr)
542
                deltaDsr <= dsrx[1] ^ dsrx[0];
543
end
544
 
545
// detect a change on the dcd signal
546
always_ff @(posedge clk_i)
547
if (rst_i)
548
        deltaDcd <= 1'b0;
549
else begin
550
        if (ne_stat)
551
                deltaDcd <= 0;
552
        else if (~deltaDcd)
553
                deltaDcd <= dcdx[1] ^ dcdx[0];
554
end
555
 
556
// detect a change on the cts signal
557
always_ff @(posedge clk_i)
558
if (rst_i)
559
        deltaCts <= 1'b0;
560
else begin
561
        if (ne_stat)
562
                deltaCts <= 0;
563
        else if (~deltaCts)
564
                deltaCts <= ctsx[1] ^ ctsx[0];
565
end
566
 
567
// detect a change on the ri signal
568
always_ff @(posedge clk_i)
569
if (rst_i)
570
        deltaRi <= 1'b0;
571
else begin
572
        if (ne_stat)
573
                deltaRi <= 0;
574
        else if (~deltaRi)
575
                deltaRi <= rix[1] ^ rix[0];
576
end
577
 
578
// detect a change in line status
579
reg [7:0] pLineStatusReg;
580
always_ff @(posedge clk_i)
581
        pLineStatusReg <= lineStatusReg;
582
 
583
assign lineStatusChange = pLineStatusReg != lineStatusReg;
584
 
585
//-----------------------------------------------------
586
 
587
// compute recieve timeout
588
always_comb
589
        rxToutMax <= (wordLength << 2) + 6'd12;
590
 
591
always_ff @(posedge clk_i)
592
if (rst_i)
593
        rxTout <= 1'b0;
594
else begin
595
        // read of receiver clears timeout counter
596
        if (rdrx)
597
                rxTout <= 1'b0;
598
        // Don't time out if the fifo is empty
599
        else if (rxCnt[9:4]==rxToutMax && ~rxEmpty)
600
                rxTout <= 1'b1;
601
end
602
 
603
 
604
//-----------------------------------------------------
605
// compute the 2x number of stop bits
606
always_comb
607
if (stopBit==1'b0)          // one stop bit
608
        stopBits <= 3'd2;
609
else if (wordLength==4'd8 && parityCtrl != 3'd0)
610
        stopBits <= 3'd2;
611
else if (wordLength==4'd5 && parityCtrl == 3'd0)        // 5 bits - 1 1/2 stop bit
612
        stopBits <= 3'd3;
613
else
614
        stopBits <= 3'd4;          // two stop bits
615
 
616
 
617
// compute frame size
618
// frame size is one less
619
always_ff @(posedge clk_i)
620
        frameSize <= {wordLength + 4'd1 + stopBits[2:1] + parityCtrl[0], stopBits[0],3'b0} - 2'd1;
621
 
622
//-----------------------------------------------------
623
// encode IRQ mailbox
624
always_comb
625
        irqenc <=
626
                lineStatusChange ? 3'd0 :
627
                ~rxDRQ_o ? 3'd1 :
628
                rxTout ? 3'd2 :
629
                ~txDRQ_o ? 3'd3 :
630
                modemStatusChange ? 3'd4 :
631
                3'd0;
632
 
633
endmodule

powered by: WebSVN 2.1.0

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