FPGA协议篇:UART通信及Verilog最易懂实现方式/通用于任何工程/带握手信号 ----UART_TX

这篇具有很好参考价值的文章主要介绍了FPGA协议篇:UART通信及Verilog最易懂实现方式/通用于任何工程/带握手信号 ----UART_TX。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

概述:

        UART(Universal Asynchronous Receiver/Transmitter)是一种通用的异步收发传输协议,用于在计算机系统和外部设备之间进行串行数据传输。UART 协议定义了数据的传输格式和通信规则,使得不同设备之间能够进行可靠的数据交换。

首先先把设计代码放到这里:UART_TX完整代码下载

以下是 UART 协议的几个关键要素:

        1、异步传输:UART 使用异步传输方式,不需要共享时钟信号来进行数据同步。发送端和接收端通过起始位、数据位和停止位进行数据的有效传输。

        2、起始位和停止位:在每个数据字节的开始之前,UART 使用一个起始位来标识传输的起始点。而在数据字节的末尾,UART 添加一个或多个停止位以标识传输的结束。起始位和停止位的数量可以根据协议和设置进行配置。

        3、数据位:UART 协议规定了数据位的传输顺序和位数。数据位是实际传输的数据位数,典型的位数为 5、6、7 或 8 位,具体取决于协议和配置。重要的一点:UART的传输数据为:

        4、波特率:UART 通信的波特率指的是每秒传输的位数。发送端和接收端必须以相同的波特率进行通信,以确保数据的正确传输。常见的波特率包括 9600、115200 等。

        5、校验位(可选):为了增加数据传输的可靠性,UART 还可以使用校验位进行错误检测。校验位是在数据位之后添加的一个位,用于验证数据的准确性。常见的校验方式包括奇校验和偶校验。

UART 协议在许多应用中得到广泛应用,例如串口通信、嵌入式系统、传感器和外围设备等。它提供了一种简单而有效的数据传输方式,允许设备之间进行可靠的异步通信。

本章将介绍如何使用Verilog实现UART发送部分并进行下板验证:

一、UART构成

根据概述可以简单的提取出来,如下图:UART接受传输的数据格式:

FPGA协议篇:UART通信及Verilog最易懂实现方式/通用于任何工程/带握手信号 ----UART_TX,FPGA协议,fpga开发,fpga,信息与通信

讲解几个关键点:

        1、UART传输数据顺序:

                LSB → MSB,从最低位到最高位

                例如:d=8'b1011_0011    :传输顺序:d[0],d[1] ....... d[6],d[7]

        2、通信方式:

                异步通信:“不需要额外的时钟线进行数据的同步传输”

                全双工传输:UART 只需要两条信号线:RXD 和 TXD ,可以同时进行传输

        3、传输数据速率:

                采用波特率作为传输数据的速率(每秒传输二进制位数的多少),单位:BPS,常用波特率有9600、14400、38400、57600...115200。

        例如波特率=115200,则它传输一位数据位(1bit)的时间为1/115200s

        两个设备通过UART传输的时候,必须是相同波特率。

二、时钟与波特率的计算

        涉及到两个量:

        1、FPGA时钟主频率:FPGA 主频指的是 FPGA 设备上时钟信号的频率,通常以赫兹(Hz)为单位。

        2、波特率:波特率指的是数据传输的速率,以位每秒(bps)为单位。

根据这两个量,可以计算出数据传输的时间,所需要的时钟周期:、

        例如:时钟频率100M,波特率115200bps

                bps_cnt = 100_000_000 / 9600 = 868 

        可以得出:FPGA传输数据,需要翻转868个时钟周期,才可以传输一位数据。

简单一点就是时钟频率除以波特率就是需要的计数。

三、Verilog实现

1、UART_TX设计框图        ​​​​​

FPGA协议篇:UART通信及Verilog最易懂实现方式/通用于任何工程/带握手信号 ----UART_TX,FPGA协议,fpga开发,fpga,信息与通信

