目录
前言
嵌入式电子产品是一种互连电路(处理器或其他集成电路)以创建共生系统。
为了使这些单独的电路交换其信息,它们必须共享
公共通信协议。已经定义了数百种通信协议来实现这种数据交换,并且通信的方式主要可以分为两类:
并行或串行。
这一章我们需要理解串行通信,并行通信两种方式。并理清UART串口通信的整个模块设计,然后依次编写发送模块,接收模块
一丶通信方式
1.串行通信
定义:串行通信是指利用一条传输线将数据一位位地顺序传送。(也就是说串行通信传输的数据是1比特1比特的传送的)
串行通信又称为点对点通信,对于点对点之间的通信
根据数据的同步方式,又分为 异步通信 和 同步通信 两种方式
根据数据的传输方向与时间关系,又可分为:①单工通信、②半双工通信及③全双工通信三种方式。

1.同步通信
同步通信一般有一个同步时钟,如下图,一根数据线,一根时钟线。一个时钟传输一个Bit位。

2.异步通信
异步通信中,在异步通信中有两个比较重要的指标:字符帧格式和波特率。
数据通常以字符或者字节为单位组成字符帧传送,是通过双方约定好的波特率进行数据传输。
假如双方波特率不一致,则接收到数据就是乱码。

单工:
只允许数据按照一个固定的方向传送,在任何时刻都只能进行一个方向的通信,一个设备固定为发送设备,一个设备固定为接收设备。
半双工:
两个设备之间可以收发数据,但是不能在同一时刻进行,每次只能有一个设备发送,另一个站接收。
全双工:
在同一时刻,两个设备之间可以同时进行发送和接收数据。

2.并行通信
并行是指多比特数据同时通过并行线进行传送,这样数据传送速度大大提高。
但并行传送的线路长度受到限制,因为长度增加,干扰就会增加,数据也就容易出错。
并行接口同时传输多个位。它们通常需要数据总线(八、十六或更多线路),以1和0的波形传输数据。
如下图:使用9线的并行通信,由时钟控制的8位数据总线,每个时钟脉冲发送一个字节。

二丶UART 串口通信
它是全双工的异步通信。
串口通信的信号线需要两条线完成,TX和RX TX发送端 RX为接收端
它的协议主要由四部分组成
- 起始位(1 bit)
- 数据位(6/7/8 bit)
- 奇偶校验位(1 bit)
- 停止位(1 bit)
原理图如下:

注意:此原理图既作为接收的数据帧,也作为发送的数据帧。因为串行通信中,在数据线上传输的数据是一位一位的,所以在收发数据的时候要进行串并之间的转换
收发流程:
- 发送:首先是
空闲状态,线路处于高电位;当收到发送数据指令后,拉低线路一个数据位的时间T1,接着数据按低位到高位依次发送,数据发送完毕后,接着发送奇偶校验位和停止位(停止位为高电位),一帧数据发送结束。 - 接收:首先是
空闲状态,线路处于高电位;当检测到线路的下降沿(线路电位由高电位变为低电位)时说明线路有数据传输,按照约定的波特率从低位到高位接收数据,数据接收完毕后,接着接收并比较奇偶校验位是否正确,如果正确则通知后续设备准备接收数据或存入缓存,最后接收到停止位(停止位为高电位),一帧数据接收结束。
三丶模块设计

- rx为接收端口
- tx为发送端口
上图所示分为主机和从机
我们把FPGA当作从机,来接收上位机(也就是我们的PC)发送过来的数据,再把数据发送给上位机,内部就需要两个模块 uart_rx和uart_tx
uart_rx:
串口接收模块从 rx 接收到数据后,在内部实现接收方法,接收完毕后将数据进行串转并,然后发送给控制模块
uart_tx:
串口发送模块接收到uart_rx模块传来的数据,将数据进行并转串,通过tx端口发送出去
四丶发送模块
1.代码
uart_tx.v
module uart_tx (
input wire clk,
input wire rst_n,
input wire [7:0] din,
input wire din_vld,
output reg tx
);
//定义一个寄存器来锁存 din_vld 时的din
reg [9:0] data;
//波特率计数器
reg [8:0] cnt_bps;
wire add_cnt_bps;
wire end_cnt_bps;
//比特计数器
reg [4:0] cnt_bit;
wire add_cnt_bit;
wire end_cnt_bit;
reg flag; //计数器开启标志位
parameter BPS_115200=434; //发送一bit数据需要的周期数
//data
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
data<=0;
end
else if(din_vld) begin
data<={
1'b1,din,1'b0}; //拼接起始位和停止位
end
else
data<=data;
end
//发送数据 tx
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
tx<=1'b1;
end
else if(cnt_bps==1) begin
tx<=data[cnt_bit];
end
end
//flag
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
flag<=0;
end
else if(din_vld) begin
flag<=1;
end
else if(end_cnt_bit) begin //发送完成关闭计数器
flag<=0;
end
else
flag<=flag;
end
//cnt_bps
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
cnt_bps<=0

本文深入探讨了串行通信与并行通信的区别,并重点讲解了UART串口通信的工作原理和特点,包括起始位、数据位、奇偶校验位和停止位。通过实例展示了FPGA中UART的模块设计,包括发送模块和接收模块的Verilog代码实现,以及仿真过程。同时,阐述了全双工异步通信的实现方式,以及如何在FPGA内部实现串并转换。最后,提到了上板验证和源码分享链接。

27万+

被折叠的 条评论
为什么被折叠?



