• 【连载】【FPGA黑金开发板】Verilog HDL那些事儿串口发送|接收 封装(十九)


    声明:本文为原创作品,版权归akuei2及黑金动力社区(http://www.heijin.org)共同所有,如需转载,请注明出处http://www.cnblogs.com/kingst/

    2

    5.5 实验十八:串口发送|接收 封装

    5.3章的蜂鸣器封装实验中,介绍了FIFO在封装中用于缓冲输入信息,从而使得该接口可以独立于上一层模块。相反的,在5.4章的PS2封装试验中,FIFO用于输出信息的缓冲。

    本章实验基本上和上两章实验很类似,FIFO都是由于输入缓冲,和输出缓冲,从而使得接口独立于上一层模块。在这里笔者再重复一下:当我们在练习单片机的时候,常常会误会,串口发送和串口接收都是基于在一起,实际上它们是各自独立的。对于这件事情,串口发送和抽口接收,必须拥有各自的接口。

    串口发送接口:

    clip_image002

    tx_interface.v 组合模块中的“串口发送模块”是在实验中完成建模的。此外在该组合模块中,最左方的是用于缓冲输入信息的FIFO模块(16个深度)。然而中间的控制模块,只用于“协调控制”FIFO模块和串口发送模块(~名字很囧)

    图形”已经将tx_interface.v 表达的非常直接了,具体的操作我们还是直接看源码:

    tx_top_control_module.v

    clip_image004

    clip_image005

    21~45行是该控制模块的核心部分。当i步骤等于0的时候(31行),如果FIFO模块不为空的话,i就递增以示下一个步骤。

    34~38行,isRead 在步骤 1 被拉高,然后在步骤 2 又被拉低,该意思是从FIFO读取一个深度的数据。有一点,必须注意的是,在11行定义的TX_Data输出是直接由FIFO_Read_Data7行)驱动(51行)。

    40行,步骤3 isTX 标志寄存器拉高,以示使能(启动)串口发送模块(42行)。

    当串口发送模块完成一次性的发送操作后,会反馈一个完成信号,然后if条件(41行)会成立,isTX被拉低,和i被赋予0,以示重复另一次发送操作。

    tx_interface.v

    clip_image007


    clip_image008

    完成后的扩展图:

    clip_image010

    串口接收接口:

    clip_image012

    上图是 rx_interface.v 的组合模块。串口接收模块是基于实验十建模而成的。rx_interface.v 的功能大致上如下:

    该控制模块一开始就使能串口接收模块,当串口接收模块完成一次性的读取操作以后,就会反馈数据 RX_Data 和完成信号RX_Done_Sig。当串口接收顶层控制模块(名字依然很囧)接收到串口接收模块反馈的完成信号,就会不使能串口接收模块。然后该控制模块就会将 RX_Data 反馈回来的数据缓冲致FIFO模块。

    rx_top_control_module.v

    clip_image014

    21~44行是该控制模块的核心功能。在步骤031)行,isRX被拉高,此时串口接收模块就被使能(32行)。当串口接收模块完成一次性的读取操作,串口接收模块就会反馈一个完成信号。然而在32 if条件就会成立,isRX被拉低,然后i递增以示下一个步骤。

    36行步骤1,如果FIFO不为满状态(Full_Sig拉低),i递增以示下一个步骤。

    38~42行,在步骤2isWrite被拉高,然后在步骤3, isWrite被拉低。在这里需要注意一点 FIFO_Write_Data 信号直接由 RX_Data ,当串口接收模块反馈完成信号以后,RX_Data已经准备好 FIFO_Write_Data 的输入数据。一旦 isWrite 被拉高又被拉低,RX_Data 信号已经就绪的数据会被写入 FIFO

    当完成一次性的数据读取操作,i会被赋予0,以示重新执行以上的所有步骤。

    rx_interface.v

    clip_image016

     

    clip_image017

    该组合模块和“图形”几乎是一样,哎笔者也懒得说什么了...

    完成的扩展图:

    clip_image019

    补充:在这里读者可能会为“FIFO里信息卡住现象”而产生许多疑问。那么笔者反问读者先,串口是用来传输什么?对!串口是用来传输数据。我们可以这样想,如果某一波数据流的最后一个数据卡在FIFO里,那么这个数据就会被下一波的数据流给挤出。

    说简单点,如果是单纯的“数据与数据之间的传输”对于“数据卡住现象”的影响是很小。因为数据流的传输,有如被开着的水龙头,水会源源不断的流着 ... 顶多在关起水龙头的前一个时间,再往水龙头开一下子(在数据流的传输完结之前再写入一个无关的数据,以达到挤出最后一个数据的效果)。

    实验十八演示:

    clip_image021

    在这个演示中主要是演示如何调用串口接收接口和串口发送接口。实际上这个演示时没有实际的意义。当串口接收接口完成数据读取后,就会将数据缓冲在自己的FIFO里。然后中间控制模块就会判断该FIFO的状态,再从FIFO中读取数据,然后将数据写入串口发送节后的FIFO里。

    在全部的操作中中间控制模块,如同中介的工作,将数据从一方移去另一方,完全没有介入串口接收|发送接口的操作之中。从另一个角度去看,在 rx_tx_interface_demo.v 中的接口(串口接收接口和串口发送接口)和中间模块控制模块,完全是独立的。

    inter_control_module.v

    clip_image023

    clip_image024

    29~50行是中间控制模块的主要功能。在步骤0,先判断 rx_interface.v FIFO是否为空,如果不为空 if条件就成立,i 就递增以示下一个步骤(32行)。

    34~38行,表示从 rx_interface.v 读取一个深度的数据。

    当完成从 rx_interface.v FIFO读取一个深度的数据以后,数据在FIFO_Read_Data信号上已经就绪。在步骤3,先判断 tx_inerface.v FIFO是否为满状态?如果 tx_interface.v FIFO 不为满状态,i会递增以示下一个步骤。

    在这里请注意, FIFO_Write_Data 是直接由 FIFO_Read_Data 驱动。在43~47行,主要是将数据写入 tx_interface.v FIFO内。

    最后i被赋予0,以示重复上述的动作。

    rx_tx_interface_demo.v

    clip_image026

    实验十八演示说明:

    演示的结果会是:当你从上位机发送 十六进制 的数据,该数据会经过 FPGA 然后传回至上位机显示。所以我说演示结果实际上是没有意义的 ...

    完成后的扩展图:

    clip_image028

    实验十八演示结论:

    该演示说白了,就是演示FIFO的调用。在实验十六至十八,FIFO几乎扮演着很重要的角色。FIFO用来缓冲数据,该目的本身是没有什么亮点,但是FIFO可以使某个模块封装后,拥有“独立性”的特性,这才是重点。从另一个角度来看,如果某个接口包含FIFO,那么该接口的调用方式都是清一色。

  • 相关阅读:
    896. Monotonic Array单调数组
    865. Smallest Subtree with all the Deepest Nodes 有最深节点的最小子树
    489. Robot Room Cleaner扫地机器人
    JavaFX
    《Python CookBook2》 第一章 文本
    《Python CookBook2》 第一章 文本
    《Python CookBook2》 第一章 文本
    《Python CookBook2》 第一章 文本
    《Python CookBook2》 第一章 文本
    《Python CookBook2》 第一章 文本
  • 原文地址:https://www.cnblogs.com/kingst/p/1864697.html
Copyright © 2020-2023  润新知