(参考野火代码)
UART即通用异步收发传输器(Universal Asynchronous Receiver/Transmitter)
发送过程及基础知识
1、RS232是UART的一种,没有时钟线,只有两根数据线rx和tx,均是1bit位宽。
2、rx位宽为1bit,PC机通过串口调试助手往FPGA发8bit数据时,FPGA通过串口线rx一位一位地接收,从最低位到最高位依次接收,最后在FPGA里面位拼接成8比特数据。
3、tx位宽为1bit,FPGA通过串口往PC机发8bit数据时,FPGA把8bit数据通过tx线一位一位的传给PC机,从最低位到最高位依次发送,最后上位机通过串口助手按照RS232协议把这一位一位的数据位拼接成8bit数据。
4、串口数据的发送与接收是基于帧结构的,即一帧一帧的发送与接收数据。每一帧除了中间包含8bit有效数据外,还在每一帧的开头都必须有一个起始位,且固定为0;在每一帧的结束时也必须有一个停止位,且固定为1,即最基本的帧结构(不包括校验等)有10bit。在不发送或者不接收数据的情况下,rx和tx处于空闲状 态,此时rx和tx线都保持高电平,如果有数据帧传输时,首先会有一个起始位,然后是8bit的数据位,接着有1bit的停止位,然后rx和tx继续进入空闲状态,然后等待下一次的数据传输。
5、波特率:在信息传输通道中,携带数据信息的信号单元叫码元(因为串口是1bit进行传输的,所以其码元就是代表一个二进制数),每秒钟通过信号传输的码元数称为码元的传输速率,简称波特率,常用符号“Baud”表示,其单位为“波特每秒(Bps)”。串口常见的波特率有4800、9600、115200等,我们选 用9600的波特率进行串口章节的讲解。
6、比特率:每秒钟通信信道传输的信息量称为位传输速率,简称比特率,其单位为“每秒比特数(bps)”。比特率可由波特率计算得出,公式为:比特率=波特率 * 单个调制状态对应的二进制位数。如果使用的是9600的波特率,其串口的比特率为:9600Bps * 1bit= 9600bps。
uart_rx串口数据接收
`timescale 1ns / 1ps
//串口接受模块
module uart_rx
#(
parameter UART_BPS = 'd9600, //串口波特率------1s可以发送多少bit
parameter CLK_FREQ = 'd50_000_000 //时钟频率
)
(
input sys_clk ,
input sys_rst_n,
input wire rx, //串口接受数据
output reg [7:0] po_data, //串转并后的8bit数据
output reg po_flag //串转并后数据的有效标志信号
);
localparam BAUD_CNT_MAX = CLK_FREQ/UART_BPS;
reg rx_reg1;
reg rx_reg2;
reg rx_reg3;
reg start_nedge;
reg work_en;
reg [12:0] baud_cnt;
reg bit_flag;
reg [3:0] bit_cnt;
reg [7:0] rx_data;
reg rx_flag;
// 单比特信号从慢速时钟域同步到快速时钟域时