【FPGA练习】(一): UART串口通信实验

由于之前学习FPGA的过程中,没有做一个良好的记录,以及已学知识的扩展,所以从今天开始每一个实验例程和扩展应用,都要做文档记录。本实验,是基于正点原子达芬奇xc7a35tfgg484-2开发板。开发板时钟为50Mhz,采用RS232的通信协议。

1.UART串口通信简介

        串口数据的发送与接收都是基于帧结构的,即一帧一帧的发送与接收数据。每一帧除了中间包含8bit有效数据外,还在每一帧的开头都必须要有一个起始位,且固定为0;在每一帧的结束时,也必须要有一个停止位,且固定为1,即最基本的帧结构(不包括校验等)有10bit。在不发送或不接收数据的情况下,rx和tx处于空闲状态,此时rx和tx都保持高电平。

        后续则在上述实验原理的基础下,完成以下两个实验。

2.实验一:回环测试

        输入回环测试,即输入即输出。当上位机通过串口调试工具发送数据给FPGA,FPGA再通过串口接收数据并将接收到的数据返送给上位机,完成串口数据回环。

2.1.串口接收模块

        串口发送模块将输入的8位并行数据进行串行输出。串口发送模块uart_rx代码如下:

module uart_rx
#(
	parameter	UART_BPS		=	'd19200,
	parameter	CLK_FREQ		=	'd50_000_000
)
(
	input	wire				sys_clk,
	input	wire				sys_rst_n,
	input	wire				rx,
	
	output	reg		[7:0]		Po_data,
	output	reg					Po_flag
);
	parameter		BAUD_CNT_MAX = CLK_FREQ/UART_BPS ;

	reg					rx_reg1;
	reg					rx_reg2;
	reg					rx_reg3;
				
	reg					start_nedge;
	reg					work_en;
	reg		[15:0]		baud_cnt;
	reg					bit_flag;
				
	reg		[3:0]		bit_cnt;
	reg		[7:0]		rx_data;
	reg					rx_flag;
	
	//插入两级寄存器进行数据同步,用来消除亚稳态
	always@(posedge sys_clk or negedge sys_rst_n)begin
		if(sys_rst_n == 1'b0)
			rx_reg1	<=	1'b1;
		else
			rx_reg1 <=	rx;
	end
	
	always@(posedge	sys_clk	or negedge	sys_rst_n)begin
		if(sys_rst_n == 1'b0)
			rx_reg2 <= 	1'b1;
		else
			rx_reg2	<=	rx_reg1;
	end
	
	always@(posedge sys_clk or negedge sys_rst_n)begin
		if(sys_rst_n == 1'b0)
			rx_reg3	<=	1'b1;
		else
			rx_reg3 <=	rx_reg2;
	end
	
	always@(posedge sys_clk	or	negedge sys_rst_n)begin
		if(sys_rst_n =&
  • 1
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值