为什么要讲包文
FPGA广泛应用于通信、图像处理、航天航空、自动化等领域,其中通信是FPGA应用最大的领域。在通信中,发送端首先将数据封装成一个个包文,接收端按包文为单位进行接收。例如以太网,发送端将数据封装成包文格式,该包文包含了目的地址、源地址、检验域、包文长度和包文数据等信号。接收端根据这些信息,就能正确地接收数据。可以说包文是通信中处理的基本单元。
明德扬的练习,大部分都是对包文的处理,因此明德扬先统一解释包文概念和包文接口信号,从而避免做练习时出现功能歧义,如果连功能都不明确,那是不可能做好设计的。
包文接口信号
下面就是一个典型的以太网包文,该包文由14字节的以太网头、2字节的报文头、44至1498字节的包文内容和4字节的检验码组成。
在FPGA可以定义如下信号来方便地传输,即能保留全部报文的信息,又能适合FPGA的接口。
信号名 | 意义 | 一般约定 |
data | 包文数据,例子中的以太网头至CRC等全部内容。 | 还可以用din来表示输入的数据;dout表示输出的数据。接口位宽一般是8、16、24、32等8的整数倍。 |
vld | 为1时表示当拍的数据的有效;为0时表示数据无效。 | 包文在传输时,有可能不是连续过来的,例如传了以太网头后,等几个始终才来报文头数据。我们可以通过vld来指示数据是有效还是无效。无效的数据就不用理会。 |
sop | 为1时表示这个是包文的第一个数据。 | 如无特别说明,只有vld=1时,sop才有效。表示该时刻的data中包含了该报文的第一个字节数据。
|
eop | 为1时表示这个是包文的最后一个数据 | 如无特别说明,只有vld=1时,eop才有效。表示该时刻的data中包含了该报文的最后一字节数据。
|
err | 为1时表示这个包文有错误 | 如无特别说明,只有vld=1且eop=1时,err才有效,否则err无效,不用理会。 |
mty | 表示无效字节数。0全部有效。 | vld=1且eop=1时,mty才有效,其他时候为一定为0。(也就是说包文中间vld=1时,data全部有效) 假如data的位宽是32位,也就是4个字节。但包文有可能不是4字节的倍数。例如包文长度为127字节时,eop时刻肯定是只有3个字节有效,此时就可以用mty信号来指示出来。 mdy值得定义: 0:全部数据都有效; 1:除了data[7:0],其他数据有效。 2:除了data[15:0],其他数据有效。 3:除了data[23:0],其他数据有效。 4:除了data[31:0],其他数据有效。 …… 以此类推。 |
rdy | 模块准备好信号。当rdy=1时,表示下游模块准备好,可以发送数据。rdy=0时,绝对不能发送数据。 | 当模块A发数据给模块B,如果B正在处理数据,来不及接收时,B将rdy信号拉低,告诉A不要发数据过来。假如ryd=1,A发数据过来,B处理出错,则是B的问题。而如果rdy=0,A发数据过来导致B出错,那就是A的问题。 要注意此信号由B产生的。 |
上面的表格非常重要,做练习如果不清楚信号定义,请务必回到此处查找。基本上所有模块的输入输出信号都可以参考这表格来定义,对于划分模块也有重要参考价值。