roc_li

UART通信的Verilog实现

2
阅读(6492)

                                     UART通信的Verilog实现


        作为一个学习FPGA的菜鸟,以前查资料大多数都是通过博客查找,在这里对那些前辈说声感谢。通过博客使我受益匪浅,自己一直想着去写博客。耽搁了好久(借口, 都是太懒),今天刚好有这个机会和时间来写我的第一篇博客。(废话不多说,该进入正题了)

————————————————————————————————————————————

      

       一.串口通信通信协议

          所谓的通信协议是指通信双的一种约定。约定包括: 对数据格式,同步方式,传送速率,传送步骤,检纠错发送及控制字符定义问题的同意规定,通信双方必须遵守的。

      1.串口介绍

           串口(通常指com接口),采用串行通讯通信方式的扩展接口,利用一条传输线将数据一  位一位的顺序传送。与之相对并口,数据一并行传输,但由于通信线的增加,其需要的成本更高。

        特点:    

                 a.通信线简单,只需要一根线就可实现双向通信;

                 b.成本低

                 c.能实现数米到数千米的通信距离(百度百科)

     但也有致命缺点,传输速率慢。由于其串行误码率低,成本低,其在远距离通信也有一定优势。

       2.UART         

               UART(异步串行通信口),它包括有rs232,rs499,rs423,rs422和rs485等接口标准规范和总线标准规范,即UART是异步串行通信接口的总称。(由于历史原因,IBM的PC外部接口配置RS232,成长PC上的默认标准,所以,现在PC上的COM口均为RS232。)UART协议是实现设备之间低速数据通信的标准协议。


        UART使用的是 异步,串行接口。可在同一时刻实现数据的发送与接收为双全公通信(与SPI类似),但在I2C中,某一时刻只能实现接收或者发送,为(单工通信)。

         异步通信一一个字符为传送单位,通信中两个字符之间的时间间隔是不固定的,然而在             同一字符中相邻位的时间间隔是固定的。(串行不再介绍)

       3.波特率

     波特率是衡量数据传输速率的指标。每秒传送的二进制位数。一般都会选择9600,19200,115200等选项。

           例:假设一个字符为10位(1个起始位,8个数据位,一个结束位),每秒传送120个字         符。其波特率为: 10*120 =1200字符/秒=1200波特。  

    二.时序分析

       这里使用两个basys2(MCLK 50MHZ),一个作为主机,一个作为从机。(tx 发送  rx 接收),实现从主机向从机发送一字节数据。           

blob.png

     发送一个字节时序图:

 

blob.png

     从上面时序分析(主机向从机发送一个字节):

     1>数据流在某一波特率下工作,发送期间不能改变。

     2>在空闲转态,数据为高电平。

     3>先发送一个0,作为数据发送的起始信号(从机的响应信号)。

     4>数据先发送最低位, bit0->bit7。

     5>最后发送一个1,作为数据发送的结束信号(数据发送结束)。

    当然完整的应该还包含奇偶校验位等 ,这里不做省去。

     接收时序与发送时序完全相同这里不做详细说明

      三.模块分析

      确定输入输出模块:       

blob.png     

blob.png


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

       这里要说一些我自己的见解(对我触动很大的地方)。Verilog用来描述硬件电路,但知道自己所写下的代码会综合出怎样的电路吗???我想这里是一个大大的问号。 就拿我自己说吧,以前写的代码都是从要描述的功能出发,通过功能,来写Verilog代码,是不清楚要生成什么样的电路。我想这就违背了我们用硬件描述语言学习电路设计的初衷。现在我的认识是通过功能,将其细化,具体化,先构建每一部分的电路,然后依照电路图,照图施工编写代码

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

blob.png

                (尝试在电脑上画过几次上图,但是最好的效果图还是这个,请大家担待一点。)

          //现在照图施工写代码  

发送:    

blob.png

blob.png

blob.png

blob.png

blob.png

接收: 

blob.png

blob.png

blob.png

blob.png

blob.png

blob.png

blob.png

blob.png

blob.png

    这里的篇幅很长,所以就没有给出测试的代码。

blob.png

   这里接了两根线 ,我们只实现了从发送端向接收端发送了一字节数据,为什么要两根线呢???

   共地 处理,在数字电路中这是一种常见处理,保证逻辑电平处于同一标准。


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

           总算告一段落了,心里还是很高兴的。写博客我的看法就是把自己学到的东西整理总结一下,不让它是零散的,碎片化的,锻炼自己,同时分享给大家,共同探讨,期待会收获更多。

    

          当然里面有很多东西还不是很完善,希望大家批评指正,多提宝贵意见。谢谢大家。