国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

FPGA控制W5500完成UDP環(huán)回測(cè)試

這篇具有很好參考價(jià)值的文章主要介紹了FPGA控制W5500完成UDP環(huán)回測(cè)試。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

1 前言

本文針對(duì)已經(jīng)對(duì)W5500有一定了解,并且數(shù)據(jù)手冊(cè)已經(jīng)通讀一遍的人群,因?yàn)椴┲髂壳爸煌瓿闪薝DP環(huán)回測(cè)試,因此在后文可能只介紹有關(guān)UDP部分。

2 前期準(zhǔn)備

1.FPGA核心板或者開(kāi)發(fā)板;
2.W5500模塊。下圖是博主使用的模塊;
FPGA控制W5500完成UDP環(huán)回測(cè)試
3.網(wǎng)絡(luò)調(diào)試助手,網(wǎng)上隨便找一個(gè)就行;

3?。?500寄存器描述

主機(jī)與W5500通信有固定協(xié)議(數(shù)據(jù)幀),主機(jī)先發(fā)兩個(gè)字節(jié)的寄存器地址,然后一個(gè)字節(jié)的控制字,最后是數(shù)據(jù),這個(gè)數(shù)據(jù)可以是一個(gè)字節(jié),也可以是N的字節(jié),但是W5000為了方便操作,可以將這個(gè)N分為1、2、4和可變長(zhǎng)度,這些都可以配置。下圖是數(shù)據(jù)幀格式。
FPGA控制W5500完成UDP環(huán)回測(cè)試
下圖是控制字段寄存器,BSB4~BSB0選擇寄存器,RWB是讀寫(xiě)選擇位(1:寫(xiě) 0:讀),OM選擇數(shù)據(jù)段中N的字節(jié)數(shù)。
FPGA控制W5500完成UDP環(huán)回測(cè)試

W5500的寄存器分為兩種,一是通用寄存器,二是socket寄存器。這兩種寄存器通過(guò)數(shù)據(jù)幀中的地址段來(lái)選擇,如下圖所示。例如,當(dāng)寄存器地址為16’h0000時(shí),如果BSB是5‘h00000,那么此時(shí)選擇的是通用寄存器中的MR寄存器;如果BSB是5‘h00001,那么此時(shí)選擇的是socket0寄存器中的Sn_MR寄存器。
FPGA控制W5500完成UDP環(huán)回測(cè)試

4?。?500 環(huán)回測(cè)試

4.1 W5500初始化

4.1.1 通用寄存器初始化

通用寄存器的初始化就是配置源網(wǎng)關(guān)、子網(wǎng)掩碼、MAC地址,IP地址、PHY寄存器,然后清中斷。

always@(posedge clk,negedge rst_n)
	if(!rst_n)
		o_dat<='d0;
	else begin
		case(state)
			WR_MR://WRMR_CMD,
				o_dat<=8'h00;
			WRGAR_CMD,WR_GAR:
				if(rdreq)
					case(cnt_byte)
							'd00:o_dat<=GAR[31:24];
							'd01:o_dat<=GAR[23:16];
							'd02:o_dat<=GAR[15:08];
							'd03:o_dat<=GAR[07:00];
						default:;
					endcase
				else
					o_dat<=o_dat;
			WR_SUBR://WRSUBR_CMD,
				if(rdreq)
					case(cnt_byte)
							'd00:o_dat<=SUBR[31:24];
							'd01:o_dat<=SUBR[23:16];
							'd02:o_dat<=SUBR[15:08];
							'd03:o_dat<=SUBR[07:00];
						default:;
					endcase
				else
					o_dat<=o_dat;
			WR_SHAR://WRSHAR_CMD,
				if(rdreq)
					case(cnt_byte)
							'd00:o_dat<=SHAR[47:40];
							'd01:o_dat<=SHAR[39:32];
							'd02:o_dat<=SHAR[31:24];
							'd03:o_dat<=SHAR[23:16];
							'd04:o_dat<=SHAR[15:08];
							'd05:o_dat<=SHAR[07:00];							
						default:;
					endcase
				else
					o_dat<=o_dat;	
			WR_IP://WRIP_CMD,
				if(rdreq)
					case(cnt_byte)
							'd00:o_dat<=SIPR[31:24];
							'd01:o_dat<=SIPR[23:16];
							'd02:o_dat<=SIPR[15:08];
							'd03:o_dat<=SIPR[07:00];
						default:;
					endcase
				else
					o_dat<=o_dat;
			WRIR_CMD,WR_IR,WRIMR_CMD,WR_IMR:
				o_dat<=8'hFF;
			WR_RTR://WRRTR_CMD,
				if(rdreq)
					case(cnt_byte)
							'd00:o_dat<=8'h07;
							'd01:o_dat<=8'hD0;
						default:;
					endcase
				else
					o_dat<=o_dat;
			WRRCR_CMD,WR_RCR:
				o_dat<=8'h08;
			WRPHY_CMD,WR_PHY:
				o_dat<=8'b11111111;
			default:o_dat<=8'h00;
		endcase
	end

