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

Subversion Repositories darkriscv

[/] [darkriscv/] [trunk/] [rtl/] [darkuart.v] - Diff between revs 4 and 6

Show entire file | Details | Blame | View Log

Rev 4 Rev 6
Line 64... Line 64...
`define UART_STATE_STOP  0
`define UART_STATE_STOP  0
`define UART_STATE_ACK   1
`define UART_STATE_ACK   1
 
 
// UART registers
// UART registers
// 
// 
// 0: status register ro, 1 = xmit busy, 2 = recv busy
// 0: status register ro, 1 = xmit busy, 2 = recv bfusy
// 1: buffer register rw, w = xmit fifo, r = recv fifo
// 1: buffer register rw, w = xmit fifo, r = recv fifo
// 2: baud rate msb   rw (not used)
// 2: baud rate msb   rw (not used)
// 3: baud rate lsb   rw (not used)
// 3: baud rate lsb   rw (not used)
 
 
module darkuart
module darkuart
Line 98... Line 98...
 
 
    reg [15:0]  UART_TIMER = `__BAUD__;  // baud rate from config.vh
    reg [15:0]  UART_TIMER = `__BAUD__;  // baud rate from config.vh
    reg         UART_IREQ  = 0;     // UART interrupt req
    reg         UART_IREQ  = 0;     // UART interrupt req
    reg         UART_IACK  = 0;     // UART interrupt ack
    reg         UART_IACK  = 0;     // UART interrupt ack
 
 
 
`ifdef __UARTQUEUE__
 
    reg [ 7:0]  UART_XFIFO [0:255]; // UART TX FIFO
 
    wire [7:0]  UART_XTMP;          // UART TX FIFO
 
    reg [ 8:0]  UART_XREQ  = 0;     // xmit request (core side)
 
    reg [ 8:0]  UART_XACK  = 0;     // xmit ack (uart side)
 
`else
    reg [ 7:0]  UART_XFIFO = 0;     // UART TX FIFO
    reg [ 7:0]  UART_XFIFO = 0;     // UART TX FIFO
    reg         UART_XREQ  = 0;     // xmit request (core side)
    reg         UART_XREQ  = 0;     // xmit request (core side)
    reg         UART_XACK  = 0;     // xmit ack (uart side)
    reg         UART_XACK  = 0;     // xmit ack (uart side)
 
`endif
    reg [15:0]  UART_XBAUD = 0;    // baud rate counter
    reg [15:0]  UART_XBAUD = 0;    // baud rate counter
    reg [ 3:0]  UART_XSTATE= 0;     // idle state
    reg [ 3:0]  UART_XSTATE= 0;     // idle state
 
 
 
`ifdef __UARTQUEUE__
 
    reg [ 7:0]  UART_RFIFO [0:255]; // UART RX FIFO
 
    reg [ 7:0]  UART_RTMP  = 0;     // UART RX FIFO
 
    reg [ 8:0]  UART_RREQ  = 0;     // request (uart side)
 
    reg [ 8:0]  UART_RACK  = 0;     // ack (core side)
 
