原创作品,请引用保留链接。http://blog.csdn.net/HengZo/article/details/52052787
2016.7.28,开始着手分析这个IP核,分析功能和使用教程,并完成在板调试。分析这个主要用于光纤通信应用。
1)封装的IP核,,不使用输入引脚接地,不使用输出引脚不接。
unused inputs are tied low and unused outputs are disconnected.
2)CORE Generator GUI根据设置,对IP核进行了封装(wapper),总共进行了三层封装。
最底层:源程序文件:V5EMAC.v
例化了 Ethernet MAC,即TEMAC这个内核IP primitive。最底层文件为:V5EMAC.v,只是例化了TEMAC:
module V5EMAC(...);
...
...
// Instantiate the Virtex-5 Embedded Ethernet EMAC
TEMAC v5_emac(...); //例化TEMAC
...
...
endmodule
末尾的MAC地址设置如下:这两个地址如何理解?
// Set the Pause Address Default
//synthesis attribute EMAC0_PAUSEADDR of v5_emac is 48'hFFEEDDCCBBAA
defparam v5_emac.EMAC0_PAUSEADDR = 48'hFFEEDDCCBBAA;
//synthesis attribute EMAC0_UNICASTADDR of v5_emac is 48'h000000000000
defparam v5_emac.EMAC0_UNICASTADDR = 48'h000000000000;
V5EMAC只是实现了MAC层的控制,后级接物理层实现,
// Instantiate RocketIO tile for SGMII or 1000BASE-X PCS/PMA Physical I/F
GTP_dual_1000X GTP_DUAL_1000X_inst(...)
125M时钟输出则是由GTP_dual_1000X产生并输出
第二层:例化了V5EMAC和时钟、物理接口 文件:V5EMAC_block.v
module V5EMAC_block(...);
// The RocketIO transceivers are available in pairs with shared
// clock resources
// 125MHz clock is used for GTP user clocks and used
// to clock all Ethernet core logic.
assign usrclk2 = CLK125; //输入时钟
// Connect previously derived client clocks to example design output ports
// EMAC0 Clocking
// 125MHz clock output from transceiver
assign CLK125_OUT = refclkout; //输出时钟
// Instantiate RocketIO tile for SGMII or 1000BASE-X PCS/PMA Physical I/F
GTP_dual_1000X GTP_DUAL_1000X_inst(...);
// Instantiate the EMAC Wrapper (V5EMAC.v)
V5EMAC v5_emac_wrapper_inst(...);
endmodule
第三层:V5EMAC_locallink.v
例化了V5EMAC_block和收发FIFO
对接收FIFO例化了locallink接口
// The module declaration for the MAC with FIFO design.
module V5EMAC_locallink(...);
// Instantiate the EMAC Wrapper (V5EMAC_block.v)
V5EMAC_block v5_emac_block_inst(...);
// Instantiate the client side FIFO
eth_fifo_8 client_side_FIFO_emac0 (...);
endmodule
这三层已经完成了EMAC的封装工作。
软件继续进行了一个example的演示封装,对V5EMAC_locallink.v进行封装调用,完善功能
module V5EMAC_example_design(...);
// Reset input buffer
IBUF reset_ibuf (.I(RESET), .O(reset_i));
// Instantiate the EMAC Wrapper with LL FIFO
// (V5EMAC_locallink.v)
V5EMAC_locallink v5_emac_ll(...);
// Instatiate the address swapping module
address_swap_module_8 client_side_asm_emac0 (...);
address_swap_module_8则实现源地址和目的地址的互换,完成数据转发。
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
以下部分:20161210修改
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
以下部分,为在FPGA板上测试实际效果截图。
Virtex-5 Embedded Tri-Mode Ethernet MAC Wrapper
Debugging and Packet Analysis Guide
介绍
这里的介绍主要靠抄抄抄,给个链接吧,自己看。
XilinxAnswer 43330 ,在XIlinx官网搜索,文档记录了TEMAC核的简略配置过程,使用官网ML505开发板调试,采用GMII接口。
本文,则应用于光纤通信,物理层使用PCS/PMA,外接光电转换接头,实现数据传输。
调试需求
软件
ISE13.3
Wireshark
ChipScopePro
硬件
FPGA光纤通信板(本公司项目板),基于XC5VLX50TFF665。
IP CoreVersion
XilinxLogiCORE Virtex-5 Embedded Tri-Mode Ethernet MAC Wrapper v1.8
Example Design Architecture
下图是 EXAMPLE DESIGN WRAPPER的程序分层结构图。EXAMPLE DESIGN共分为三级封装接口,对应图中红色标记所示:
1) The exampledesign wrapper connects the FIFOs to the Address Swap module so that datareceived at the receive client interface is looped back to the transmitter.
2) The local link wrapper connects thetransmit and receive client interfaces of each selected Ethernet MAC to a LocalLink FIFO.
3) The block-level wrapper instantiates theEthernet MAC wrapper and the interface logic for each of the selected physicalinterfaces.
第(1)层example designWrapper,则是个可以直接应用的example小程序Address Swap module,该小程序实现把接收到的数据原路返回,即把接收数据帧中目的地址和源地址倒换,实现原路返回数据。用户可以根据自己的设计,替换为自己的设计程序。设计程序使用Local Link接口实现数据流控制与传输。
1)ISE CoreGenerator封装的IP核,,不使用输入引脚接地,不使用输出引脚不接。
unused inputs are tied low and unused outputs are disconnected.
2)CORE GeneratorGUI根据设置,对IP核进行了封装(wapper),总共进行了三层封装。
最底层:源程序文件:My_Fiber_EMAC.v
例化了 Ethernet MAC,即TEMAC这个内核IP primitive。最底层文件为:My_Fiber_EMAC.v,只是例化了TEMAC:
moduleMy_Fiber_EMAC(...);
...
...
// Instantiate the Virtex-5 EmbeddedEthernet EMAC
TEMAC v5_emac(...); //例化TEMAC
...
...
endmodule
末尾的MAC地址设置如下:这两个地址如何理解?
// Set the Pause Address Default
//synthesis attribute EMAC0_PAUSEADDR of v5_emac is 48'hFFEEDDCCBBAA
defparam v5_emac.EMAC0_PAUSEADDR = 48'hFFEEDDCCBBAA;
//synthesis attribute EMAC0_UNICASTADDR of v5_emac is 48'h000000000000
defparam v5_emac.EMAC0_UNICASTADDR = 48'h000000000000;
V5EMAC只是实现了MAC层的控制,后级接物理层实现,
// Instantiate RocketIO tile for SGMII or1000BASE-X PCS/PMA Physical I/F
GTP_dual_1000X GTP_DUAL_1000X_inst(...)
125M时钟输出则是由GTP_dual_1000X产生并输出
第二层:例化了V5EMAC和时钟、物理接口 文件:My_Fiber_EMAC_block.v
moduleMy_Fiber_EMAC_block(...);
// The RocketIO transceivers are availablein pairs with shared
// clockresources
//125MHz clock is used for GTP user clocks and used
// toclock all Ethernet core logic.
assign usrclk2 =CLK125; //输入时钟
// Connect previously derived clientclocks to example design output ports
// EMAC0 Clocking
// 125MHz clock output from transceiver
assign CLK125_OUT = refclkout; //输出时钟
// Instantiate RocketIO tile for SGMII or1000BASE-X PCS/PMA Physical I/F
GTP_dual_1000X GTP_DUAL_1000X_inst(...);
// Instantiate the EMAC Wrapper(V5EMAC.v)
My_Fiber_EMAC v5_emac_wrapper_inst(...);
endmodule
第三层:My_Fiber_EMAC_locallink.v
例化了V5EMAC_block和收发FIFO
对接收FIFO例化了locallink接口
// The module declaration for the MACwith FIFO design.
module My_Fiber_EMAC_locallink(...);
// Instantiate the EMAC Wrapper (My_Fiber_EMAC_locallink.v)
My_Fiber_EMAC_block v5_emac_block_inst(...);
// Instantiate the client side FIFO
eth_fifo_8 client_side_FIFO_emac0 (...);
endmodule
这三层已经完成了EMAC的封装工作。
软件继续进行了一个example的演示封装,对V5EMAC_locallink.v进行封装调用,完善功能
moduleMy_Fiber_EMAC_example_design(...);
//Reset input buffer
IBUF reset_ibuf (.I(RESET), .O(reset_i));
// Instantiate the EMAC Wrapper with LLFIFO
// (V5EMAC_locallink.v)
V5EMAC_locallink v5_emac_ll(...);
// Instatiate the address swapping module
address_swap_module_8client_side_asm_emac0 (...);
address_swap_module_8则实现源地址和目的地址的互换,完成数据转发。
NOTES:注意这个复位信号RESET,TEMAC核是高电平复位信号,引脚传入的信号需要根据外部复位电平进行设置,如果外部复位芯片为低复位,则需要进行取反,
assign reset_i =!RESET; //修改@Heng,20161209
或者直接接地,
assign reset_i =1’0;
都可正确收发数据
图1-Figure 1: Default Example Design and Testbench
数据接口介绍
本小节介绍应用于光纤通信的千兆网IP核的模块接口。
要弄清楚这些接口,最好跟踪一个数据包的流向,逐级分析数据流与控制信号。
根据AR43330文档介绍,大致分为三层共六路信号(收信号和发信号)。
1. RXPhysical (GTP) Interface [Interface-3 in Figure 1]
2. TXPhysical (GTP) Interface [Interface-3 in Figure 1]
3. RX MACClient Interface [Interface-2 in Figure 1]
4. TX MACClient Interface [Interface-2 in Figure 1]
5. RXLocal Link Interface [Interface-1 in Figure 1]
6. TXLocal Link Interface [Interface-1 in Figure 1]
在1和2中,数据是看不出来具体意义的,但有数据收发和无数据收发,产生的线路数据是不一样的。
查看具体的收发数据与控制信号,则观察3-6信号组最好。
这里主要看LocalLink数据接口,RX 和TX数据流。
Generatingthe PCS/PMADesignin the CORE Generator
步骤
1)New Source Wizard,创建IP核
2)NewSource Wizard-Select IP
3) Configure the Virtex-5 EmbeddedTri-Mode Ethernet MAC Wrapper as follows and generate the core.
Host Type – None
Enable Emacs –两个都选上
PHY Interface –1000BASE X PCS PMA
Flow Control Configuration – Enable Rx and Tx Flow Control
EMAC0和EMAC1可以独立配置。这里配置为相同的PCS/PMA模式。
这里使能了Address Filter 。这个功能后面会观察它的效果。
生成了TEMAC核:
这里把核文件.xco移除,添加.v文件。
文件列表如上图所示。
程序适应性修改
修改程序部分,以使程序适应各个工程。这个程序是不能直接运行的。
修改如下:
1)复位信号
外部输入的低电平复位信号修改为高电平复位信号。因为TEMAC核就是高电平复位的。而且还是同步复位的。
// Reset input buffer
//IBUF reset_ibuf (.I(RESET),.O(reset_i));
assign reset_i = !RESET;
2)在My_Fiber_EMAC.v文件,修改配置自动协商属性,改为使能自动协商
//synthesis attributeEMAC0_PHYINITAUTONEG_ENABLE of v5_emac is "FALSE"
defparamv5_emac.EMAC0_PHYINITAUTONEG_ENABLE = "TRUE";
3)修改UCF文件
提供的自动生成的UCF比较复杂,约束较多。其实,只需要简单地时钟和位置约束即可,修改简单的约束如下:
##################################
# BLOCK Level constraints
##################################
# EMAC0 Clocking
## 125MHz clock input from BUFG
#NET "CLK125" TNM_NET = "clk_gtp";
#TIMEGRP "My_Fiber_EMAC_gtp_clk" = "clk_gtp";
#TIMESPEC "TS_My_Fiber_EMAC_gtp_clk" = PERIOD"My_Fiber_EMAC_gtp_clk" 8 ns HIGH 50 %;
##################################
# EXAMPLE DESIGN Level constraints
##################################
NET "MGTCLK_N" TNM_NET = MGTCLK_N;
TIMESPEC TS_MGTCLK_N = PERIOD "MGTCLK_N" 8 ns HIGH 50%INPUT_JITTER 500 ps;
NET "MGTCLK_P" TNM_NET = MGTCLK_P;
TIMESPEC TS_MGTCLK_P = PERIOD "MGTCLK_P" 8 ns HIGH 50%INPUT_JITTER 500 ps;
# Place the transceiver components. Please alter to your chosentransceiver.
INST "*clkingen" LOC = BUFDS_X0Y3;
INST"*GTP_DUAL_1000X_inst?GTP_1000X?tile0_rocketio_wrapper_i?gtp_dual_i"LOC = "GTP_DUAL_X0Y3";
INST "MGTCLK_N" LOC = "K3";
INST "MGTCLK_P" LOC = "K4";
NET "TXP_0" LOC = H2;
NET "TXN_0" LOC = J2;
NET "RXP_0" LOC = J1;
NET "RXN_0" LOC = K1;
NET "TXP_1" LOC = N2;
NET "TXN_1" LOC = M2;
NET "RXP_1" LOC = M1;
NET "RXN_1" LOC = L1;
4)添加额外的复位引脚位置:
NET "RESET" LOC = Y10;
完成修改。
ChipScope配置
在CDC添加信号
添加Local Link信号即可。多多益善。
开始实现设计。
等待。
。。。。。。。。。
。。。。。。。。。。
。。。。
。。。。
PC端设置
要使用WireSark抓取信号,则要PC向FPGA发送信号。这里利用ping指令实现PC向FPGA数据发送。
本机地址为:1.2.3.9,设置FPGA板地址为1.2.3.5,MAC地址为00-22-19-05-1b-9b
在command shell 中输入
1)arp -s 1.2.3.5 00-22-19-05-1b-9b
2)ping 1.2.3.5
Arp指令意义自己arp /?查询阅读。
PC端发送信号:
WireShark抓取信号如下:
ChipScope抓取信号如下:
RX_LL_DATA_0收信号,TX_LL_DATA_0转发信号。TX_LL_DATA_0比RX_LL_DATA_0延迟了7个时钟发出。这个延时在address_swap_module_8程序中可以自己去了解。
可以对比WireShark数据与CDC数据,源地址和目的地址正确:
wireshark数据:
完成初步设计。
对比一下地址过滤是什么东西??
设计时,地址过滤使能了的。
PC端修改一下目的MAC地址,目的地址修改一位,模拟一位错误的地址,改为:arp -s 1.2.3.5 00-22-19-05-1b-9c
然后:ping 1.2.3.5
结果:无数据返回,无数据返回,无数据返回。。。。
只有电脑端发送的数据。
CDC抓取信号,EMAC0CLIENTRXFRAMEDROP=1,数据包丢弃,
根据UG194文档第71页介绍
数据未匹配,数据丢失。
地址匹配很有用的。。。
下图是地址匹配的完成CDC数据图:
完成。
后续应用程序根据自己需要修改,应用Local Link接口,编写自己的应用程序。