搜索
bottom↓
回复: 31

FPGA学习心得--------带有fifo的uart通信(使用线性序列机)

[复制链接]

出0入0汤圆

发表于 2015-9-2 00:32:08 | 显示全部楼层 |阅读模式
本帖最后由 735953120@qq.co 于 2015-9-2 00:32 编辑

       ,小白又来写自己的学习新得来了。希望可以和大家互相交流啊。
   上次发的帖子,有些朋友给小白提出了建议,接下来小白一定改正。今天小白又来分享自己的一个项目,名称是带有异步fifo的串口通信,或许有人觉得没啥,但是小白这个是用线性序列机做的,自己觉得比以前的方法简单多了。
  
一、项目要求
    高速时钟sys_clk=100Mhz,uart_clk=16*9600=153600Hz,波特率=9600,启始位=1,信息位=8,奇偶校验位=0,停止位=1,空闲位=1实现串口的单字节收发数据。实现不同速度的设备能进行通信。
二、设计分析

   首先大家要了解串口通信的通信协议,其对应的数据包为:start + data + none (odd/even) + stop + 空闲位。
  start                     :空闲时数据线路为高电平,当要发送数据是数据线路首先会发送一个低电平的起始信号;
  data                     :数据位,为一个字节;
  none (odd/even)   : 表示校验位, none为校验位、odd表示奇校验、even表示偶校验;
  stop                     :表示停止位;通常停止位的位宽为1、1.5、2;高电平有效;
  空闲位                 :表示当前线路无数据交互,持续高电平;
波特率                  :每秒钟传送的数据位数,常见的波特率有4800、9600、115200等等;

分析完串口通信的通信协议,之后下来根据项目要求进行分析,两个不同速度的设备进行通信时,我们常用的解决方案就是:1采用握手信号,进行确认;2、就是利用异步的fifo或者爽口的ram;
我这次采用的是异步时钟fifo。由要求可知,发送方和接收方都必须要有一个异步的fifo。当双方有这个缓存装置后,不管接收方式不接收发射方,均可发送,接收方只需要在自己接收端的fifo中读取数据报,不需要,和发射端保持同步。因此我们的设计就有了两个模块,发射缓存fifo,接收fifo。接下来就是发送数据和接收数据模块。到此我们已经有了四个模块了,有了这四个模块就够了吗?呵呵,我们忘了最重要的东西时钟,我们的高速设备的时钟为100Mhz,而串行通信的波特率9600,由此可以看出我们又得做两个时钟分频模块。一般情况下,建议大家高速时钟采用PLL进行分频,而低速时钟建议大家采用技数分频的方法(这个是听人家告知的 )。到此我们已经拥有了6个子模块,最后加上一个一个顶层我们得7个模块。下面是我的总体架构图:

三、模块分析

我把七个模块分了5类:一个是顶层模块,二是使用IP核的模块,三是发射模块,四是接收模块,五是计数分频模块。
3.1接下来我先说说,顶层模块,由我的系统框架可知道我的系统输入一共有6个输入(i_clk、i_rst_n、i_txdata、i_wrreq、i_rdreq、i_txd、),3个输出(o_rxd、o_rec_q、o_usedw)下面是我的顶层模块:
3.2使用IP核的模块,有快时钟100Mhz产生模块、发射缓存fifo模块、接收缓存fifo模块。
   3.2.1首先先说一下使用PLL的模块这个模块其实也没多的要讲的东西,主要是我们设置的时候要注意的地方一般情况下打开锁相环时,其会有四个端口,分别是输入时钟,置位端口,时钟输出模块,还有一个就是locked;在这里我主要想说一下这个locked这个端口的设置,它的作用就是输出时钟是否稳定的标志,其为高电平时说明输出时钟已经稳定,这个locked信号是可以设置其计数时钟的个数,我了解的是cyclone II系列是可以设置的不知大神知不知道其它型号是否可以设置,知道的希望可以告诉一下小白 。还有就是在端口设置的时候锁相环的置位端口一定要接高电平。
   3.2.2接下来就是接收缓存异步fifo(双时钟),主要是其端口的设置输入信号有:发射的数据输入端口、读数据时钟、读请求、写时钟、写请求、数据输出、fifo中数据个数计数器。
   3.2.3发射缓存异步fifo(双时钟),主要端口有:数据输入端口、读时钟、读请求、写时钟、写请求、数据输出、空标志信号、满标志信号。
         这三个模块程序应为已经产生所以就不废话了。
3.3发射模块
    我采用的是线性序列机其原理就是设计者必须清楚每一个时钟节拍,都有哪些东西发生变化;举个例子:这个东西就好比我们的课表一样,我们第一节上语文课,第二节上数学课,第三节上英语课,它是按照时钟节拍一拍一拍的按照事先已经知道要发生的步骤做着每件事情,而状态机则不同它的灵活性比较高可以随意的从一个状态跳到另一个状态。状态机里面case(state),而序列机里面则是case(count),count表示的是时钟节拍数。
