[米联客-安路飞龙DR1-FPSOC] FPGA基础篇连载-26 RS485串口程序收发环路设计

news/2024/11/13 3:03:40/文章来源:https://www.cnblogs.com/milianke/p/18335293

软件版本:Anlogic -TD5.9.1-DR1_ES1.1

操作系统:WIN10 64bit

硬件平台:适用安路(Anlogic)FPGA

实验平台:米联客-MLK-L1-CZ06-DR1M90G开发板

板卡获取平台:https://milianke.tmall.com/

登录"米联客"FPGA社区 http://www.uisrc.com 视频课程、答疑解惑!

 

1概述

在前面的课程中,我们已经学习了UART串口程序的设计,在工业场合为了提高串口的抗干扰能力,以及传输距离,RS485/RS422会更加广泛应用。在本文的实验中我们通过调用前面已经编写好的UART收发IP模块,以及FIFO,实现RS485的单工通信测试。其中重点是关于RS485芯片在单工通信方式下的信号控制逻辑设计。

2 RS485硬件电路设计

2.1 RS485驱动芯片介绍

SP3485 器件是一款3.3V 低功耗半双工收发器,符合RS-485 RS-422 串行协议的规范。SP3485 可以满足RS-485 RS-422 串行协议的电气规范,负载下最高10Mbps

PIN

功能

功能描述

1

RO

数据接收输出

2

RE

接收输出使能,低电平有效

3

DE

输出使能,高电平有效

4

DI

数据发送输入

5

GND

6

A

同相驱动器输出/接收器输入

7

B

反相驱动器输出/接收器输入

8

VCC

供电

2.2 RS485的应用电路设计

 

发送真值表:

INPUTS

OUTPUTS

RE

DE

DI

B

A

X

1

1

0

1

X

1

0

1

0

0

0

X

High-Z

1

0

X

关闭

可以看到,结合原理图设计:

DE是高电平,RE是任何值,DI决定了A B的输出电平;

DERE都是0AB 输出为高阻,这个时候,RO可以作为输入

接收真值表:

INPUTS

OUTPUTS

RE

DE

Va~Vb

RO

0

X

-50mv

1

0

X

-200mv

0

X

X

Open/Shorted

1

1

1

X

High-Z

1

0

X

关闭

DE0DE为任意值,RO输入有效:

Va~Vb的差模电压>-50mv RO输出1

Va~Vb的差模电压<-200mv RO输出0

2.3 瞬态抑制器的使用

对于工业场合的工作环境,SMBJ6.0瞬态抑制器,可以抑制RS485总线的浪涌,过压,对RS485芯片起到保护作用。

3 RS485的收发环路

3.1系统框图

RS485采用的通信协议依然是UART串口协议,因此收发模块还是使用前面已经写好的UART收发IP模块。为了实现单工模式的环路测试功能,这里增加了1FIFO以及1个收发模块控制器。默认情况下,RS485芯片工作于接收数据状态,当FIFO有数据,并且一段时间内没有新数据到达,控制器切换RS485芯片到发送状态,从FIFO中取出缓存的数据发出。

3.2顶层模块源码

以下代码中核心部分为如何实现RS485数据方向的切换,以及数据到FIFO的缓存。

/*************RS485 半双工测试*************

--使用到了UART 发送和接收驱动

--通过FIFO缓存数据,并且检测到接收总线一段时间没有时间达到,进入发送模式,发送之前接收到的数据。

*********************************************************************/

 

