zoukankan      html  css  js  c++  java
  • 【连载】【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,那么该接口的调用方式都是清一色。

  • 相关阅读:
    vue中@事件处理函数的柯里化
    一个例子生动理解js的原型_js的原型prototype和__protopy__区别
    vue3自定义v-model
    js初始化一个特定值的array
    dom的clientHeight、scrollHeight以及offsetHeight
    ts踩坑记录
    常见问题1
    资料share
    几种开放源码的TCPIP协议栈
    阻塞与非阻塞,同步与异步
  • 原文地址:https://www.cnblogs.com/kingst/p/1864697.html
Copyright © 2011-2022 走看看