串口UART

2023-05-16

目录

串口概念

串口rs232 

数据格式

注意事项 

总体结构图 

代码verilog 

接收模块 

结构图 

 波形图​​​​​​​​编辑

代码 verilog

发送模块 

结构图

 波形图

代码 verilog

串口rs485


串口概念

  • 串口是异步串行通信接口,spi和iic是同步串行通信接口
  • 同步表示收发双方在一个时钟下,发送时包含数据和时钟信号,数据和时钟是同步的;
  • 异步表示收发双方不同时钟下,发送时只需要发送数据,不需要时钟信号,根据起始位和停止位进行数据的同步,异步接收

串口rs232 

全双工通信

信号采用单端传输方式

缺点:传输距离近和传输速度慢

优点:都有com口,方便使用

波特率:每秒钟传输码元的个数 baus Bps 码元:一个二进制位 常用:4800 9600 115200

比特率:每秒钟传输bit数  比特率=波特率*单个调制状态对应二进制数 bps

单端传输:使用一根信号线,通过与地信号比较来区分逻辑0,1;

数据格式

共10bit的数据,其中起始位1bit,8bit的数据位,停止位1bit 

注意事项 

数据接受模块需要进行寄存器打拍,因为数据与时钟不同步,会出现亚稳态

亚稳态:信号在进入寄存器时的建立时间和保持时间不满足条件(信号 是必须稳定的才满足)导致的

危害:亚稳态会一直向下传播,组合逻辑是无法消除的

解决:多级寄存器,因为寄存器会减缓亚稳态 一般两级打拍

 Tco:寄存器延迟 Tmet:决断时间

总体结构图 

代码verilog 

module AX301_rs232(
    input clk,
	 input rst_n,
	 input rx,
	 
	 output tx
);	 
wire [7:0] po_data;
wire po_flag;

