0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

FPGA之HDMI與以太網(wǎng)篇分享

FPGA技術(shù)江湖 ? 來(lái)源:FPGA技術(shù)江湖 ? 2023-04-06 09:22 ? 次閱讀

一、HDMI

1.1 、HDMI介紹

高清多媒體接口(High Definition Multimedia Interface)是一種全數(shù)字化視頻和聲音發(fā)送接口,可以發(fā)送未壓縮的音頻及視頻信號(hào)。HDMI可用于機(jī)頂盒、DVD播放機(jī)、個(gè)人計(jì)算機(jī)、電視、游戲主機(jī)、綜合擴(kuò)大機(jī)、數(shù)字音響與電視機(jī)等設(shè)備。HDMI可以同時(shí)發(fā)送音頻和視頻信號(hào),由于音頻和視頻信號(hào)采用同一條線材,大大簡(jiǎn)化系統(tǒng)線路的安裝難度。

HDMI是被設(shè)計(jì)來(lái)取代較舊的模擬信號(hào)影音發(fā)送接口如SCART或RCA等端子的。它支持各類電視與計(jì)算機(jī)視頻格式,包括SDTV、HDTV視頻畫面,再加上多聲道數(shù)字音頻。HDMI與去掉音頻傳輸功能的UDI都繼承DVI的核心技術(shù)“傳輸最小化差分信號(hào)”TMDS,從本質(zhì)上來(lái)說(shuō)仍然是DVI的擴(kuò)展。DVI、HDMI、UDI的視頻內(nèi)容都以即時(shí)、專線方式進(jìn)行傳輸,這可以保證視頻流量大時(shí)不會(huì)發(fā)生堵塞的現(xiàn)象。每個(gè)像素?cái)?shù)據(jù)量為24位。信號(hào)的時(shí)序與VGA極為類似。

1.1.1、HDMI接口

HDMI 1.0版本于2002年發(fā)布,最高數(shù)據(jù)傳輸速度為5Gbps;而2017年發(fā)布的HDMI 2.1標(biāo)準(zhǔn)的理論帶寬可達(dá)48Gbps。HDMI的規(guī)格書中規(guī)定了四種HDMI接口。HDMI向下兼容DVI,但是DVI(數(shù)字視頻接口)只能用于傳輸視頻,而不能同時(shí)傳輸音頻,這是兩者最大的區(qū)別。此外,DVI接口的尺寸明顯大于HDMI接口,

右側(cè)是最常見(jiàn)的A型HDMI接口,其引腳定義如下圖:

53ec8df6-d418-11ed-bfe3-dac502259ad0.png

圖1.2.2HDMI接口引腳圖

DVI和HDMI接口協(xié)議在物理層使用TMDS標(biāo)準(zhǔn)傳輸音視頻數(shù)據(jù)。

1.1.2 、TMDS介紹

TMDS(Transition Minimized Differential Signaling,最小化傳輸差分信號(hào))是美國(guó)Silicon Image公司開(kāi)發(fā)的一項(xiàng)高速數(shù)據(jù)傳輸技術(shù),在DVI和HDMI視頻接口中使用差分信號(hào)傳輸高速串行數(shù)據(jù)。TMDS差分傳輸技術(shù)使用兩個(gè)引腳(如圖21.1.2中的“數(shù)據(jù)2+”和“數(shù)據(jù)2-”)來(lái)傳輸一路信號(hào),利用這兩個(gè)引腳間的電壓差的正負(fù)極性和大小來(lái)決定傳輸數(shù)據(jù)的數(shù)值(0或1)。

DVI或HDMI視頻傳輸所使用的TMDS連接通過(guò)四個(gè)串行通道實(shí)現(xiàn)。對(duì)于DVI來(lái)說(shuō),其中三個(gè)通道分別用于傳輸視頻中每個(gè)像素點(diǎn)的紅、綠、藍(lán)三個(gè)顏色分量(RGB4:4:4格式)。HDMI默認(rèn)也是使用三個(gè)RGB通道,但是它同樣可以選擇傳輸像素點(diǎn)的亮度和色素信息(YCrCb44或YCrCb42格式)。第四個(gè)通道是時(shí)鐘通道,用于傳輸像素時(shí)鐘。獨(dú)立的TMDS時(shí)鐘通道為接收端提供接收的參考頻率,保證數(shù)據(jù)在接收端能夠正確恢復(fù)。

540ade8c-d418-11ed-bfe3-dac502259ad0.png

圖1.3.1 、TMDS連接示意圖

