OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5561|回复: 0

【FPGA开源教程连载】第十二章 串口接收模块设计与验证

[复制链接]

58

主题

71

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
266
金钱
266
注册时间
2016-12-14
在线时间
44 小时
发表于 2016-12-31 16:21:58 | 显示全部楼层 |阅读模式
本帖最后由 芯航线跑堂 于 2016-12-31 17:11 编辑

串口接收模块设计与验证





实验目的:1.串口接收模块设计与验证
2.使用ISSP进行调试与验证设计的数据接收模块
实验平台:芯航线FPGA核心板
图片1.jpg
实验原理:
       在上一讲介绍了串口发送模块的设计思想,其UART发送端发送一个字节数据时序图如图12-1所示。
图片2.jpg
12-1 发送一字节数据时序图
这一讲介绍串口接收模块的设计与实现。当对于数据线的每一位进行采样,一般情况下每一位数据的中间点是最稳定的,因此一般应用中,采集中间时刻时的电平即认为是此位数据的电平,如图12-2所示。
图片3.jpg
12-2 串口接收时序图
但是在工业应用中,现场往往有非常强的电磁干扰,只采样一次就作为该数据的电平判定,是不保险的,有可能恰好采集到被干扰的信号而导致结果出错,因此需要使用多次采样求概率的方式进行。因此这里提出以下为改进型的单bit数据接收方式示意图,如图12-3。
图片4.jpg
12-3 改进型串口接收方式示意图
在图12-3中,将每一位数据又平均分成了16小段,对于Bit_x这一位数据,考虑到数据在刚刚发生变化和即将发生变化的这一时期,数据极有可能不稳定的(用红色标出的两段),在这两个时间段采集数据,很有可能得到错误的结果,因此判定这两段时间的电平无效,采集时直接忽略。而中间这一时间段(用绿色标出),数据本身是比较稳定的,一般都代表了正确的结果。也就是前面提到的中间测量方式,但是也不排除该段数据受强电磁干扰而出现错误的电平脉冲,因此对这一段电平,进行多次采样,并求高低电平发生的概率,6次采集结果中,取出现次数多的电平作为采样结果。例如,采样6次的结果分别为1/1/1/1/0/1/,则取电平结果为1,若为0/0/1/0/0/0,,则取电平结果为0,当6次采样结果中1和0各占一半(各3次),则可判断当前通信线路环境非常恶劣,数据不具有可靠性,不进行处理。
这样串口接收模块主要就需要包含起始位检测模块、波特率产生模块以及数据接收模块。
实验步骤:
基于以上原理,串口接收模块整体框图如图12-5所示,其接口列表如表12-1所示。
图片5.jpg
12-5 串口接收模块整体框图
图片6.jpg
12-1 模块接口列表
经过以上的分析,建立工程子文件夹后,新建一个以名为uart_byte_rx的工程保存在prj下,并在本工程目录的rtl文件夹下新建verilog file文件并以uart_byte_rx.v保存。由上面的分析可以得出如下的信号列表。
图片7.jpg


这里输入数据相对于系统时钟是个异步信号,因此也需要对其进行同步,这就与按键的输入部分一样,不再详述。
图片8.jpg 图片9.jpg




串口接收模块主要构成之一即为波特率时钟生成模块。这里根据上面提到的过采样方式,实际的采样频率是波特率的16倍,因此存在计数值与波特率之间的关系如表12-3所示,其中系统时钟周期为System_clk_period,这里为20ns。
图片10.jpg

12-2 采样时钟计算
       不同波特率对应采样时钟分频计数值的选择如下。这里依旧使用了一个选择器,来实现本部分功能。
图片11.jpg


现在产生采样时钟,即波特率时钟的16倍。
图片12.jpg


采样时钟计数器,计数器清零条件之一bps_cnt == 8'd159 即一个字节接收完毕,  (bps_cnt == 8'd12 &&(START_BIT > 2))是实现起始位检测是否出错,详细在后面会解释。