`timescale 1ns / 1ns //仿真时间刻度/精度

 

module rs485_top#

(

parameterinteger SYSCLKHZ =  25_000_000  //系统输入时钟频率参数

)

(

input       I_sysclk,//系统时钟输入

output      O_rs485_de, // 485 de控制,控制输入 输出方向,0 输入 1输出

input       I_rs485_rx, // 485 RX输入总线

output      O_rs485_tx  // 485 TX输出总线

);

 

wire        reset_n;  //内部上电延迟复位

wire        rs485_rx; //内部RX 接收

wire        rs485_fifo_empty;  //FIFO

wire        rs485_fifo_rd_en;  //FIFO 读使能

wire        rs485_rvalid;      //读数据有效

wire [7:0]  rs485_rdata;       //串口读数据(接收)

wire [7:0]  rs485_wdata;       //串口写数据(发送)

wire        rs485_wbusy;       //写忙

reg         rs485_de;          //485芯片的DE控制0 输入 1输出

reg         rs485_wreq = 1'b0; //串口写请求

wire        rs485_tx_start;    //发送启动

reg         rs485_tx_start_r = 1'b0; //发送启动寄存

reg [17:0]  T_dcnt; //延迟计数器

reg [11:0]  rstn_cnt = 12'd0; //复位计数器

 

//rs485_de=0,设置rs485内部逻辑准备接收总线数据

assign rs485_rx         = (rs485_de == 1'b0) ? I_rs485_rx : 1'b1;

//FIFO中有数据,并且串口发送不忙,启动发送

assign rs485_tx_start   = rs485_de&&(rs485_wbusy == 1'b0)&&(!rs485_fifo_empty);

//FIFO使能,用rs485_tx_start的上升沿触发读FIFO

assign rs485_fifo_rd_en = (rs485_tx_start_r == 1'b0 & rs485_tx_start == 1'b1);//read fifo enable

//rs485_de=0,设置rs485内部逻辑准备接收总线数据,否则,可以发送数据

assign O_rs485_de       = rs485_de;

 

assign reset_n = rstn_cnt[11];//上电延迟复位

 

//复位计数器

always @(posedge I_sysclk)begin

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

        rstn_cnt <= rstn_cnt + 1'b1;

    else

        rstn_cnt <= rstn_cnt;

end

 

//T_dcnt用于一段时间内,判断接收总线是否空闲

always @(posedge I_sysclk ornegedge reset_n)begin

   if(reset_n == 1'b0)

       T_dcnt <= 17'd0;

   elseif(rs485_rx && (!rs485_fifo_empty))//如果RX总线是高电平,并且FIFO非空(有数据)

       T_dcnt <= (T_dcnt[17] == 1'b1) ? T_dcnt : T_dcnt + 1'b1; //计数器累加

   else

       T_dcnt <= 0; //否则重置归零

 

end

 

//rs485_de=0,设置rs485内部逻辑准备接收总线数据,否则,可以发送数据

always @(posedge I_sysclk )begin

    if(reset_n ==1'b0)//if(rs485_de | reset_n ==1'b0)

       rs485_de <= 1'b0;//重置rs485_de,切换到接收

    elseif((T_dcnt[17]==1'b1)|rs485_wreq|rs485_wbusy)//T_dcnt延迟计数器到达计数值,或者串口发送控制器正在发送(rs485_wreqrs485_wbusy有效)

       rs485_de <= 1'b1;//设置rs485_de

     else

     rs485_de <= 1'b0;//设置rs485_de

end

 

//打拍寄存一次

always @(posedge I_sysclk) rs485_tx_start_r <= rs485_tx_start;

 

//rs485_wreq,延迟于rs485_fifo_rd_en1个时钟,用于数据同步

always @(posedge I_sysclk) rs485_wreq <= rs485_fifo_rd_en;

 

//例化FIFO IP,FIFO设置标准模式,用户缓存接收到的帧

fifo_generator_0inst_fifo (

  .clkw(I_sysclk),          //写时钟输入

  .wrst(reset_n == 1'b0),   //写复位

  .clkr(I_sysclk_p),          //读时钟输入

  .rrst(reset_n == 1'b0),   //读复位

  .di(rs485_rdata),          //RX接收到的数据

  .we(rs485_rvalid&(rs485_de==1'b0)), // FIFO 使能,当rs485_rvalid有效,写入数据

  .re(rs485_fifo_rd_en),   //FIFO读使能

  .dout(rs485_wdata),         //写数据

  .empty_flag(rs485_fifo_empty)    //FIFO

 

);

 

//例化串口发送模块

uiuart_tx#

(

.BAUD_DIV(SYSCLKHZ/115200 -1)  //设置波特率  

)

uiuart_tx_u

(

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

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

.I_uart_wreq(rs485_wreq),   //串口发送驱动器发送请求

.I_uart_wdata(rs485_wdata), //串口发送,数据

.O_uart_wbusy(rs485_wbusy), //串口发送总线忙

.O_uart_tx(O_rs485_tx)      //串口发送总线

);

 

//例化串口接收模块

uiuart_rx#

(

.BAUD_DIV(SYSCLKHZ/115200 -1) //设置波特率      

)

uiuart_rx_u

(

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

.I_uart_rx_rstn(reset_n),   //系统复位

.I_uart_rx(rs485_rx),       //串口接收总线

.O_uart_rdata(rs485_rdata), //串口接收数据

.O_uart_rvalid(rs485_rvalid)//串口接收数据有效

);  

 

endmodule

4 FPGA工程

关于软件安装、FPGA工程创建、编译、下载等请参考"米联客2023FPGA课程-安路FPGA TD软件快速入门课程.pdf",该章节路径如下:

打开配套代码的FPGA工程如下:

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

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

02_sim:仿真文件或者工程

03_ip:放使用到的ip文件

04_pin:fpgapin脚约束文件或者时序约束文件

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

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

5 RTL仿真

5.1仿真测试文件

`timescale 1ns/1ns  //定义仿真时间刻度/精度

 

