首页 > 编程语言 >02 串口程序收发环路设计

02 串口程序收发环路设计

时间:2023-12-27 18:13:01浏览次数:46  
标签:02 环路 tx uart 发送 模块 串口 接收

软件版本:VIVADO2021.1

操作系统:WIN10 64bit

硬件平台:适用XILINX A7/K7/Z7/ZU/KU系列FPGA

登录米联客(MiLianKe)FPGA社区-www.uisrc.com观看免费视频课程、在线答疑解惑!

1概述

常用的异步串行通信包含,UART、RS232、RS485。初学者可能搞不清几个名词区别,这里就做一个简单介绍。

UART (Universal Asynchronous Receiver/Transmitter)代表通用异步接收器/发送器。也叫是我们经常所说的串口,基本都用于调试。UART的主要目的是发送和接收串行数据。串口只需要2根线就可以实现收发,TX用于发送数据,RX用于接受数据(收发不是一根线,所以是全双工方式),通信双方只要采用相同的帧格式和波特率,就能在未共享时钟信号的情况下,可以完成通信过程(收发不同步,所以是异步串行通信)。

若加入一个合适的电平转换器,如SP3232E、SP3485,UART 还能用于RS-232、RS-485 通信,或与计算机的端口连接。UART 应用非常广泛,工控的人机界面HMI、手机、PC 等应用中都要用到UART。

RS-232标准:RS-232是美国电子工业协会EIA(Electronic Industry Association)制定的一种串行物理接口标准。RS是英文"推荐标准"的缩写,232为标识号。RS-232是对电气特性以及物理特性的规定,只作用于数据的传输通路上,它并不内含对数据的处理方式。RS-232、RS422、RS-485并不是标准通信协议,仅仅作为UART通讯的一个机械和电气接口标准(仅仅是标准协议中物理层面),RS485是RS-232升级版。

RS485采用物理非标准接口,根据实际情况。RS232采用点对D9标准接口:

本实验通过串口调试助手发送数据到FPGA,FPGA实现串并转换,之后再实现并串转换数据发回串口调试助手。

实验目的:

1:实现UART串口收发环路的设计

2:实现主程序中调用串口接收信息并且发送接收到的信息

3:完成仿真验证

4:编译并且固化程序到FPGA验证

2 硬件电路设计

硬件接口和子卡模块请阅读"附录 1"

配套工程的 FPGA PIN 脚定义路径为 fpga_prj/uisrc/04_pin/ fpga_pin.xdc。

3 UART收发环路

3.1 系统框图

上位机通过串口发送数据到FPGA开发板的UART数据接收模块,数据接收模块接收数据后,通过UART数据发送模块把数据发回到串口芯片,之后数据在串口调试助手上打印,实现环路测试。对于发送控制器中的uart_busy信号,不需要使用,因为这里uart发送模块是被动发送。

 

3.2 顶层模块调用UART收发驱动源码

顶层模块只需要调用uart的首发模块驱动接口。并且设置O_uart_rdata和I_uart_wdata互联,I_uart_wreq和O_uart_rvalid互联。

/*********************uart_top UART串口环路测试*********************

1.uiuart_rx接收驱动,用于接收串口数据,当O_uart_rvalid代表uiuart_rx接收驱动

接收到了总线的有效数据

2.uiuart_tx发送驱动,用于发送数据,当I_uart_wreq为高电平,请求发送数据

环路测试中,用O_uart_rvalid = I_uart_wreq,使用接收的数据再转发出去I_uart_wdata = O_uart_wdata *********************************************************************/

 