如果每個(gè)像素點(diǎn)的顏色深度為24位,即RGB每個(gè)顏色分量各占8位,那么每個(gè)通道上的顏色數(shù)據(jù)將通過(guò)一個(gè)8B/10B的編碼器(Encoder)來(lái)轉(zhuǎn)換成一個(gè)10位的像素字符。然后這個(gè)10位的字符通過(guò)并串轉(zhuǎn)換器(Serializer)轉(zhuǎn)換成串行數(shù)據(jù),最后由TMDS數(shù)據(jù)通道發(fā)送出去。這個(gè)10:1的并轉(zhuǎn)串過(guò)程所生成的串行數(shù)據(jù)速率是實(shí)際像素時(shí)鐘速率的10倍。

在傳輸視頻圖像的過(guò)程中,數(shù)據(jù)通道上傳輸?shù)氖蔷幋a后的有效像素字符。而在每一幀圖像的行與行之間,以及視頻中不同幀之間的時(shí)間間隔(消隱期)內(nèi),數(shù)據(jù)通道上傳輸?shù)膭t是控制字符。每個(gè)通道上有兩位控制信號(hào)的輸入接口,共對(duì)應(yīng)四種不同的控制字符。這些控制字符提供了視頻的行同步(HZYNC)以及幀同步(VSYNC)信息,也可以用來(lái)指定所傳輸數(shù)據(jù)的邊界(用于同步)。

對(duì)于DVI傳輸,整個(gè)視頻的消隱期都用來(lái)傳輸控制字符。而HDMI傳輸?shù)南[期除了控制字符之外,還可以用于傳輸音頻或者其他附加數(shù)據(jù),比如字幕信息等。這就是DVI和HDMI協(xié)議之間最主要的差別。從圖1.3.1中也可以看出這一差別,即“Auxiliary Data”接口標(biāo)有“HDMI Olny”,即它是HDMI所獨(dú)有的接口。

從前面的介紹中我們可以看出,TMDS連接從邏輯功能上可以劃分成兩個(gè)階段:編碼和并串轉(zhuǎn)換。在編碼階段,編碼器將視頻源中的像素?cái)?shù)據(jù)、HDMI的音頻/附加數(shù)據(jù),以及行同步和場(chǎng)同步信號(hào)分別編碼成10位的字符流。然后在并串轉(zhuǎn)換階段將上述的字符流轉(zhuǎn)換成串行數(shù)據(jù)流,并將其從三個(gè)差分輸出通道發(fā)送出去。

DVI編碼器在視頻有效數(shù)據(jù)段輸出像素?cái)?shù)據(jù),在消隱期輸出控制數(shù)據(jù),如圖1.3.2所示。其中VDE(Video Data Enable)為高電平時(shí)表示視頻數(shù)據(jù)有效,為低電平代表當(dāng)前處于視頻消隱期。

542d6826-d418-11ed-bfe3-dac502259ad0.png

圖1.3.2DVI編碼輸出示意圖

圖1.3.3給出了三個(gè)通道的DVI編碼器示意圖。對(duì)于像素?cái)?shù)據(jù)的RGB三個(gè)顏色通道,編碼器的邏輯是完全相同的。VDE用于各個(gè)通道選擇輸出視頻像素?cái)?shù)據(jù)還是控制數(shù)據(jù)。HSYNC和VSYNC信號(hào)在藍(lán)色通道進(jìn)行編碼得到10位字符,然后在視頻消隱期傳輸。綠色和紅色通道的控制信號(hào)C0和C1同樣需要進(jìn)行編碼,并在消隱期輸出。但是DVI規(guī)范中這兩個(gè)通道的控制信號(hào)是預(yù)留的(未用到),因此將其置為2‘b00。

543ee736-d418-11ed-bfe3-dac502259ad0.png

圖1.3.3 DVI編碼示意圖

每個(gè)通道輸入的視頻像素?cái)?shù)據(jù)都要使用DVI規(guī)范中的TMDS編碼算法進(jìn)行編碼。每個(gè)8-bit的數(shù)據(jù)都將被轉(zhuǎn)換成460個(gè)特定10-bit字符中的一個(gè)。這個(gè)編碼機(jī)制大致上實(shí)現(xiàn)了傳輸過(guò)程中的直流平衡,即一段時(shí)間內(nèi)傳輸?shù)母唠娖剑〝?shù)字“1”)的個(gè)數(shù)大致等于低電平(數(shù)字“0”)的個(gè)數(shù)。同時(shí),每個(gè)編碼后的10-bit字符中狀態(tài)跳轉(zhuǎn)(“由1到0”或者“由0到1”)的次數(shù)將被限制在五次以內(nèi)。

