我是靠谱客的博主 拼搏小熊猫,最近开发中收集的这篇文章主要介绍UART协议概述与实现协议描述关键代码逻辑写在最后,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

UART协议概述(一)

  • 协议描述
  • 关键代码逻辑
  • 写在最后

协议描述

  1. 常见的三大低速通信协议之一,UART,通用异步收发协议。
  2. 非常简单的协议,协议细节不需要多说,只说需要注意的点。
  3. 空闲位为高位,起始位为低位,8位数据,校验位,停止位为高位,一共11位数据,空闲位不算在发送的数据之中,因为它和停止位是相同的。这样才符合异步传送的连续性逻辑。
  4. 发送的逻辑比较简单,直接利用系统时钟和波特率产生我们需要的发送脉冲,也就是波特率发送脉冲,脉冲需要计数11次,当计数完成时,表示发送完毕,给出done信号。
  5. 接受逻辑主要要考虑两个点,第一,当数据从空闲态进入起始位时是一个下降沿,需要检测工业的实际接受需要采样很多次,因此我们给出一个16倍频的时钟去采样16ci,取中间的6次作为样本,然后计算他们的和,若大于等于4,则判断为1,否则为0,不考虑3个1和3个0的情况,也就是第三位为1的时候,则为1,否则为0。其余的逻辑都和发送类似,不再赘述。
  6. 校验逻辑是否正确可以直接将发送的数据接口接入到接受的数据接口,
    在这里插入图片描述
    然后观察接受的数据和发送的是否一致即可。比如下面这样:
    在这里插入图片描述

关键代码逻辑

  1. uart_rx逻辑关键代码:
assign nedge =  !tmp0_Rs232_Rx && tmp1_Rs232_Rx;

// 边沿检测
always @ (posedge clk or negedge rst_n) begin
	if (!rst_n) begin
		tmp0_Rs232_Rx <= 1'b0;
		tmp1_Rs232_Rx <= 1'b0;
	end
	else begin
		tmp0_Rs232_Rx <= s1_Rs232_Rx;
		tmp1_Rs232_Rx <= tmp0_Rs232_Rx;
	end
end

// 将累加得到的第三位的值直接输出即可,第三位为1,则代表采集的6个数的和大于等于4,那么输出为1。
always @ (posedge clk or negedge rst_n) begin
	if (!rst_n) begin
		data_byte <= 8'd0;
	end
	else if (bps_cnt == 8'd159) begin
		data_byte[0] <= r_data_byte[0][2];
		data_byte[1] <= r_data_byte[1][2];
		data_byte[2] <= r_data_byte[2][2];
		data_byte[3] <= r_data_byte[3][2];
		data_byte[4] <= r_data_byte[4][2];
		data_byte[5] <= r_data_byte[5][2];
		data_byte[6] <= r_data_byte[6][2];
		data_byte[7] <= r_data_byte[7][2];
	end
end
  1. uart_tx逻辑关键代码:
// bps_clk发送脉冲的实现
always @ (posedge clk or negedge rst_n) begin
	if (!rst_n) begin
		bps_clk <= 1'b0;
	end
	else if (div_cnt == 1'b1) begin
		bps_clk <= 1'b1;
	end
	else begin
		bps_clk <= 1'b0;
	end
end

写在最后

  1. 保持节奏,戒骄戒躁!

最后

以上就是拼搏小熊猫为你收集整理的UART协议概述与实现协议描述关键代码逻辑写在最后的全部内容,希望文章能够帮你解决UART协议概述与实现协议描述关键代码逻辑写在最后所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(50)

评论列表共有 0 条评论

立即
投稿
返回
顶部