`timescale 1ns / 1ns //仿真时钟刻度和精度

 

module uart_top

(

input  I_sysclk,//系统时钟输入

input  I_uart_rx,//uart rx接收信号

output O_uart_tx //uart tx发送信号

);

 

localparam SYSCLKHZ = 50_000_000;  //系统输入时钟

 

reg [11:0] rstn_cnt = 0;//上电后延迟复位

wire uart_rstn_i;//内部复位信号

wire uart_wreq,uart_rvalid;

wire [7:0]uart_wdata,uart_rdata;

 

assign uart_wreq  = uart_rvalid;//用uart rx接收数据有效的uart_rvalid信号,控制uart发送模块的发送请求

assign uart_wdata = uart_rdata; //接收的数据给发送模块发送

assign uart_rstn_i = rstn_cnt[11];//延迟复位设计,用计数器的高bit控制复位

 

//同步计数器实现复位

always @(posedge I_sysclk)begin

    if(rstn_cnt[11] == 1'b0)

        rstn_cnt <= rstn_cnt + 1'b1;

    else

        rstn_cnt <= rstn_cnt;

end

 

//例化uart 发送模块

uiuart_tx#

(

.BAUD_DIV(SYSCLKHZ/115200-1)    

)

uart_tx_u

(

.I_clk(I_sysclk),//系统时钟输入

.I_uart_rstn(uart_rstn_i), //系统复位

.I_uart_wreq(uart_wreq), //uart发送驱动的写请求信号,高电平有效

.I_uart_wdata(uart_wdata), //uart发送驱动的写数据

.O_uart_wbusy(),//uart 发送驱动的忙标志

.O_uart_tx(O_uart_tx)//uart 串行数据发送

);

 

//例化uart 接收

uiuart_rx#

(

.BAUD_DIV(SYSCLKHZ/115200-1)  

)

uiuart_rx_u

(

.I_clk(I_sysclk), //系统时钟输入

.I_uart_rstn(uart_rstn_i),//系统复位

.I_uart_rx(I_uart_rx), //uart 串行数据接收

.O_uart_rdata(uart_rdata), //uart 接收数据

.O_uart_rvalid(uart_rvalid)//uart 接收数据有效,当O_uart_rvalid =1'b1 O_uart_rdata输出的数据有效

);

     

endmodule

 

4 FPGA工程

fpga工程的创建过程不再重复,如有不清楚的请看前面实验

米联客的代码管理规范,在对应的FPGA工程路径下创建uisrc路径,并且创建以下文件夹

01_rtl:放用户编写的rtl代码

02_sim:仿真文件或者工程

03_ip:放使用到的ip文件

04_pin:放fpga的pin脚约束文件或者时序约束文件

05_boot:放编译好的bit或者bin文件(一般为空)

06_doc:放本一些相关文档(一般为空)

5 RTL仿真

5.1 准备工作

仿真测试文件源码如下:

module uart_top_tb();

   

localparam      BPS          = 'd115200     ;             //波特率

localparam      CLK_FRE    = 'd50_000_000   ;     //系统频率

localparam      CLK_TIME   =  'd500_000_000 /CLK_FRE;//计算系统时钟周期,以ns为单位

localparam      BIT_TIME   = 'd500_000_000  / BPS ; //计算出传输每个bit所需要的时间以ns为单位

localparam      NUM_BYTES  = 3;            //需要发送的BYTES

 

reg               I_sysclk;         //系统时钟

reg               bsp_clk ;     //波特率时钟

reg               O_uart_tx;      //uart 数据发送,该信号接入到,FPGA的uart 接收

wire             I_uart_rx;      //uart 数据接收,该信号接入到,FPGA的uart 发送

reg [8*NUM_BYTES-1:0] uart_send_data; //需要发送的数据

reg [7:0]             uart_send_data_r; //寄存每次需要发送的BYTE

 

integer i,j;

 

//例化顶层模块

uart_top uart_top_inst

(

.I_sysclk(I_sysclk),

.I_uart_rx(O_uart_tx),

.O_uart_tx(I_uart_rx)

);

 

 

//仿真初始化

initial begin  

//初始化REG寄存器

I_sysclk =0;

bsp_clk  = 0;  

O_uart_tx  = 1;

i=0;

j=0;

uart_send_data   =0;

uart_send_data_r =0;

 

#20000;//延迟20000ns,等待uart测试代码中的复位延迟

uart_send_data[(0*8) +: 8] = 8'b1001_0101;//初始化需要发送的第1个BYTE

uart_send_data[(1*8) +: 8] = 8'b0000_0101;//初始化需要发送的第2个BYTE

uart_send_data[(2*8) +: 8] = 8'b1000_0100;//初始化需要发送的第3个BYTE

 

//uart tx 发送数据

  for(i=0; i<NUM_BYTES;i=i+1)

  begin

      uart_send_data_r = uart_send_data[(i*8) +: 8];//寄存需要发送的数据到寄存器

      $display("uart_send_data : 0x%h",uart_send_data_r);//打印准备发送的数据

 

      @(posedge bsp_clk);  //发送起始位1bit

      O_uart_tx = 1'b0;

 

      for(j=0;j<8;j=j+1)begin//发送数据8bits

      @(posedge bsp_clk);  //发送

      O_uart_tx = uart_send_data_r[j];

      end

 

       @(posedge bsp_clk);//发送停止位1bit

       O_uart_tx = 1'b1;  

 

  end

       @(posedge bsp_clk);

       #200 $finish;            

end

   

always #(CLK_TIME/2) I_sysclk = ~I_sysclk;    //产生主时钟

always #(BIT_TIME/2) bsp_clk  = ~bsp_clk;       //产生波特率时钟

   

 

endmodule

仿真文件第产生测试波形10010101、00000101和10000100给串口接收模块。

5.2 RTL功能仿真

为保证数据接收和发送的正确性,分别对串口接收模块和串口发送模块进行了仿真。其对应的仿真测试文件,参见工程文件夹里面的源文件。

接收端仿真如下所示,预先接收到低电平,之后再接收8位有效信号,接收寄存器得到8bit数据分别为10010101、00000101、10000100。

串口回路仿真,必须注意,保持和接收发送文件中设置的波特率一致。

发送模块相对简单,以下是RTL功能仿真,可以看到我们的发送模块把测试文件中模拟发送的数据,从接收模块接收后正确发送出去了。

6 下载演示

下载程序前,先确保FPGA工程已经编译。

6.1 硬件连接

请确保下载器和开发板已经正确连接,并且开发板已经上电(注意JTAG端子不支持热插拔,而USB接口支持,所以在不通电的情况下接通好JTAG后,再插入USB到电脑,之后再上电,以免造成JTAG IO损坏)

 

 

5.2 运行结果

标签:02,环路,tx,uart,发送,模块,串口,接收
From: https://www.cnblogs.com/milianke/p/17931130.html

相关文章

  • 「悦数图数据库」获 2023 年度 IT168 创新解决方案奖
    近日,由国内知名 IT 垂直门户媒体 IT168 举办的 2023 年度技术卓越奖评选结果正式公布,悦数图数据库荣获人工智能领域创新解决方案奖,充分肯定了悦数在大语言模型和图数据库领域的技术能力和行业前瞻性。图技术结合大模型技术,未来新方向RAG,即Retrieval-AugmentedGeneration,是......
  • 【2023-12-26】连岳摘抄
    23:59RMWS!                                                 ——XXX你认为,儿子长大后别给他压力,他一下可以继承几千万的资产,生活将更幸福。这是富裕阶层典型的误区,以......
  • Qt 中的多线程 02:移动工作对象到子线程中
    Qt中的多线程除了通过继承QThread类,然后重写虚函数run()之外还有另一种方案:将要执行的复杂操作,放在一个继承自QObject的类中,然后使用QObject::moveToThread(QThread*)函数将工作对象的移动到创建的子线程中去执行。工作对象类该类继承自QObject主要是用来实现一些耗......
  • 雅礼 2023.12.27 习题课记录
    雅礼2023.12.27习题课记录前言这一场罚时多,都是一些低级错误。好吧全都是水题。水题(只放代码)莫诺卡普参加了一场编程比赛,其中包括\(26\)个问题,从A到Z命名。问题按难度排序。此外,已知莫诺卡普可以在\(1\)分钟内解决问题A,在\(2\)分钟内解决问题B,\(\dots\),在\(2......
  • 2023年十大网络安全攻击事件
    1、ESXi勒索软件攻击今年2月,“ESXiArgs”组织针对运行VMwareESXi虚拟机监控程序的客户展开勒索攻击。据联邦调查局(FBI)和CISA数据估计,全球受感染的服务器数量超过了3800台。网络安全供应商Censys称,该活动主要针对美国、加拿大、法国和德国等国家的组织。研究人员表示:这些攻......
  • 2023NCTF Misc Crypto 部分WP
    MISCJumpForSignin题目来签个到吧我的解答:哎!游戏题。。直接打开这个文件运行玩游戏,进入游戏后点击空格进行跳跃,会看到天上掉落二维码,截图即可。在线工具扫码即可https://demo.dynamsoft.com/barcode-reader/?ref=www.hackjie.comNCTF{VVVVELCOME_TO_NCTF_2023!^!}......
  • 2023-12-27:用go语言,店铺数量n,编号1~n, 人的数量m,编号1~m, 每个人有自己投票的店铺p,和改
    2023-12-27:用go语言,店铺数量n,编号1~n,人的数量m,编号1~m,每个人有自己投票的店铺p,和改投1号店的报价x。返回想让1号店铺成为人气最高的店,至少花多少钱?1<=p,n,m<=3000,1<=x<=10^9。1号店铺贿赂问题。来自华为OD。答案2023-12-27:来自左程云。灵捷3.5大体步骤如下:minC......
  • [NOIP2023] 词典
    题目描述小S的词典里有\(n\)个两两不同的、长度均为\(m\)的单词\(w_1,w_2,\cdots,w_n\)。每个单词都是一个小写字母构成的字符串。小S可以做以下操作任意多次(可以不做):选择词典中的任意一个单词,交换其中任意两个字符。对于每个\(1\lei\len\),小S想知道,是否可以通......
  • 2023年航天大事件
    2023年,中国完成宇航发射近70次,是中国航天新的里程碑。中国科技工作者继续推进航天科技创新,并在运载火箭发动机研制固体燃料火箭研发、可重复航天器研发等方面取得重大突破;继续推进载人航天工程、北斗工程等中国重大航天旗舰工程,打造大型空间基础设施;继续推进遥感卫星、通讯卫星等......
  • 02-Mysql体系结构
    一、MySQL服务器连接模型2、应用程序如何连接到mysql2.1tcp/ip的方式mysql-uroot-poldboy123-h10.0.0.2002.2套接字的方式mysql-uroot-poldboy123-S/tmp/mysql.sock二、MySQL服务器构成——实例连接层sql层处理流程解析器(执行计划)--优化器(选择比......