This is an old revision of the document!
Verilog UART Readme
Introduction
This is a basic UART to AXI Stream IP core, written in Verilog with MyHDL testbenches.
Documentation
Source Files
rtl/uart.v
- Wrapper for complete UARTrtl/uart_rx.v
- UART receiver implementationrtl/uart_tx.v
- UART transmitter implementation
uart module
- Parameters
parameter DATA_WIDTH = 8
- define width of data bus and transferred words in bits
- Clock and reset
input wire clk
- clock inputinput wire rst
- reset input
- AXI Stream Interface (TX)
input wire [DATA_WIDTH-1:0] input_axis_tdata
- data inputinput wire input_axis_tvalid
- data valid inputoutput wire input_axis_tready
- ready for data output
- AXI Stream Interface (RX)
output wire [DATA_WIDTH-1:0] output_axis_tdata
- data outputoutput wire output_axis_tvalid
- data valid outputinput wire output_axis_tready
- ready for data input
- UART Interface
input wire rxd
- UART RXD inputoutput wire txd
- UART TXD output
- Status
output wire tx_busy
- operation in progress signaloutput wire rx_busy
- operation in progress signaloutput wire rx_overrun_error
- overrun error signaloutput wire rx_frame_error
- frame error signal
- Configuration
input wire [15:0] prescale
- BAUD rate prescale value
The uart
module is simply a wrapper around the uart_rx
and uart_tx
modules.
uart_rx module
Signals and Parameters
- Parameters
parameter DATA_WIDTH = 8
- define width of data bus and transferred words in bits
- Clock and Reset
input wire clk
- clock inputinput wire rst
- reset input
- AXI Stream Interface
output wire [DATA_WIDTH-1:0] output_axis_tdata
- data outputoutput wire output_axis_tvalid
- data valid outputinput wire output_axis_tready
- ready for data input
- UART Interface
input wire rxd
- UART RXD input
- Status
output wire busy
- operation in progress signaloutput wire overrun_error
- overrun error signaloutput wire frame_error
- frame error signal
- Configuration
input wire [15:0] prescale
- BAUD rate prescale value
Description
The uart_rx
module implements the UART receive function. Bits received over the rxd
pin are decoded and output on the AXI Stream interface. The baud rate is determined by the prescale
setting, which should be set to Fclk / (baud * 8). prescale
is a port and not a parameter so it can be changed at run time if necessary. The uart_rx
module also generates frame and overrun error signals. The frame_error
signal indicates that the stop bit was not received correctly, while the overrun_error
signal indicates that a byte was received before the previous one was read, causing the older data byte to be overwritten.
uart_tx module
- Parameters
parameter DATA_WIDTH = 8
- define width of data bus and transferred words in bits
- Clock and Reset
input wire clk
- clock inputinput wire rst
- reset input
- AXI Stream Interface
input wire [DATA_WIDTH-1:0] input_axis_tdata
- data inputinput wire input_axis_tvalid
- data valid inputoutput wire input_axis_tready
- ready for data output
- UART Interface
output wire txd
- UART TXD output
- Status
output wire busy
- operation in progress signal
- Configuration
input wire [15:0] prescale
- BAUD rate prescale value
AXI interface
The main interface to the user design is an AXI4-Stream interface that consists of the tdata, tvalid, and tready signals. tready flows in the opposite direction. tdata is considered valid when tvalid is high. The destination will accept data only when tready is high. Data is transferred from the source to the destination only when both tvalid and tready are high, otherwise the bus is stalled.
AXI Stream Interface Example
two byte transfer with sink pause after each byte
__ __ __ __ __ __ __ __ __ clk __/ \__/ \__/ \__/ \__/ \__/ \__/ \__/ \__/ \__ _____ _________________ tdata XXXXXXXXX_D0__X_D1______________XXXXXXXXXXXXXXXXXXXXXXXX _______________________ tvalid ________/ \_______________________ ______________ _____ ___________ tready \___________/ \___________/
Testing
Running the included testbenches requires MyHDL and Icarus Verilog. Make sure that myhdl.vpi is installed properly for cosimulation to work correctly. The testbenches can be run with a Python test runner like nose or py.test, or the individual test scripts can be run with python directly.
Testbench Files
tb/axis_ep.py
- MyHDL AXI Stream endpointstb/test_uart_rx.py
- MyHDL testbench for uart_rx moduletb/test_uart_rx.v
- Verilog toplevel file for uart_rx cosimulationtb/test_uart_tx.py
- MyHDL testbench for uart_tx moduletb/test_uart_tx.v
- Verilog toplevel file for uart_tx cosimulationtb/uart_ep.py
- MyHDL UART endpoints
Example Design
The included example design is targeted to a Digilent Atlys board. To build it, cd into example/ATLYS/fpga, make sure the Xilinx settings file has been sourced correctly, and run make.