uart.v
module uart #(
parameter clk_freq = 50000000,
parameter baud = 9600
) (
input sys_clk,
input sys_rst,
output rx_irq,
output tx_irq,
input uart_rx,
output uart_tx
);
wire [7:0] rx_data;
reg [7:0] tx_data;
reg tx_wr;
always @(posedge sys_clk)
begin
if (rx_irq)
begin
tx_data <= rx_data;
tx_wr <= 1'b1;
end
else
begin
tx_wr <= 1'b0;
end
end
uart_transceiver transceiver(
.sys_clk(sys_clk),
.sys_rst(sys_rst),
.uart_rx(uart_rx),
.uart_tx(uart_tx),
.divisor(clk_freq/baud/16),
.rx_data(rx_data),
.rx_done(rx_irq),
.tx_data(tx_data),
.tx_wr(tx_wr),
.tx_done(tx_irq)
);
endmodule
uart_transceiver.v
/*
* Milkymist VJ SoC
* Copyright (C) 2007, 2008, 2009, 2010 Sebastien Bourdeauducq
* Copyright (C) 2007 Das Labor
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
module uart_transceiver(
input sys_rst,
input sys_clk,
input uart_rx,
output reg uart_tx,
input [15:0] divisor,
output reg [7:0] rx_data,
output reg rx_done,
input [7:0] tx_data,
input tx_wr,
output reg tx_done
);
//-----------------------------------------------------------------
// enable16 generator
//-----------------------------------------------------------------
reg [15:0] enable16_counter;
wire enable16;
assign enable16 = (enable16_counter == 16'd0);
always @(posedge sys_clk) begin
if(sys_rst)
enable16_counter <= divisor - 16'b1;
else begin
enable16_counter <= enable16_counter - 16'd1;
if(enable16)
enable16_counter <= divisor - 16'b1;
end
end
//-----------------------------------------------------------------
// Synchronize uart_rx
//-----------------------------------------------------------------
reg uart_rx1;
reg uart_rx2;
always @(posedge sys_clk) begin
uart_rx1 <= uart_rx;
uart_rx2 <= uart_rx1;
end
//-----------------------------------------------------------------
// UART RX Logic
//-----------------------------------------------------------------
reg rx_busy;
reg [3:0] rx_count16;
reg [3:0] rx_bitcount;
reg [7:0] rx_reg;
always @(posedge sys_clk) begin
if(sys_rst) begin
rx_done <= 1'b0;
rx_busy <= 1'b0;
rx_count16 <= 4'd0;
rx_bitcount <= 4'd0;
end else begin
rx_done <= 1'b0;
if(enable16) begin
if(~rx_busy) begin // look for start bit
if(~uart_rx2) begin // start bit found
rx_busy <= 1'b1;
rx_count16 <= 4'd7;
rx_bitcount <= 4'd0;
end
end else begin
rx_count16 <= rx_count16 + 4'd1;
if(rx_count16 == 4'd0) begin // sample
rx_bitcount <= rx_bitcount + 4'd1;
if(rx_bitcount == 4'd0) begin // verify startbit
if(uart_rx2)
rx_busy <= 1'b0;
end else if(rx_bitcount == 4'd9) begin
rx_busy <= 1'b0;
if(uart_rx2) begin // stop bit ok
rx_data <= rx_reg;
rx_done <= 1'b1;
end // ignore RX error
end else
rx_reg <= {uart_rx2, rx_reg[7:1]};
end
end
end
end
end
//-----------------------------------------------------------------
// UART TX Logic
//-----------------------------------------------------------------
reg tx_busy;
reg [3:0] tx_bitcount;
reg [3:0] tx_count16;
reg [7:0] tx_reg;
always @(posedge sys_clk) begin
if(sys_rst) begin
tx_done <= 1'b0;
tx_busy <= 1'b0;
uart_tx <= 1'b1;
end else begin
tx_done <= 1'b0;
if(tx_wr) begin
tx_reg <= tx_data;
tx_bitcount <= 4'd0;
tx_count16 <= 4'd1;
tx_busy <= 1'b1;
uart_tx <= 1'b0;
`ifdef SIMULATION
$display("UART:Â %c", tx_data);
`endif
end else if(enable16 && tx_busy) begin
tx_count16 <= tx_count16 + 4'd1;
if(tx_count16 == 4'd0) begin
tx_bitcount <= tx_bitcount + 4'd1;
if(tx_bitcount == 4'd8) begin
uart_tx <= 1'b1;
end else if(tx_bitcount == 4'd9) begin
uart_tx <= 1'b1;
tx_busy <= 1'b0;
tx_done <= 1'b1;
end else begin
uart_tx <= tx_reg[0];
tx_reg <= {1'b0, tx_reg[7:1]};
end
end
end
end
end
endmodule
分享到:
相关推荐
UARTLoopback改进版是针对Android平台上串行通信(UART)的一种优化实现。UARTLoopback通常用于测试和调试设备间的串行数据传输,它允许设备通过UART接口发送数据并立即接收相同的回显数据,以验证通信链路的正确性...
在本压缩包文件"UART.rar"中,包含了一个UART Loopback测试实例,该实例主要用于验证UART模块的功能。UART Loopback测试是一种常用的调试方法,它通过将发送的数据回送到接收端,从而检查数据传输路径的正确性。 ...
标题中的“uart_loopback_上位机zynq_FPGAverilog_verilogUart_zynquart_”表明这是一个关于UART(通用异步接收发送器)环回测试的项目,其中涉及Zynq SoC(系统级芯片)、FPGA(现场可编程门阵列)设计、Verilog...
在这个项目中,“9_uart_loopback_top.rar”是一个包含Verilog代码的压缩包,专注于讲解如何实现一个UART(通用异步接收发送器)的收发回环功能。UART是一种广泛使用的串行通信接口,常用于设备间的低速数据传输。 ...
UART环回 该示例演示了通过UART进行的基本数据读取和写入操作。 该应用程序创建一个环回接口,该接口立即将从接收(RX)缓冲区读取的任何数据回显到发送(TX)缓冲区。 屏幕截图 先决条件 带有可用UART端口的...
**标题解析:** "pic32单片机uart例程loopback" 指的是一个使用PIC32微控制器(单片机)实现UART(通用异步收发传输器)功能的程序,其中包含了Loopback模式。Loopback模式是UART通信的一种测试方式,通常用于检查...
在本文中,我们将详细探讨“JZ2440->UART: loopback mode”的相关知识点,以及如何在实际操作中设置和使用UART的环回模式。 首先,UART是一种串行通信接口,它允许设备间以较低的数据速率进行双向通信。UART通常...
标题中的“9_uart_loopback_top_2018.3版本_uartverilog工程亲测可用”揭示了这个压缩包文件包含的是一个基于Verilog语言实现的UART(通用异步接收发送器)设计,且该设计在2018.3版本的工具下经过验证,证明是可行...
UART(通用异步收发传输器)是一种广泛用于嵌入式系统和计算机之间的串行通信接口,它在各种设备间传输数据,如微处理器、传感器、显示器等。本项目是南京邮电大学的一个课程设计,重点在于实现一个具有回环功能的...
此外,"UARTLoopback"可能是一个测试程序或类,用于验证串口通信的正确性。循环回路测试(Loopback Test)是常见的通信测试方法,它将发送的数据直接返回给接收端,如果接收到的数据与发送的一致,就表明通信链路...
在本文中,我们将深入探讨SCI Loopback,这是SCI功能开发的一个关键环节,用于串口通讯的调试和UART(通用异步收发传输器)的测试。 SCI Loopback模式是一种自环回测试方法,它允许数据在发送后立即被同一设备接收...
在TI的TMS320C28335 DSP(数字信号处理器)中,SCI(Serial Communication Interface)模块是一个用于串行通信的接口,它支持多种通信协议,如UART、SPI等。在这个特定的场景中,我们关注的是SCI-B(Serial ...
UART0和UART1都支持自发自收(Loopback)模式,这是一种用于测试串口通信功能的方法。在自发自收模式下,发送的数据会立即被接收端口读取,无需外部设备参与。这种模式可以快速验证UART的硬件和软件配置是否正确,为...
5. **UART Loopback测试**:"UartLoop"可能是指一种环回测试,即发送的数据经过UART接口后直接返回给发送端,用于检查UART通信链路是否正常。这种测试能帮助开发者验证UART接口的正确性和稳定性。 6. **Verilog语言...
LoopBack模式是一种特殊的测试模式,用于检测UART自身的功能是否正常。在该模式下,UART的TXD(发送端)与RXD(接收端)在内部相连,发送的数据可以直接被接收端捕获并返回,以此验证数据的收发是否正常。 #### 六...
实验文件"acz7015_uart_loopback"和"uart_test_quartus"可能分别包含了用特定语言(可能是Verilog或VHDL)编写的UART回环模块和Quartus项目文件。在实际操作中,你需要加载这些文件到对应的开发环境中,编译并下载到...
DSPSCI模块在TMS320F28335中扮演着重要角色,它是一个硬件加速的串行接口,可以支持多种通信协议如UART(通用异步收发传输器),SPI(串行外围接口)或I²C(集成电路总线)。在loopback测试中,发送的数据会通过SCI...
DE0-Nano 上的 UART 该项目的目标是创建一个可以轻松添加到 DE0-Nano 上的任何项目的 UART/串行黑匣子。 唯一需要的额外硬件是串行接口。 我正在使用 CP2102 USB 到 UART 桥接器( ),但任何东西都应该可以工作。...
2. **SCI (Serial Communication Interface)**: 一种串行接口,支持异步串行通信,常用于微控制器和外围设备之间的通信,如UART(通用异步收发传输器)。 3. **环回测试**: 一种自我验证技术,其中发送的数据通过...