当前位置: 首页 > 新闻中心 > 乐球吧nba在线直播
返回
列表

串口监视系统设计

发表时间: 2024-02-18 作者: 乐球吧nba在线直播

  本实验主要学习串口(UART)总线工作原理、协议及相关知识,练习怎么样去使用驱动CP2102模块实现串口通信设计,同时复习上节中扫描式数码管模块的实例化应用。

  顶层模块DisplayCtl通过实例化两个子模块并将对应的信号连接,最终实现串口监视系统的总体设计。UART通信是全双工的,接收和发送是两个独立的设计,本实验只需要接收数据,串口通信有两个重要的条件:传输格式和传输速率,我们大家可以用两个模块分别实现: * Baud:控制UART通信数据传输速率。 * UartRx:依据数据传输速率节拍控制UART通信数据格式。

  在嵌入式领域里说的串口一般就是说的UART接口,通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),通常称作UART,是一种通用串行数据总线,用于异步通信。该总线双向通信,能轻松实现全双工传输和接收。

  在系统或计算机中说的串口一般就是说的RS232接口,也叫COM口,也叫DB9,老式的电脑和台式机上一般都有这个接口,接口有9个引脚,最重要的三个引脚:TXD、RXD、GND,基本通信逻辑与UART完全一致,为增加串口通信的抗干扰的能力,RS232串行通信接口定义了自己的电平标准,采用负逻辑电平,它定义+5~+12V为低电平,而-12~-5V为高电平,相当于在UART的基础上增加驱动器,将原来UART通信电平标准调整为RS232的电平标准,通信原理如下:

  随着技术的发展,各种通信接口种类慢慢的变多,方案越来越稳定,成本越来越低,体积越来越小巧,RS232串口通信接口方案逐渐被抛弃,取而代之的是各种更高速,更稳定,更小巧的接口,USB就是这里面应用较广的,为实现UART通信,一种USB转UART的方案被大范围的应用,常用的USB转UART方案有CP2102、FT232、CH340等等

  我们STEP BaseBoard V3.0底板集成的UART通信模块就是采用CP2102方案,FPGA通过UART总线实现USB和UART之间的数据通信,最终实现FPGA与电脑之间的数据传输,UART通信的时序如下。

  上图为基于CP2102方案的UART通信模块电路图,能够正常的看到CP2102方案很简洁,无需外置USB通信时钟晶体(内部集成),CP2102芯片TXD和RXD分别与FPGA芯片RXD和TXD连接,同时两个信号都连接了LED灯,这样当UART通信时,随着数据传输对应LED灯也会快速闪烁,起到UART通信指示灯的作用。CP2102芯片DTR和RTS通过两个三极管搭建流控电路,连接WIFI模块ESP8266-12F,使用UART模块烧写ESP8266模块的固件时就无需手动进入固件烧写模式了,这个会在后续涉及WIFI通信的实验中详细的介绍,这里能不用理会。

  对于SPI总线,通信双方在总线使能的情况下,通过SCK的上升沿或下降沿触发完成总线数据的采样,这样通信双方就可以准确的接收到对方传送的数据了。对于I2C总线,通信接收方通过SCL的高电平触发完成总线数据的采样。综上,SPI总线C总线中的SCL在通信中起到时钟的作用,接收方都是根据时钟的对应状态采样数据,最终保证通信能够正常进行。

  对于UART总线,TXD和RXD分别用于发送和接收数据,相当于两根独立工作的单线总线,没有了时钟线的配合,那么接收端该如何获取发送端传输的数据呢?实际上也是有方法的,那就是通信双方需要约定好UART总线数据传输的

  通信速率UART的数据传输速度用波特率来描述,也就是UART每秒接收或发送的数据位。例如9600波特率表示每秒钟发送或接收9600比特的数据,即发送端需要将发送的每个数据位保持对应的时间,计算如下:

  因为波特率是协议里约定的,为保证协议的通用性和灵活性,波特率参数有固定的选项,不可以随意设置(如果UART通信双方都是自己编程的,能够准确的通过自己的要求定义个人需要的波特率,这样的一种情况除外),波特率参数选项很多,你们可以打开串口调试助手工具找到波特率配置列表查看,我们很常用的波特率值有以下几种:

  时序格式关于时序格式在前面UART接口介绍部分也简单说了一下,通信过程中时序依次为:起始位、数据位、校验位、停止位、空闲位,其中数据位可以是5~8位,本设计个人会使用8位数据,校验位可以省略,最后确定的时序格式如下:

  前面所说的通信速率和时序格式实际上的意思就是UART通信中的两个重要的参数,需要传输的数据根据通信速率的节拍按照UART的时序格式输出,就能轻松实现UART通信了,可根据下面三个步骤实现。

  对于UART发送数据来说,波特率节拍是自己产生的,数据是自己主动发出的,逻辑相对简单,而当UART接收数据的时候,因为不确定对方何时发送数据,所以要对RX信号持续检测,当检测到有数据传送时,根据约定的波特率节拍采样,可根据下面三个步骤实现。

  通过以上理论,我们不难发现了UART发送和接收数据的整一个流程,两个过程中我们都需要波特率节拍,那么我们就可以设计一个节拍模块Baud,这样我们的发送和接收都可以实例化节拍模块用于产生对应波特率的节拍信号。

  PARA来决定,前面数据接收时序部分了解到,从RX检测到下降沿开始计数器工作,到数据采样点需要半个节拍的时间,而数据发送时只要保证相邻两个节拍点之间的时间为一个计数器周期即可,所以我们大家可以在计数器计数到中值时产生一个脉冲信号充当节拍信号。节拍信号产生程序实现如下:

  valid和txdatain将需要发送的数据传输进来,当txdatavalid有脉冲信号时,txdatain信号为有效数据,拼接起始位和停止位后赋值给txdatar,同时控制节拍使能信号使能并自锁,然后等发送完10bit数据后解除使能。数据发送控制程序实现如下:

  整个UART驱动设计是由两个独立的功能组合而成:发送功能部分和接收功能部分。UART功能总体设计框图如下:

  当我们需要UART发送数据的时候只需要实例化发送功能部分设计,需要UART接收数据的时候只需要实例化接收功能部分设计,例如本设计中FPGA驱动UART模块接收电脑串口调试助手发出的数据,所以我们就只需要实例化接收功能部分设计即可。

  上图为电脑端友善串口调试助手的界面,当我们将硬件连接,在串口设置串口选定串口对应的端口,并按上图配置波特率、数据位、校验位、停止位、流控等,点击开始建立连接,接下来我们就可以在串口发送窗口输入要发送的数据,点击发送后数据传输出去。在发送设置有两个选项:ASCII和Hex ,

  当选择ASCII的时候,通过UART发出的数据是数据窗口中字符的ASCII码值,每个字符的ASCII码值都是8位数据,所以窗口中字符数量与UART传输的次数是相等的,同时数字的值与ASCII码值相差48,例如数字0的ASCII码值为48。

  当选择Hex的时候,通过UART发出的数据(必须是16进制数据)就是数据窗口中的数据本身,这样每次UART传输都会发送两个数字,如果只发送一个数字,则高位补零组成8位数据,例如发送数字1,实际UART传输的数据为8‘h01。

  我们设计一个32位的移位寄存器对应8位数码管,按照BCD码格式每4位表示一个数字,每次接收到UART数据都存到移位寄存器中,同时控制数码管显示对应的数码管位,Decoder程序实现如下:

  endif语句为预编译指令,与C预演类似。如果个人会使用串口助手Hex(16进制)格式发送数据,需要在程序中使用define定义参数HEX_FORMAT,若使用ASCII格式发送数据,则不需要定义。 code verilog串口助手使用Hex格式发送时定义HEX_FORMAT,否则不定义 /code 综合后的设计框图如下:

  #### 实验步骤 - 双击打开Quartus Prime工具软件; - 新建工程:File → New Project Wizard(工程命名,工程目录选择,设备型号选择,EDA工具选择); - 新建文件:File → New → Verilog HDL File,键入设计代码并保存; - 设计综合:双击Tasks窗口页面下的Analysis & Synthesis对代码做综合; - 管脚约束:Assignments → Assignment Editor,根据项目需求分配管脚; - 设计编译:双击Tasks窗口页面下的Compile Design对设计进行整体编译并生成配置文件; - 程序烧录:点击Tools → Programmer打开配置工具,Program进行下载; - 观察设计运行结果。 #### 实验现象 使用两根Micro-USB线同时连接核心板和底板的USB接口,将程序下载到FPGA中,数码管处于不显示的状态,打开电脑上的串口调试助手,按照前面图片配置相应参数,在数据发送窗口输入数字,点击发送观察底板数码管的变化,重新输入数字,点击发送再次观察底板数码管的变化。