集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 6414|回复: 8

零基础学FPGA(十)牛刀小试——串行口通信电路设计

[复制链接]
小墨同学 该用户已被删除
小墨同学 发表于 2014-11-20 13:34:00 | 显示全部楼层 |阅读模式
本帖最后由 小墨同学 于 2014-11-20 17:00 编辑

以前在学单片机的时候,觉得串口通信其实很简单,只要一个指令数据就能轻易的接收或者发送。前几天试着用FPGA实现,发现里面的学问还不少,并没有想象的那么简单。当然代码肯定是参考别人的,不过我还是认真研究了整段代码的,下面的程序就是我在看懂了别人代码后自己敲的,花了也不少时间,理解的也差不多,下面我就在这里给那些和我一样的初学者介绍一下吧,解释的不对的地方还望各位大神指正,大家好一起学习~
     1、顶层模块
      写程序都一样,不能多有的程序都写在一个模块里,那样看起来很麻烦,出了错误也不好维护,对于一些小的程序我们可以写在一个模块里,但程序一旦复杂起来还是要懂得模块化编程的,对于顶层模块,最好是只写接口就好了,例如:




     这段代码中,rx_232是我们的底层模块名,后面跟着的那个rx呢是我们自己取的名字,是任意的。后面的一大串呢就是接口,为了直观呢,建议大家采用我的这种写法,看上去比较清楚明白,括号里面的接口是我们顶层文件的接口,括号外面的是我们调用底层模块的接口,这些接口要一一对应正确才能保证数据之间的传输。
     在顶层模块中,我们只定义了数据输入接口,用来接收数据,数据输出接口,用于发送数据,时钟接口,和复位接口。这四个接口是有输入输出关系的,对于其他的接口,是属于我们整个模块内部的接口,是模块与模块之间的接口,既非输入,也非输出,相当于一根导线一样,所以我们把他们定义成wire型变量





  2、波特率选择模块
       单片机或者计算机在串口通信时的传输速率用波特率表示,9600bps表示的就是每秒钟传送9600位的数据
这里之所以计数到5027,在这里算一下。
  1秒传送9600位,那么传送一位的时间就可以算出,即1s=1000_000_000ns,所以传送一位数据需要1000_000_000/9600=
104166ns,而我们的时钟周期为20ns,因此需要计数到104166/20=5028个时钟周期

下面是串口通信时序图


我再来解释一下这个图吧,我当时学单片机的时候还真是没怎么重视这张图,只知道只要一个指令就可以发送,没有真正搞清楚是怎么发送和接受的,那就在这里复习一下吧
   计算机和单片机之间进行通信,这里用的是rs232通信方式,即通信之前,计算机和单片机之前要设定好相同的波特率,只有波特率相同了才能进行通信。
    其次,计算机发送数据时要先发送一个起始位,一般是低电平,后面跟着的是8位数据位,奇偶校验位,停止位等,当起始位低电平信号传送到我们的接收端口时,在接收模块中会发送一个命令给波特率时钟计数器,开始计时,计时到一半的时候会产生一个采样高脉冲信号,当接收模块检测到这个高脉冲之后就会将数据存到寄存器中,当检测到第11个脉冲信号时,也就是代表一帧的数据接收完毕,发送模块就给波特率选择模块发送一个停止信号告诉它停止计时。同时,当数据接收完毕之后也会产生一个信号告诉发送模块,信号已经接收完毕,准备发送,这个时候发送模块再给波特率计时模块发送一个信号开始计时,计数到某一位的中间时产生一个采样信号,当发送模块检测到采样信号之后就将寄存器里的数据送到发送端,每次只送一位,这样就实现了数据的接收与发送。

下面是波特率计时模块的主要程序部分



3、数据接收模块

      在接收模块中,为了准确的检测计算机发送来的数据起始位的那个低电平信号,用到了边沿脉冲检测法,可以有效的避免毛刺现象带来的问题

下面是发送部分的主要程序段


    4、数据发送模块

发送模块原理上和接受模块是一样的,不同点就是接收模块通过边沿检测法检测起始位低电平信号来启动接收数据,而发送模块是通过检测数据发送完毕后,我们认为的置一个低电平信号,发送模块通过检测这个低电平信号来启动发送。见下图



下面是生成的RTL视图





下面是测试结果





此外,以后小墨同学的文章将在EDNchina和北京至芯科技官方技术论坛同时更新,至芯科技的官方技术论坛也有很多的资料供大家下载,里面也有小墨的专题板块,希望广大网友和爱好者的大力支持~
http://www.fpgaw.com/
小墨同学专版网址
http://www.fpgaw.com/thread-78527-1-1.html
下面是至芯科技官方网站,夏宇闻教授和那里的老师都超好的~有意愿接受FPGA培训的可以找工作人员咨询
http://www.zxopen.com/
       以后小墨同学的教程会跟这款开发板配套,想跟小墨同学一起学习,一起进步的的可以考虑一下购买一块开发板,毕竟学习要舍得投资嘛,下面是开发板淘宝链接
http://item.taobao.com/item.htm? ... ;abbucket=13#detail

下面提供源代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要注册

x
scybyq 发表于 2014-12-19 13:18:33 | 显示全部楼层
好东东,谢谢了
小墨同学 该用户已被删除
 楼主| 小墨同学 发表于 2014-12-19 22:57:01 | 显示全部楼层
scybyq 发表于 2014-12-19 13:18
好东东,谢谢了

也谢谢你的支持
qazmkob 发表于 2015-11-30 20:16:48 | 显示全部楼层
非常感谢小墨同学的分享!!支持!!~
一叶遮秋 发表于 2017-8-13 11:18:43 | 显示全部楼层
感觉还不错!
一叶遮秋 发表于 2017-8-14 15:40:31 | 显示全部楼层
波特率模块的 cnt计数是5207而不是5027这个地方有笔误
zhangyukun 发表于 2017-8-15 08:30:57 | 显示全部楼层
谢谢楼主分享
linuvzg 发表于 2022-5-1 14:37:24 | 显示全部楼层
本帖最后由 linuvzg 于 2022-5-27 14:55 编辑

路过我是来打酱油的,给力一下!























如冷氣機發生故障或機身、機件出現老化現象,應立即找尋專業的冷氣機維修公司幫忙進行維修 分體式冷氣機 外 機或更換。「冷氣通」師傅會使用高壓噴射型的清潔科技,細心地清洗風喉式冷氣機的扇葉與過濾網等配件。












您需要登录后才可以回帖 登录 | 我要注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|小黑屋|手机版|Archiver|fpga论坛|fpga设计论坛 ( 京ICP备20003123号-1 )

GMT+8, 2024-11-16 08:36 , Processed in 0.067461 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表