module sim_top_tb();

   

localparam     BPS       = 'd115200          ;                //波特率

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

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

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

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

 

reg              sysclk_p;                                    //系统时钟

reg              bsp_clk ;                                    //波特率时钟

reg              uart_tx;                                     //uart 数据发送,该信号接入到,FPGAuart 接收

wire             uart_rx;                                      //uart 数据接收,该信号接入到,FPGAuart 发送

wire             rs485_de;                                  

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

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

 

integer i,j;

 

//例化顶层模块

rs485_top#

(

.SYSCLKHZ(CLK_FRE)    

)

rs485_top_inst

(

.I_sysclk(sysclk_p),

.O_rs485_de(rs485_de),

.I_rs485_rx(uart_tx),

.O_rs485_tx(uart_rx)

);

 

//仿真初始化

initialbegin  

 

//初始化REG寄存器

sysclk_p =0;

bsp_clk  = 0;  

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;//初始化需要发送的第1BYTE

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

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

 

//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

      uart_tx = 1'b0;

 

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

      @(posedge bsp_clk);  //发送

      uart_tx = uart_send_data_r[j];

      end

 

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

       uart_tx = 1'b1;  

 

  end

       @(posedge bsp_clk);

       #200 $finish;              

end

   

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

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

   

 

endmodule

5.2仿真结果

6 实验演示

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

6.1 硬件连接

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

我们使用的是板卡自带的RS485接口的RS485_0接口,为了方便我们测试,我们使用了RS485USB的转接线与我们的电脑端相连接,方便我们的通信

6.2 实验结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/775748.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[米联客-安路飞龙DR1-FPSOC] FPGA基础篇连载-25 ADC模块FEP-DAQ9248采集显示波形方案

软件版本:Anlogic -TD5.9.1-DR1_ES1.1 操作系统:WIN10 64bit 硬件平台:适用安路(Anlogic)FPGA 实验平台:米联客-MLK-L1-CZ06-DR1M90G开发板 板卡获取平台:https://milianke.tmall.com/ 登录"米联客"FPGA社区 http://www.uisrc.com 视频课程、答疑解惑! 1 概述本…

UE4 C++ 多人游戏中的简单聊天窗口

本质 不管是客户端还是服务器在输入文字后,按下回车发送,将触发RPC调用。然后通过RPC将发送者,输入文本等信息,传入到服务器,然后通过多播RPC传播到所有客户端的聊天框。 UI UI利用三个组件 ScrollBox 用于在服务器以及每个客户端上显示消息的载体 TextBlock 本地将信息通…

[米联客-安路飞龙DR1-FPSOC] FPGA基础篇连载-24 基于FPGA简易示波器显示驱动设计

