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

以太網——MDIO(SMI)接口的FPGA實現(xiàn)

這篇具有很好參考價值的文章主要介紹了以太網——MDIO(SMI)接口的FPGA實現(xiàn)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

??在 MAC 與 PHY 之間,有一個配置接口,即 MDIO(也稱 SMI,Serial Management Interface),可以配置 PHY 的工作模式、獲取 PHY 芯片的工作狀態(tài)等。本文以 PHY 芯片 B50610 為例,實現(xiàn) MDIO 接口,以實現(xiàn)對傳輸速度、接口類型的自協(xié)商。

??MDIO 包含 2 根信號線:

  • MDC,由 MAC 側提供給 PHY 的時鐘信號,最大 12.5MHz;
  • MDIO,inout,數(shù)據(jù)線

??MDIO 的通信協(xié)議如下

mdio接口,數(shù)字邏輯,Ethernet,fpga開發(fā)

MDIO 的幀構成如下:

  • Preamble,32 位前導碼,MAC 端發(fā)送 32 位邏輯 1,以同步 PHY 芯片
  • Start of Frame,幀開始信號,2’b01
  • Operation Code,操作碼,2‘b01 表示進行寫操作,2’b10 表示讀操作
  • PHY Address,5 位 PHY 地址,用于決定和哪個 PHY 芯片通信
  • Register Address,5 位寄存器地址,最大可表示 32 個寄存器
  • Turn Around,2 位轉向,在讀操作中,MDIO 在此時由 MAC 驅動改為 PHY 驅動,在第一個 TA 位,MDIO 引腳為高阻狀態(tài),第二個 TA 位,PHY 將 MDIO 引腳拉低,準備發(fā)送數(shù)據(jù),MAC 端此兩位設為高阻,若 MAC 檢測到第二位非低電平,表明對方無應答,可通過這個判斷是否讀取失?。辉趯懖僮髦?,不需要 MDIO 方向發(fā)生變化,MAC 固定輸出 2’b10
  • Data,16bit 數(shù)據(jù)
  • IDLE,空閑狀態(tài)下,一般將 MDIO 上拉

??MDIO 的時序如下

mdio接口,數(shù)字邏輯,Ethernet,fpga開發(fā)

可以看到,PHY 芯片在 MDC 上升沿讀取數(shù)據(jù),并在上升沿給出數(shù)據(jù)。因此 MAC 端須在 MDC 下降沿給出數(shù)據(jù),而讀取數(shù)據(jù)在上升沿、下降沿均可(不過需要注意,由于 MDIO_DELAY 最大可達 50ns,若使用高于 10M 的 MDC 頻率,則下降沿讀取可能出現(xiàn)問題,因此推薦 MAC 側在 MDC 上升沿讀取數(shù)據(jù))。

??由于一次 MDIO 讀寫,均由 32bit 前導碼,以及 32bit 讀寫比特流組成,因此可以方便地使用一個 5bit 計數(shù)器進行計數(shù),然后根據(jù)當前的計數(shù)值操作 MDIO。Verilog 代碼如下

/* 
 * file			: smi_top.v
 * author		: 今朝無言
 * date			: 2023-05-31
 * version		: v2.0
 * description	: SMI(MDIO)Read/Write
 */
module smi_top(
input				clk,
input				rst_n,

output				mdc,
inout				mdio,

input		[4:0]	phy_addr,
input		[4:0]	reg_addr,

input		[15:0]	wrdata,
input				write_req,
//req 信號上升沿有效,應維持至少一個 mdc 周期,可在檢測到 busy 后再置低,下同

output	reg	[15:0]	rddata,
input				read_req,

output	reg			busy,
output	reg			rd_failed	//對方無應答
);

parameter	CLK_FREQ	= 100_000_000;
parameter	MDC_FREQ	= 100_000;

clkdiv #(.N(CLK_FREQ/MDC_FREQ))
clkdiv_inst(
	.clk_in		(clk),
	.clk_out	(mdc)
);

reg				mdio_buf;
reg				link;			//MAC是否占有MDIO控制權

assign	mdio	= link? mdio_buf : 1'bz;

//-----------------edge detect---------------------------
wire	write_req_pe;
reg		write_req_d0;
reg		write_req_d1;

