MAC IP核的主要做用是:實現數據鏈路層協議,分爲TX方向與RX方向,TX方向實現的是在原包文的前面加上7個55和1個D5,RX方向則相反。在使用這個 MAC IP核以前,首先確認下本身使用的網卡是支持千兆網卡仍是百兆網卡,我本身的電腦是百兆網卡,百兆網卡只支持百兆速率的傳輸,要按照百兆網卡進行管腳配置。測試
(1)進行管腳配置:spa
根據數據手冊P5四、P55進行硬件管腳引出:設計
千兆網鏈接模式3d
千兆網的PHY芯片數據接收與發送管腳txd與rxd均是8bit,須要用pll倍頻125M給PHY芯片的gtx_clk以及MAC IP核的tx_clk,PHY芯片會根據發送速率產生一個隨路時鐘給MAC IP核的rx_clk。code
百兆網鏈接模式blog
百兆網的PHY芯片數據接收與發送管腳txd與rxd均是4bit,而且只須要給一個Reference Clock 至PHY芯片,PHY芯片就會產生25M的tx_clk與rx_clk至MAC IP核,這裏注意要把m_rx_col 與m_rx_crs芯片管腳也引出來做爲MAC IP核的m_rx_col 與m_rx_crs輸入,要注意的是千兆網PHY芯片的使用是不須要這兩個管腳的。it
(2)MAC IP核生成注意事項:io
若是選擇的是生成32bit數據位寬的內部 FIFO,那麼「Align packet headers to 32-bit boundary"就是一個可選擇項,具體見數據手冊:class
特別要注意的是:bfc
「Align packet headers to 32-bit boundary"這個選項的做用就是爲了對齊數據,自動往TX方向/RX方向減小或者增長兩個字節。由於按照TX方向發送包文格式:
目的地址(6字節)+源地址(6字節)+類型(2字節)+數據
目的地址(6字節)+源地址(6字節)+類型(2字節)=14(字節),MAC 內部FIFO是32bit,也就是一次發送4byte,14字節不是4的倍數,所以,「Align packet headers to 32-bit boundary"這個選項是爲了對齊數據,避免一個時鐘週期內地址與數據混合發送,若是不勾選此選項,FPGA與PC端通信的數據字節數會保持一致。
(3)傳輸速率要求
一、對於千兆網,只要保證用戶側速率>1G便可;
二、對於百兆網,只要保證用戶側速率>100M便可;
我這裏選用32bit的內部FIFO,用PLL分頻出10M時鐘給MAC IP核的ff_tx_clk 、ff_rx_clk以及clk,這樣用戶側速率就是32bit X 10M > 100M,符合速率傳輸要求。
(4)MAC IP核的初始化配置
關於MAC IP核的初始化配置很是重要,若是實在看不懂Command_config Register的配置,請嚴格按照數據手冊P97-P98配置便可
惟一要注意的是最後要保證TX與RX的使能端口已經開啓,所以最後要讀下16‘h02這個地址,以確保Command_config Register 已經等於0x00800223。
個人初始化配置表以下所示:
parameter REG_NUM = 19 ;
always @(*)begin
case(reg_cnt) 0 :add_wdata = {3'b110,8'h02,32'h00802220};//common
1 :add_wdata = {3'b110,8'h09,32'd2032 };//tx_section_emty
2 :add_wdata = {3'b110,8'h0e,32'd4 };//tx_almost_full
3 :add_wdata = {3'b110,8'h0d,32'd08 };//tx_almost_empty
4 :add_wdata = {3'b110,8'h07,32'd2032 };//rx_section_empty
5 :add_wdata = {3'b110,8'h0c,32'd08 };//rx_almost_full
6 :add_wdata = {3'b110,8'h0b,32'd08 };//rx_almost_emty
7 :add_wdata = {3'b110,8'h0a,32'd16 };//tx_section_full
8 :add_wdata = {3'b110,8'h08,32'd16 };//rx_section_full
9 :add_wdata = {3'b110,8'h03,32'h01020304};//MAC0
10 :add_wdata = {3'b110,8'h04,32'h00000605};//MAC1
11 :add_wdata = {3'b110,8'h05,32'd1518 };//MAX FRAME LENGTH
12 :add_wdata = {3'b110,8'h17,32'd12 };//TX IPG LEGNTH
13 :add_wdata = {3'b110,8'h06,32'h0000ffff};//pause_quant
14 :add_wdata = {3'b110,8'h02,32'h00800220};//..
15 :add_wdata = {3'b110,8'h02,32'h00802220};//common,rst,set SW_RESET bit to 1
16 :add_wdata = {3'b001,8'h00,32'h00010_0000};//wait
17 :add_wdata = {3'b010,8'h02,32'h00800220 };//wait
18 :add_wdata = {3'b110,8'h02,32'h00800223};//common,enable tx and rx //
default:add_wdata = 0; endcase
end
(4)PHY芯片的復位時間
由數據手冊能夠看到,PHY芯片的上電覆位時間至少要維持10ms,以50M輸入時鐘爲例,個人設計以下:
always @(posedge clk or negedge rst_n)begin
if(!rst_n)begin cnt_phy_reset <= 0; end
else if(add_cnt_phy_reset)begin
if(end_cnt_phy_reset) cnt_phy_reset <= 0; else cnt_phy_reset <=cnt_phy_reset + 1; end
end
assign add_cnt_phy_reset = flag==0 ; assign end_cnt_phy_reset = add_cnt_phy_reset && cnt_phy_reset== 10_00_000 ; //拉低10ms
always @(posedge clk or negedge rst_n)begin
if(rst_n==1'b0)begin
flag <= 0; end
else if(end_cnt_phy_reset)begin flag <= 1; end
end
always @(posedge clk or negedge rst_n)begin //phy_reset
if(rst_n==1'b0)begin
phy_reset <= 1; end
else if(flag==0&&add_cnt_phy_reset && cnt_phy_reset == 500_000)begin phy_reset <= 0; end
else if(end_cnt_phy_reset)begin phy_reset <= 1; end
end
(5)測試驗證:
TX 方向: 初始化完成後,自動產生MAC 層包文,通過MAC IP 進行數據鏈路層處理後,將包文發 給PHY 芯片RTL8211,PHY 芯片通過PHY 層處理後再傳給PC,PC 使用wireshark 軟件採集包文觀察。
RX 方向: PC 發廣播包文給PHY 芯片,PHY 芯片通過PHY 層處理後送給FPGA,FPGA 接到後通過數據鏈路層處理後,用SIGNALTAP 觀測最後的信號。
用到的輔助測試軟件:
一、小兵發包:往FPGA 發數據
二、wireshark:捕獲發送與接收包文
TX方向,FPGA往PC發128字節長度的廣播包
PC端收到無缺的128個字節的廣播包
(2)RX方向
小兵發64字節的廣播包
FPGA收到無缺的64個字節的廣播包
至此,有關該MAC IP核百兆網的設計與使用完畢,有關MAC IP核千兆網的使用與它相似,只須要注意PHY芯片的gtx_clk時鐘由PLL倍頻獲得125M做爲輸入以及接收/發送數據端口均爲8bit便可。