端口名称 端口属性 介绍
i_clk 输入端口 FPGA输入时钟
i_reset 输入端口 FPGA输入复位,高有效
i_data[7:0] 输入端口

UART发送数据

i_valid 输入端口 输入数据有效
o_ready 输出端口 数据传输完成
o_txd 输出端口 UART输出接口

部分代码:

module uart_tx #(
	parameter CHECK_BIT = "None",       //“None”无校验  “Odd”奇校验  “Even”偶校验
	parameter BPS       = 115200,       //系统波特率 
	parameter CLK       = 25_000_000,   //系统时钟频率 hz 
	parameter DATA_BIT  = 8,            //数据位(6、7、8)
	parameter STOP_BIT  = 1             //停止位 (1、2、3... 整数)
)(
	input	i_reset,
	input	i_clk,
	input	[DATA_BIT-1:0] i_data,
	input	i_valid,
	output	reg o_ready,
	output  reg o_txd
);

endmodule

2、UART_TX状态转移图

 FPGA协议篇:UART通信及Verilog最易懂实现方式/通用于任何工程/带握手信号 ----UART_TX,FPGA协议,fpga开发,fpga,信息与通信

代码中采用三段式状态机:

IDLE:空闲状态,无数据传输,输出高电平,当i_valid信号到来时跳转到START状态;

START:起始位,无数据传输,输出低电平为 ,无条件跳转至DATA状态;

DATA:数据位,进行数据传输,先发送低比特,根据数据输出高低电平,假如有校验位,跳到CHECK状态,假如数据传输不设校验位,跳转到STOP状态;

CHECK:奇偶校验位处理状态,根据CHECK_BIT参数进行添加校验位值。

STOP:停止位状态,输出STOP_BIT个高电平。 

部分代码:

 reg [3:0] c_state, n_state;
    parameter   IDLE    = 0,
                STATE   = 1,
                DATA    = 2,
                CHECK   = 3,
                STOP    = 4;

///* FSM *3 *//
    always @(posedge i_clk, posedge i_reset) begin
        if (i_reset)
            c_state <= 0;
        else
            c_state <= n_state;
    end

    always @(*) begin
        case (c_state)
            IDLE    :   begin
                            if (tx_en && i_valid)
                                n_state = STATE;
                            else
                                n_state = IDLE;
            end  

            STATE   :   begin
                            if (tx_en)
                                n_state = DATA; 
                            else
                                n_state = STATE;
            end

            DATA    :   begin
                            if (tx_en && tx_cnt >= DATA_BIT && CHECK_BIT == "None")
                                n_state = STOP;
                            else if (tx_en && tx_cnt >= DATA_BIT)
                                n_state = CHECK;
                            else
                                n_state = DATA;
            end 

            CHECK   :   begin
                            if (tx_en)
                                n_state = STOP;
                            else
                                n_state = CHECK;
            end

            STOP    :   begin
                            if (tx_en && stop_cnt == 1)
                                n_state = IDLE;
                            else
                                n_state = STOP;
            end
            
            default :   n_state = 0;

        endcase
    end

3、发送数据格式

此模块用于辅助大家更好的运用UART_TX模块,展示了握手信号的工作方式,以及串口发送模块的调用方法。

为了方便大家理解,给大家画了一个发送数据的时序图:

FPGA协议篇:UART通信及Verilog最易懂实现方式/通用于任何工程/带握手信号 ----UART_TX,FPGA协议,fpga开发,fpga,信息与通信

在数据发送过程中,握手信号的细致描述如下:(接收端即UART_TX模块)

初始状态:发送端准备好发送数据,并将VALID信号置高,表示数据有效。接收端处于等待状态,READY信号为低电平,表示接收端尚未准备好接收数据。

数据传输开始:发送端在VALID信号置高后,开始传输数据。发送端将要发送的数据值放置在DATA线上,并保持稳定。VALID信号保持高电平,表示数据一直有效。

