包文的理解
在通信工程中,包文是通信處理不可缺少的一部分,經過一段時間的學習總結,今天跟大家分享一下我對包文的理解。
一、包文的基本概念
在通信中,發送端首先將數據封裝成一個個包文,接收端按包文為單位進行接收。例如以太網,發送端將數據封裝成包文格式,該包文包含了目的地址、源地址、檢驗域、包文長度和包文數據等信號。接收端根據這些信息,就能正確地接收數據。每個包文之間互不相關,可以說包文是處理數據的基本單元。
包文其實就是一組一組的用戶數據,它可以由一個或者多個字節組成,機器以一個包文為單位,進行包文處理。用生活中的例子來解釋,我們使用QQ傳遞消息時,QQ有可能會將當前的對話內容封裝成一個包文,然后再傳給另一端。那么根據實際情況,這個包文可長可短,對話內容少時,包文自然就短,對話內容長時,包文自然就很長了。
二、包文的傳輸
前面介紹了包文是一組一組的用戶數據。包文在傳遞傳輸中,有可能會通過不同的接口進行傳輸,例如網線、串口、電話線、無線傳輸等,不管是什么樣的方式傳輸,最終傳到另一端的時候,必須又能夠還原回原來的包文。就如我們通過QQ發了一段音頻,那么對方收到的也會是一段音頻,不能變成文字或者視頻。在工程中就相當于我們將一個包文(48’h000102030405)從A發送到B,不管中間經過了什么接口,最終B要收到的就是(48’h000102030405)。
在FPGA中,明德揚定義了一種數據接口,這種數據接口一般包含data,data_vld,data_sop,data_eop和data_mty等。其解釋如下:
data:類似的名稱還有din,dout等,傳遞的數據,其可能由多根線組成,常用的8根線、16根線、32根線,分別表示一次可傳送8位、16位和32位數據。
data_vld:數據有效表示信號;為1表示當前時刻的data有效,正在傳遞一個數據,為0時表示當前數據無效,不要去抓數據。(注意,很多人會誤認為,用“data==0”表示“沒有數據”,這是錯誤的觀念,0本身也是一個數據,因為有可能A要將數據0傳給B。真正表示數據有效還是無效的,是看vld信號,而不是看data。)
data_sop:包文頭指示信號;表示當前的這個數據是包文的第一個數據。
data_eop:包文尾指示信號;表示當前的這個數據是包文的最后一個數據。
(通過data_sop,data_eop就可以很容易區分出各個包文,避免不同包文數據之間的錯亂。)
data_mty:當前無效數據字節數;很多人不太理解這個信號的含義,前面說過,包文的長度是可長可短的,一般是以字節為單位,因此有可能長度為1、2、3~1000字節等,甚至更長的長度。假設現在data的位寬是32位,就是vld有效時,一次就傳4個字節。現在問題來了,假如A要傳給B,1個字節的包文,那么如何怎么告訴B現在是1個字節包文呢?這時就可通過mty為表示了,當其為3時,就表示當前data有3個字節無效,B收到后就知道怎么做了。有同學會問B有沒有可能等于4,也就是全部無效呢?如果要表示全部無效,直接讓vld等于0就好了,沒有必要讓mty來表示。
綜上所述,通過上面幾個信號,A和B之間能實現傳遞任何長度的包文。
三、包文的接口信號意義以及約定規范
在FPGA可以定義如下信號來方便地傳輸,即能保留全部報文的信息,又能適合FPGA的接口:
四、包文的接口信號應用
使用一個案例來加固學習效果。假設模塊A要先后發送包文5字節包文:40’h0102030405和6字節包文:48’h060708091011給模塊B。
一起來實現這個效果,分析目標可知信號連接和信號波形可設置如下所示:
模塊A和模塊B的連接信號
該信號波形是數據位寬為16包文,包文的有效包文數據是:8’h01,8’h02,8’h03,8’h04,8’h05,8’h06,8’h07,8’h08,8’h09,8’h10,8’h11,當data_mty為高電平時,對應的data值16’h0500有一個字節無效,默認低位無效(即8’h00無效),所以data值為16’h0500時,有效值是8’h05。
以上就是本人對包文的理解和使用,更多相關FPGA的知識,大家可以在評論區與我進行交流討論!