`

uart loopback

    博客分类:
  • FPGA
 
阅读更多

 

    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改进版

    UARTLoopback改进版是针对Android平台上串行通信(UART)的一种优化实现。UARTLoopback通常用于测试和调试设备间的串行数据传输,它允许设备通过UART接口发送数据并立即接收相同的回显数据,以验证通信链路的正确性...

    UART.rar_UART Verilog_uart_uart loopback

    在本压缩包文件"UART.rar"中,包含了一个UART Loopback测试实例,该实例主要用于验证UART模块的功能。UART Loopback测试是一种常用的调试方法,它通过将发送的数据回送到接收端,从而检查数据传输路径的正确性。 ...

    uart_loopback_上位机zynq_FPGAverilog_verilogUart_zynquart_

    标题中的“uart_loopback_上位机zynq_FPGAverilog_verilogUart_zynquart_”表明这是一个关于UART(通用异步接收发送器)环回测试的项目,其中涉及Zynq SoC(系统级芯片)、FPGA(现场可编程门阵列)设计、Verilog...

    9_uart_loopback_top.rar

    在这个项目中,“9_uart_loopback_top.rar”是一个包含Verilog代码的压缩包,专注于讲解如何实现一个UART(通用异步接收发送器)的收发回环功能。UART是一种广泛使用的串行通信接口,常用于设备间的低速数据传输。 ...

    sample-uartloopback:Echo使用Android Things通过UART接收字符

    UART环回 该示例演示了通过UART进行的基本数据读取和写入操作。 该应用程序创建一个环回接口,该接口立即将从接收(RX)缓冲区读取的任何数据回显到发送(TX)缓冲区。 屏幕截图 先决条件 带有可用UART端口的...

    pic32单片机uart例程loopback

    **标题解析:** "pic32单片机uart例程loopback" 指的是一个使用PIC32微控制器(单片机)实现UART(通用异步收发传输器)功能的程序,其中包含了Loopback模式。Loopback模式是UART通信的一种测试方式,通常用于检查...

    JZ2440->UART: loopback mode

    在本文中,我们将详细探讨“JZ2440-&gt;UART: loopback mode”的相关知识点,以及如何在实际操作中设置和使用UART的环回模式。 首先,UART是一种串行通信接口,它允许设备间以较低的数据速率进行双向通信。UART通常...

    9_uart_loopback_top_2018.3版本_uartverilog工程亲测可用_

    标题中的“9_uart_loopback_top_2018.3版本_uartverilog工程亲测可用”揭示了这个压缩包文件包含的是一个基于Verilog语言实现的UART(通用异步接收发送器)设计,且该设计在2018.3版本的工具下经过验证,证明是可行...

    Uart串行控制系统-回环功能-verilog实现

    UART(通用异步收发传输器)是一种广泛用于嵌入式系统和计算机之间的串行通信接口,它在各种设备间传输数据,如微处理器、传感器、显示器等。本项目是南京邮电大学的一个课程设计,重点在于实现一个具有回环功能的...

    FT311D安卓串口通信源码

    此外,"UARTLoopback"可能是一个测试程序或类,用于验证串口通信的正确性。循环回路测试(Loopback Test)是常见的通信测试方法,它将发送的数据直接返回给接收端,如果接收到的数据与发送的一致,就表明通信链路...

    sci_loopback_sci_sciloopback_sciloopback_SCI的loopback_

    在本文中,我们将深入探讨SCI Loopback,这是SCI功能开发的一个关键环节,用于串口通讯的调试和UART(通用异步收发传输器)的测试。 SCI Loopback模式是一种自环回测试方法,它允许数据在发送后立即被同一设备接收...

    28335DSP中SCI-B的loopback模式代码

    在TI的TMS320C28335 DSP(数字信号处理器)中,SCI(Serial Communication Interface)模块是一个用于串行通信的接口,它支持多种通信协议,如UART、SPI等。在这个特定的场景中,我们关注的是SCI-B(Serial ...

    UART.rar_C8051F040_C8051F040 uart1_C8051f040 Uart0 _c8051f040 UA

    UART0和UART1都支持自发自收(Loopback)模式,这是一种用于测试串口通信功能的方法。在自发自收模式下,发送的数据会立即被接收端口读取,无需外部设备参与。这种模式可以快速验证UART的硬件和软件配置是否正确,为...

    UartLoop.rar_VHDL/FPGA/Verilog_VHDL_

    5. **UART Loopback测试**:"UartLoop"可能是指一种环回测试,即发送的数据经过UART接口后直接返回给发送端,用于检查UART通信链路是否正常。这种测试能帮助开发者验证UART接口的正确性和稳定性。 6. **Verilog语言...

    s3c2410中文\S3C2410数据资料之UART.pdf

    LoopBack模式是一种特殊的测试模式,用于检测UART自身的功能是否正常。在该模式下,UART的TXD(发送端)与RXD(接收端)在内部相连,发送的数据可以直接被接收端捕获并返回,以此验证数据的收发是否正常。 #### 六...

    FPGA uart串口回环实验

    实验文件"acz7015_uart_loopback"和"uart_test_quartus"可能分别包含了用特定语言(可能是Verilog或VHDL)编写的UART回环模块和Quartus项目文件。在实际操作中,你需要加载这些文件到对应的开发环境中,编译并下载到...

    sci_loopback_C语言_DSPSCI_dsp28335_

    DSPSCI模块在TMS320F28335中扮演着重要角色,它是一个硬件加速的串行接口,可以支持多种通信协议如UART(通用异步收发传输器),SPI(串行外围接口)或I²C(集成电路总线)。在loopback测试中,发送的数据会通过SCI...

    uart_de0_nano:DE0-Nano 上的 UART 串​​行接口

    DE0-Nano 上的 UART 该项目的目标是创建一个可以轻松添加到 DE0-Nano 上的任何项目的 UART/串行黑匣子。 唯一需要的额外硬件是串行接口。 我正在使用 CP2102 USB 到 UART 桥接器( ),但任何东西都应该可以工作。...

    Example23_DSP2833x_SCI_loopback_DSP2833x_TIDSPSCI通讯源代码_

    2. **SCI (Serial Communication Interface)**: 一种串行接口,支持异步串行通信,常用于微控制器和外围设备之间的通信,如UART(通用异步收发传输器)。 3. **环回测试**: 一种自我验证技术,其中发送的数据通过...

Global site tag (gtag.js) - Google Analytics