一、串口简介
串口作为常用的三大低速总线(UART、SPI、IIC)之一,可以实现全双工,即可以同时进行发送数据和接收数据。数据传输过程中是不需要时钟的,UART通信只有两根信号线,一根是发送数据端口线叫tx(Transmitter),一根是接收数据端口线叫rx(Receiver)。其rx与tx是对自身来讲的,rx为接收数据端,tx为发送数据端。
二、模块
以RS232通信协议简介为例:
1、RS232是UART的一种,没有时钟线,只有两根数据线,分别是rx和tx,这两根线都是1bit位宽的。其中rx是接收数据的线,tx是发送数据的线。(每次传输都是1帧(8bit)的传输,也有可能加入了校验位等11bit构成)
2、rx通路的位宽为1bit,PC机通过串口调试助手往FPGA芯片发8bit数据时,FPGA通过串口线rx一位一位地接收,从最低位到最高位依次接收,最后在FPGA里面位拼接成8bit的数据。(注意:是LSB低位先发)
3、tx通路的位宽为1bit,FPGA通过串口往PC机发8bit数据时,FPGA把8bit数据通过tx通路一位一位的传给PC机,从最低位到最高位依次发送,最后上位机通过串口助手按照RS232协议把这一位一位的数据位拼接成8bit数据。
4、串口数据的发送与接收是基于帧结构的,即一帧一帧的发送与接收数据。每一帧除了中间包含8bit有效数据外,还在每一帧的开头都必须有一个起始位,且固定为0;在每一帧的结束时也必须有一个停止位,且固定为1,即最基本的帧结构(不包括校验等)有10bit。在不发送或者不接收数据的情况下,rx和tx处于空闲状 态,此时rx和tx线都保持高电平(也就是默认初始状态下为高电平),如果有数据帧传输时,首先会有一个起始位,然后是8bit的数据位,接着有1bit的停止位,然后rx和tx继续进入空闲状态,然后等待下一次的数据传输。如图 下图所示为一个最基本的RS232帧结构。
有时候会检验数据的正确性而加入校验位,加入在停止位之前,8bit之后分为奇校验与偶校验。
奇校验(odd parity):如果数据位中’1’的数目是偶数,则校验位为’1’,如果’1’的数目是奇
数,校验位为’0’。
偶校验(even parity):如果数据为中’1’的数目是偶数,则校验位为’0’,如果为奇数,校验位
为’1’。
例如:当所有这个字节的数据中出现奇数个1,比如,1000110(0)则必须添0,就是保证数据中1的个数为奇数,偶校验反之。
如图:为奇校验
tx端发送:
rx接收端:
通过自身异或(8bit数据+1校验位)来检验数据传输的正确性。
模块设计:如图所示.
我们创建四个模块,一个顶层模块内含三个模块,从左往右分别是:数据接收端口——>把串行数据转换成FPGA内部传输的并行数据。中心控制模块:——>把传过来的数据通过fifo寄存并进行相应的逻辑设计。发送模块:——>把并行数据转换成串行数据发送出去。
三、各模块思路:
1.uart_rx:上位机发送数据给我们的芯片,我们的接收端口要接收相应的数据(串行),要转化为FPGA能够识别的并行数据,传输过程当中我们首先要让接收端口识别到我们的起始位的话要对接收端进行二级寄存器打拍,为的是检测到**下降沿(起始位)为开始传输的标志。然后开始设计1bit计数器的计数本次用9600比特率(1bit计数器计数的最大值与传输的bit率有关cnt = (1s * 10^9)ns / 9600bit)ns / 20ns ≈ 5208个系统时钟周期,即每个bit数据之间的间隔要在50MHz的时钟频率下计数5208次。)同时设计,8bit的长时计数器(如果有校验位等可以适当增加)**下降沿开始拉高,直到一帧数据传输完成拉低(目的是让1bit计数器以它为条件开始计数才能保证数据传输完整性与无误也运用与按键消抖中,如果以下降沿为开始条件计数会因为消抖过程中意外抖动而导致重新计数以至于输出结果不准确。)到数据的采集过程,那传进来的数据什么时候进行采集呢?(当然是时钟周期的中点进行数据的采集这个时候数据最稳定)我们把计数器为其一个周期一般的时候把输入的数据放到我们的并行传输的寄存器当中。同时进行移位操作。
2.uart_ctrl:用来判断数据传输过程中,发送模块是否会还没有发完数据,接收模块还在一直往发送模块发,导致拥堵等情况。所以用到fifo来存储数据并判断每次发送模块是否已传完数据,再给它发数据。注意:fifo位宽为8(取决于传输一帧有多少个),我用的是深度256,一帧就是一深度这里自己可以任选深度。校验位的加(tx)与检验(rx)不经过fifo,只是在发送端与接收端加与检验。创建如下并一定记住fifo的相应的信号的功能与调用!!!!!
3.uart_tx:tx与rx代码过程差不多,也需要开始的标志,bit计数器,帧计数器,长时计数器。但是位移操作会有一定不一样,且发送时候需要加上起始位与结束位。
四、总结:
串口接收上位机数据并进行数据的串转并(有每bit传输完的标志),然后传输到fifo中寄存并进行判断tx端的工作状态是否发送完毕,是否开始下一帧数据的发送。然后到tx端,能够加上奇偶校验位都行,然后接收端检验,不经过fifo。概要:接收端就是把接收到的数据寄存到8位的寄存器中,发送端就是把寄存器中的数据一位一位的取出到总线上进行发送传输同时注意还有一个判断发送端是否在忙的标志信号(flag)。