【UART异步串口协议及verilog实现】

UART异步串口协议

  • 1 UART
    • 1.1 数据格式
    • 1.2 波特率
  • 2 UART的发送和接收模块
    • 2.1 uart发送模块
    • 2.2 uart的接收模块

【博客首发于微信公众号《 漫谈芯片与编程》】

本篇文章介绍常用的芯片外围低速协议:UART;

1 UART

UART是异步串行传输协议,即在发送数据时将并行数据转换成串行数据来传输,在接收数据时将接收到的串行数据转换到并行数据;
UART串口协议只需要两根信号线来实现即可;一根用于发送,一根用于接收;
数据流:数据以并行形式从数据总线传输到传输UART。在发送UART从数据总线获取并行数据后,它会添加一个起始位、一个奇偶校验位和一个停止位,从而创建数据包。接下来,数据包在Tx引脚上逐位串行输出。接收UART在其Rx引脚上逐位读取数据包。然后,接收的UART将数据转换回并行形式,并删除起始位、奇偶校验位和停止位。最后,接收UART将数据包并行传输到接收端的数据总线:

1.1 数据格式

UART传输的数据格式:通常以一个起始位、若干数据位、一个可选的奇偶校验位和一个或多个停止位组成。

  • 起始位:标志一帧数据的开始;
  • 停止位:标志一帧数据的结束;
  • 数据位:标志一帧数据中的有效数据;可选5~9位,一般选择8位;
  • 校验位:标志一帧数据中的奇偶校验;
  • 停止位:标志一帧数据中的停止;
    在这里插入图片描述

1.2 波特率

波特率:表示每秒传输二进制数据的位数,单位是bps;常见波特率:9600,19200,38400,57600,115200;

2 UART的发送和接收模块

2.1 uart发送模块

