基于 FPGA 实现多路UART/SPI通信系统



By
jonson
08 12 月 23
0
comment

大侠好,欢迎来到FPGA技术江湖,江湖偌大,相见即是缘分。大侠可以关注FPGA技术江湖,在“闯荡江湖”、”行侠仗义”栏里获取其他感兴趣的资源,或者一起煮酒言欢。“煮酒言欢”进入IC技术圈,这里有近50个IC技术公众号。

第一部分 设计概述 /Design Introduction

本次的设计为多路UART/SPI通信系统,可以实现一对多的通信。系统可以运行在UART模式,也可以运行在SPI模式。我选择这一课题的原因主要是目前我所在的实验室需要写基于UART的快速通信。这一课题既可以帮助我巩固之前学习的知识,又可以为我后面的项目做准备。在完成课题的过程中,主要用到了FPGA状态机、总线等方面的知识。这一课题可以应用在需要高速异步串行或同步串行通信的应用场合,如实时控制、监测等。

当系统运行在UART模式下,可以实现一个发送端最多向四个接收端发送信息,且有效信息中包含地址码,接收端可以根据发送端发送的地址码判断该信息是否是发送给自己的,实现信号线复用。UART通信简单,仅需要一根信号线,但是其缺点是只能实现单向通信,接收端无法给发送端反向发送数据。但是这一缺点也可以通过采用两个UART系统来弥补。

当系统运行在SPI模式下,可以实现一个主机与多个从机之间的通信,且在通信过程中,系统是全双工的。主机通过选择性拉低某一个或者某几个从机的片选信号,实现对于从机的选择。

第二部分 系统组成及功能说明 /System Construction & Function Description

计划功能

程序实现UART和SPI的通信,并可以通过按键的方式在两种模式之间切换。在UART模式下,发送端给接收端发送一串数据,接收端判断是否和已知数据相符。如果相符则点亮LED,如果不符则不点亮。在SPI模式下,主机给从机、从机给主机同时发送数据,若接收到的数据和已知数据相符,则点亮LED,如果不符,则不点亮。同时,UART和SPI均有寻址功能。UART的寻址方式是在数据位前面加两位地址位,实现对最多四个接收端的区分;SPI的寻址方式是通过拉低需要选定的从机的SS信号,实现对最多四个接收端的区分。

目前所有的功能均已实现。最初计划通信系统在两个不同的FPGA板上实现,但是另外一块板出了问题,目前只能在一块板上验证。发送端和接收端、主机和从机均写在一块板子里,内部的通信线也直接用FPGA内部的线连接。总的框图如下。其中,inst_clkwiz是系统自带的分频器,将外部100M的始终编程10M,降低了通信速率,但是可以使通信系统更加稳定;inst_SPIpart是SPI通信模块;inst_UART是UART通信模块;inst_modeselection是通信模式选择模块。

SPI内部的构造如下。其中,inst_SPItop为从机;inst_SPItop1为主机。当主机的信号选择信号为0111时系统中的从机被选中。在主机、从机内部, inst_SPImaster为SPI主机端口,inst_SPIslave为SPI从机端口,inst_leddriver为led驱动电路,负责判断接收到的信号和已知信号是否一致,当接收到的信号和一直信号一致时,驱动LED点亮。

UART部分的框图如下。其中,inst_UARTtop1为发送端;inst_UARTtop为接收端。发送端给接收端发送数据。当接收端接收到的数据和已知数据相同,驱动LED点亮。

第三部分 完成情况及性能参数 /Final Design & Performance Parameters

除了两块板相互通信以外,所有的功能均可以在一块板子上实现。

测试方法:

接通电源后,首先按动RST,对板卡进行复位,复位后的通信模式默认为UART模式。红色的LED被点亮。这证明在该模式下,接收端已经完整接收到了十位信号,完成了地址的判断。将接收到的信号传送给LED驱动模块后,经过判断符合已知的8’hbb。LED2信号置位,点亮红色LED2,而在UART模式下,绿色的LED1不被点亮。综合以上现象,UART模式可以运行。

按动KEY1,红色和绿色的LED均被点亮,且绿色LED亮度弱于红色LED。红色LED点亮证明主机成功选中从机、发送给从机数据且从机已经接收到主机发来的数据,且经过LED驱动模块的判断,和已知数据相符。绿色LED灯点亮证明从机给主机也成功发送数据,且也和已知数据相符。绿色LED亮度弱于红色LED的原因是,主机只接了一个从机,因此只有1/4的时间,接收到的信号和已知信号相同,在其他3/4时间中接收到的均为8’bzz,和已知信号不符,不点亮LED。因此亮度更弱。

KEY1,系统又转换到UART模式,绿色LED熄灭,红色LED点亮。

发表回复