行业知识
uart串口环回(加FIFO)
2026-10-31 21:47:14
来源:互联网转载
文章目录
- 一.uart简介
- 二.原理
- 1.同步通信&&异步通信
- 1.1同步通信
- 1.2异步通信
- 2.并行通信&&串行通信
- 2.1并行通信
- 2.2串行通信
- 3.全双工&&半双工
- 3.1全双工
- 3.2半双工
- 4.协议层
- 4.1数据格式
- 4.2传输速率
- 二.初步设计
- 1.模块图
- 2.tx设计
- 3.rx设计
- 4.加入FIFO
- 三.代码
- 1.uart_tx
- 2.uart_rx
- 3.ctrl(FIFO)
- 4.top
- 四.���果
一.uart简介
- UART(universal asynchronous receiver-transmitter)是一种采用异步串行通信方式的通用异步收发传输器。
- 定义如上,那么出现问题了,什么叫异步串行通信?请关注下文原理。
二.原理
1.同步通信&&异步通信
1.1同步通信
- 发送方发送出数据后,等接收方响应后才发送下一个数据
1.2异步通信
- 发送方发出数据后,不等接收方发回相应,接着发送下一个数据
2.并行通信&&串行通信
2.1并行通信
- 并行通信是指数据各个位用多条数据线同时进行传输
2.2串行通信
- 串行通信是将数据分成一位一位的形式在一条线上逐个传输
3.全双工&&半双工
3.1全双工
- 双方都可以发送接收数据,并可以同时进行
3.2半双工
- 双方都可以发送接收数据,但是同一时刻只能一方发送,一方接收
4.协议层
4.1数据格式
- 解析上图可以看出:空闲位处于高电平,起始位为0(拉低);数据位可以是6-8bit,注意是低位先发;暂时不考虑校验位,停止位为1(拉高)。
4.2传输速率
- 串口通信的速率用波特率表示,它表示每秒传输二进制数据的位数,单位是bit/s(位/秒),简称bps。常用的波特率有9600、19200、38400、57600、115200等。本文中设计用的115200的波特率==>传输1bit需要计数50_000_000/115200 = 434次
二.初步设计
1.模块图
2.tx设计
- tx将8bit的数据转换为1bit数据输出
3.rx设计
- rx将1bit的数据转换为8bit数据输出
- 这里由于加入stop状态后面会导致状态跳崩了,于是我不要stop状态了
4.加入FIFO
- FIFO配置上,数据宽度选8bit,数据深度选32bit,其他配置可参考前文https://blog.csdn.net/weixin_67803687/article/details/132248964?spm=1001.2014.3001.5501中的单时钟前显模式
三.代码
1.uart_tx
/**************************************功能介绍***********************************Date: 2023年8月16日17:07:11Author: Alegg xy.Version: 2.0Description: FPGA向上位机发送数据【8bit变1bit(波形)】*********************************************************************************/ //---------------------------------------------------------------module uart_tx( inputclk, inputrst_n, input [7:0] tx_data , input tx_data_vld, output ready , output reg tx ); //------------------------------------------------------------------ parameter MAX_1bit = 9'd434;//1bit要计434次 //状态机参数定义 localparam IDLE = 'b0001,//空闲状态 START = 'b0010,//起始位 DATA = 'b0100,//数据位 STOP = 'b1000;//停止位//-------------------------------------------------------------- reg [3:0]cstate ;//现态 reg [3:0]nstate ;//次态 wire IDLE_START; wire START_DATA; wire DATA_CHECK; wire CHECK_STOP; wire STOP_IDLE; reg[8:0]cnt_baud ;//波特计数器,波特率115200 wireadd_cnt_baud; wireend_cnt_baud; reg[2:0]cnt_bit ;//bit计数器,起始位1bit,数据位8bit,结束位1bit wireadd_cnt_bit; wireend_cnt_bit; reg [3:0] bit_max;//bit最大值,复用需要考察每个状态的bit值 reg [7:0] tx_data_r; //计434次 always @(posedge clk or negedge rst_n)begin if(!rst_n)begin cnt_baud
- FIFO配置上,数据宽度选8bit,数据深度选32bit,其他配置可参考前文https://blog.csdn.net/weixin_67803687/article/details/132248964?spm=1001.2014.3001.5501中的单时钟前显模式
- tx将8bit的数据转换为1bit数据输出
- 串口通信的速率用波特率表示,它表示每秒传输二进制数据的位数,单位是bit/s(位/秒),简称bps。常用的波特率有9600、19200、38400、57600、115200等。本文中设计用的115200的波特率==>传输1bit需要计数50_000_000/115200 = 434次
- 解析上图可以看出:空闲位处于高电平,起始位为0(拉低);数据位可以是6-8bit,注意是低位先发;暂时不考虑校验位,停止位为1(拉高)。
- 双方都可以发送接收数据,但是同一时刻只能一方发送,一方接收
- 双方都可以发送接收数据,并可以同时进行
- 串行通信是将数据分成一位一位的形式在一条线上逐个传输
- 并行通信是指数据各个位用多条数据线同时进行传输
- 发送方发出数据后,不等接收方发回相应,接着发送下一个数据
- 发送方发送出数据后,等接收方响应后才发送下一个数据