我们由题目要求可以看出它的uart_clk是波特率的16呗一就是说,每16个波特率才发送一个位数据,具体过程本来是想画图的但是图太恶心了,我还是给大家讲讲吧第一个数据发送需要16个波特率周期,第二个则需要16*1个,往后以此类推。只要遵循串口发送数据包格式,就可以实现数据的发送了。
3.4接收模块
        和发送模块一样也是用序列机实现的,但是它则不一样之处是在与数据接收时需要在数据的正中间进行数据采集,否则在数据位的刚开始或结束的时候进行数据采集的话有可能就采集不到数据。有发射模块可以知道发送一个数据需要16个波特率周期,那么采集的话需要在其中间,所以说采集地一个数据的时候需要16+8波特率周期,则第二个需要24+16*1,往后以此类推,即可完成数据的单字节发送和接收。
3.5计数分频模块
        这个为啥我要说一下呢,因为FPGA虽然有锁相环但不是说每个始终都需要用它,比如说我们现在需要分频9600hz,我们前面用了pll分了个100M的,如果在分频一个9600hz的时钟,分出来的时钟会有一定的误差,而且锁相环分的时钟越多误差越大,建议大家倍频用锁相环,分频的话就用这种方法。用这种方法的话就必须要知道计数分频的计数值,这个该怎么算呢方法很简单fclk(系统)/(2*fclk(需要的时钟) - 1)。
下面是我的代码及仿真波形图希望大家多多提出宝贵意见。这篇帖子没上一片注解详细,大家有那块不明白的,大家相互讨论


作者:会飞的小鸟。

本帖子中包含更多资源

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

x

出0入0汤圆

发表于 2015-9-2 02:21:37 | 显示全部楼层
请问线性序列机和状态机是同一个东西吗

出0入0汤圆

发表于 2015-9-2 06:45:38 | 显示全部楼层
朋友能共享下源代码文件吗?谢谢。

出0入0汤圆

发表于 2015-9-2 06:56:43 | 显示全部楼层
好。我明白状态机和线性序列机的区别了。。。

出0入4汤圆

发表于 2015-9-2 08:55:40 | 显示全部楼层
最近正好在做这个,看看了

出0入0汤圆

发表于 2015-9-2 09:00:02 | 显示全部楼层
lans0625 发表于 2015-9-2 06:56
好。我明白状态机和线性序列机的区别了。。。

这么说线性序列和状态机不是同一种东西,那他们有什么区别呢

出0入0汤圆

发表于 2015-9-2 11:51:07 | 显示全部楼层
kingcrum 发表于 2015-9-2 09:00
这么说线性序列和状态机不是同一种东西,那他们有什么区别呢

线性序列机下一步跳到哪里是确定的,只有一条路可走。状态机下一步到哪里是不确定的,可以有多条路走。。。。

出0入4汤圆

发表于 2015-9-2 12:25:24 来自手机 | 显示全部楼层
莫非仿顺序操作就是传说中的线性序列机?

出0入0汤圆

发表于 2015-9-2 13:09:04 | 显示全部楼层
lans0625 发表于 2015-9-2 11:51
线性序列机下一步跳到哪里是确定的,只有一条路可走。状态机下一步到哪里是不确定的,可以有多条路走。。 ...

言简意赅,那其实他们相差不大

出0入0汤圆

发表于 2015-9-2 13:11:23 | 显示全部楼层
kingcrum 发表于 2015-9-2 13:09
言简意赅,那其实他们相差不大

线性序列机应该算是状态机的特殊形式。。。

出0入0汤圆

 楼主| 发表于 2015-9-2 21:16:42 | 显示全部楼层
kingcrum 发表于 2015-9-2 02:21
请问线性序列机和状态机是同一个东西吗

不是的,两个概念;我前面按键计数器中的,按键消抖是用状态机写的,这个串口是用序列机写的你看看吧

出0入0汤圆

 楼主| 发表于 2015-9-2 21:17:47 | 显示全部楼层
lans0625 发表于 2015-9-2 06:56
好。我明白状态机和线性序列机的区别了。。。

哈哈,怎样没骗你吧,简单吧,不过序列机的坏处就是太死板了,不灵活

出0入0汤圆

 楼主| 发表于 2015-9-2 21:18:51 | 显示全部楼层
flyfox8 发表于 2015-9-2 12:25
莫非仿顺序操作就是传说中的线性序列机?

差不多,是这个思想;前提是你要知道你下一步好干什么事,否则这个是做不了的

出0入0汤圆

 楼主| 发表于 2015-9-2 21:19:41 | 显示全部楼层
lans0625 发表于 2015-9-2 11:51
线性序列机下一步跳到哪里是确定的,只有一条路可走。状态机下一步到哪里是不确定的,可以有多条路走。。 ...