握手信号等待:接收端检测到VALID信号置高后,开始等待READY信号的响应。接收端会持续监测READY信号状态,直到它被置高。

数据接收和响应:一旦接收端检测到READY信号置高,它表示接收端已经准备好接收数据。在READY信号置高后,发送端可以改变DATA的值,并且VALID信号也可以跟随着改变。这表示发送端可以发送下一个数据。

握手信号完成:发送端发送数据后,继续保持VALID信号的高电平,表示数据仍然有效。接收端在接收完数据后,如果准备好接收下一个数据,则保持READY信号的高电平。这样一个完整的握手信号周期就完成了。

通过这种握手信号的交互,发送端和接收端能够进行同步的数据传输。VALID信号的高电平表示数据有效,READY信号的高电平表示接收端准备好接收数据。只有在READY信号置高后,发送端才能改变数据并发送下一个数据。

这种握手机制确保了数据的可靠传输,发送端和接收端在数据传输过程中能够以协调的方式进行通信。

部分代码:

module UART_tx_gen_data(
	input clk_a,
	input rst_n,
	output txd
);

	reg [7:0] temp_data;
	reg [7:0] tx_data;
	reg tx_valid;
	wire ready;


	reg [3:0] c_state, n_state;
	parameter S0 = 0,
				S1 = 1;

	uart_tx #(
	.CHECK_BIT ("None"	)	,       //“None”无校验  “Odd”奇校验  “Even”偶校验
	.BPS       (115200	)	,       //系统波特率 
	.CLK       (25_000_000)	,   	//系统时钟频率 hz 
	.DATA_BIT  (8		)	,       //数据位(6、7、8)
	.STOP_BIT  (1       )   		//停止位
) TX (
	.i_reset(!rst_n),
	.i_clk(clk_a),
	.i_data(tx_data),
	.i_valid(tx_valid),
	.o_ready(ready),
	.o_txd(txd)
);

	always @(posedge clk_a, negedge rst_n) begin
		if (!rst_n)
			c_state <= 0;
		else 
			c_state <= n_state;
	end

四、下板验证

通过上面两个模块,既可以对串口发送进行验证,把UART_tx_gen_data置为顶层,然后对端口进行引脚约束,生成下载文件,然后下载到板卡:

FPGA协议篇:UART通信及Verilog最易懂实现方式/通用于任何工程/带握手信号 ----UART_TX,FPGA协议,fpga开发,fpga,信息与通信

同时打开串口调试助手,选择波特率115200,数据位8,停止位1,校验位none,按16进制显示:

FPGA协议篇:UART通信及Verilog最易懂实现方式/通用于任何工程/带握手信号 ----UART_TX,FPGA协议,fpga开发,fpga,信息与通信

然后运行程序,即可在接收窗口收到连续变换的数据:

FPGA协议篇:UART通信及Verilog最易懂实现方式/通用于任何工程/带握手信号 ----UART_TX,FPGA协议,fpga开发,fpga,信息与通信

这样的话,此UART_TX设计已经完全完成了,下一期将更新UART_RX的设计和讲解。

如果感觉文章对您有用,麻烦三连支持一下,方便下次用到的时候,就可以快速找到我,非常感谢您的支持!!!文章来源地址https://www.toymoban.com/news/detail-843664.html

