FPGA三大串行通信接口之UART

        UART是一种通用串行数据总线,用于异步通信。该总线双向通信,可以实现全双工传输和接收。在嵌入式设计中,UART用于主机与辅助设备通信,如汽车音响与外接AP之间的通信,与PC机通信包括与监控调试器和其它器件,如EEPROM通信。

        UART 通信在使用前需要做多项设置,最常见的设置包括数据位数、波特率大小、奇偶校验类型和停止位数。
        数据位(Data bits): 该参数定义单个 UART 数据传输在开始到停止期间发送的数据位数。 可选择为: 5、 6、 7 或者 8(默认)。
        波特率(Baud):是指从一设备发到另一设备的波特率,即每秒钟可以通信的数据比特个数。 典型的波特率有 300, 1200, 2400, 9600, 19200, 115200 等。一般通信两端设备都要设为相同的波特率,但有些设备也可设置为自动检测波特率。
        奇偶校验类型(Parity Type):是用来验证数据的正确性。奇偶校验一般不使用,如果使用,则既可以做奇校验(Odd)也可以做偶校验(Even)。在偶校验中,因为奇偶校验位会被相应的置 1 或 0(一般是最高位或最低位),所以数据会被改变以使得所有传送的数位(含字符的各数位和校验位)中“1”的个数为偶数;在奇校验中,所有传送的数位(含字符的各数位和校验位)中“1”的个数为奇数。奇偶校验可以用于接受方检查传输是否发送生错误,如果某一字节中“1”的个数发生了错误,那么这个字节在传输中一定有错误发生。如果奇偶校验是正确的,那么要么没有发生错误, 要么发生了偶数个的错误。如果用户选择数据长度为 8 位,则因为没有多余的比特可被用来作为奇偶校验位,因此就叫做“无奇偶校验(Non) ”。
        停止位(Stop bits): 在每个字节的数据位发送完成之后,发送停止位,来标志着一次数剧传输完成,同时用来帮助接受信号方硬件重同步。 可选择为: 1(默认)、 1.5 或者 2 位。

        按照一个完整的字节包括一位起始位、 8 位数据位、 一位停止位即总共十位数据来算,要想完整的实现这十位数据的发送,就需要 11 个波特率时钟脉冲, 第 1 个脉冲标记一次传输的起始, 第 11 个脉冲标记一次传输的结束,如下所示:

FPGA三大串行通信接口之UART_第1张图片

Uart_Tx.v

//========================================
//	Filename		:	Uart_Tx.v
//	Created On		:	2022-2-26
//	Last Modified	:	2022-2-26
//	Author			:	Ritian73
//  Description		:	Uart_Tx
//	Baud_Set		baud
//		0			9600
//		1			19200
//		2			38400
//		3			57600
//		4			115200
//	Clk   50M
//========================================
module Uart_Tx(
	input	Rst_n,
	input	Send_En,
	input	[7:0]Data_Byte,
	input	[2:0]Baud_Set,
	input	Clk_50M,
	
	output	reg	Uart_Tx_Data,
	output	reg	Tx_Done
); 

//波特率选择
reg [15:0]baud_cnt;
always@(posedge Clk_50M or negedge Rst_n)begin
	if(!Rst_n)
		baud_cnt<=16'd5207;
	else begin
		case(Baud_Set)   //baud_cnt等于波特率周期/时钟周期(20ns) 例9600:104167ns/20ns=5208
		0:	baud_cnt <=  16'd5207; //9600
		1:	baud_cnt <=  16'd2603; //19200
		2:	baud_cnt <=  16'd1301; //38400
		3:	baud_cnt <=  16'd867;  //57600
		4:	baud_cnt <=  16'd433;  //115200
		default baud_cnt<=16'd5207;
		endcase
	end
end
//计数器
reg [15:0]div_cnt;
always@(posedge Clk_50M or negedge Rst_n)begin
	if(!Rst_n)
		div_cnt <= 16'd0;
	else if(Send_En)begin
		if(div_cnt == baud_cnt)begin
			div_cnt <= 16'd0;			
		end
		else
			div_cnt <= div_cnt + 1'd1;
	end
	else
		div_cnt <&

你可能感兴趣的:(FPGA,uart,fpga开发)