wire	read_req_pe;
reg		read_req_d0;
reg		read_req_d1;

always @(posedge mdc) begin
	write_req_d0	<= write_req;
	write_req_d1	<= write_req_d0;

	read_req_d0		<= read_req;
	read_req_d1		<= read_req_d0;
end

assign	write_req_pe	= write_req_d0 & (~write_req_d1);
assign	read_req_pe		= read_req_d0 & (~read_req_d1);

//---------------------FSM-------------------------------
localparam	S_IDLE	= 8'h01;
localparam	S_ARB	= 8'h02;
localparam	S_PRE_R	= 8'h04;
localparam	S_RD	= 8'h08;
localparam	S_PRE_W	= 8'h10;
localparam	S_WR	= 8'h20;
localparam	S_STOP	= 8'h40;

localparam	ST		= 2'b01;
localparam	R_OP	= 2'b10;
localparam	W_OP	= 2'b01;
localparam	W_TA	= 2'b10;

reg		[4:0]	cnt;	//一次讀寫正好 32bit Pre + 32bit WR/RD

reg		[7:0]	state		= S_IDLE;
reg		[7:0]	next_state;

always @(posedge mdc or negedge rst_n) begin
	if(~rst_n) begin
		state	<= S_IDLE;
	end
	else begin
		state	<= next_state;
	end
end