到了这里,关于FPGA协议篇:UART通信及Verilog最易懂实现方式/通用于任何工程/带握手信号 ----UART_TX的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【FPGA】FPGA实现UART串口通信回环

    关于UART协议的基础理论部分已经在上一篇文章中讲述,不再重复介绍。 UART通信协议 本文主要介绍如何使用Verlilog编程,通过FPGA实现UART串口通信回环工程。在本工程中所使用的系统时钟为50MHz,如果选择115200的波特率进行数据传输,那么传输1bit所用的时钟周期数就是50_000_

    2024年02月05日
    浏览(65)
  • FPGA实现UART通信(1)---发送数据

    1、基本概念 通用异步收发传输器,是一种异步收发传输器,在发送数据通过将并行数据转换成串行数据进行传输,在接收数据时将串行数据转换成并行数据。 串行通信分为同步串行通信和异步串行通信。同步串行通信即需要时钟的参与,通信双方需要在同一时钟的控制下,

    2024年02月04日
    浏览(45)
  • 【FPGA】UART串口通信——奇偶校验实现

    奇偶校验位是基于uart的数据上进行一个判断 奇校验:数据1个数为奇时,校验为0,反之为1 偶校验:数据0个数为偶时,校验为0,反之为1 Uart回环在之前已经实现,现在需要基于uart增加一个奇偶校验位的需求 uart及代码:https://blog.csdn.net/weixin_59150966/article/details/128005066?spm=10

    2024年02月11日
    浏览(42)
  • 【FPGA学习】状态机实现UART通信

      在之前的文章中【FPGA学习】实例一、Cyclone IV串口通信(RS232)我们已经能够采用波形图的方法,实现9600bps的Uart通信。近期笔者在整理了状态机和计数器组合的设计方法以后,对状态机的设计又有了新的感悟和体会,所以又把经典的RS232协议拉出来当状态机的例子练手了哈哈

    2023年04月11日
    浏览(41)
  • FPGA-结合协议时序实现UART收发器(一):UART协议、架构规划、框图

    记录FPGA的UART学习笔记,以及一些细节处理,主要参考奇哥fpga学习资料。 本次UART主要采用计数器方法实现,实现uart的稳定性发送和接收功能,最后实现串口数据回环进行功能测试。 UART协议如图。 包含:空闲位、起始位、数据位、校验位、停止位、空闲位(一般没有) 对于

    2024年02月08日
    浏览(67)
  • Verilog(1)UART串口通信

    第一部分为uart串口通信的接收部分,用pc端虚拟串口来对其发送数据。 第三部分为uart串口通信的发送部分,用此部分对pc端虚拟串口发送数据。 第二部分loop,处理数据,形成回环,使发送部分有数据来源,以此来保证实验的完成。 串口接收 :  输入: sys_clk、sys_rst_n、u

    2024年02月03日
    浏览(81)
  • FPGA-结合协议时序实现UART收发器(五):串口顶层模块UART_TOP、例化PLL、UART_FIFO、uart_drive

    串口顶层模块UART_TOP、例化PLL、UART_FIFO、uart_drive,功能实现。 对照代码,串口发送模块UART_TOP实现功能包括: PLL锁相环,实现稳定系统输入时钟功能 UART_FIFO,数据先进先出,实现数据缓存功能,防止出现数据错乱 w_clk_rst = ~w_system_pll_locked;保证复位电平是先高位再地位 r_use

    2024年02月08日
    浏览(87)
  • FPGA用verilog HDL实现串口通讯协议

    串口通信是一种通过串行传输数据的通信方式。它使用单个数据线将数据位逐个传输,而不是同时传输多个数据位。串口通信常用于连接计算机与外部设备,如打印机、调制解调器、传感器等。 串口通信一般使用的是异步传输方式,即发送方和接收方的时钟不同步。数据传输

    2024年02月05日
    浏览(61)
  • 【FPGA教程案例40】通信案例10——基于FPGA的简易OFDM系统verilog实现

    FPGA教程目录 MATLAB教程目录 --------------------------------------------------------------------------------------- 目录 1.软件版本 2.OFDM原理 3.OFDM系统的verilog实现

    2024年02月12日
    浏览(56)
  • FPGA入门 —— FPGA UART 串口通信

    UART 通用异步收发传输器( Universal Asynchronous Receiver/Transmitter) ,通常称作 UART。 UART 是一种通用的数据通信协议,也是异步串行通信口(串口)的总称,它在发送数据时将并行数据转换成串行数据来传输,在接收数据时将接收到的串行数据转换成并行数据。 它包括了ch340、 RS232、

    2024年02月09日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包