图片13.jpg


以图12-3起始位为例,实现数据接收,中间时间段的bps_cnt值分别为6、7、8、9、10、11,然后直接累加本位数据。然后下一位需要进行计算时的值即为bps_cnt加16,也就是22、23、24、25、26、27,也直接累加本位数据。以此类推可以得到其他位的数据。
       现解释为何在上面清零条件之一为(bps_cnt == 8'd12 && (START_BIT > 2)),理想情况下(真正的起始位)也就是当bps_cnt计数值为12时,START_BIT的计算值应该为0。如果此时START_BIT的计算值大于2,也就代表着在6次采样中有一半或以上状态为高电平,这样我们认为真正的起始位尚未到来,不进行数据采集。若不加此操作,进入了一种假采样会使后面的数据接收错误,或者即使接收了也不是真实的数据。
图片14.jpg


一次采样结束后再将数据一次性传输出去。在原理部分介绍一位数据采集结果中,取出现次数多的电平作为采样结果。6次采样认为大于等于4的数据才是真实数据,这样判断我们可以写为 ,也可以写为, 也可以直接令其等于当前位的第二位数据。011/010/100/101这几个数据分别为3/2/4/5,可以发现只需判断第二位即可。
图片15.jpg 图片16.jpg 图片17.jpg


进行分析和综合直至没有错误以及警告。
为了测试仿真编写测试激励文件,新建uart_byte_rx_tb.v文件保存到testbench文件夹下,这里产生数据的激励使用上一讲的发送数据来做,因此激励文件只需在上一节的激励文件中,修改端口信息、例化本模块以及将发送模块输出的Rs232_Tx连接到接收模块上的Rs232_Rx即可。修改后的激励文件如下:

图片18.jpg 图片19.jpg 图片20.jpg


设置好仿真脚本后进行功能仿真,可以看到如图12-6所示的波形文件,每当一个字节发送结束后,数据输出data_byte_r均会更新输出一次。下图中由于Rs232_Rx仅声明了没有调用,因此无数据显示,可以直接删除。
图片21.jpg
12-6 byte数据接收仿真波形图
为了使用ISSP进行调试与验证设计的数据接收模块,这里使用的是ISSP的探针功能,与上一讲使用的源不同。其主要配置如图12-7所示,并加入到工程中。
图片22.jpg
12-7 ISSP主要参数配置
在本工程目录的rtl文件夹下新建verilogfile文件在此文件下输入以下内容并以uart_rx_top.v保存,并设置为顶层文件。这里例化了数据接收模块以及ISSP工具。 只有接收成功后才采集数据,也符合实际使用情况。
图片23.jpg 图片24.jpg


分配引脚后全编译无误后下载工程到开发板中。在Quartus II中点击Tools—In-System Source and ProbesEditor启动ISSP,手动选择下载器后,并将数据格式改为设计中的hex格式,持续触发模式。打开串口助手波特率设置为9600、没有校验位、8位数据位以及1bit停止位。
图片25.jpg
12-8 串口助手设置界面
图片26.jpg
12-9ISSP工具设置界面
       在串口助手上先后输入aa38后在ISSP使用界面可以看到Data会随之对应变化。即设计无误。
图片27.jpg
12-10串口助手发送数据
图片28.jpg
12-11-1探针接收到数据
图片29.jpg
12-11-2探针接收到数据




小梅哥
芯航线电子工作室


关于学习资料,小梅哥系列所有能够开放的资料和更新(包括视频教程,程序代码,教程文档,工具软件,开发板资料)都会发布在我的云分享。(记得订阅)链接:http://yun.baidu.com/share/home?uk=402885837&view=share#category/type=0


class12_uart_rx.rar

1.25 MB, 下载次数: 96

第十二章串口接收模块设计与验证.pdf

983.52 KB, 下载次数: 83

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-7-1 06:21

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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