除了視頻數(shù)據(jù)之外,每個(gè)通道2-bit控制信號(hào)的狀態(tài)也要進(jìn)行編碼,編碼后分別對(duì)應(yīng)四個(gè)不同的10-bit控制字符,分別是10'b1101010100,10'b0010101011,10'b0101010100,和10'b1010101011。可以看出,每個(gè)控制字符都有七次以上的狀態(tài)跳轉(zhuǎn)。視頻字符和控制字符狀態(tài)跳轉(zhuǎn)次數(shù)的不同將會(huì)被用于發(fā)送和接收設(shè)備的同步。

HDMI協(xié)議與DVI協(xié)議在很多方面都是相同的,包括物理連接(TMDS)、有效視頻編碼算法以及控制字符的定義等。但是相比于DVI,HDMI在視頻的消隱期會(huì)傳輸更多的數(shù)據(jù),包括音頻數(shù)據(jù)和附加數(shù)據(jù)。4-bit音頻和附加數(shù)據(jù)將通過(guò)TERC4編碼機(jī)制轉(zhuǎn)換成10-bit TERC4字符,然后在綠色和紅色通道上傳輸。

HDMI在輸入附加數(shù)據(jù)的同時(shí),還需要輸入ADE(Aux/Audio Data Enable)信號(hào),其作用和VDE是類似的:當(dāng)ADE為高電平時(shí),表明輸入端的附加數(shù)據(jù)或者音頻數(shù)據(jù)有效。如果大家想了解更多有關(guān)HDMI的細(xì)節(jié),可以參考開(kāi)發(fā)板資料(A盤)/8_FPGA參考資料/HDMI/《HDMI Specification 13a》。為了簡(jiǎn)單起見(jiàn),我們?cè)谶@里把HDMI接口當(dāng)作DVI接口進(jìn)行驅(qū)動(dòng)。

在編碼之后,3個(gè)通道的10-bit字符將進(jìn)行并串轉(zhuǎn)換,這一過(guò)程是使用7系列FPGA中專用的硬件資源來(lái)實(shí)現(xiàn)的。7系列的FPGA提供了專用的并串轉(zhuǎn)換器——OSERDESE2。單一的OSERDESE2模塊可以實(shí)現(xiàn)8:1的并串轉(zhuǎn)換,通過(guò)位寬擴(kuò)展可以實(shí)現(xiàn)10:1和14:1的轉(zhuǎn)換率。

5451ef20-d418-11ed-bfe3-dac502259ad0.png

5466ebdc-d418-11ed-bfe3-dac502259ad0.png

548a92e4-d418-11ed-bfe3-dac502259ad0.png

1.2 HDMI設(shè)計(jì)思路

對(duì)于HDMI,和之前VGA項(xiàng)目差不多,可以通過(guò)修改VGA的驅(qū)動(dòng)代碼,來(lái)實(shí)現(xiàn)HDMI的驅(qū)動(dòng),修改其中的分辨率和時(shí)鐘,即可完成。

對(duì)于HDMI來(lái)說(shuō),需要將信號(hào)轉(zhuǎn)為差分對(duì),再將并轉(zhuǎn)為串。

1.3 代碼

modulehdmi_driver(

inputwireclk,
inputwirerst_n,
outputwireVSYNC,
outputwireHSYNC,
outputwire[23:0]RGB,
outputwireen_display
);

parameterH_A=40;
parameterH_B=220;
parameterH_C=1280;
parameterH_D=110;
parameterH_E=1650;

parameterV_A=5;
parameterV_B=20;
parameterV_C=720;
parameterV_D=5;
parameterV_E=750;

reg[10:0]cnt_h;
reg[9:0]cnt_v;
wireen_h;//顯示列的C段有效標(biāo)志信??
wireen_v;//顯示行的C段有效標(biāo)志信??

wireaddr_en_h;
wireaddr_en;


