相關(guān)文章:
(1)千兆以太網(wǎng)網(wǎng)絡(luò)層 ARP 協(xié)議的原理與 FPGA 實現(xiàn)
(2)千兆以太網(wǎng)硬件設(shè)計及鏈路層 MAC 協(xié)議格式
(3)CRC校驗原理及實現(xiàn)
(4)RGMII 與 GMII 轉(zhuǎn)換電路設(shè)計
(5)千兆以太網(wǎng)網(wǎng)絡(luò)層 IP 協(xié)議介紹與 IP 校 驗和算法實現(xiàn)
(6)千兆以太網(wǎng)傳輸層 UDP 協(xié)議原理與 FPGA 實現(xiàn)(UDP發(fā)送)
(7)千兆以太網(wǎng)傳輸層 UDP 協(xié)議原理與 FPGA 實現(xiàn)(UDP接收)
(8)千兆以太網(wǎng)傳輸層 UDP 協(xié)議原理與 FPGA 實現(xiàn)(UDP回環(huán))
(9)以太網(wǎng)初始化設(shè)計(MDIO 控制器)
(10)添加基于 OV2640 的以太網(wǎng) RGMII 圖像傳輸系統(tǒng)設(shè)計
前言
在前面我們對以太網(wǎng) UDP 幀格式做了講解,UDP 幀格式包括前導(dǎo)碼+幀界定符、以太網(wǎng)頭部數(shù)據(jù)、IP 頭部數(shù)據(jù)、UDP 頭部數(shù)據(jù)、UDP 數(shù)據(jù)、FCS 數(shù)據(jù),以太網(wǎng)接收模塊同樣是按照該格式接收數(shù)據(jù)。
提示:任何文章不要過度深思!萬事萬物都經(jīng)不起審視,因為世上沒有同樣的成長環(huán)境,也沒有同樣的認知水平,更「沒有適用于所有人的解決方案」 ;不要急著評判文章列出的觀點,只需代入其中,適度審視一番自己即可,能「跳脫出來從外人的角度看看現(xiàn)在的自己處在什么樣的階段」才不為俗人 。怎么想、怎么做,全在乎自己「不斷實踐中尋找適合自己的大道」
心得體會
(1)UDP接收數(shù)據(jù),無論是MAC地址,還是IP地址,或者UDP端口,其源端口都為計算機;
(2)在接收數(shù)據(jù)時不關(guān)心源端口(計算機)的MAC地址,還是IP地址,或者UDP端口,只關(guān)心目的地址,也就是說接收數(shù)據(jù)時可以將源端口MAC地址,IP地址,UDP端口全部置 0;
(3)驗證時一定要弄清目的地址(開發(fā)板)的MAC和IP地址,這里與UDP發(fā)送中目的MAC、IP(計算機)是相反的,此處需要注意;
(4)本實驗針對千兆網(wǎng),注意查看電腦是否支持。
一、 UDP 協(xié)議簡單回顧
以太網(wǎng) UDP 幀的用戶數(shù)據(jù)是打包在 UDP 協(xié)議中,而 UDP 協(xié)議又是基于 IP 協(xié)議之上的,IP 協(xié)議又是走 MAC 層發(fā)送的,即從包含關(guān)系來說:MAC 幀中的數(shù)據(jù)段為 IP 數(shù)據(jù)報文,IP 報文中的數(shù)據(jù)段為 UDP 報文,UDP 報文中的數(shù)據(jù)段為用戶希望傳輸?shù)臄?shù)據(jù)內(nèi)容下圖為使用 UDP 協(xié)議發(fā)送數(shù)據(jù)的層層打包示意圖。
其中,和以太網(wǎng)幀、IP 報文具有幀頭一樣,UDP 數(shù)據(jù)報也包含了一個 UDP 報頭部分,與 UDP 協(xié)議相關(guān)的一些信息如端口號,數(shù)據(jù)包長度等會被打包進 UDP 報頭中,然后再與需要傳輸?shù)?UDP 報文數(shù)據(jù)一起,作為 IP 報文的數(shù)據(jù)段送往 IP 層發(fā)送。
二、UDP接收實現(xiàn)
GMII 接口信號連接關(guān)系及各信號的介紹如下。
(注:表格中的方向是站在 MAC 側(cè)角度看的)
此處給出GMII 接口信號連接關(guān)系及各信號的介紹,是為了明確UDP發(fā)送與接收需要什么輸入與輸出。
下面將對各個狀態(tài)的實現(xiàn)及功能進行簡要介紹。
- IDLE
空閑狀態(tài),當(dāng)產(chǎn)生接收數(shù)據(jù)有效信號時,進入PREAMBLE_CODE狀態(tài),否則處于 IDLE 狀態(tài),代碼如下所示:
IDLE: begin
GMII_RX_DONE <= 0;
crc_en <= 0;
if(GMII_DV_reg1 && !GMII_DV_reg2)
begin
curr_state <= PREAMBLE_CODE;
end
else
curr_state <= curr_state;
end
上述代碼中的GMII_DV_reg1 信號是將接收數(shù)據(jù)有效信號GMII_DV寄存之后打一拍得到的,GMII_DV_reg2 信號是將GMII_DV_reg1信號打一拍得到的,將GMII_DV_reg2 信號取反與
GMII_DV_reg1 相與得到接收數(shù)據(jù)有效脈沖,得到該信號之后,進入到PREAMBLE_CODE 狀態(tài),
GMII_DV_reg1 信號和GMII_DV_reg2 信號的實現(xiàn)代碼如下所示,代碼中對GMII_TXD 信號也進行了寄存和打拍操作,文章來源:http://www.zghlxwxcb.cn/news/detail-765863.html
//輸入數(shù)據(jù)寄存
always @ (posedge clk125m_o or negedge reset_n)
if(!reset_n)
begin
GMII_ER_reg <= 0;
GMII_DV_reg <= 0;
GMII_TXD_reg<= 0;
end
else begin
GMII_ER_reg <= GMII_ER;
GMII_DV_reg <= GMII_DV;
GMII_TXD_reg<= GMII_TXD;
end
//數(shù)據(jù)打兩拍判斷接收起始
always @ (posedge clk125m_o or negedge reset_n)
if(!reset_n)
begin
GMII_DV_reg1 <= 0;
GMII_DV_reg2 <= 0;
GMII_TXD_reg1<= 0;
GMII_TXD_reg2<= 0;
crc_data <= 0;
end
else
begin
GMII_DV_reg1 <= GMII_DV_reg;
GMII_DV_reg2 <= GMII_DV_reg1;
GMII_TXD_reg1<= GMII_TXD_reg;
GMII_TXD_reg2<= GMII_TXD_reg1;
crc_data <= GMII_TXD_reg2;
end
- PREAMBLE_CODE 狀態(tài)
處于 PREAMBLE_CODE狀態(tài)的時候,當(dāng)以太網(wǎng)接收到幀界定符(D5)和 7 個的前導(dǎo)碼(55)
時,進入到ETH_HEADER 狀態(tài),代碼如下所示:
PREAMBLE_CODE:
begin
crc_init <= 0;
if(cnt_preamble == 4'd7)
begin
curr_state <= ETH_HEADER;
cnt_preamble <= 0;
end
else
begin
cnt_preamble <= cnt_preamble + 1'b1;
curr_state <= curr_state;
end
end
- ETH_HEADER
處于 ETH_HEADER 狀態(tài)時,接收以太網(wǎng)頭部數(shù)據(jù),當(dāng)接收完 14 個以太網(wǎng)頭部數(shù)據(jù)之后,進入到 IP_HEADER 狀態(tài),如果接收不是7個55和一個D5,則表明此時數(shù)據(jù)接收錯誤,進入 IDLE 狀態(tài),然后當(dāng)處于該狀態(tài)的時候,根據(jù) cnt_eth_header 的值,依次得到 14 個字節(jié)的以太網(wǎng)頭部數(shù)據(jù),分別是 MAC 目的地址(6 個字節(jié))、MAC 源地址(6 個字節(jié))和以太網(wǎng)類型(2 個字節(jié)),代碼如下所示:
ETH_HEADER:begin
crc_en <= 1;
if(cnt_eth_header == 4'd13)
begin
curr_state <= IP_HEADER;
cnt_eth_header <= 0;
end
else if((cnt_eth_header == 4'd0) && (preamble_code_check_ok == 1'b0))
begin
curr_state <= IDLE;
cnt_eth_header <= 0;
end
else
begin
cnt_eth_header <= cnt_eth_header + 1'b1;
curr_state <= curr_state;
end
case(cnt_eth_header)
4'd0 :dst_mac_reg[47:40] <= GMII_TXD_reg2;
4'd1 :dst_mac_reg[39:32] <= GMII_TXD_reg2;
4'd2 :dst_mac_reg[31:24] <= GMII_TXD_reg2;
4'd3 :dst_mac_reg[23:16] <= GMII_TXD_reg2;
4'd4 :dst_mac_reg[15:8] <= GMII_TXD_reg2;
4'd5 :dst_mac_reg[7:0] <= GMII_TXD_reg2;
4'd6 :src_mac_reg[47:40] <= GMII_TXD_reg2;
4'd7 :src_mac_reg[39:32] <= GMII_TXD_reg2;
4'd8 :src_mac_reg[31:24] <= GMII_TXD_reg2;
4'd9 :src_mac_reg[23:16] <= GMII_TXD_reg2;
4'd10:src_mac_reg[15:8] <= GMII_TXD_reg2;
4'd11:src_mac_reg[7:0] <= GMII_TXD_reg2;
4'd12:eth_type[15:8] <= GMII_TXD_reg2;
4'd13:eth_type[7:0] <= GMII_TXD_reg2;
default: ;
endcase
end
其中preamble_code_check_ok為:文章來源地址http://www.zghlxwxcb.cn/news/detail-765863.html
always @ (posedge clk125m_o or negedge reset_n)
if(!reset_n)
preamble_code_check_ok <= 1'b0;
else if((GMII_TXD_reg2 == 8'hd5) && (cnt_preamble == 4'd7))
preamble_code_check_ok <= 1'b1;
else
preamble_code_check_ok <= 1'b0;
- IP_HEADER
(1)接收以太網(wǎng) IP 頭部數(shù)據(jù)狀態(tài)IP_HEADER,首先得對接收的以太網(wǎng) IP 頭部數(shù)據(jù)進行計數(shù),定義一個計數(shù)器 cnt_ip_header,當(dāng)處于該狀態(tài)的時候進行計數(shù),否則清零,
(2)然后當(dāng)處于 IP_HEADER 狀態(tài)時,獲取以太網(wǎng) IP 頭部數(shù)據(jù),根據(jù) cnt_ip_header 的值,一共需要獲取 20 個字節(jié)的數(shù)據(jù),分別為 IP 版本(ip_ver)、首部長度(ip_hdr_len)、服務(wù)類型(ip_tos)、數(shù)據(jù)報總長度(total_len)、標(biāo)識主機發(fā)送的每一份數(shù)據(jù)報(ip_id)、標(biāo)志位(ip_rsv、ip_df、ip_mf)、段偏移量(ip_frag_offset)、生存期(ip_ttl)、IP 的協(xié)議封裝類型(ip_protocol)、頭部校驗和(ip_check_sum)、源 IP 地址(src_ip)和目的 IP 地址(dst_ip),代碼如下所示:
IP_HEADER:begin
if(cnt_ip_header == 5'd19)
begin
curr_state <= UDP_HEADER;
udp_data_length_reg <= ip_total_len - 16'd20 - 16'd8;
cnt_ip_header <= 5'd0;
ip_cal_en <= 1;
end
else if(cnt_ip_header >= 5'd1 && eth_header_check_ok == 1'b0)
begin
curr_state <= IDLE;
cnt_ip_header <= 0;
end
else
begin
cnt_ip_header <= cnt_ip_header + 1'b1;
curr_state <= curr_state;
end
case (cnt_ip_header)
5'd0: {
ip_ver,ip_hdr_len} <= GMII_TXD_reg2;
5'd1: ip_tos <= GMII_TXD_reg2;
5'd2: ip_total_len[15:8] <= GMII_TXD_reg2;
5'd3: ip_total_len[7:0] <= GMII_TXD_reg2;
5'd4: ip_id[15:8] <= GMII_TXD_reg2;
5'd5: ip_id[7:0] <= GMII_TXD_reg2;
5'd6: {
ip_rsv,ip_df,ip_mf,ip_frag_offset[12:8]} <= GMII_TXD_reg2;
5'd7: ip_frag_offset[7:0] <= GMII_TXD_reg2;
5'd8: ip_ttl <= GMII_TXD_reg2;
5'd9: ip_protocol <= GMII_TXD_reg2;
5'd10: ip_check_sum[15:8] <= GMII_TXD_reg2;
5'd11: ip_check_sum[7:0] <= GMII_TXD_reg2;
5'd12: src_ip_reg[31:24] <= GMII_TXD_reg2;
5'd13: src_ip_reg[23:16] <= GMII_TXD_reg2;
5'd14: src_ip_reg[15:8] <= GMII_TXD_reg2;
5'd15: src_ip_reg[7:0] <= GMII_TXD_reg2;
5'd16: dst_ip_reg[31:24] <= GMII_TXD_reg2;
5'd17: dst_ip_reg[23:16] <= GMII_TXD_reg2;
5'd18: dst_ip_reg[15:8] <= GMII_TXD_reg2;
5'd19: dst_ip_reg[7:0] <= GMII_TXD_reg2;
defaul
到了這里,關(guān)于千兆以太網(wǎng)傳輸層 UDP 協(xié)議原理與 FPGA 實現(xiàn)(UDP接收)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!