不愧是元老级别的

出0入0汤圆

 楼主| 发表于 2015-9-2 21:20:16 | 显示全部楼层
jiulong855@.163 发表于 2015-9-2 08:55
最近正好在做这个,看看了

看了给提点意见和建议,我好改正谢谢

出0入0汤圆

 楼主| 发表于 2015-9-2 21:22:29 | 显示全部楼层
iwqt1983 发表于 2015-9-2 06:45
朋友能共享下源代码文件吗?谢谢。

这个就是源码,只有锁相环和fifo的没有这个你直接去调用ip生成就好了。你自己敲上一遍,有助于理解;,不懂咱两讨论,直接给代码的话,你拉过来用没意思

出0入0汤圆

 楼主| 发表于 2015-9-2 21:24:31 | 显示全部楼层
kingcrum 发表于 2015-9-2 13:09
言简意赅,那其实他们相差不大

这个这样说就不对了,差别还是有的;一个灵活一个死板,优化过的线性序列机的速度可以是状态机的两位数甚至三位数的倍数

出0入0汤圆

 楼主| 发表于 2015-9-2 21:25:23 | 显示全部楼层
lans0625 发表于 2015-9-2 13:11
线性序列机应该算是状态机的特殊形式。。。

就是状态机的顺序执行,无跳转的状态机

出0入0汤圆

发表于 2015-9-2 21:28:57 | 显示全部楼层
Xilinx有一个利用SLR的参考UART收发器的AppNote,可以参考一下。

串并转换用串行移位寄存器的多,因为采样点和权重比较一般是固定位置的。

如果没有意外,你的代码会出来一个+1计数器,一堆比较器,每个REG基于CE的控制,资源消耗会比较大。当然,写起来会比较省事儿了。

出0入0汤圆

 楼主| 发表于 2015-9-2 21:32:19 | 显示全部楼层
dr2001 发表于 2015-9-2 21:28
Xilinx有一个利用SLR的参考UART收发器的AppNote,可以参考一下。

串并转换用串行移位寄存器的多,因为采样 ...

恩恩,好的谢谢你的建议;小白会看看的,刚开始学希望大神多多提点意见。

出0入0汤圆

 楼主| 发表于 2015-9-2 22:03:22 | 显示全部楼层
dr2001 发表于 2015-9-2 21:28
Xilinx有一个利用SLR的参考UART收发器的AppNote,可以参考一下。

串并转换用串行移位寄存器的多,因为采样 ...

刚看了一下发生和接收的门级网表,没那么惨吧

本帖子中包含更多资源

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

x

出0入0汤圆

发表于 2015-9-2 22:56:26 | 显示全部楼层
735953120@qq.co 发表于 2015-9-2 21:17
哈哈,怎样没骗你吧,简单吧,不过序列机的坏处就是太死板了,不灵活

它的长处是时间效率。。。

出0入0汤圆

发表于 2015-9-2 23:40:45 | 显示全部楼层
楼主 可否把工程代码打包上传一下,供大家参考学习一把

出0入0汤圆

 楼主| 发表于 2015-9-3 22:23:01 | 显示全部楼层
jay778778 发表于 2015-9-2 23:40
楼主 可否把工程代码打包上传一下,供大家参考学习一把

工程太大提示上传不了,代码基本上就是上面的图片中的除过3个ip的没有,不过这个你根据截图中的端口名直接调用即可

出0入0汤圆

 楼主| 发表于 2015-9-3 22:29:28 | 显示全部楼层
链接:http://pan.baidu.com/s/1sjEBNSp 密码:5z8k

出20入0汤圆

发表于 2015-9-4 17:07:15 | 显示全部楼层
  第一次听说这个线性序列机的概念。

出0入0汤圆

 楼主| 发表于 2015-9-4 18:34:36 | 显示全部楼层
talkingbeast 发表于 2015-9-4 17:07
第一次听说这个线性序列机的概念。

国内的FPGA资料中基本没有讲这个的,不信你去百度一下

出0入0汤圆

发表于 2015-9-4 19:20:30 | 显示全部楼层
735953120@qq.co 发表于 2015-9-4 18:34
国内的FPGA资料中基本没有讲这个的,不信你去百度一下

是哪位大牛第一个弄出来的?

出0入0汤圆

 楼主| 发表于 2015-9-5 23:30:46 | 显示全部楼层
lans0625 发表于 2015-9-4 19:20
是哪位大牛第一个弄出来的?

不知道,我的还是看人家的学来的

出0入0汤圆

发表于 2016-8-9 14:07:21 | 显示全部楼层
支持一下。支持一下。支持一下。

出0入0汤圆

发表于 2016-8-9 16:35:48 | 显示全部楼层
原理序列机是这个意思呀

出0入0汤圆

发表于 2016-8-25 13:28:57 | 显示全部楼层
蛮好的,学习一下
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-20 20:13

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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