always@(posedgeclk,negedgerst_n)
begin
if(rst_n==1'b0)
cnt_h<=?11'd0;
????else?if(cnt_h?==?H_E?-?1)
??????cnt_h?<=?11'd0;
????else
??????cnt_h?<=?cnt_h?+?1'b1;
??end
??
??always?@?(posedge?clk,?negedge?rst_n)
??begin
????if(rst_n?==?1'b0)
??????cnt_v?<=?10'd0;
????else?if(cnt_h?==?H_E?-?1)
??????begin
????????if(cnt_v?==?V_E?-?1)
??????????cnt_v?<=?10'd0;
????????else
??????????cnt_v?<=?cnt_v?+?1'b1;
??????end
????else
??????cnt_v?<=?cnt_v;
??end
??
??assign?HSYNC?=?(cnt_h?=H_A+H_B&&cnt_h=V_A+V_B&&cnt_v=566&&cnt_h=277&&cnt_v=565&&cnt_h

Top頂層模塊

moduletop(

inputclk,
inputrst_n,

outputD0_P,
outputD0_N,
outputD1_P,
outputD1_N,
outputD2_P,
outputD2_N,
outputD3_P,
outputD3_N
);
wireVSYNC;
wireHSYNC;
wire[23:0]RGB;
wireen_display;
wireclk_1;
wireclk_5;
wirelocked;
wireR_b;
wireG_b;
wireB_b;
wireclk_b;
wire[9:0]G,B,R;

pllinstance_name
(
//Clockoutports
.clk_out1(clk_1),//outputclk_out1
.clk_out2(clk_5),//outputclk_out2
//Statusandcontrolsignals
.reset(~rst_n),//inputreset
.locked(locked),//outputlocked
//Clockinports
.clk_in1(clk));//inputclk_in1



vga_drivervga_driver_inst(

.clk(clk_1),
.rst_n(locked),

.VSYNC(VSYNC),
.HSYNC(HSYNC),
.RGB(RGB),
.en_display(en_display)
);

dvi_encoderdvi_encoder_inst0(
.clkin(clk_1),//pixelclockinput
.rstin(~locked),//async.resetinput(activehigh)
.din(RGB[23:16]),//datainputs:expectregistered
.c0(1'b0),//c0input
.c1(1'b0),//c1input
.de(en_display),//deinput
.dout(R)//dataoutputs
);

serializer_10_to_1serializer_10_to_1_inst0(
.reset(~locked),//
.paralell_clk(clk_1),//
.serial_clk_5x(clk_5),//
.paralell_data(R),//
.serial_data_out(R_b)//
);
OBUFDSOBUFDS_inst0(
.O(D2_P),//1-bitoutput:Diff_poutput(connectdirectlytotop-levelport)
.OB(D2_N),//1-bitoutput:Diff_noutput(connectdirectlytotop-levelport)
.I(R_b)//1-bitinput:Bufferinput
);

dvi_encoderdvi_encoder_inst1(
.clkin(clk_1),//pixelclockinput
.rstin(~locked),//async.resetinput(activehigh)
.din(RGB[15:8]),//datainputs:expectregistered
.c0(1'b0),//c0input
.c1(1'b0),//c1input
.de(en_display),//deinput
.dout(G)//dataoutputs
);

serializer_10_to_1serializer_10_to_1_inst1(
.reset(~locked),//
.paralell_clk(clk_1),//
.serial_clk_5x(clk_5),//
.paralell_data(G),//

.serial_data_out(G_b)//
);
OBUFDSOBUFDS_inst1(
.O(D1_P),//1-bitoutput:Diff_poutput(connectdirectlytotop-levelport)
.OB(D1_N),//1-bitoutput:Diff_noutput(connectdirectlytotop-levelport)
.I(G_b)//1-bitinput:Bufferinput
);


dvi_encoderdvi_encoder_inst2(
.clkin(clk_1),//pixelclockinput
.rstin(~locked),//async.resetinput(activehigh)
.din(RGB[7:0]),//datainputs:expectregistered
.c0(HSYNC),//c0input
.c1(VSYNC),//c1input
.de(en_display),//deinput
.dout(B)//dataoutputs
);

serializer_10_to_1serializer_10_to_1_inst2(
.reset(~locked),
.paralell_clk(clk_1),//
.serial_clk_5x(clk_5),//
.paralell_data(B),//

.serial_data_out(B_b)//
);
OBUFDSOBUFDS_inst2(
.O(D0_P),//
.OB(D0_N),//
.I(B_b)//
);
serializer_10_to_1serializer_10_to_1_inst3(
.reset(~locked),
.paralell_clk(clk_1),//
.serial_clk_5x(clk_5),//
.paralell_data(10'b11111_00000),

.serial_data_out(clk_b)//
);
OBUFDSOBUFDS_inst3(
.O(D3_P),//1-bitoutput:Diff_poutput(connectdirectlytotop-levelport)
.OB(D3_N),//1-bitoutput:Diff_noutput(connectdirectlytotop-levelport)
.I(clk_b)//1-bitinput:Bufferinput
);
endmodule

對(duì)于其他模塊,都是進(jìn)行調(diào)用,并沒(méi)有自己編寫,即不再簡(jiǎn)述。

二、以太網(wǎng)

2.1 、UDP數(shù)據(jù)包介紹

54ab43f4-d418-11ed-bfe3-dac502259ad0.png

2.2 、MAC協(xié)議

54cc2786-d418-11ed-bfe3-dac502259ad0.png

2.3 、IP協(xié)議

54ecc3e2-d418-11ed-bfe3-dac502259ad0.png

2.4 、UDP協(xié)議

550c2282-d418-11ed-bfe3-dac502259ad0.png

2.5 、代碼

以下代碼即為UDP發(fā)送模塊。

moduleeth_tx(

inputwireclk,
inputwirerst_n,
inputwirekey,

outputreggmii_tx_en,
outputwiregmii_tx_er,
outputwiregmii_tx_clk,
outputreg[7:0]gmii_tx_data

);
//88-A4-C2-E5-D3-66{8'h8c,8'h82,8'hb9,8'h95,8'h10,8'hcc};
parameterPC_MAC={8'h88,8'ha4,8'hc2,8'he5,8'hd3,8'h66};
parameterBOARD_MAC={8'h88,8'ha4,8'hc2,8'he5,8'hd3,8'h67};
parameterPC_IP={8'd192,8'd168,8'd0,8'd2};
parameterBOARD_IP={8'd192,8'd168,8'd0,8'd3};
parameterPC_COM=16'd65533;
parameterBOARD_COM=16'd65531;



wireclk_125m;
wirelocked;
wireflag;
wireneg_edge;
regi_en;
regi_init;
wire[31:0]crc;
wire[31:0]crc_new;
reg[63:0]send_buf;
reg[4:0]state;
reg[9:0]send_cnt;
wirekey_flag;
wire[31:0]IP_HEAD1;
wire[31:0]IP_HEAD2;
wire[31:0]IP_HEAD3;
wire[15:0]DATA_LEN;
wire[15:0]UDP_LEN;
wire[15:0]IP_HEAD_LEN;
wire[15:0]IP_HEAD_SUM;
wire[31:0]IP_HEAD_SUM1;

assigngmii_tx_clk=clk_125m;
assigngmii_tx_er=1'b0;
assignDATA_LEN=16'd24;
assignUDP_LEN=DATA_LEN+16'd8;
assignIP_HEAD_LEN=UDP_LEN+16'd20;
assignIP_HEAD1={8'h45,8'd0,IP_HEAD_LEN};
assignIP_HEAD2=32'd0;
assignIP_HEAD3={8'hff,8'd17,IP_HEAD_SUM};
assignIP_HEAD_SUM1=IP_HEAD1[31:16]+IP_HEAD1[15:0]+IP_HEAD3[31:16]+PC_IP[31:16]+PC_IP[15:0]+BOARD_IP[31:16]+BOARD_IP[15:0];
assignIP_HEAD_SUM=~(IP_HEAD_SUM1[31:16]+IP_HEAD_SUM1[15:0]);

my_pllmy_pll_inst(
.areset(~rst_n),
.inclk0(clk),
.c0(clk_125m),
.locked(locked)
);

jitterjitter_inst(

.clk(clk_125m),
.rst_n(locked),
.key(key),

.flag(flag)
);

neg_edgeneg_edge_inst(

.clk(clk_125m),
.rst_n(locked),
.flag(flag),

.neg_edge(neg_edge)
);

CRC32_D8CRC32_D8_inst(
.clk(clk_125m),
.rst_n(locked),
.i_en(i_en),
.i_data(gmii_tx_data),
.i_init(i_init),

.crc(crc),
.crc_new(crc_new)
);

always@(posedgeclk_125m)
begin
if(locked==1'b0)
begin
gmii_tx_data<=?8'd0;
????????gmii_tx_en?<=?1'b0;
????????state?<=?5'd0;
????????i_en?<=?1'b0;
????????i_init?<=?1'b0;
????????send_buf?<=?64'd0;
????????send_cnt?<=?10'd0;
??????end
????else
??????case?(state)
????????5'd0?:??begin
??????????????????if?(neg_edge)
????????????????????state?<=?5'd1;
??????????????????else
????????????????????state?<=?5'd0;
????????????????end
????????5'd1?:??begin
??????????????????state?<=?5'd2;
??????????????????i_init?<=?1'b1;
??????????????????send_buf?<=?{{7{8'h55}},8'hd5};
????????????????end?
????????5'd2?:??begin
??????????????????i_init?<=?1'b0;
??????????????????gmii_tx_en?<=?1'b1;
??????????????????if(send_cnt?
5526cc40-d418-11ed-bfe3-dac502259ad0.png

以下為發(fā)送模塊代碼:

moduleeth_rx(

inputwirerx_clk,
inputwirerst_n,
inputwirerx_er,
inputwirerx_en,
inputwire[7:0]rx_data,

outputregfifo_wr_en,
outputregfifo_data_valid,
outputregfifo_data_clr,
outputreg[7:0]fifo_data,
outputreg[15:0]data_cnt

);

parameterPC_MAC={8'h88,8'ha4,8'hc2,8'he5,8'hd3,8'h66};
parameterBOARD_MAC={8'h88,8'ha4,8'hc2,8'he5,8'hd3,8'h67};
parameterPC_IP={8'd192,8'd168,8'd0,8'd2};
parameterBOARD_IP={8'd192,8'd168,8'd0,8'd3};
parameterPC_COM=16'd65533;
parameterBOARD_COM=16'd65531;

reg[4:0]state;
regi_en;
regi_init;
wire[31:0]crc;

reg[47:0]rx_buf;
reg[9:0]rx_cnt;
reg[31:0]IP_HEAD_SUM;
reg[15:0]UDP_LEN;

CRC32_D8CRC32_D8_inst(

.clk(rx_clk),
.rst_n(rst_n),
.i_en(i_en),
.i_data(rx_data),
.i_init(i_init),

.crc(crc),
.crc_new()
);

always@(posedgerx_clk)
begin
if(rst_n==1'b0)
begin
fifo_wr_en<=?1'b0;
????????????fifo_data?<=?8'd0;
????????????fifo_data_valid?<=?1'b0;
????????????fifo_data_clr?<=?1'b0;
????????????state?<=?5'd1;
????????????i_en?<=?1'b0;
????????????i_init?<=?1'b0;
????????????rx_buf?<=?48'd0;
????????????rx_cnt?<=?10'd0;
????????????IP_HEAD_SUM?<=?PC_IP[31:16]?+?PC_IP[15:0]?+?BOARD_IP[31:16]?+?BOARD_IP[15:0];
????????????UDP_LEN?<=?16'd0;
????????data_cnt?<=?16'd0;
????????end
????else
????????case?(state)
????????????5'd0?:?begin
????????????????????fifo_wr_en?<=?1'b0;
????????????????????fifo_data?<=?8'd0;
????????????????????fifo_data_valid?<=?1'b0;
????????????????????fifo_data_clr?<=?1'b0;
????????????????????state?<=?5'd1;
????????????????????i_en?<=?1'b0;
????????????????????i_init?<=?1'b0;
????????????????????rx_buf?<=?48'd0;
????????????????????rx_cnt?<=?10'd0;
????????????????????IP_HEAD_SUM?<=?PC_IP[31:16]?+?PC_IP[15:0]?+?BOARD_IP[31:16]?+?BOARD_IP[15:0];
????????????????????UDP_LEN?<=?16'd0;
???????????????????end?
????????????5'd1?:?begin
?????????????????????if?(rx_en?&&?rx_er?==?1'b0)?
?????????????????????????begin
?????????????????????????????i_init?<=?1'b1;
?????????????????????????????state?<=?5'd2;
?????????????????????????????rx_buf?<=?{rx_buf[39:0],rx_data};
?????????????????????????end
?????????????????????else
?????????????????????????state?<=?5'd1;
???????????????????end
????????????5'd2?:?begin
????????????????????i_init?<=?1'b0;
????????????????????data_cnt?<=?16'd0;
????????????????????rx_buf?<=?{rx_buf[39:0],rx_data};
????????????????????if?(rx_buf?==?{{5{8'h55}},8'hd5})
??????????????????????begin?
????????????????????????state?<=?5'd3;
????????????????????????i_en?<=?1'd1;
??????????????????????end
????????????????????else
????????????????????????state?<=?5'd2;
???????????????????end
????????????5'd3?:?begin
????????????????????i_en?<=?1'b1;
????????????????????rx_buf?<=?{rx_buf[39:0],rx_data};
????????????????????if(rx_cnt?

其實(shí)現(xiàn)原理就是發(fā)送模塊的逆過(guò)程。

三 、 總結(jié)

以太網(wǎng)實(shí)現(xiàn)過(guò)程基于UDP,代碼思路根據(jù)每一層順序?qū)懴聛?lái)即可完成,其中需要注意的是MAC的地址需要提前準(zhǔn)備好,因?yàn)闆](méi)有寫ARP協(xié)議,不可通過(guò)代碼來(lái)獲取MAC地址。端口號(hào)也需要提前準(zhǔn)備好。在接收模塊中需要考慮CRC獲取數(shù)據(jù)的時(shí)機(jī),不可提前也不可推遲。






審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • FPGA
    +關(guān)注

    關(guān)注

    1624

    文章

    21539

    瀏覽量

    600495
  • HDMI
    +關(guān)注

    關(guān)注

    32

    文章

    1622

    瀏覽量

    151432
  • 以太網(wǎng)
    +關(guān)注

    關(guān)注

    40

    文章

    5319

    瀏覽量

    170481
  • VGA
    VGA
    +關(guān)注

    關(guān)注

    5

    文章

    520

    瀏覽量

    62708
  • RCA
    RCA
    +關(guān)注

    關(guān)注

    0

    文章

    27

    瀏覽量

    8759

原文標(biāo)題:就業(yè)班學(xué)員學(xué)習(xí)筆記分享:FPGA之HDMI、以太網(wǎng)篇

文章出處:【微信號(hào):HXSLH1010101010,微信公眾號(hào):FPGA技術(shù)江湖】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    基于Xilinx FPGA的千兆以太網(wǎng)控制器的開(kāi)發(fā)

    千兆以太網(wǎng)利用了原以太網(wǎng)標(biāo)準(zhǔn)所規(guī)定的全部技術(shù)規(guī)范,其中包括CSMA/CD協(xié)議、以太網(wǎng)幀、全雙工、流量控制以及IEEE 802.3標(biāo)準(zhǔn)中所定義的管理對(duì)象。##以太網(wǎng)控制器的
    發(fā)表于 01-23 11:13 ?3w次閱讀
    基于Xilinx <b class='flag-5'>FPGA</b>的千兆<b class='flag-5'>以太網(wǎng)</b>控制器的開(kāi)發(fā)

    簡(jiǎn)談基于FPGA的千兆以太網(wǎng)

    大家好,又到了學(xué)習(xí)時(shí)間了,學(xué)習(xí)使人快樂(lè)。今天我們來(lái)簡(jiǎn)單的聊一聊以太網(wǎng)以太網(wǎng)FPGA學(xué)習(xí)中屬于比較高級(jí)的內(nèi)容了,有些同學(xué)肯定會(huì)感覺(jué)以太網(wǎng)學(xué)習(xí)起來(lái)非常不容易。其實(shí),我可以告訴大家,前期
    的頭像 發(fā)表于 08-05 10:28 ?1.3w次閱讀
    簡(jiǎn)談基于<b class='flag-5'>FPGA</b>的千兆<b class='flag-5'>以太網(wǎng)</b>

    基于FPGA以太網(wǎng)ARP通信測(cè)試(二)

    本文繼續(xù)簡(jiǎn)單介紹一下基于FPGA以太網(wǎng)ARP通信,該項(xiàng)目主要用于實(shí)現(xiàn)FPGA以太網(wǎng)接口和上位機(jī)進(jìn)行ARP請(qǐng)求和應(yīng)答的功能。
    的頭像 發(fā)表于 11-06 18:26 ?1123次閱讀
    基于<b class='flag-5'>FPGA</b>的<b class='flag-5'>以太網(wǎng)</b>ARP通信測(cè)試(二)

    基于FPGA的萬(wàn)兆以太網(wǎng)接口的設(shè)計(jì)與實(shí)現(xiàn)

    基于FPGA的萬(wàn)兆以太網(wǎng)接口的設(shè)計(jì)與實(shí)現(xiàn)標(biāo)準(zhǔn)中萬(wàn)兆以太網(wǎng)物理層及媒質(zhì)接入控制子層的相關(guān)協(xié)議以 應(yīng)用物理環(huán)境為例,闡述了萬(wàn)兆以太網(wǎng)接口各個(gè)單元模塊的功能和設(shè)計(jì)實(shí)現(xiàn)方法 仿真結(jié)果表明,該萬(wàn)
    發(fā)表于 08-11 15:48

    就業(yè)班學(xué)員學(xué)習(xí)筆記分享:FPGAHDMI以太網(wǎng)

    并轉(zhuǎn)為串。 1.3 代碼 Top頂層模塊 對(duì)于其他模塊,都是進(jìn)行調(diào)用,并沒(méi)有自己編寫,即不再簡(jiǎn)述。 二、以太網(wǎng)2.1 、UDP數(shù)據(jù)包介紹 2.2 、MAC協(xié)議 2.3 、IP協(xié)議 2.4
    發(fā)表于 06-12 18:30

    基于FPGA的萬(wàn)兆以太網(wǎng)接口設(shè)計(jì)

    介紹了IEEE802.3ae 標(biāo)準(zhǔn)中 萬(wàn)兆以太網(wǎng) 物理層及媒質(zhì)接入控制子層的相關(guān)協(xié)議。以10GBASE-R 應(yīng)用物理環(huán)境為例,闡述了萬(wàn)兆以太網(wǎng)接口各個(gè)單元模塊的功能和設(shè)計(jì)實(shí)現(xiàn)方法。FPGA仿真結(jié)果表明
    發(fā)表于 07-20 16:21 ?334次下載
    基于<b class='flag-5'>FPGA</b>的萬(wàn)兆<b class='flag-5'>以太網(wǎng)</b>接口設(shè)計(jì)

    一種基于FPGA以太網(wǎng)高速傳輸平臺(tái)

    一種基于FPGA以太網(wǎng)高速傳輸平臺(tái),采用DM9000和FPGA芯片,實(shí)現(xiàn)100M以太網(wǎng)數(shù)據(jù)傳輸
    發(fā)表于 02-25 14:45 ?17次下載

    基于FPGA的萬(wàn)兆以太網(wǎng)接口的設(shè)計(jì)與實(shí)現(xiàn)

    基于FPGA的萬(wàn)兆以太網(wǎng)接口的設(shè)計(jì)與實(shí)現(xiàn)。
    發(fā)表于 05-11 09:46 ?39次下載

    基于FPGA以太網(wǎng)接口設(shè)計(jì)與實(shí)現(xiàn)_李勛

    基于FPGA以太網(wǎng)接口設(shè)計(jì)與實(shí)現(xiàn)_李勛
    發(fā)表于 01-19 21:54 ?8次下載

    在工業(yè)以太網(wǎng)領(lǐng)域采用FPGA的好處

    您的工廠或者工藝自動(dòng)化系統(tǒng)需要采用多種工業(yè)以太網(wǎng)協(xié)議嗎?請(qǐng)觀看這一10分鐘的視頻,了解怎樣采用FPGA來(lái)輕松開(kāi)發(fā)工業(yè)以太網(wǎng)設(shè)計(jì)。您將能夠:   觀看在單片FPGA中集成電機(jī)控制和
    的頭像 發(fā)表于 06-20 14:00 ?4416次閱讀

    詳解FPGA的10G以太網(wǎng)接口調(diào)試

    隨著FPGA在數(shù)據(jù)中心加速和Smart NIC在SDN和NFV領(lǐng)域的廣泛應(yīng)用,基于以太網(wǎng)接口的FPGA開(kāi)發(fā)板越來(lái)越受到關(guān)注。而更高速率的以太網(wǎng)接口技術(shù)則是應(yīng)用的關(guān)鍵,本文將詳細(xì)介紹基于
    發(fā)表于 03-03 10:52 ?1.7w次閱讀
    詳解<b class='flag-5'>FPGA</b>的10G<b class='flag-5'>以太網(wǎng)</b>接口調(diào)試

    FPGA如何為以太網(wǎng)和千兆以太網(wǎng)解決低功耗問(wèn)題

    探索新的中檔 FPGA 如何為以太網(wǎng)和千兆以太網(wǎng) (GbE) 鏈路執(zhí)行橋接功能,同時(shí)解決低功耗問(wèn)題。
    的頭像 發(fā)表于 05-07 16:54 ?3917次閱讀
    <b class='flag-5'>FPGA</b>如何為<b class='flag-5'>以太網(wǎng)</b>和千兆<b class='flag-5'>以太網(wǎng)</b>解決低功耗問(wèn)題

    MELSEC iQ R以太網(wǎng)用戶手冊(cè)(應(yīng)用)

    MELSEC iQ-R以太網(wǎng)用戶手冊(cè)(應(yīng)用) 產(chǎn)品規(guī)格書
    發(fā)表于 08-25 09:39 ?0次下載
    MELSEC iQ R<b class='flag-5'>以太網(wǎng)</b>用戶手冊(cè)(應(yīng)用<b class='flag-5'>篇</b>)

    STM32以太網(wǎng)培訓(xùn)資料以太網(wǎng)外設(shè)

    電子發(fā)燒友網(wǎng)站提供《STM32以太網(wǎng)培訓(xùn)資料以太網(wǎng)外設(shè).pdf》資料免費(fèi)下載
    發(fā)表于 07-31 14:57 ?5次下載
    STM32<b class='flag-5'>以太網(wǎng)</b>培訓(xùn)資料<b class='flag-5'>之</b><b class='flag-5'>以太網(wǎng)</b>外設(shè)

    基于FPGA以太網(wǎng)中繼器設(shè)計(jì)

    電子發(fā)燒友網(wǎng)站提供《基于FPGA以太網(wǎng)中繼器設(shè)計(jì).pdf》資料免費(fèi)下載
    發(fā)表于 10-26 09:47 ?1次下載
    基于<b class='flag-5'>FPGA</b>的<b class='flag-5'>以太網(wǎng)</b>中繼器設(shè)計(jì)