`else
    reg [ 7:0]  UART_RFIFO = 0;     // UART RX FIFO
    reg [ 7:0]  UART_RFIFO = 0;     // UART RX FIFO
    reg         UART_RREQ  = 0;     // request (uart side)
    reg         UART_RREQ  = 0;     // request (uart side)
    reg         UART_RACK  = 0;     // ack (core side)
    reg         UART_RACK  = 0;     // ack (core side)
 
`endif
    reg [15:0]  UART_RBAUD = 0;    // baud rate counter
    reg [15:0]  UART_RBAUD = 0;    // baud rate counter
    reg [ 3:0]  UART_RSTATE= 0;     // idle state
    reg [ 3:0]  UART_RSTATE= 0;     // idle state
 
 
    reg [2:0]   UART_RXDFF = -1;
    reg [2:0]   UART_RXDFF = -1;
 
 
    wire [7:0]  UART_STATE = { 6'd0, UART_RREQ^UART_RACK, UART_XREQ^UART_XACK };
`ifdef __UARTQUEUE__
 
    wire [7:0]  UART_STATE = { 6'd0, UART_RREQ!=UART_RACK, UART_XREQ==(UART_XACK^9'h100) };
 
 
 
    integer i;
 
 
 
    initial
 
    for(i=0;i!=256;i=i+1)
 
    begin
 
        UART_RFIFO[i] = 0;
 
        UART_XFIFO[i] = 0;
 
    end
 
`else
 
    wire [7:0]  UART_STATE = { 6'd0, UART_RREQ!=UART_RACK, UART_XREQ!=UART_XACK };
 
`endif
    reg [7:0]   UART_STATEFF = 0;
    reg [7:0]   UART_STATEFF = 0;
 
 
    // bus interface
    // bus interface
 
 
    reg [31:0] DATAOFF = 0;
    reg [31:0] DATAOFF = 0;
Line 126... Line 152...
    begin
    begin
        if(WR)
        if(WR)
        begin
        begin
            if(BE[1])
            if(BE[1])
            begin
            begin
                UART_XFIFO <= DATAI[15:8];
 
`ifdef SIMULATION
`ifdef SIMULATION
                // print the UART output to console! :)
                // print the UART output to console! :)
                if(DATAI[15:8]!=13) // remove the '\r'
                if(DATAI[15:8]!=13) // remove the '\r'
                begin
                begin
                    $write("%c",DATAI[15:8]);
                    $write("%c",DATAI[15:8]);
Line 146... Line 172...
                begin
                begin
                    $display(" no UART input, end simulation request...");
                    $display(" no UART input, end simulation request...");
                    FINISH_REQ <= 1;
                    FINISH_REQ <= 1;
                end
                end
`else
`else
 
    `ifdef __UARTQUEUE__
 
                if(UART_XREQ!=(UART_XACK^9'h100))
 
                begin
 
                    UART_XFIFO[UART_XREQ[7:0]] <= DATAI[15:8];
 
                    UART_XREQ <= UART_XREQ+1;
 
                end
 
    `else
 
                UART_XFIFO <= DATAI[15:8];
                UART_XREQ <= !UART_XACK;    // activate UART!
                UART_XREQ <= !UART_XACK;    // activate UART!
`endif
`endif
 
`endif
            end
            end
            //if(BE[2]) UART_TIMER[ 7:0] <= DATAI[23:16];
            //if(BE[2]) UART_TIMER[ 7:0] <= DATAI[23:16];
            //if(BE[3]) UART_TIMER[15:8] <= DATAI[31:24];           
            //if(BE[3]) UART_TIMER[15:8] <= DATAI[31:24];           
        end
        end
 
 
Line 161... Line 196...
            UART_STATEFF <= UART_STATE;
            UART_STATEFF <= UART_STATE;
        end
        end
        else
        else
        if(RD)
        if(RD)
        begin
        begin
 
`ifdef __UARTQUEUE__
 
            if(BE[1]) UART_RACK     <= UART_RACK!=UART_RREQ?UART_RACK+1:UART_RACK; // fifo ready
 
`else
            if(BE[1]) UART_RACK     <= UART_RREQ; // fifo ready
            if(BE[1]) UART_RACK     <= UART_RREQ; // fifo ready
 
`endif
            if(BE[0]) UART_STATEFF <= UART_STATE; // state update, clear irq
            if(BE[0]) UART_STATEFF <= UART_STATE; // state update, clear irq
        end
        end
    end
    end
 
 
    assign IRQ   = |(UART_STATE^UART_STATEFF);
    assign IRQ   = |(UART_STATE^UART_STATEFF);
 
`ifdef __UARTQUEUE__
 
    assign DATAO = { UART_TIMER, UART_RFIFO[UART_RACK[7:0]], UART_STATE };
 
`else
    assign DATAO = { UART_TIMER, UART_RFIFO, UART_STATE };
    assign DATAO = { UART_TIMER, UART_RFIFO, UART_STATE };
 
`endif
 
 
    // xmit path: 6(IDLE), 7(START), 8, 9, 10, 11, 12, 13, 14, 15, 0(STOP), 1(ACK)
    // xmit path: 6(IDLE), 7(START), 8, 9, 10, 11, 12, 13, 14, 15, 0(STOP), 1(ACK)
 
 
    always@(posedge CLK)
    always@(posedge CLK)
    begin
    begin
        UART_XBAUD <= UART_XSTATE==`UART_STATE_IDLE ? UART_TIMER :      // xbaud=timer
        UART_XBAUD <= UART_XSTATE==`UART_STATE_IDLE ? UART_TIMER :      // xbaud=timer
                      UART_XBAUD ? UART_XBAUD-1 : UART_TIMER;           // while() { while(xbaud--); xbaud=timer }
                      UART_XBAUD ? UART_XBAUD-1 : UART_TIMER;           // while() { while(xbaud--); xbaud=timer }
 
 
        UART_XSTATE <= RES||UART_XSTATE==`UART_STATE_ACK  ? `UART_STATE_IDLE :
        UART_XSTATE <= RES||UART_XSTATE==`UART_STATE_ACK  ? `UART_STATE_IDLE :
                            UART_XSTATE==`UART_STATE_IDLE ? UART_XSTATE+(UART_XREQ^UART_XACK) :
                            UART_XSTATE==`UART_STATE_IDLE ? UART_XSTATE+(UART_XREQ!=UART_XACK) :
                                                            UART_XSTATE+(UART_XBAUD==0);
                                                            UART_XSTATE+(UART_XBAUD==0);
 
`ifdef __UARTQUEUE__
 
        UART_XACK   <= RES ? UART_XREQ : UART_XSTATE==`UART_STATE_ACK && UART_XACK!=UART_XREQ  ? UART_XACK+1 : UART_XACK;
 
`else
        UART_XACK   <= RES||UART_XSTATE==`UART_STATE_ACK  ? UART_XREQ : UART_XACK;
        UART_XACK   <= RES||UART_XSTATE==`UART_STATE_ACK  ? UART_XREQ : UART_XACK;
 
`endif
    end
    end
 
 
 
`ifdef __UARTQUEUE__
 
    assign UART_XTMP = UART_XFIFO[UART_XACK[7:0]];
 
 
 
    assign TXD = UART_XSTATE[3] ? UART_XTMP[UART_XSTATE[2:0]] : UART_XSTATE==`UART_STATE_START ? 0 : 1;
 
`else
    assign TXD = UART_XSTATE[3] ? UART_XFIFO[UART_XSTATE[2:0]] : UART_XSTATE==`UART_STATE_START ? 0 : 1;
    assign TXD = UART_XSTATE[3] ? UART_XFIFO[UART_XSTATE[2:0]] : UART_XSTATE==`UART_STATE_START ? 0 : 1;
 
`endif
 
 
    // recv path: 6(IDLE), 7(START), 8, 9, 10, 11, 12, 13, 14, 15, 0(STOP), 1(ACK)
    // recv path: 6(IDLE), 7(START), 8, 9, 10, 11, 12, 13, 14, 15, 0(STOP), 1(ACK)
 
 
    always@(posedge CLK)
    always@(posedge CLK)
    begin
    begin
Line 200... Line 251...
 
 
        UART_RSTATE <= RES||UART_RSTATE==`UART_STATE_ACK  ? `UART_STATE_IDLE :
        UART_RSTATE <= RES||UART_RSTATE==`UART_STATE_ACK  ? `UART_STATE_IDLE :
                            UART_RSTATE==`UART_STATE_IDLE ? UART_RSTATE+(UART_RXDFF[2:1]==2'b10) : // start bit detection
                            UART_RSTATE==`UART_STATE_IDLE ? UART_RSTATE+(UART_RXDFF[2:1]==2'b10) : // start bit detection
                                                            UART_RSTATE+(UART_RBAUD==0);
                                                            UART_RSTATE+(UART_RBAUD==0);
 
 
 
`ifdef __UARTQUEUE__
 
        if(UART_RSTATE==`UART_STATE_ACK&&(UART_RREQ!=(UART_RACK^9'h100)))
 
        begin
 
            UART_RREQ <= UART_RREQ+1;
 
            UART_RFIFO[UART_RREQ[7:0]] <= UART_RTMP;
 
        end
 
`else
        UART_RREQ <= UART_RSTATE==`UART_STATE_ACK ? !UART_RACK : UART_RREQ;
        UART_RREQ <= UART_RSTATE==`UART_STATE_ACK ? !UART_RACK : UART_RREQ;
 
`endif
        if(UART_RSTATE[3])
        if(UART_RSTATE[3])
        begin
        begin
 
`ifdef __UARTQUEUE__
 
            UART_RTMP[UART_RSTATE[2:0]] <= UART_RXDFF[2];
 
`else
            UART_RFIFO[UART_RSTATE[2:0]] <= UART_RXDFF[2];
            UART_RFIFO[UART_RSTATE[2:0]] <= UART_RXDFF[2];
 
`endif
        end
        end
    end
    end
 
 
    //debug
    //debug
 
 

powered by: WebSVN 2.1.0

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