4.1.2 socket寄存器初始化

socket寄存器配置跟通用寄存器類似,先配置目的socket模式(TCP、UDP、MACRAW)、MAC地址、目的IP地址、目的端口、以及本地端口等寄存器,然后清中斷等,最后配置Sn_CR寄存器打開(kāi)端口,之后就是定時(shí)查詢SN_SR寄存器,等待socket初始化成功(Sn_SR寄存器值為8’h22)。

always@(posedge clk,negedge rst_n)
	if(!rst_n)
		o_dat<='d0;	
	else begin
		case(state)
			WR_MR:
				o_dat<=8'h02;
			WR_IR,WR_IMR:
				o_dat<=8'hFF;
			WR_PORT:
				if(rdreq)
					case(cnt_byte)
						'd00:o_dat<=SN_PORT[15:08];		
						'd01:o_dat<=SN_PORT[07:00];
						default:;
					endcase
				else
					o_dat<=o_dat;
			WR_DHAR:
				if(rdreq)
					case(cnt_byte)
						'd00:o_dat<=SN_DSHAR[47:40];		
						'd01:o_dat<=SN_DSHAR[39:32];
						'd02:o_dat<=SN_DSHAR[31:24];		
						'd03:o_dat<=SN_DSHAR[23:16];
						'd04:o_dat<=SN_DSHAR[15:08];		
						'd05:o_dat<=SN_DSHAR[07:00];							
						default:;
					endcase
				else
					o_dat<=o_dat;
			WR_DIPR:
				if(rdreq)
					case(cnt_byte)
						'd00:o_dat<=SN_DIP[31:24];		
						'd01:o_dat<=SN_DIP[23:16];
						'd02:o_dat<=SN_DIP[15:08];		
						'd03:o_dat<=SN_DIP[07:00];						
						default:;
					endcase
				else
					o_dat<=o_dat;
			WR_DPORT:
				if(rdreq)
					case(cnt_byte)
						'd00:o_dat<=SN_DPORT[15:08];		
						'd01:o_dat<=SN_DPORT[07:00];
						default:;
					endcase
				else
					o_dat<=o_dat;
			WR_MSSR:
				if(rdreq)
					case(cnt_byte)
						'd00:o_dat<=8'h05;		
						'd01:o_dat<=8'hB4;
						default:;
					endcase
				else
					o_dat<=o_dat;		
			WR_CR:
				o_dat<=8'h01;		
			default:;
		endcase	
	end

4.2 W5500數(shù)據(jù)接收

軟件一直在查詢Sn_RX_RSR寄存器(Socket n 空閑接收緩存寄存器),顯示了 Socket n 接收緩存中已接收和保存的數(shù)據(jù)大小,當(dāng)其值大于0時(shí),表明socket已經(jīng)接收到數(shù)據(jù),因此可以進(jìn)行數(shù)據(jù)接收流程。W5500數(shù)據(jù)手冊(cè)提供了一種數(shù)據(jù)讀取的方法,如下圖所示。
FPGA控制W5500完成UDP環(huán)回測(cè)試
socket的接收緩存(RX_BUF)有兩個(gè)指針,一是寫(xiě)指針(Sn_RX_WR)二是讀指針(Sn_RX_RD),當(dāng)外部將UDP數(shù)據(jù)發(fā)送給W5500時(shí),Sn_RX_WR會(huì)自動(dòng)增加,因此Sn_RX_WR是W5500芯片控制的。Sn_RX_RD由用戶控制,控制流程如上圖所示。

always@(posedge clk,negedge rst_n)
	if(!rst_n)
		o_dat<='d0;
	else begin
		case(state)
			WR_RXRD:	
				if(rdreq)
					case(cnt_byte)
						'd00:o_dat<=rx_ptr[15:08];		
						'd01:o_dat<=rx_ptr[07:00];
						default:;
					endcase
				else
					o_dat<=o_dat;
			WR_CR:
				o_dat<=8'h40;		
			default:o_dat<=o_dat;
		endcase
	end
	
