上一篇7系列收發器博文講解了GTP IP核的基本配置,本文繼續分析如何將它使用起來。生成IP核后打開example design,先看看工程中包含的文件結構。
頂層文件下包含了gtp ip核系統頂層文件、frame_gen以及frame_check三類模塊。frame_gen和frame_check用於測試過程中的數據包產生和接收檢測(由於我在配置IP核時使能了兩個通道,因此工程中有兩組frame_gen和frame_check模塊),gen模塊讀發送樣式,check模塊則將接收到數據與本地存儲樣式對比,從而判斷數據傳輸是否正確。下面截取一段gen模塊內代碼:
發現gen模塊是通過系統函數$readmem讀取gt_rom_init_tx.dat文件來初始化rom,發送數據則直接從rom中讀取。雖然$readmem和initial是不可綜合語句,但其功能與.mif文件初始化ROM IP核是類似的。check模塊與gen模塊類似,但有一點比較值得借鑒。
根據上邊的注釋可以看出,這個IP核在使用32bit用戶數據位寬時,會發生錯位現象。因此發送數據時所有comma碼要放在32bit數據四個字節的同一字節中,最常見的是均放在最低字節,這樣接收端可以根據控制字指示信號為1的位置找出錯位情況,進而讀數據進行重新對齊。比如當rxctrl == 4'b1000,則錯誤情況和重對齊方式如下:
d0'代表上一個數據的最低字節部分。其他錯位情況的重對齊方式同理,現在看下check模塊中根據sel信號對接收數據重對齊的邏輯。
可以看出重對齊方式與剛才講的方法一致。因此當測試完畢后,去除frame_gen和frame_check模塊並將gt數據端口開放到頂層后,接收端用戶側也要有類似的邏輯防止數據錯位。
再來看下頂層文件中關於原語的使用:
IBUFDS是差分信號輸入緩沖器,用來將差分信號變為單端信號。而BUFG是全局緩沖,其輸出到達FPGA內部CLB IOB RAM的時鍾延遲和抖動是最小的,從而使系統工作穩定。
最后,為保證最基本的通信功能,還需做三件事:
1. 去除gen和check邏輯塊,並將用戶數據端口開放到工程頂層;
2. 接收端用戶側例化數據重對齊模塊保證接收正確;
3. 例化PLL產生100MHz時鍾信號作為GTP子系統工作時鍾;