基于Xilinx FPGA的uart串口实验详解

本文详述了一次基于Xilinx FPGA的UART串口实验,使用CH340C转换芯片,通过笔记本电脑与FPGA进行数据交互。实验设计包括硬件配置和软件程序设计,协议设定为8位数据、1位停止、无校验,波特率为115200bps。程序主要包括接收、环回和发送模块,通过时序图和源码展示了具体实现过程。最终通过下载到芯片并使用串口调试助手验证,实现了数据的正确环回。
摘要由CSDN通过智能技术生成


1. 实验设计

1.1 硬件

本次UART实验使用了type-c接口,而不是传统的DB9接口,因此在主板上使用了一块CH340C芯片作为U转串的芯片。
在这里插入图片描述

1.2 实验方法

  1. 以笔记本电脑作为上位机,FPGA作为下位机
  2. 笔记本电脑给FPGA发送数据,FPGA接收数据后再发送回串口

2. 程序设计

2.1 系统模型

在这里插入图片描述

  1. 接收模块:接收数据,并把数据一位以为存到一个寄存器中,存完给一个信号
  2. 环回模块:协调接收模块与发送模块,确保接收和发送不会互相打断
  3. 发送模块:将接收的数据按照时序一位一位发给上位机

2.2 协议设计

数据位为8位,停止位为1位,无校验位。波特率为115200bps
在这里插入图片描述
时序图如下
在这里插入图片描述

  1. sys_clk:系统时钟
  2. uart_rxd:FPGA接收的数据
  3. start_flag:当接收到start bit时,抓一个上升沿,抓到后让rx_flag拉高
  4. rx_flag:拉高代表正在接收中
  5. clk_cnt:时钟周期计数,通过十的九次方ns除以波特率除以20ns(50M的一个时钟周期),本次实验中,每满434判断数据发送了一个字节
  6. rx_cnt:接收到的字节个数
  7. uart_done:当接收完八位数据位时拉高,接收过程结束,即rx_flag拉低后拉低
  8. uart_data:接收到的值

3.程序编写

编写了uart_loop.v,uart_loopback_top.v,uart_recv.v,uart_send.v,uart.xdc,源码如下所示

3.1 uart_loop.v

module uart_loop(
	input              sys_clk,
	input              sys_rst_n,
	input              recv_down,
	input [7 : 0]      recv_data,
	input              tx_busy,
	output reg         send_en,
	output reg [7 : 0] send_data
);

reg recv_down_d0;
reg recv_down_d1;
reg tx_ready;
wire recv_down_flag;

assign recv_down_flag = (~recv_down_d1) & recv_down_d0;

always@(posedge sys_clk or negedge sys_rst_n) begin
	if(!sys_rst_n) begin
		recv_down_d0 <= 1'd0;
		recv_down_d1 <= 1'd0;
	end

	else begin
		recv_down_d0 <= recv_down;
		recv_down_d1 <= recv_down_d0;
	end
end

always@(posedge sys_clk or negedge sys_rst_n) begin
	if(!sys_rst_n) begin
		send_en <= 1'd0;
		send_data <= 8'd0;
		tx_ready <= 1'd0;
	end
	else begin
		if(recv_down_flag) begin
			tx_ready <= 1'd1;
			send_en <= 1'd0;
			send_data <= recv_data;
		end
		else if((~tx_busy)&&tx_ready) begin
			tx_ready <= 1'd0;
			send_en <= 1'd1;
		end
	end
end

endmodule

3.2 uart_loopback_top.v

module uart_loopback_top(
	input    sys_clk,
	input    sys_rst_n,
	
	input    uart_rxd,
	output   uart_txd 

);

wire uart_en;
wire [7 : 0] uart_din;
wire [7 : 0] uart_data;
wire uart_done;
wire uart_tx_busy;


uart_recv uart_recv_u(

	.sys_clk   (sys_clk),
	.sys_rst_n (sys_rst_n),
	.uart_rxd  (uart_rxd),
	.</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

普通的晓学生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值