always@(posedge clk,negedge rst_n)
	if(!rst_n)
		rx_ptr<='d0;
	else begin
		case(state)
				RD_RXRD:
					if(rdrxrd_vld)
						rx_ptr<=dinr;
					else
						rx_ptr<=rx_ptr;
				RD_RXBUF:
					if(den)
						rx_ptr<=rx_ptr+'d1;
					else
						rx_ptr<=rx_ptr;
//				END:
//					rx_ptr<='d0;
			default:rx_ptr<=rx_ptr;
		endcase	
	end

4.3 W5500數(shù)據(jù)發(fā)送

軟件進(jìn)入數(shù)據(jù)發(fā)送流程時(shí),先查詢W5500的發(fā)送緩存剩余空間大小,如果剩余空間大于用戶發(fā)送數(shù)據(jù)長(zhǎng)度,那么繼續(xù)后續(xù)流程,反之則拒絕發(fā)送用戶數(shù)據(jù)。同樣,手冊(cè)也提供了一種數(shù)據(jù)發(fā)送的方法,如下圖所示。
FPGA控制W5500完成UDP環(huán)回測(cè)試

4.4 數(shù)據(jù)環(huán)回

軟件例化例一個(gè)ram來(lái)存儲(chǔ)收到的數(shù)據(jù),接收完成后將數(shù)據(jù)讀出然后發(fā)送,代碼如下:

