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

Subversion Repositories mips32r1

[/] [mips32r1/] [trunk/] [Hardware/] [XUPV5-LX110T_SoC/] [MIPS32-Pipelined-Hw/] [src/] [UART/] [uart-min.v] - Rev 2

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

`timescale 1ns / 1ps
/*
 * File         : uart-min.v
 * Project      : University of Utah, XUM Project MIPS32 core
 * Creator(s)   : Grant Ayers (ayers@cs.utah.edu)
 *
 * Modification History:
 *   Rev   Date         Initials  Description of Change
 *   1.0   24-May-2010  GEA       Initial design.
 *
 * Standards/Formatting:
 *   Verilog 2001, 4 soft tab, wide column.
 *
 * Description:
 *   115200 baud 8-N-1 serial port, using only Tx and Rx.
 *   (8 data bits, no parity, 1 stop bit, no flow control.)
 *   Configurable baud rate determined by clocking module, 16x oversampling
 *   for Rx data, Rx filtering, and configurable FIFO buffers for receiving
 *   and transmitting.
 *
 *   Described as '_min' due to lack of overflow and other status signals
 *   as well as the use of only Tx and Rx signals.
 */
module uart_min(
    input clock,
    input reset,
    input write,
    input [7:0] data_in,   // tx going into uart, out of serial port
    input read,
    output [7:0] data_out, // rx coming in from serial port, out of uart
    output data_ready,
    output [8:0] rx_count,
    /*------------------------*/
    input RxD,
    output TxD
    );
 
    localparam DATA_WIDTH = 8; // Bit-width of FIFO data (should be 8)
    localparam ADDR_WIDTH = 8; // 2^ADDR_WIDTH words of FIFO space
 
    /* Clocking Signals */
    wire uart_tick, uart_tick_16x;
 
    /* Receive Signals */
    wire [7:0] rx_data;     // Raw bytes coming in from uart
    wire rx_data_ready;     // Synchronous pulse indicating this (^)
    wire rx_fifo_empty;
 
    /* Send Signals */
    reg tx_fifo_deQ = 0;
    reg tx_start = 0;
    wire tx_free;
    wire tx_fifo_empty;
    wire [7:0] tx_fifo_data_out;
 
    assign data_ready = ~rx_fifo_empty;
 
    always @(posedge clock) begin
        if (reset) begin
            tx_fifo_deQ <= 0;
            tx_start <= 0;
        end
        else begin
            if (~tx_fifo_empty & tx_free & uart_tick) begin
                tx_fifo_deQ <= 1;
                tx_start <= 1;
            end
            else begin
                tx_fifo_deQ <= 0;
                tx_start <= 0;
            end
        end
    end
 
    uart_clock clocks (
        .clock          (clock), 
        .uart_tick      (uart_tick), 
        .uart_tick_16x  (uart_tick_16x)
    );
 
    uart_tx tx (
        .clock          (clock),
        .reset          (reset),
        .uart_tick      (uart_tick), 
        .TxD_data       (tx_fifo_data_out), 
        .TxD_start      (tx_start), 
        .ready          (tx_free), 
        .TxD            (TxD)
    );
 
    uart_rx rx (
        .clock          (clock),
        .reset          (reset),
        .RxD            (RxD), 
        .uart_tick_16x  (uart_tick_16x), 
        .RxD_data       (rx_data), 
        .data_ready     (rx_data_ready)
    );
 
    FIFO_NoFull_Count #(
        .DATA_WIDTH     (DATA_WIDTH),
        .ADDR_WIDTH     (ADDR_WIDTH))
        tx_buffer (
        .clock          (clock), 
        .reset          (reset), 
        .enQ            (write), 
        .deQ            (tx_fifo_deQ), 
        .data_in        (data_in), 
        .data_out       (tx_fifo_data_out), 
        .empty          (tx_fifo_empty),
        .count          ()
    );
 
    FIFO_NoFull_Count #(
        .DATA_WIDTH     (DATA_WIDTH),
        .ADDR_WIDTH     (ADDR_WIDTH))
        rx_buffer (
        .clock          (clock), 
        .reset          (reset), 
        .enQ            (rx_data_ready), 
        .deQ            (read), 
        .data_in        (rx_data), 
        .data_out       (data_out), 
        .empty          (rx_fifo_empty),
        .count          (rx_count)
    );
 
endmodule
 

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

powered by: WebSVN 2.1.0

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