本帖最后由 芯航线跑堂 于 2016-12-31 17:11 编辑
串口接收模块设计与验证
实验目的:1.串口接收模块设计与验证 2.使用ISSP进行调试与验证设计的数据接收模块 实验平台:芯航线FPGA核心板 实验原理: 在上一讲介绍了串口发送模块的设计思想,其UART发送端发送一个字节数据时序图如图12-1所示。 图12-1 发送一字节数据时序图 这一讲介绍串口接收模块的设计与实现。当对于数据线的每一位进行采样,一般情况下每一位数据的中间点是最稳定的,因此一般应用中,采集中间时刻时的电平即认为是此位数据的电平,如图12-2所示。 图12-2 串口接收时序图 但是在工业应用中,现场往往有非常强的电磁干扰,只采样一次就作为该数据的电平判定,是不保险的,有可能恰好采集到被干扰的信号而导致结果出错,因此需要使用多次采样求概率的方式进行。因此这里提出以下为改进型的单bit数据接收方式示意图,如图12-3。 图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所示。 图12-5 串口接收模块整体框图 表12-1 模块接口列表 经过以上的分析,建立工程子文件夹后,新建一个以名为uart_byte_rx的工程保存在prj下,并在本工程目录的rtl文件夹下新建verilog file文件并以uart_byte_rx.v保存。由上面的分析可以得出如下的信号列表。
这里输入数据相对于系统时钟是个异步信号,因此也需要对其进行同步,这就与按键的输入部分一样,不再详述。
串口接收模块主要构成之一即为波特率时钟生成模块。这里根据上面提到的过采样方式,实际的采样频率是波特率的16倍,因此存在计数值与波特率之间的关系如表12-3所示,其中系统时钟周期为System_clk_period,这里为20ns。
表12-2 采样时钟计算 不同波特率对应采样时钟分频计数值的选择如下。这里依旧使用了一个选择器,来实现本部分功能。
现在产生采样时钟,即波特率时钟的16倍。
采样时钟计数器,计数器清零条件之一bps_cnt == 8'd159 即一个字节接收完毕, (bps_cnt == 8'd12 &&(START_BIT > 2))是实现起始位检测是否出错,详细在后面会解释。
以图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次采样中有一半或以上状态为高电平,这样我们认为真正的起始位尚未到来,不进行数据采集。若不加此操作,进入了一种假采样会使后面的数据接收错误,或者即使接收了也不是真实的数据。
一次采样结束后再将数据一次性传输出去。在原理部分介绍一位数据采集结果中,取出现次数多的电平作为采样结果。6次采样认为大于等于4的数据才是真实数据,这样判断我们可以写为 ,也可以写为, 也可以直接令其等于当前位的第二位数据。011/010/100/101这几个数据分别为3/2/4/5,可以发现只需判断第二位即可。
进行分析和综合直至没有错误以及警告。 为了测试仿真编写测试激励文件,新建uart_byte_rx_tb.v文件保存到testbench文件夹下,这里产生数据的激励使用上一讲的发送数据来做,因此激励文件只需在上一节的激励文件中,修改端口信息、例化本模块以及将发送模块输出的Rs232_Tx连接到接收模块上的Rs232_Rx即可。修改后的激励文件如下:
设置好仿真脚本后进行功能仿真,可以看到如图12-6所示的波形文件,每当一个字节发送结束后,数据输出data_byte_r均会更新输出一次。下图中由于Rs232_Rx仅声明了没有调用,因此无数据显示,可以直接删除。 图12-6 单byte数据接收仿真波形图 为了使用ISSP进行调试与验证设计的数据接收模块,这里使用的是ISSP的探针功能,与上一讲使用的源不同。其主要配置如图12-7所示,并加入到工程中。 图12-7 ISSP主要参数配置 在本工程目录的rtl文件夹下新建verilogfile文件在此文件下输入以下内容并以uart_rx_top.v保存,并设置为顶层文件。这里例化了数据接收模块以及ISSP工具。 只有接收成功后才采集数据,也符合实际使用情况。
分配引脚后全编译无误后下载工程到开发板中。在Quartus II中点击Tools—In-System Source and ProbesEditor启动ISSP,手动选择下载器后,并将数据格式改为设计中的hex格式,持续触发模式。打开串口助手波特率设置为9600、没有校验位、8位数据位以及1bit停止位。 图12-8 串口助手设置界面 图12-9ISSP工具设置界面 在串口助手上先后输入aa、38后在ISSP使用界面可以看到Data会随之对应变化。即设计无误。 图12-10串口助手发送数据 图12-11-1探针接收到数据 图12-11-2探针接收到数据
小梅哥 芯航线电子工作室
|