软件版本:Anlogic -TD5.9.1-DR1_ES1.1 操作系统:WIN10 64bit 硬件平台:适用安路(Anlogic)FPGA 实验平台:米联客-MLK-L1-CZ06-DR1M90G开发板 板卡获取平台:https://milianke.tmall.com/ 登录"米联客"FPGA社区 http://www.uisrc.com 视频课程、答疑解惑! 1 概述F…

[米联客-安路飞龙DR1-FPSOC] FPGA基础篇连载-23 RGB转HDMI显示方案

软件版本:Anlogic -TD5.9.1-DR1_ES1.1 操作系统:WIN10 64bit 硬件平台:适用安路(Anlogic)FPGA 实验平台:米联客-MLK-L1-CZ06-DR1M90G开发板 板卡获取平台:https://milianke.tmall.com/ 登录"米联客"FPGA社区 http://www.uisrc.com 视频课程、答疑解惑! 1概述本…

VU13载板,2个FMC和3个FMC+接口,一个QSFP28(100G)光纤口,一个千兆网接口

VU13载板,2个FMC和3个FMC+接口,一个QSFP28(100G)光纤口,一个千兆网接口,8GB内存。基于XILINX Virtex UltraScale+系列,芯片型号为XCVU13P-2FHGB2104I的一款高性能FMC+载板。该板卡集成了3个FMC+(Vita 57.4)和2个FMC(Vita 57.1)连接器。可以与各种FMC子卡进行完美匹配,为用…

无影云电脑设置开机启动项

在msconfig及任务管理器的选项卡中,不可设置启动项。可通过以下步骤设置。Windows设置 应用 启动 打开或关闭相应启动项版权木有,侵权不究,欢迎转载

企业数字化转型的必备钥匙:数据思维|专题报告集

原文链接:https://tecdat.cn/?p=37165 本质上来讲,企业数字化转型,不仅是技术方面的升级,更是企业文化、思维方式的转变。那么,企业数字化转型究竟需要什么样的思维方式? 企业数字化转型,需要什么样的思维方式? 不知道你有没有过这样的感觉:不知道从什么时候开始,和…

【PHP系列】内存马(一)不死马

实验环境工具 phpstudy一、内存马概念 内存马是无文件攻击的一种常用手段,利用中间件的进程执行某些恶意代码。首先要讲的是PHP不死马,实质上就是直接用代码弄一个死循环,强占一个 PHP 进程,并不间断的写一个PHP shell,或者执行一段代码 二、不死马剖析 test.php: <?p…

[米联客-安路飞龙DR1-FPSOC] FPGA基础篇连载-21 VTC视频时序控制器设计

软件版本:Anlogic -TD5.9.1-DR1_ES1.1 操作系统:WIN10 64bit 硬件平台:适用安路(Anlogic)FPGA 实验平台:米联客-MLK-L1-CZ06-DR1M90G开发板 板卡获取平台:https://milianke.tmall.com/ 登录"米联客"FPGA社区 http://www.uisrc.com 视频课程、答疑解惑! 1概述Vi…

【视频讲解】Python用LSTM、Wavenet神经网络、LightGBM预测股价

原文链接:https://tecdat.cn/?p=37184 原文出处:拓端数据部落公众号 分析师:Yuyan Ye 在金融科技的浪潮中,量化投资方法以其数据驱动和模型导向的特性,日益成为资本市场分析的重要工具。特别是,长短期记忆网络(LSTM)、Wavenet以及LightGBM等先进的机器学习算法,因其…

easyFrida指南

easyFrida使用python运行 python easyFrida.py -h usage: easyFrida.py [-h] [-R] [-S S] [-f F | -p P] [--className CLASSNAME] [--plugin PLUGIN] [-l]_____ _ ____ __ _ ___ _ _| ___| __(_) __| | __ _/ _ \/ _` / __| | | | |_ | __| |/ _` |/ _` || __/ (…

生物相容性相关知识

生物相容性常规五项是指哪五项? 编辑于 2024-06-21 10:51 发布于:广东省一、生物相容性常规三项检测是指细胞毒性试验、致敏试验、刺激试验生物相容性。常规五项检测是指细胞毒性试验、致敏试验、刺激试验、全身毒性试验、热原试验。 1.细胞毒性试验是评估生物材料对细胞生…