//==========================================================
//--Author  : colonel
//--Date    : 11-05
//--Module  : uart_send
//--Function: uart is diviede into uart_send,uart_reciver
//==========================================================
module uart_send(
//==========================< 端口 >=========================input clk,input rst_n,input tx_en,input [8 -1:0] tx_din,output reg uart_txd
);
//==========================< 参数 >=========================
localparam  BAUD_RATE   = 9600;
localparam  CLK_FREQ    = 50000000;
localparam  BAUD_PERIOD = CLK_FREQ / BAUD_RATE;//==========================< 信号 >=========================
reg tx_en_sync0;
reg tx_en_sync1;//=========================================================
//-- tx_en_sync0/1
//=========================================================
always @(posedge clk or rst_n) beginif (!rst_n) begintx_en_sync0 <= 1'b0;tx_en_sync1 <= 1'b0;end else begintx_en_sync0 <= tx_en;tx_en_sync1 <= tx_en_sync0;end
endwire start_flag = tx_en_sync0 && !tx_en_sync1;  //pos pulse//==========================< 信号 >=========================
reg [16 -1:0]   bps_cnt;
reg [4 -1:0]    tx_cnt;//=========================================================
//-- bps_cnt, tx_cnt: 
//=========================================================
always @(posedge clk or negedge rst_n) beginif (!rst_n) beginbps_cnt <= 'b0;end else beginif (bps_cnt < BAUD_PERIOD -1) beginbps_cnt <= bps_cnt + 1'b1;end else beginbps_cnt <= 'b0;endend
endalways @(posedge clk or negedge rst_n) beginif (!rst_n) begintx_cnt <= 'b0;end else beginif (bps_cnt==BAUD_PERIOD-1) begintx_cnt <= tx_cnt + 1'b1;end else if(start_flag)begintx_cnt <= 1'b0;end else begintx_cnt <= tx_cnt;endend
end//==========================< 信号 >=========================
reg             tx_flag;
reg [8 -1:0]    tx_data;    //floped for uart_din//=========================================================
//-- tx_flag,tx_data
//=========================================================
always @(posedge clk or negedge rst_n) beginif (!rst_n) begintx_data <= 'd0;end else beginif (start_flag) begintx_data <= tx_din;end else if (tx_cnt==4'd9 &&(bps_cnt==BAUD_PERIOD/2)) begintx_data <= 0;end else begintx_data <= tx_data;endend
endalways @(posedge clk or negedge rst_n) beginif (!rst_n) begintx_flag <= 1'b0;end else beginif (start_flag) begintx_flag <= 1'b1;end else if(tx_cnt==4'd9) begintx_flag <= 1'b0;end else begintx_flag <= tx_flag;endend
end//=========================================================
//-- uart_txd
//=========================================================always @(posedge clk or negedge rst_n) beginif (!rst_n) beginuart_txd <= 1'b1;end else beginif (tx_flag) begincase (tx_cnt)4'd0: uart_txd  <= 1'b0; 4'd1: uart_txd  <= tx_data[0]; 4'd2: uart_txd  <= tx_data[1]; 4'd3: uart_txd  <= tx_data[2]; 4'd4: uart_txd  <= tx_data[3]; 4'd5: uart_txd  <= tx_data[4]; 4'd6: uart_txd  <= tx_data[5]; 4'd7: uart_txd  <= tx_data[6]; 4'd8: uart_txd  <= tx_data[7]; 4'd9: uart_txd  <= 1'b1; default: uart_txd <= 1'b1;endcaseend else beginuart_txd <= 1'b1;endend
endendmodule

2.2 uart的接收模块

//==========================================================
//--Author  : colonel
//--Date    : 11-05
//--Module  : uart_reci
//--Function: uart is diviede into uart_send,uart_reciver
//==========================================================
module uart_reciver (
//==========================< 端口 >=========================input clk,input rst_n,input uart_rxd,output [8 -1:0] uart_txd,output rx_done
);
//==========================< 参数 >=========================
localparam  BAUD_RATE   = 9600;
localparam  CLK_FREQ    = 50000000;
localparam  BAUD_PERIOD = CLK_FREQ / BAUD_RATE;//==========================< 信号 >=========================
reg uart_rxd_r1;
reg uart_rxd_r2;//=========================================================
//-- uart_rxd_r1/2
//=========================================================
always @(posedge clk or negedge rst_n) beginif (!rst_n) beginuart_rxd_r1 <= 1'b0;uart_rxd_r2 <= 1'b0;end else beginuart_rxd_r1 <= uart_rxd;uart_rxd_r2 <= uart_rxd_r1;end
endwire start_flag_neg = uart_rxd_r2 && !uart_rxd_r1;//==========================< 信号 >=========================
reg [16 -1:0]   bps_cnt;
reg [4 -1:0]    rx_cnt;//=========================================================
//-- bps_cnt, rx_cnt: 
//=========================================================
always @(posedge clk or negedge rst_n) beginif (!rst_n) beginbps_cnt <= 'b0;end else beginif (bps_cnt < BAUD_PERIOD -1) beginbps_cnt <= bps_cnt + 1'b1;end else beginbps_cnt <= 'b0;endend
endalways @(posedge clk or negedge rst_n) beginif (!rst_n) beginrx_cnt <= 'b0;end else beginif (bps_cnt==BAUD_PERIOD-1) beginrx_cnt <= rx_cnt + 1'b1;end else if(start_flag_neg) beginrx_cnt <= 1'b0;end else beginrx_cnt <= rx_cnt;endend
end//==========================< 信号 >=========================
reg rx_flag;//=========================================================
//-- rx_flag
//=========================================================
always @(posedge clk or rst_n) beginif (!rst_n) beginrx_flag <= 1'b0;end else beginif (start_flag_neg) beginrx_flag <= 1'b1;end else if (rx_cnt==4'd9 && (bps_cnt==BAUD_PERIOD/2)) beginrx_flag <= 1'b0;end else beginrx_flag <= rx_flag;endend
end//==========================< 信号 >=========================
reg [8 -1:0] uart_txd_r;
//=========================================================
//-- uart_txd_r
//=========================================================
always @(posedge clk or negedge rst_n) beginif (!rst_n) beginuart_txd_r <= 8'b0;end else beginif (rx_flag && bps_cnt==BAUD_PERIOD/2) begincase (rx_cnt)4'd1: uart_txd_r[0] <= uart_rxd_r1;4'd2: uart_txd_r[1] <= uart_rxd_r1;4'd3: uart_txd_r[2] <= uart_rxd_r1;4'd4: uart_txd_r[3] <= uart_rxd_r1;4'd5: uart_txd_r[4] <= uart_rxd_r1;4'd6: uart_txd_r[5] <= uart_rxd_r1;4'd7: uart_txd_r[6] <= uart_rxd_r1;4'd8: uart_txd_r[7] <= uart_rxd_r1;default:    ; endcaseend else beginuart_txd_r <= uart_txd_r;endend
endendmodule

以上是uart的发送和接收模块,从这里可以看出核心是维护cnt;

【REF】
1.https://www.cnblogs.com/liujinggang/p/9535366.html
2.https://blog.csdn.net/m0_61298445/article/details/125073150

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/884774.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TS-AWG控制电光调制器:推动科技应用新发展的利器

一、电光调制有什么用&#xff1f; 如今&#xff0c;基于光学、光子学和脉冲激光以及电光调制器的应用正变得极为流行&#xff0c;最新一代科学家正在为其实际应用开辟新领域&#xff0c;如汽车激光雷达、医疗解决方案、航空航天和国防、量子和激光传感器。 测试挑战、上市时…

ros与mqtt相互转换

vda5050 VDA5050协议介绍 和 详细翻译-CSDN博客 ros与mqtt相互转换 如何转换的&#xff0c;通过某个中转包&#xff0c;获取ros的消息然后以需要的格式转换为mqtt 需要的参数 ros相关 parameters[ (ros_subscriber_type, vda5050_msgs/NodeState), (ros_subscriber_queue…

探讨 | 大模型在传统NLP任务的使用姿势

以chatgpt为起始节点的大模型技术经过了两年左右的发展&#xff0c;大致沉淀了一些较为确定的研究领域。首先是基座大模型的研究&#xff0c;主要是国内外大厂集中大量财力、人力、算力进行大模型军备竞赛&#xff0c;企图将大模型的基础能力&#xff08;包括推理能力&#xff…

C语言 — 指针的进阶

文章目录 前言一、字符指针二、指针数组三、数组指针数组名 与 &数组名 四、指针传参二维数组传参 五、函数指针结语 前言 通过前面的关于指针的学习&#xff0c;我们了解了指针的一些个特性。本篇文章我们将深入指针&#xff0c;挖掘指针更深处的知识。 在开始之前&#…

Ceisum无人机巡检视频投放

公司投标内容有个视频投放的功能动画&#xff0c;原本想实现这么一个效果&#xff1a; 案例效果来自别人的展示作品&#xff0c;Leader一眼就相中了这个效果&#xff0c;可惜别人的终究是别人的&#xff0c;又不会白白给你&#xff0c;终究是要自己动手尝试。 动画方面的展示…

Redis为什么用跳表实现有序集合

Redis为什么用跳表实现有序集合 手写一个跳表 为了更好的回答上述问题以及更好的理解和掌握跳表&#xff0c;这里可以通过手写一个简单的跳表的形式来帮助读者理解跳表这个数据结构。 我们都知道有序链表在添加、查询、删除的平均时间复杂都都是 O(n) 即线性增长&#xff0c…

ubuntu双屏只显示一个屏幕另一个黑屏

简洁的结论&#xff1a; 系统环境 ubuntu22.04 nvidia-535解决方案 删除/etc/X11/xorg.conf 文件 记录一下折腾大半天的问题。 ubuntu系统是22.04,之前使用的时候更新驱动导致桌面崩溃&#xff0c;重新安装桌面安装不上&#xff0c;请IT帮忙&#xff0c;IT一番操作过后也表示…

Docker可视化管理面板DPanel的安装

本文软件由网友 rui 推荐&#xff1b; 什么是 DPanel &#xff1f; DPanel 是一款 Docker 可视化管理面板&#xff0c;旨在简化 Docker 容器、镜像和文件的管理。它提供了一系列功能&#xff0c;使用户能够更轻松地管理和部署 Docker 环境。 软件特点&#xff1a; 可视化管理&…

学习threejs,使用对象组合

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.Object3D 三维物体 二…

企业必备:一合通电子合同

一合通&#xff0c;让合同签署更简单。加密技术保障安全&#xff0c;随时随地可签。助力企业加速业务流程&#xff0c;提高办公效率。 在数字化转型的浪潮中&#xff0c;企业面临着前所未有的机遇与挑战。特别是在人力资源管理和合同签署方面&#xff0c;传统的纸质合同已经难以…

二十二、MySQL 8.0 主从复制原理分析与实战

文章目录 一、复制&#xff08;Replication&#xff09;1、什么是复制2、复制的方式3、复制的数据同步类型3.1、异步复制3.2、半同步复制3.3、设计理念&#xff1a;复制状态机——几乎所有的分布式存储都是这么复制数据的 4、基于binlog位点同步的主从复制原理4.1、异步复制示例…

AAA 数据库事务隔离级别及死锁

目录 一、事务的四大特性&#xff08;ACID&#xff09; 1. 原子性(atomicity)&#xff1a; 2. 一致性(consistency)&#xff1a; 3. 隔离性(isolation)&#xff1a; 4. 持久性(durability)&#xff1a; 二、死锁的产生及解决方法 三、事务的四种隔离级别 0 .封锁协议 …

w~自动驾驶~合集4

我自己的原文哦~ https://blog.51cto.com/whaosoft/12451789 #基于深度学习的端到端自动驾驶 最新的端到端自动驾驶综述刚刚出炉&#xff0c;话说论文一作卡内基梅隆大学的Apoorv Singh今年产出了七篇综述&#xff0c;都和自动驾驶相关&#xff0c;推荐给大家。就一个字&…

【6G 需求与定义】ITU(国际电联)对全球6G标准的愿景

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G技术研究。 博客内容主要围绕…

JVM 类加载器

字节码的结构 魔数u4 cafe babe 版本u4 52 java8 常量池计数器u2 从1开始&#xff0c;0索引留给不需要的情况 常量池 表 #1 -> #计数器-1 类标识符 u2 public final abstrat class annotion interface 之类 类索引u2 名字 父类索引u2 父类名字 接口计数器 u2 接口数…

Sentieon软件快速入门指南

Sentieon软件为完整的纯软件基因变异检测二级分析方案&#xff0c;其分析流程完全忠于BWA、GATK、MuTect2、STAR、Minimap2、Fgbio、picard等金标准的数学模型。在匹配开源流程分析结果的前提下&#xff0c;大幅提升WGS、WES、Panel、UMI、ctDNA、RNA等测序数据的分析效率和检出…

数字信号处理:自动增益控制(AGC)

自动增益控制&#xff1a; &#xff1a;自动增益控制&#xff08;Automatic Gain Control, AGC&#xff09;是一种信号处理技术&#xff0c;用于在接收端调整输入信号的增益&#xff08;或放大系数&#xff09;&#xff0c;以保持信号在一个合适的强度范围内&#xff0c;从而防…

RAG中的代表性上下文压缩方案总结:从RECOMP、CompAct到COCOM

今天是2024年11月5日&#xff0c;星期二&#xff0c;北京&#xff0c;天气晴 昨天有说到RAG中的长文本压缩&#xff0c;现有的上下文压缩方法主要分为基于词汇的压缩&#xff08;硬提示&#xff0c;如LLMLingua和RECOMP&#xff09;和基于嵌入的压缩(软提示&#xff0c;如Gist…

创新材料科技:铜冷却壁助力高炉节能降耗

高炉用铜冷却壁是高炉内部的一种构件&#xff0c;通常用于高炉的炉身部分。它的主要功能是在高炉冶炼过程中冷却炉壁&#xff0c;以防止炉壁过热。铜冷却壁通常由铜制成&#xff0c;因为铜具有良好的导热性和耐腐蚀性&#xff0c;能够有效地将热量从高炉内部传导到外部&#xf…

免费送源码:Java+ssm+MySQL ssm小区车辆信息管理系统的设计与实现 计算机毕业设计原创定制

摘 要 科技进步的飞速发展引起人们日常生活的巨大变化&#xff0c;电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流&#xff0c;人类发展的历史正进入一个新时代。在现实运用中&#xff0c;应用软件的工作…