rs232_rx
#(
  .uart_Bps   ('d9600),
  .clk_fre    ('d50_000_000)
)
rs232_rx_inst
(
   .clk   (clk),
	.rst_n (rst_n),
	.rx           (rx),
	
	.po_data      (po_data),
	.po_flag      (po_flag)
);

rs232_tx
#(
  .uart_Bps   ('d9600),
  .clk_fre    ('d50_000_000)
)
rs232_tx_inst
(
   .clk   (clk),
	.rst_n (rst_n),
	.po_data      (po_data),
	.po_flag      (po_flag ),     
	
	.tx      (tx)
);
endmodule

接收模块 

结构图 

 波形图​​​​​​​

代码 verilog

module rs232_rx
#(
   parameter uart_Bps = 'd9600,
	parameter clk_fre = 'd50_000_000
)
(
   input clk,
	input rst_n,
	input rx,
	
	output reg po_flag,
	output reg [7:0] po_data
);
parameter max_cnt = clk_fre / uart_Bps;
reg rx_reg1,rx_reg2,rx_reg3;
reg work_en;
reg [15:0] bps_cnt;
reg bit_flag;
reg [3:0] bit_cnt;
reg [7:0] rx_data;
reg rx_flag;

always@(posedge clk or negedge rst_n)begin
   if(!rst_n)
      rx_reg1 <= 1'b1;
	else 
	   rx_reg1 <= rx;
end

always@(posedge clk or negedge rst_n)begin
   if(!rst_n)
      rx_reg2 <= 1'b1;
	else 
	   rx_reg2 <= rx_reg1;
end

always@(posedge clk or negedge rst_n)begin
   if(!rst_n)
      rx_reg3 <= 1'b1;
	else 
	   rx_reg3 <= rx_reg2;
end

always@(posedge clk or negedge rst_n)begin
   if(!rst_n)
	   work_en <= 1'b0;
   else if(rx_reg2 == 1'b0 && rx_reg3 == 1'b1)
	   work_en <= 1'b1;
   else if(bit_cnt ==4'd8 && bit_flag ==1'b1)
	   work_en <=1'b0;
	else 
	   work_en <= work_en;
end

always@(posedge clk or negedge rst_n)begin
   if(!rst_n)
	  bps_cnt <= 16'd0;
	else if(work_en == 1'b0 || bps_cnt == max_cnt - 1)
	  bps_cnt <= 16'd0;
	else 
	  bps_cnt <= bps_cnt + 16'd1;
end

always@(posedge clk or negedge rst_n)begin
   if(!rst_n)
	  bit_flag <= 1'b0;
	else if(bps_cnt == max_cnt/2 - 1)
	  bit_flag <= 1'b1;
	else 
	  bit_flag <= 1'b0;
end		

always@(posedge clk or negedge rst_n)begin
   if(!rst_n)
	  bit_cnt <= 4'd0;
	else if(bit_cnt ==4'd8 && bit_flag ==1'b1)
	  bit_cnt <= 4'd0;
	else if(bit_flag ==1'b1)
     bit_cnt <= bit_cnt + 4'd1;
end

always@(posedge clk or negedge rst_n)begin
   if(!rst_n)
	  rx_data <= 8'b0;
	else if(bit_cnt >= 4'd1 && bit_cnt <=4'd8 && bit_flag == 1'b1)
	  rx_data <= {rx_reg3,rx_data[7:1]};
end

always@(posedge clk or negedge rst_n)begin
   if(!rst_n)
	  rx_flag <= 1'b0;
	else if(bit_cnt ==4'd8 && bit_flag == 1'b1)
	  rx_flag <= 1'b1;
	else 
	  rx_flag <= 1'b0;
end 

always @(posedge clk or negedge rst_n)
begin
	if(!rst_n)
	  po_data<=8'b0;
	else if(rx_flag==1'b1)
	  po_data<=rx_data;
end

always @(posedge clk or negedge rst_n)
begin
	if(!rst_n)
	  po_flag<=1'b0;
	else 
	  po_flag<=rx_flag;
end
endmodule

发送模块 

结构图

 波形图

代码 verilog

module rs232_tx
#(
   parameter uart_Bps = 'd9600,
	parameter clk_fre = 'd50_000_000
)
(
   input clk,
	input rst_n,
	input [7:0] po_data,
	input po_flag,
	
	output reg tx
);

parameter max_cnt = clk_fre / uart_Bps;
reg work_en;
reg [15:0] bps_cnt;
reg bit_flag;
reg [3:0] bit_cnt;

always@(posedge clk or negedge rst_n)begin
   if(!rst_n)
	  work_en <= 1'b0;
	else if(po_flag == 1'b1)
	  work_en<=1'b1;
	else if(bit_cnt == 4'd9 &&bit_flag == 1'b1)
	  work_en <= 1'b0;
	else 
	  work_en <= work_en;
end

always@(posedge clk or negedge rst_n)begin
   if(!rst_n)
	  bps_cnt <= 16'd0;
	else if(work_en == 1'b0 || bps_cnt == max_cnt - 1)
	  bps_cnt <= 16'd0;
	else 
	  bps_cnt <= bps_cnt + 16'd1;
end

always@(posedge clk or negedge rst_n)begin
   if(!rst_n)
	  bit_flag <= 1'b0;
	else if(bps_cnt == 16'd1)
	  bit_flag <= 1'b1;
	else 
	  bit_flag <= 1'b0;
end	

always@(posedge clk or negedge rst_n)begin
   if(!rst_n)
	  bit_cnt <= 4'd0;
	else if(bit_cnt ==4'd9 && bit_flag ==1'b1)
	  bit_cnt <= 4'd0;
	else if(bit_flag ==1'b1)
     bit_cnt <= bit_cnt + 4'd1;
end

always@(posedge clk or negedge rst_n)begin
   if(!rst_n)
	  tx <=1'b1;
	else if(bit_flag == 1'b1)
	  case(bit_cnt)
	     0: tx<=1'b0;
		  1: tx<=po_data[0];
		  2: tx<=po_data[1];
		  3: tx<=po_data[2];
		  4: tx<=po_data[3];
		  5: tx<=po_data[4];
		  6: tx<=po_data[5];
		  7: tx<=po_data[6];
		  8: tx<=po_data[7];
		  9: tx<=1'b1;
		  default: tx<=1'b1;
    endcase
end
endmodule

串口rs485

  • 半双工通信
  • 信号采用差分传输方式
  • 允许多个驱动器和接收器挂在总线上,其中每个驱动器都能够脱离总线。
  • 优点:rs485相对于rs232抗干扰能力强,传输距离远,因为rs485上有收发器,可以检测到200mv的电压,最远通信距离可以达到1200m左右,速度可以达到10Mb/s
  • 差分传输:使用两根信号线进行传输,两个信号相位相反,幅值相同,通过两根信号的电压差值判断是逻辑0还是1,抗干扰能力强;
  • rs485相对于rs232抗干扰能力强,传输距离远,因为rs485上有收发器,可以检测到200mv的电压,最远通信距离可以达到1200m左右,速度可以达到10Mb/s
  • 具体代码实现同RS232相同
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

串口UART 的相关文章

  • TM4C123系列(四)————UART串口通信

    一 实验简介 使用TM4C123的串口通信功能实现单片机与PC端通信 二 UART介绍 TM4C123有八个串口 xff0c 其中UART0已经与USB集成 xff0c UART0建议只用来和PC端通信 xff0c 不要与外界通信 除此之外
  • 串口UART

    目录 串口概念 串口rs232 数据格式 注意事项 总体结构图 代码verilog 接收模块 结构图 波形图 编辑 代码 verilog 发送模块 结构图 波形图 代码 verilog 串口rs485 串口概念 串口是异步 串行通信接口 x
  • UART协议

    UART协议 简介 UART是通用异步收发传输器 xff08 Universal Asynchronous Receiver Transmitter xff0c 通常称作UART xff0c 是一种异步收发传输器 是设备间进行异步通信的关键
  • Uart串口收发回环验证

    Uart串口收发回环验证 接受模块发送模块波特率设置模块顶层模块TBModelsim仿真结果板级验证总结 本次所做的项目比较复杂 xff08 对我本人来讲 xff09 xff0c 设计一个Uart IP核 xff0c 在其基础 xff0c
  • UART+DMA数据传输

    DMA的概念 DMA xff08 Direct Memory Access xff09 即直接内存访问 xff0c DMA传输方式无需CPU直接控制传输 xff0c 通过硬件为RAM I O设备开辟一条直接传输数据的通路 xff0c 能使C
  • ESP32+WiFi+UART数据传输测试

    刚开始使用ESP32芯片 xff0c 摸索着实现了一个数据传输的功能 xff0c 记录下来以免忘记 实现功能 使用ESP32在服务器与下位机之间传输数据 xff0c 整体的流程图如下所示 如图所示 xff0c 下位机与ESP通过串口连接 x
  • UART, IIC, SCI, SPI, 232, 485, 422, CAN, SDIO, GPIO, MODBUS, TCP/IP汇总简介

    UART IIC SCI SPI 232 485 422 CAN SDIO GPIO MODBUS TCP IP汇总简介 UART xff1a Universal Asynchronous Receiver Transmitter xff1
  • UART通信中流控RTS和CTS的理解

    一 流控 xff0c 顾名思义就是流量控制的意思 目的是协调收发双方 xff0c 使数据不会丢失 如果UART只有RX TX两个信号 xff0c 要流控的话只能是软流控 xff1b 如果有RX xff0c TX xff0c CTS xff0
  • UART详解

    UART 通用异步收发传输器 xff08 Universal Asynchronous Receiver Transmitter xff0c 通常称作UART xff09 是一种串行异步收发协议 xff0c 应用十分广泛 UART工作原理是
  • UART波形分析

    1 逻辑分析仪解码配置 波特率 xff1a 9600 2 逻辑分析仪结果 3 波特率计算 1除以9600 xff0c 结果如下 xff08 e 4表示10的负4次方 xff09 表示 0 00010416秒 61 104 16 微秒 找到发
  • UART串口通信

    串口是 串行接口 的简称 xff0c 即采用串行通信方式的接口 串行通信将数据字节分成一位一位的形式在一条数据线上逐个传送 xff0c 其特点是通信线路简单 xff0c 但传输速度较慢 因此串口广泛应用于嵌入式 工业控制等领域中对数据传输速
  • 4.RTT-UART-中断接收及轮询发送

    本期博客开始分享RTT的UART xff0c 利用战舰V3的uart2来输入输出一些字符串 UART xff08 Universal Asynchronous Receiver Transmitter xff09 通用异步收发传输器 xff
  • Node.js笔记:SerialPort(串口)模块使用(基于9.x.x)

    文章目录 目的 模块安装 基础使用 扫描端口 打开端口 发送数据 接收数据 错误处理 数据解析器 SerialPort类 构造方法 属性 事件 方法 命令行工具 总结 目的 上位机与各种电路模块间常常采用串口进行通讯 Node js中可以使
  • GD32E23x的USART被断点打断后重新运行,会一直进入中断的问题

    GD32E23x的USART被断点打断后重新运行 会一直进入中断的问题 GD32E230K8单片机USART0连接一个从机芯片 该芯片每100ms发来一串16Bytes的数据 MCU中断接收 没有开启FIFO 只开启了RBNE 接收缓存非空
  • Verilog功能模块——Uart收发

    摘要 本文分享了一种通用的Uart收发模块 可实现Uart协议所支持的任意波特率 任意位宽数据 5 8 任意校验位 无校验 奇校验 偶校验 1校验 0校验 任意停止位 1 1 5 2 的数据传输 此模块需要搭配FIFO使用 以消除发送端和接
  • UART ISR Tx Rx 架构

    我让事情变得复杂了吗 我正在构建我的代码 以便通过 UART 从 8051 micro 与外围设备进行通信 外设响应主机的命令 一次只能响应一个命令 这是一个简单的发送和接收协议 tx1 rx1 tx2 rx2 tx3 rx3 每个 TX
  • 启用并测试 UART 的本地环回

    我正在尝试进行 UART 内部环回测试并提出以下更改 include
  • IOError:[Errno 2]没有这样的文件或目录(当它确实存在时)Python [重复]

    这个问题在这里已经有答案了 我正在通过 python 中的 uart 传输文件文件夹 下面您可以看到简单的功能 但有一个问题 因为我收到如标题所示的错误 IOError Errno 2 No such file or directory 1
  • 启用 DMA 的 UART Tx 模式

    我已经为 UART 在传输模式下编写了一个简单的设备驱动程序 并启用了 DMA 和中断 我使用的硬件是 omap 4460 pandaboard 其中加载了 Linux 3 4 下面我分享一下相关部分的代码 在开放阶段 dma map io
  • 使用 read(...) 时在换行符处停止

    我需要从通过 UART 连接的 GPS 读取 NMEA 语句 操作系统是Debian 语言必须是C 为此 我使用以下命令打开文件open 并读取一个字符串read 但是 这样我必须指定字符串长度 这会分解句子 相反 我想读到 NMEA 句子

随机推荐

  • 使用keil软件添加.C文件和.H文件到工程

    使用keil软件添加 C文件和 H文件到工程 1 第一步 在所建工程的文件夹下的HARDWARE子文件夹下创建一个所要添加文件名称 xff0c 例如要添加led c和led h文件 xff0c 可以先在HARDWARE文件目录下创建一个命名
  • STL常用容器——String容器的使用

    文章目录 STL常用容器 String容器1 string构造器2 string的赋值操作3 拼接字符串4 字符串查找和替换5 字符串比较6 字符串存取7 字符串插入与删除8 截取字符串 STL常用容器 String容器 string类封装
  • STL常用容器——vector容器的使用

    文章目录 STL常用容器 vector容器的使用1 vector容器概念2 vector容器构造方式3 vector赋值操作4 vector容量 capacity 和大小 size 的区别5 vector添加和删除6 vector数据存取
  • STL常用容器——deque容器的使用

    文章目录 STL常用容器 deque容器的使用1 deque 容器简介2 deque容器的构造函数3 deque的赋值操作4 deque大小操作5 deque容器添加和删除元素6 deque容器访问元素7 容器内元素排序 STL常用容器 d
  • STL常用容器——stack容器的使用

    文章目录 STL常用容器 stack容器的使用1 stack容器介绍2 stack容器常用接口 STL常用容器 stack容器的使用 1 stack容器介绍 stack容器简介 stack容器是堆栈容器 xff0c 该容器具有先进后出的特性
  • STL常用容器——queue容器的使用

    文章目录 STL常用容器 queue容器的使用1 queue容器的介绍2 queue容器常用接口2 1 queue容器构造函数2 2 queue队列容器常用的成员函数 STL常用容器 queue容器的使用 1 queue容器的介绍 queu
  • STL常用容器—— list 容器的使用

    文章目录 STL常用容器 list 容器的使用1 list 容器介绍2 list容器的构造函数3 list容器的赋值和交换4 list容器大小操作5 list容器添加和删除元素操作6 list容器数据存取7 list容器反转和排序 STL常
  • STL常用容器——set容器的使用

    文章目录 STL常用容器 set容器的使用1 set容器简介2 set容器的构造和赋值3 set容器的大小和交换4 set容器的添加与删除5 set容器的查找与统计6 pair类模板7 set和multiset的区别8 set容器的排序 S
  • STL常用容器——map容器的使用

    文章目录 STL常用容器 map容器的使用1 map容器介绍2 map容器构造和赋值3 map容器大小和交换4 map容器的添加和删除4 1 insert插入数据的四种方式4 2 删除键值对 5 map容器查找和统计6 map容器排序 ST
  • STL常用算法——遍历算法

    文章目录 STL常用算法 遍历算法1 for each 2 transform STL常用算法 遍历算法 1 for each for each xff1a 遍历容器 xff0c 对容器中的每一个元素调用函数或函数对象 函数原型 xff1a
  • STL常用算法——查找算法

    文章目录 STL常用算法 查找算法1 find 2 find if 3 adjacent find 4 binary search 5 count 和count if 5 1 count 5 2 count if STL常用算法 查找算法
  • 视觉识别示例-海康威视

    视觉识别示例 海康威视 C Program Files x86 MVS Development Documentations1 在海康威视软件MVS xff0c 默认安装目录下有示例及说明 xff0c 如上图是示例说明 C Program
  • STL常用算法——排序算法

    文章目录 STL常用算法 排序算法1 sort 2 random shuffle 3 merge 4 reverse STL常用算法 排序算法 1 sort sort xff1a 对容器或普通数组中范围内的元素进行排序 xff0c 默认进行
  • STL常用算法——拷贝和替换算法

    文章目录 STL常用算法 拷贝和替换算法1 copy 2 replace 3 replace if 4 swap STL常用算法 拷贝和替换算法 1 copy copy 函数 xff1a 将源容器内指定范围的元素拷贝到目的容器中 函数原型
  • STL常用算法——算术生成算法和集合算法

    文章目录 STL常用算法 算术生成算法和集合算法1 算术生成算法1 1 accumulate 1 2 fill 和fill n 2 集合算法2 1 set intersection 2 2 set union 2 3 set differe
  • CompletableFuture的使用

    文章目录 1 Future2 CompletableFuture 并行 xff0c 并发 并发 xff1a 一个实体上 xff0c 多个任务有序执行 并行 xff1a 多个实体上 xff0c 多个任务同时执行 用户线程 用户线程是系统的工作
  • 将本地jar添加到Maven仓库

    一 将jar添加到本地仓库的做法 xff1a 以下面pom xml依赖的jar包为例 xff1a 实际项目中pom xml依赖写法 xff1a html view plain copy lt dependency gt lt groupId
  • nodejs如何实现Digest摘要认证?

    文章目录 1 前言2 原理3 过程4 node实现摘要认证5 前端如何Digest摘要登录认证 xff08 下面是海康的设备代码 xff09 1 前言 根据项目需求 xff0c 海康设备ISAPI协议需要摘要认证 xff0c 那么什么是摘要
  • HAL库中断方式进行串口通信

    目录 一 通过CubeMX配置项目 二 在keil配置代码 三 烧录运行 四 输出 五 总结 六 参考链接 一 通过CubeMX配置项目 二 在keil配置代码 main函数中的while循环里面添加传输代码 if flag 61 61 1
  • 串口UART

    目录 串口概念 串口rs232 数据格式 注意事项 总体结构图 代码verilog 接收模块 结构图 波形图 编辑 代码 verilog 发送模块 结构图 波形图 代码 verilog 串口rs485 串口概念 串口是异步 串行通信接口 x