always @(*) begin
	case(state)
	S_IDLE: begin
		next_state	<= S_ARB;
	end
	S_ARB: begin
		if(write_req_pe) begin		//寫優(yōu)先
			next_state	<= S_PRE_W;
		end
		else if(read_req_pe) begin
			next_state	<= S_PRE_R;
		end
		else begin
			next_state	<= S_ARB;
		end
	end
	S_PRE_R: begin
		if(cnt==5'd31) begin
			next_state	<= S_RD;
		end
		else begin
			next_state	<= S_PRE_R;
		end
	end
	S_RD: begin
		if(cnt==5'd31) begin
			next_state	<= S_STOP;
		end
		else begin
			next_state	<= S_RD;
		end
	end
	S_PRE_W: begin
		if(cnt==5'd31) begin
			next_state	<= S_WR;
		end
		else begin
			next_state	<= S_PRE_W;
		end
	end
	S_WR: begin
		if(cnt==5'd31) begin
			next_state	<= S_STOP;
		end
		else begin
			next_state	<= S_WR;
		end
	end
	S_STOP: begin
		next_state	<= S_IDLE;
	end
	default: begin
		next_state	<= S_IDLE;
	end
	endcase
end

//cnt
always @(posedge mdc) begin
	case(state)
	S_IDLE: begin
		cnt		<= 5'd0;
	end
	S_PRE_R, S_RD, S_PRE_W, S_WR: begin
		cnt		<= cnt + 1'b1;
	end
	default: begin
		cnt		<= 5'd0;
	end
	endcase
end

//mdio_buf
always @(negedge mdc) begin		//必須下降沿發(fā)送數(shù)據(jù)
	case(state)
	S_IDLE: begin
		mdio_buf	<= 1'b1;
	end
	S_PRE_R, S_PRE_W: begin
		mdio_buf	<= 1'b1;
	end
	S_WR: begin
		case(cnt)
		5'd0: mdio_buf	<= ST[1];
		5'd1: mdio_buf	<= ST[0];

		5'd2: mdio_buf	<= W_OP[1];
		5'd3: mdio_buf	<= W_OP[0];

		5'd4: mdio_buf	<= phy_addr[4];
		5'd5: mdio_buf	<= phy_addr[3];
		5'd6: mdio_buf	<= phy_addr[2];
		5'd7: mdio_buf	<= phy_addr[1];
		5'd8: mdio_buf	<= phy_addr[0];

		5'd9: mdio_buf	<= reg_addr[4];
		5'd10: mdio_buf	<= reg_addr[3];
		5'd11: mdio_buf	<= reg_addr[2];
		5'd12: mdio_buf	<= reg_addr[1];
		5'd13: mdio_buf	<= reg_addr[0];

		5'd14: mdio_buf	<= W_TA[1];
		5'd15: mdio_buf	<= W_TA[0];

		5'd16: mdio_buf	<= wrdata[15];
		5'd17: mdio_buf	<= wrdata[14];
		5'd18: mdio_buf	<= wrdata[13];
		5'd19: mdio_buf	<= wrdata[12];
		5'd20: mdio_buf	<= wrdata[11];
		5'd21: mdio_buf	<= wrdata[10];
		5'd22: mdio_buf	<= wrdata[9];
		5'd23: mdio_buf	<= wrdata[8];
		5'd24: mdio_buf	<= wrdata[7];
		5'd25: mdio_buf	<= wrdata[6];
		5'd26: mdio_buf	<= wrdata[5];
		5'd27: mdio_buf	<= wrdata[4];
		5'd28: mdio_buf	<= wrdata[3];
		5'd29: mdio_buf	<= wrdata[2];
		5'd30: mdio_buf	<= wrdata[1];
		5'd31: mdio_buf	<= wrdata[0];

		default: begin
			mdio_buf	<= 1'b1;
		end
		endcase
	end
	S_RD: begin
		case(cnt)
		5'd0: mdio_buf	<= ST[1];
		5'd1: mdio_buf	<= ST[0];

		5'd2: mdio_buf	<= R_OP[1];
		5'd3: mdio_buf	<= R_OP[0];

		5'd4: mdio_buf	<= phy_addr[4];
		5'd5: mdio_buf	<= phy_addr[3];
		5'd6: mdio_buf	<= phy_addr[2];
		5'd7: mdio_buf	<= phy_addr[1];
		5'd8: mdio_buf	<= phy_addr[0];

		5'd9: mdio_buf	<= reg_addr[4];
		5'd10: mdio_buf	<= reg_addr[3];
		5'd11: mdio_buf	<= reg_addr[2];
		5'd12: mdio_buf	<= reg_addr[1];
		5'd13: mdio_buf	<= reg_addr[0];

		default: begin
			mdio_buf	<= 1'b1;
		end
		endcase
	end
	default: begin
		mdio_buf	<= 1'b1;
	end
	endcase
end

//data_tmp
reg		[15:0]	data_tmp;

always @(posedge mdc) begin	//在上升沿讀數(shù)據(jù)
	case(state)
	S_RD: begin
		case(cnt)
		5'd15: rd_failed	<= mdio;	//若對方應答,此處會被拉低,否則失敗
		5'd16: data_tmp[15]	<= mdio;
		5'd17: data_tmp[14]	<= mdio;
		5'd18: data_tmp[13]	<= mdio;
		5'd19: data_tmp[12]	<= mdio;
		5'd20: data_tmp[11]	<= mdio;
		5'd21: data_tmp[10]	<= mdio;
		5'd22: data_tmp[9]	<= mdio;
		5'd23: data_tmp[8]	<= mdio;
		5'd24: data_tmp[7]	<= mdio;
		5'd25: data_tmp[6]	<= mdio;
		5'd26: data_tmp[5]	<= mdio;
		5'd27: data_tmp[4]	<= mdio;
		5'd28: data_tmp[3]	<= mdio;
		5'd29: data_tmp[2]	<= mdio;
		5'd30: data_tmp[1]	<= mdio;
		5'd31: data_tmp[0]	<= mdio;
		default: begin
			data_tmp	<= data_tmp;
		end
		endcase
	end
	default: begin
		data_tmp	<= data_tmp;
	end
	endcase
end

//rddata
always @(posedge mdc) begin
	case(state)
	S_STOP: begin
		rddata	<= data_tmp;
	end
	default: begin
		rddata	<= rddata;
	end
	endcase
end

//link
always @(posedge mdc) begin
	case(state)
	S_PRE_W, S_PRE_R, S_WR: begin
		link	<= 1'b1;
	end
	S_RD: begin
		if(cnt<=13) begin
			link	<= 1'b1;
		end
		else begin
			link	<= 1'b0;
		end
	end
	default: begin
		link	<= 1'b0;
	end
	endcase
end

//busy
always @(posedge mdc) begin
	case(state)
	S_IDLE, S_ARB: begin
		busy	<= 1'b0;
	end
	S_PRE_R, S_RD, S_PRE_W, S_WR, S_STOP: begin
		busy	<= 1'b1;
	end
	default: begin
		busy	<= busy;
	end
	endcase
end

endmodule

測試

??B50610 的 PHY 地址通過 PHYA0、TEST3、TEST2 三個引腳進行配置

mdio接口,數(shù)字邏輯,Ethernet,fpga開發(fā)

比如我們想查看下網絡是否連接、當前操作速度等信息,可以查看 Auxiliary Status Summary Register 寄存器,地址 0x19。各比特含義如下

mdio接口,數(shù)字邏輯,Ethernet,fpga開發(fā)

??測試代碼略.

??連接路由器(100BASE)后:

mdio接口,數(shù)字邏輯,Ethernet,fpga開發(fā)

可以看到網絡已連接(bit2=1),自協(xié)商已完成(bit15=1),當前網速 100M 全雙工(bit10:8=0b101)。

拔掉網線:

mdio接口,數(shù)字邏輯,Ethernet,fpga開發(fā)

可以檢測到網絡斷開(bit2=0),正在自協(xié)商過程中(bit15=0)。文章來源地址http://www.zghlxwxcb.cn/news/detail-561600.html

到了這里,關于以太網——MDIO(SMI)接口的FPGA實現(xiàn)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯(lián)網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • FPGA 20個例程篇:12.千兆網口實現(xiàn)MDIO接口讀寫

    FPGA 20個例程篇:12.千兆網口實現(xiàn)MDIO接口讀寫

    ? ? ? ?千兆網口是我們日常生活中經常見到的外設接口,在后面三個例程中,我們將會一起去動手實現(xiàn)千兆網口實現(xiàn)MDIO接口讀寫、ARP通信協(xié)議、ICMP和UDP通信協(xié)議等,這三個例程有一定的難度,通過實際分析、動手編碼、模塊劃分、上板調試大家可以學到很多內容,涵蓋了

    2024年02月01日
    瀏覽(71)
  • FPGA實現(xiàn)以太網(一)——以太網簡介

    FPGA實現(xiàn)以太網(一)——以太網簡介

    以太網(Ethernet)是當今現(xiàn)有局域網采用的最通用的通信協(xié)議標準, 該標準定義了在局域網中采用的電纜類型和信號處理方法。 以太網憑借其成本低、通信速率高、抗干擾性強等優(yōu)點被廣泛應用在網絡遠程監(jiān)控、 交換機、工業(yè)自動化等對通信速率要求較高的場合。 以太網是一

    2024年02月03日
    瀏覽(28)
  • FPGA-以太網基礎知識-MII接口-RMII接口-GMII接口-RGMII接口-MAC協(xié)議-UDP協(xié)議

    FPGA-以太網基礎知識-MII接口-RMII接口-GMII接口-RGMII接口-MAC協(xié)議-UDP協(xié)議

    記錄學習FPGA以太網基礎知識、包括MII接口-RMII接口-GMII接口-RGMII接口-MAC協(xié)議、UDP協(xié)議 由上圖可得,以太網傳輸流程 : 1、一塊fpga的pcb板子以太網部分,包括FPGA芯片、PHY以太網芯片、網口接口。 2、FPGA芯片包括UDP層、IP層、MAC層,即FPGA封裝好了這些硬件模塊也叫IP核(這里的

    2024年02月08日
    瀏覽(28)
  • FPGA千兆網口數(shù)據(jù)傳輸MDIO接口——FPGA學習筆記3

    FPGA千兆網口數(shù)據(jù)傳輸MDIO接口——FPGA學習筆記3

    ????????是當今現(xiàn)有局域網采用的最通用的通信協(xié)議標準,它規(guī)定了包括物理層的連線、電子信號和介質訪問層協(xié)議的內容。成本低,通信速率高,抗干擾能力強。 標準以太網:10Mbit/s 快速以太網:100Mbit/s 千兆以太網:1000Mbit/s ......... 以太網和千兆網口其實不完全相同。

    2024年03月24日
    瀏覽(29)
  • FPGA實現(xiàn)千兆/百兆自適應以太網UDP傳輸

    FPGA實現(xiàn)千兆/百兆自適應以太網UDP傳輸

    筆者最近在項目中需要使用到ZYNQ中PL端做以太網UDP傳輸并且需要支持100M/1000M自適應切換。使用的PHY型號為RTL8211。以下分享的主要為利用已有的1000M協(xié)議棧修改為100M并且實現(xiàn)二者自適應切換,IP核主要實現(xiàn)以下功能 1、實現(xiàn)100M/1000M自適應 2、回環(huán)測試 PS:完整的IP核文件下載地

    2024年01月21日
    瀏覽(52)
  • 千兆以太網傳輸層 UDP 協(xié)議原理與 FPGA 實現(xiàn)(UDP接收)

    千兆以太網傳輸層 UDP 協(xié)議原理與 FPGA 實現(xiàn)(UDP接收)

    相關文章: (1)千兆以太網網絡層 ARP 協(xié)議的原理與 FPGA 實現(xiàn) (2)千兆以太網硬件設計及鏈路層 MAC 協(xié)議格式 (3)CRC校驗原理及實現(xiàn) (4)RGMII 與 GMII 轉換電路設計 (5)千兆以太網網絡層 IP 協(xié)議介紹與 IP 校 驗和算法實現(xiàn) (6)千兆以太網傳輸層 UDP 協(xié)議原理與 FPGA 實現(xiàn)(

    2024年02月04日
    瀏覽(29)
  • 千兆以太網芯片88E1111 RGMII模式的FPGA驅動實現(xiàn)

    千兆以太網芯片88E1111 RGMII模式的FPGA驅動實現(xiàn) 在網絡應用領域,千兆以太網已經成為主流,而88E1111作為一款先進的千兆以太網芯片,其驅動實現(xiàn)對于網絡設備的性能和穩(wěn)定性有著至關重要的影響。本文將介紹在RGMII模式下,如何實現(xiàn)88E1111芯片在FPGA上的驅動。 一、準備工作

    2024年01月22日
    瀏覽(25)
  • FPGA高端項目:圖像采集+GTP+UDP架構,高速接口以太網視頻傳輸,提供2套工程源碼加QT上位機源碼和技術支持

    FPGA高端項目:圖像采集+GTP+UDP架構,高速接口以太網視頻傳輸,提供2套工程源碼加QT上位機源碼和技術支持

    FPGA高端項目:圖像采集+GTP+UDP架構,高速接口以太網視頻傳輸,提供2套工程源碼加QT上位機源碼和技術支持 沒玩過圖像處理、GT高速接口、UDP網絡通信,都不好意思說自己玩兒過FPGA,這是CSDN某大佬說過的一句話,鄙人深信不疑。。。GT資源是Xilinx系列FPGA的重要賣點,也是做

    2024年02月05日
    瀏覽(26)
  • FPGA高端項目:圖像采集+GTX+UDP架構,高速接口以太網視頻傳輸,提供2套工程源碼加QT上位機源碼和技術支持

    FPGA高端項目:圖像采集+GTX+UDP架構,高速接口以太網視頻傳輸,提供2套工程源碼加QT上位機源碼和技術支持

    FPGA高端項目:圖像采集+GTX+UDP架構,高速接口以太網視頻傳輸,提供2套工程源碼加QT上位機源碼和技術支持 沒玩過圖像處理、GT高速接口、UDP網絡通信,都不好意思說自己玩兒過FPGA,這是CSDN某大佬說過的一句話,鄙人深信不疑。。。GT資源是Xilinx系列FPGA的重要賣點,也是做

    2024年02月05日
    瀏覽(25)
  • FPGA高端項目:圖像縮放+GTX+UDP架構,高速接口以太網視頻傳輸,提供2套工程源碼加QT上位機源碼和技術支持

    FPGA高端項目:圖像縮放+GTX+UDP架構,高速接口以太網視頻傳輸,提供2套工程源碼加QT上位機源碼和技術支持

    FPGA高端項目:圖像縮放+GTX+UDP架構,高速接口以太網視頻傳輸,提供2套工程源碼加QT上位機源碼和技術支持 沒玩過圖像處理、GT高速接口、UDP網絡通信,都不好意思說自己玩兒過FPGA,這是CSDN某大佬說過的一句話,鄙人深信不疑。。。GT資源是Xilinx系列FPGA的重要賣點,也是做

    2024年03月14日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

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

二維碼1

領取紅包

二維碼2

領紅包