FPGA实现uart串口协议

reference:正点原子视频教程

具体代码请参考B站正点原子官方

UART串口通信原理

是一种采用异步串行通信方式的通用异步手法传输器。

因为是异步通信所以,使用的时候要进行同步到系统时钟下,不然会出现亚稳态

具体代码如下:

/下降沿的抓取
assign state_flag = uart_rx_d1 && (~uart_rx_d0);

//异步数据同步到系统时钟下
//如果不这样做会出现亚稳态的情况
always @(posedge sys_clk or negedge rst_n) begin
	if (rst_n == 1'b0) begin
		uart_rx_d1 <= 1'b1;//因为串口空状态情况下是高电平
		uart_rx_d0 <= 1'b1;
	end
	else  begin
		uart_rx_d0 <= uart_done;
		uart_rx_d1 <= uart_rx_d0;
	end
end

功能:它发送数据时将并行的数据转换成串行的数据来传输,在接收数据时将接收到的串行数据转换成并行的数据。

俺的理解:意思就是 并行→串行→并行。

协议层:通信协议(包括数据的格式、传输速率等)

物理层:接口类型、电平标准等。

UART 在发送或接收过程中的一帧数据由 4 部分组成, 起始位、 数据位、 奇偶校验位和停止位,如图所示。其中,起始位标志着一帧数据的开始,停止位标志着一帧数据的结束, 数据位是一帧数据中的有效数据。 校验位分为奇校验和偶校验, 用于检验数据在传输过程中是否出错。 奇校验时, 发送方应使数据位中 1 的个数与校验位中 1 的个数之和为奇数;接收方在接收数据时, 对 1 的个数进行检查,若不为奇数,则说明数据在传输过程中出了差错。 同样,偶校验则检查 1 的个数是否为偶数

UART 通信过程中的数据格式及传输速率是可设置的,为了正确的通信,收发双方应约定并遵循同样的设置。数据位可选择为 5、 6、 7、 8 位,其中 8 位数据位是最常用的, 在实际应用中一般都选择 8 位数据位;校验位可选择奇校验、偶校验或者无校验位;停止位可选择 1 位(默认) ,1.5 或 2 位。 串口通信的速率用波特率表示,它表示每秒传输二进制数据的位数,单位是 bps(位/秒) ,常用的波特率有 9600、 19200、38400、 57600 以及 115200 等。

其有效数据可以为5、6、7、8位数。其中8位是最常用的。

RS-232

数据的环回实验:

本次实验是基于USB转串口。

通信协议:

接收模块的编写思路:

发送模块的编写思路:

关于串口中的一个bug说明和解决方法。

tx_cnt = 9h时当传输的时间只有一半的时间,那么如果设置成一般事件之后关闭tx_flag那么,对于发送单个数据来说没什么问题,以为不需要多个数据的等待问题。

当传输多个数据的时候会出现数据的问题。因为当上位机接收数据的时候时间不是在二分之一处,所以会导致数据的丢失。

解决方案1,将二分之一的波特率周期,延长等多的是时间。

解决方案2:发送模块和接收模块时间设计一个缓冲模块。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值