always@(posedge clk,negedge rst_n)
	if(!rst_n)
		state<='d0;
	else begin
		case(state)
			IDLE:
				if(rxdat_end && waddr>'d0)
					state<=RDDAT_PRE;
				else
					state<=IDLE;
			RDDAT_PRE:
				state<=RD_DAT;
			RD_DAT:
				if(dat_tx_end)
					state<=END;
				else 
					state<=RD_DAT;
			END:state<=IDLE;
			default:state<=IDLE;
		endcase
	end

always@(posedge clk,negedge rst_n)
	if(!rst_n)
		dat_len<='d0;
	else if(state==RDDAT_PRE)
		dat_len<=waddr;

always@(posedge clk,negedge rst_n)
	if(!rst_n)
		o_dat_tx_req<='d0;
	else	if(state==RDDAT_PRE)
		o_dat_tx_req<='d1;
	else	if(state==END)
		o_dat_tx_req<='d0;	
	else
		o_dat_tx_req<=o_dat_tx_req;
		

always@(posedge clk,negedge rst_n)
	if(!rst_n)
		waddr<='d0;		
	else if(rxdat_vld)
		waddr<=waddr+'d1;
	else if(state==END)	
		waddr<='d0;	
	
always@(posedge clk,negedge rst_n)
	if(!rst_n)
		raddr<='d0;		
	else if(dat_tx_rden)
		raddr<=raddr+'d1;
	else if(state==END)	
		raddr<='d0;			
		
my_ram	
	my_ram_inst (
			.clock 			( clk 			),
			.wren 			( rxdat_vld		),
			.wraddress 		( waddr 		),
			.data 			( rxdat 		),
			
			.rden 			( dat_tx_rden 	),
			.rdaddress 		( raddr 		),
			.q 				( o_dat 		)
	);
			
assign 	o_dat_len	=dat_len;

最后測(cè)試結(jié)果如下圖所示,包含wireshark抓包結(jié)果。
FPGA控制W5500完成UDP環(huán)回測(cè)試

5 總結(jié)

W5500的UDP通信是不難的,只要初始化正確,然后在收發(fā)時(shí)正確讀寫(xiě)socket寄存器,然后就沒(méi)啥難度了,手冊(cè)的話還是要多看幾遍,博主是在官網(wǎng)下載中文手冊(cè), W5500官網(wǎng)(手冊(cè)、參考電路、驅(qū)動(dòng)固件、例程等),完整代碼及工程放在評(píng)論區(qū)。
博主在完成UDP環(huán)回測(cè)試后還嘗試進(jìn)行TCP測(cè)試驗(yàn)證,W5500作為客戶端,但是在配置完成后發(fā)現(xiàn)W5500都沒(méi)有發(fā)出ARP包,后來(lái)就沒(méi)有測(cè)了,暫時(shí)先放下。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-459370.html

到了這里,關(guān)于FPGA控制W5500完成UDP環(huán)回測(cè)試的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • W5500-EVB-PICO進(jìn)行UDP組播數(shù)據(jù)回環(huán)測(cè)試(九)

    W5500-EVB-PICO進(jìn)行UDP組播數(shù)據(jù)回環(huán)測(cè)試(九)

    ????????上一章我們用我們的開(kāi)發(fā)板作為UDP客戶端連接服務(wù)器進(jìn)行數(shù)據(jù)回環(huán)測(cè)試,那么本章我們進(jìn)行UDP組播數(shù)據(jù)回環(huán)測(cè)試。 ????????組播是主機(jī)間一對(duì)多的通訊模式, 組播是一種允許一個(gè)或多個(gè)組播源發(fā)送同一報(bào)文到多個(gè)接收者的技術(shù)。組播源將一份報(bào)文發(fā)送到特定的

    2024年02月11日
    瀏覽(16)
  • STMicroelectronics的STM32微控制器和WIZnet的W5500以太網(wǎng)通信單片機(jī)代碼

    單片機(jī)代碼 ? #include \\\"stm32f1xx_hal.h\\\" #include \\\"string.h\\\" ? #define W5500_CS_GPIO_Port GPIOB #define W5500_CS_Pin GPIO_PIN_12 ? SPI_HandleTypeDef hspi2; ? void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_SPI2_Init(void); ? uint8_t W5500_ReadByte(void) { ? ? uint8_t byte; ? ? HAL_SPI_Receive(hspi2, byte, 1, 10); ?

    2023年04月13日
    瀏覽(21)
  • W5500-EVB-PICO 做UDP Server進(jìn)行數(shù)據(jù)回環(huán)測(cè)試(七)

    W5500-EVB-PICO 做UDP Server進(jìn)行數(shù)據(jù)回環(huán)測(cè)試(七)

    ????????前面我們用W5500-EVB-PICO 開(kāi)發(fā)板在TCP Client和TCP Server模式下,分別進(jìn)行數(shù)據(jù)回環(huán)測(cè)試,本章我們將用開(kāi)發(fā)板在UDP Server模式下進(jìn)行數(shù)據(jù)回環(huán)測(cè)試。 ????????UDP (User Dataqram Protocol) 是一種無(wú)連接的、不可靠的傳輸協(xié)議,用于在計(jì)算機(jī)網(wǎng)絡(luò)上傳輸數(shù)據(jù)UDP Server是指UDP網(wǎng)絡(luò)

    2024年02月12日
    瀏覽(15)
  • W5500-EVB-PICO做UDP Client進(jìn)行數(shù)據(jù)回環(huán)測(cè)試(八)

    W5500-EVB-PICO做UDP Client進(jìn)行數(shù)據(jù)回環(huán)測(cè)試(八)

    ? ? ? ? 上一章我們用開(kāi)發(fā)板作為UDP Server進(jìn)行數(shù)據(jù)回環(huán)測(cè)試,本章我們讓我們的開(kāi)發(fā)板作為UDP Client進(jìn)行數(shù)據(jù)回環(huán)測(cè)試。 使開(kāi)發(fā)板和我們的電腦處于同一網(wǎng)段: 開(kāi)發(fā)板通過(guò)交叉線直連主機(jī) 開(kāi)發(fā)板和主機(jī)都接在路由器LAN口 網(wǎng)路調(diào)試工具(任意) wireshark抓包工具 我們打開(kāi)例程

    2024年02月12日
    瀏覽(21)
  • 基于STM32F103,利用W5500芯片實(shí)現(xiàn)TCP客戶端連接TCP服務(wù)器的實(shí)踐

    尊敬的讀者,您好!在這篇文章中,我們將一起深入了解如何使用STM32F103和W5500芯片,實(shí)現(xiàn)TCP客戶端連接到TCP服務(wù)器的過(guò)程。在詳細(xì)的步驟中,我們不僅會(huì)給出相關(guān)的理論介紹,同時(shí)也會(huì)提供實(shí)戰(zhàn)代碼以供大家參考和學(xué)習(xí)。希望大家在閱讀完這篇文章后,能夠有所收獲。 實(shí)戰(zhàn)

    2024年02月11日
    瀏覽(21)
  • 六、W5100S/W5500+RP2040樹(shù)莓派Pico<UDP Server數(shù)據(jù)回環(huán)測(cè)試>

    六、W5100S/W5500+RP2040樹(shù)莓派Pico<UDP Server數(shù)據(jù)回環(huán)測(cè)試>

    ??UDP是一種無(wú)連接的網(wǎng)絡(luò)協(xié)議,它提供了一種簡(jiǎn)單的、不可靠的方式來(lái)進(jìn)行數(shù)據(jù)傳輸。盡管它并不保證數(shù)據(jù)傳輸?shù)耐暾院晚樞蛐?,但UDP在某些場(chǎng)景下卻具有獨(dú)特的優(yōu)勢(shì),例如在實(shí)時(shí)應(yīng)用或網(wǎng)絡(luò)游戲等領(lǐng)域中。 ??W5100S/W5500是一款集成全硬件 TCP/IP 協(xié)議棧的嵌入式以太網(wǎng)控

    2024年02月07日
    瀏覽(18)
  • FPGA解析串口指令控制spi flash完成連續(xù)寫(xiě)、讀、擦除數(shù)據(jù)

    FPGA解析串口指令控制spi flash完成連續(xù)寫(xiě)、讀、擦除數(shù)據(jù)

    最近在收拾抽屜時(shí)找到一個(gè)某寶的spi flash模塊,如下圖所示,我就想用能不能串口來(lái)讀寫(xiě)flash,大致過(guò)程就是,串口向fpga發(fā)送一條指令,fpga解析出指令控制flah,這個(gè)指令協(xié)議目前就是: 55 + AA + CMD + LEN_h + LEN_m + LEN_l + DATA CMD:01 寫(xiě);02 讀;03 擦除(片擦除); LEN_h/m/l:三個(gè)字

    2024年02月03日
    瀏覽(21)
  • 七、W5100S/W5500+RP2040樹(shù)莓派Pico<UDP 組播>

    七、W5100S/W5500+RP2040樹(shù)莓派Pico<UDP 組播>

    ??UDP組播是一種基于UDP協(xié)議的通信方式,它允許一臺(tái)計(jì)算機(jī)通過(guò)發(fā)送單個(gè)UDP數(shù)據(jù)包來(lái)同時(shí)向多個(gè)目標(biāo)發(fā)送信息。這種通信方式在需要高效、實(shí)時(shí)的數(shù)據(jù)傳輸?shù)膽?yīng)用中非常有用,比如視頻直播、在線游戲等。 ??本章節(jié)將進(jìn)行UDP組播回環(huán)測(cè)試。 ??W5100S/W5500是一款集成全硬

    2024年02月06日
    瀏覽(17)
  • 六、W5100S/W5500+RP2040之MicroPython開(kāi)發(fā)<UDP示例>

    六、W5100S/W5500+RP2040之MicroPython開(kāi)發(fā)<UDP示例>

    ??在這個(gè)智能硬件和物聯(lián)網(wǎng)時(shí)代,MicroPython和樹(shù)莓派PICO正以其獨(dú)特的優(yōu)勢(shì)引領(lǐng)著嵌入式開(kāi)發(fā)的新潮流。MicroPython作為一種精簡(jiǎn)優(yōu)化的Python 3語(yǔ)言,為微控制器和嵌入式設(shè)備提供了高效開(kāi)發(fā)和簡(jiǎn)易調(diào)試的 ??當(dāng)我們結(jié)合WIZnet W5100S/W5500網(wǎng)絡(luò)模塊,MicroPython和樹(shù)莓派PICO的開(kāi)發(fā)潛力

    2024年01月22日
    瀏覽(18)
  • 基于FPGA的UART多字節(jié)環(huán)回實(shí)驗(yàn)verilog代碼(含幀頭幀尾和解碼部分)

    基于FPGA的UART多字節(jié)環(huán)回實(shí)驗(yàn)verilog代碼(含幀頭幀尾和解碼部分)

    采用VIVADO開(kāi)發(fā)環(huán)境,頻率50MHz,波特率 256000,8位數(shù)據(jù)位,1位停止位。 串口接收程序源自正點(diǎn)原子的例程。 帶仿真工程,數(shù)據(jù)幀格式如下圖: 發(fā)送數(shù)據(jù)為:aa ff 03 00 0E 03 B1 86 10 00 40 01 11 00 00 00 00 00 00 00 11 00 00 00 00 00 11 11 55 CC 效果如圖: ?仿真效果圖: 參考以下文章和視頻:

    2024年02月08日
    瀏覽(78)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包