调试LATTICE 的SGMII的调试。

最近调试lattice 的sgmii接口。 项目最初的架构大概是这样的,用于调试。

FPGA这边的架构,就是 Tri_mac 转为 sgmii,然后再通过pcs出去。其实sgmii核自带了一个pcs核,最坑人的是PCS必须是外部时钟,最后没有办法只能自己生成一个pcs核和sgmii核对接起来。由于MDIO,我们这边没有去使用。使用的是强制输出。我调试了两天才发现可能是交换机这边设置可能有问题,这边使用的 BCM56634,一开始也不熟悉,最后去请教了别人才把自动连接把它关了。然后ok了。我把交换机芯片这边的配置如下:

最后附上我serdes这边的代码;

`timescale 1ns/100ps

module top_hb (

	// G/MII Interface
	data_in_mii,
	en_in_mii,
	err_in_mii,

	data_out_mii,
	dv_out_mii,
	err_out_mii,
	col_out_mii,
	crs_out_mii,

	// GB Timing References
	in_clk_125,
	in_ce_sink,
	in_ce_source,
	out_clk_125,
	out_ce_sink,
	out_ce_source,

	// SERIAL GMII Interface
	refclkp,
	refclkn,
	hdinp0,
	hdinn0,
	hdoutp0,
	hdoutn0,

	// Control Interface
	gbe_mode,
	sgmii_mode,
	rst_n,

	// Host Bus
	hclk,
	hcs_n,
	hwrite_n,
	haddr,
	hdatain,

	hdataout,
	hready_n,

	//Debug Port
	debug_link_timer_short,
	mr_an_complete
	);

// I/O Declarations
input		rst_n;		// System Reset, Active Low
input		hclk;
input           gbe_mode ;      // GBE Mode       (0=SGMII  1=GBE)
input           sgmii_mode ;    // SGMII PCS Mode (0=MAC    1=PHY)

input		in_clk_125 ;    // GMII Input Data Path clock 125Mhz
input		in_ce_sink ;
output		in_ce_source ;
input [7:0]	data_in_mii;	// G/MII Incoming Data
input		en_in_mii;	// G/MII Incoming Data Valid
input		err_in_mii;	// G/MII Incoming Error

input		out_clk_125 ;    // GMII Output Data Path clock 125Mhz
input		out_ce_sink ;
output		out_ce_source ;
output [7:0]	data_out_mii;	// G/MII Outgoing Data
output		dv_out_mii; 	// G/MII Outgoing Data Valid
output		err_out_mii;	// G/MII Outgoing Error
output		col_out_mii;	// G/MII Collision Detect
output		crs_out_mii;	// G/MII Carrier Sense Detect 

input		refclkp;
input		refclkn;
// exemplar attribute refclkp NOPAD true
// exemplar attribute refclkn NOPAD true

input		hdinp0;		// Incoming SGMII (on SERDES)
input		hdinn0;		// Incoming SGMII (on SERDES)
// exemplar attribute hdinp0 NOPAD true
// exemplar attribute hdinn0 NOPAD true

output		hdoutp0;	// Outgoing SGMII (on SERDES)
output		hdoutn0;	// Outgoing SGMII (on SERDES)
// exemplar attribute hdoutp0 NOPAD true
// exemplar attribute hdoutn0 NOPAD true

input           hcs_n;
input           hwrite_n;
input    [5:0]  haddr;
input    [7:0]  hdatain;

output   [7:0]  hdataout;
output          hready_n;

input	        debug_link_timer_short;
output          mr_an_complete;

// Primary G/MII Outputs -- Latched Before Leaving FPGA
reg [7:0]	data_out_mii;
reg		dv_out_mii;
reg		err_out_mii;
reg		col_out_mii;
reg		crs_out_mii;

// G/MII Signals from input latches to SGMII channel
reg [7:0]	data_buf2chan;
reg		en_buf2chan;
reg		err_buf2chan;

// G/MII Signals from SGMII channel to output latches
wire [7:0]	data_chan2buf;
wire 		dv_chan2buf;
wire 		err_chan2buf;
wire 		col_chan2buf;
wire 		crs_chan2buf;

//  8-bit Interface Signals from SGMII channel to QuadPCS/SERDES
wire [7:0]	data_chan2quad;
wire 		kcntl_chan2quad;
wire 		disparity_cntl_chan2quad;
wire 		xmit_autoneg;

//  8-bit Interface Signals from QuadPCS/SERDES to SGMII channel
wire [7:0]	data_quad2chan;
wire		kcntl_quad2chan;
wire		disp_err_quad2chan;
wire		cv_err_quad2chan;
wire		link_status;
wire		serdes_recovered_clk;
wire		refclk2fpga;

// Misc Signals
wire mdin;
wire mdout;
wire mdout_en;

wire mr_an_enable;
wire mr_restart_an;
wire [15:0] mr_adv_ability;

wire mr_an_complete;
wire mr_page_rx;
wire [15:0] mr_lp_adv_ability;
wire mr_main_reset;
wire mr_loopback_enable;
wire [1:0] mr_speed_selection;
wire mr_power_down;
wire mr_isolate;
wire mr_duplex_mode;
wire mr_col_test;
wire mr_unidir_enable;
wire an_link_ok;

wire debug_link_timer_short;
wire [1:0] operational_rate;

wire tx_pll_lol;
wire rx_cdr_lol;
wire quad_rst;
wire tx_pcs_rst;
wire rx_pcs_rst;
wire rx_serdes_rst;

wire nc_1;
wire nc_2;
wire nc_3;

//  Active High Reset
wire 		rst;
///assign rst = ~rst_n;

// Instantiate Global Reset Controller
//GSR GSR_INST	(.GSR(rst_n));
//PUR PUR_INST	(.PUR(1'b1));

tx_reset_sm   tx_reset_sm (
	.rst_n (rst_n),
	.refclkdiv2 (in_clk_125), 

	.tx_pll_lol_qd_s (tx_pll_lol),

	.rst_qd_c (quad_rst),
	.tx_pcs_rst_ch_c ({nc_3, nc_2, nc_1, tx_pcs_rst})
	);

// Buffer Incoming MII Data at Primary I/O
always @(posedge in_clk_125 or negedge rst_n)
begin
	if (rst_n == 1'b0) begin
		data_buf2chan <= 8'd0;
		en_buf2chan <= 0;
		err_buf2chan <= 0;
	end
	else begin
		data_buf2chan <= data_in_mii;
		en_buf2chan <= en_in_mii;
		err_buf2chan <= err_in_mii;
	end
end 

// Buffer Outgoing MII Data at Primary I/O
always @(posedge out_clk_125 or negedge rst_n)
begin
	if (rst_n == 1'b0) begin
		data_out_mii <= 8'd0;
		dv_out_mii <= 0;
		err_out_mii <= 0;
		col_out_mii <= 0;
		crs_out_mii <= 0;
	end
	else begin
		data_out_mii <= data_chan2buf;
		dv_out_mii <= dv_chan2buf;
		err_out_mii <= err_chan2buf;
		col_out_mii <= col_chan2buf;
		crs_out_mii <= crs_chan2buf;
	end
end 

/*
// Control Interface
input         rst_n ;
input         signal_detect ;
input         gbe_mode ;
input         sgmii_mode ;
input [1:0]   operational_rate ;
input         debug_link_timer_short ;
input         force_isolate ;
input         force_loopback ;
input         force_unidir ;
 */

// Instantiate SGMII IP Core
sgmii u1_dut (
	// Clock and Reset
	.rst_n (rst_n ),
	.tx_clk_125 (in_clk_125),
	.tx_clock_enable_sink (in_ce_sink),
	.tx_clock_enable_source (in_ce_source),
	.rx_clk_125 (),
	.rx_clock_enable_sink (),
	.rx_clock_enable_source (),

	// Control
	.gbe_mode (1'b0),
	.sgmii_mode (1'b0),  //
	.debug_link_timer_short (1'b0),
	.force_isolate (1'b0),
	.force_loopback (1'b0),
	.force_unidir (1'b0), ////
	.operational_rate (2'b10),
	.rx_compensation_err (),
	.ctc_drop_flag (),
	.ctc_add_flag (),
	.an_link_ok (an_link_ok),

	// (G)MII TX Port
	.tx_d (data_buf2chan),
	.tx_en (en_buf2chan),
	.tx_er (err_buf2chan),

	// (G)MII RX Port
	.rx_d (),
	.rx_dv (),
	.rx_er (),
	.col (),
	.crs (),

	// 8BI TX Port
	.tx_data (data_chan2quad),
	.tx_kcntl (kcntl_chan2quad),
	.tx_disparity_cntl (disparity_cntl_chan2quad),

	// 8BI RX Port
	.signal_detect (),
	.serdes_recovered_clk (),
	.rx_data (),
	.rx_kcntl (),
	.rx_even (1'b0), // Signal Not Used in Normal Mode
	.rx_disp_err (),
	.rx_cv_err (),
	.rx_err_decode_mode (1'b0), // 0= Normal Mode, always tie low for SC Familiy
	.xmit_autoneg (xmit_autoneg),

	// Management Interface  I/O
	.mr_adv_ability (16'h4001),
	.mr_an_enable (1'b0),
	.mr_main_reset (1'b0),
	.mr_restart_an (1'b0),   

	.mr_an_complete (mr_an_complete),
	.mr_lp_adv_ability (mr_lp_adv_ability),
	.mr_page_rx (mr_page_rx)
	);

// Host Bus Register Interface for SGMII IP Core
// (G)MII Rate Resolution for SGMII IP Core

// QUAD ASB 8B10B + SERDES

////单端晶振

 pcs u_pcs(
// serdes clk pins //
  .hdoutp_ch0(hdoutp0),
  .hdoutn_ch0(hdoutn0),
  .rxiclk_ch0(),
  .txiclk_ch0(in_clk_125),
  .rx_full_clk_ch0( ),
  .rx_half_clk_ch0( ),
  .tx_full_clk_ch0( ),
  .tx_half_clk_ch0( ),
  .txdata_ch0(data_chan2quad),
  .tx_k_ch0(kcntl_chan2quad),
  .xmit_ch0(xmit_autoneg),
  .tx_disp_correct_ch0(disparity_cntl_chan2quad),
  .rxdata_ch0(),
  .rx_k_ch0(),
  .rx_disp_err_ch0(),
  .rx_cv_err_ch0(),
  .sb_felb_ch0_c(1'b0),
  .sb_felb_rst_ch0_c(1'b0),
  .tx_pwrup_ch0_c(1'b1),
  .rx_pwrup_ch0_c(1'b1),
  .rx_los_low_ch0_s(),
  .lsm_status_ch0_s(),
  .rx_cdr_lol_ch0_s(),
  .tx_pcs_rst_ch0_c(tx_pcs_rst),
  .rst_qd_c(quad_rst),

///// misc
  .fpga_txrefclk(in_clk_125),
  .tx_serdes_rst_c(1'b0),         ///quad_rst
  .tx_pll_lol_qd_s(tx_pll_lol),
  .serdes_rst_qd_c(1'b0));

/*
pcs_top u_pcs(
                .rstn (rst_n),
//                refclkp,
//                refclkn,

                .txdata_ch0(data_chan2quad),
                .tx_k_ch0(kcntl_chan2quad),
                .hdoutp_ch0(hdoutp0),
                .hdoutn_ch0(hdoutn0),

              .clk_pcs(in_clk_125)

 );
 */
endmodule

以上是top_hb.v这个文件的代码。希望对大家有用。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-01 22:11:14

调试LATTICE 的SGMII的调试。的相关文章

VS中生成、清理项目、调试、开始执行(不调试)、Debug 和 Release等之间的区别

一.生成和重新生成 "生成"的时候只对你改动过的文件重新生成没有改动过的文件不会重新生成: "重新生成"是对所有的文件都重新生成. 以cpp为例当你只改动某些.cpp之类的文件的时候可以用生成省了编译没有改动的那些些文件的时间:但是改动了某些.h之类的文件最好用重新生成,因为有可能能有些文件包含.h文件也需要重新编译 选择生成或生成解决方案,将只编译自上次生成以来更改过的那些些项目文件和组件 注意 如果解决方案中包括多个项目,则生成命令将变成生成解决方案. 选择重新

Windows程序调试系列: 使用VC++生成调试信息 转

Windows程序调试系列: 使用VC++生成调试信息 ZhangTao,[email protected], 译自 “Generating debug information with Visual C++”,Oleg Starodumov 出处: http://www.cnblogs.com/itrust/archive/2006/08/17/479603.aspx 引子 当我们使用调试器来调试程序时,我们希望能够单步调试到源代码中,在代码中设置断点,观察变量的值(包括用户自定义的复杂类型的

Visual Studio调试之避免单步跟踪调试模式

Visual Studio调试之避免单步跟踪调试模式 写完Visual Studio调试之断点进阶篇之后,想分享一下我常用的一些调试技巧,后面发现写之前,一些背景知识需要介绍一下. 下面是几篇今年2月份在CSDN写的几篇文章,比如关于如何使用第一次异常处理机会和第二次异常处理机会的区别来快速定位异常发生的位置,如何设置函数断点之类的文章.因为后续我打算写几篇我常用的小技巧,可能需要先了解一些背景知识,就只把链接贴出来了.理解First Chance和Second Chance避免单步调试:htt

GDB常用调试命令以及多进程多线程调试

转载自:http://blog.csdn.net/freeelinux/article/details/53700266 一:普通命令 1.list命令 list  linenum      显示程序第linenum行周围的程序 list  function      显示函数名为function的函数的源程序 list                      显示当前行后面的源程序 list -                    显示当前行前面的源程序 2.run(r) 运行命令. ru

使用ffmepg的lib库调试,debug版本下调试无问题,但release版本会出现跑飞的现象

如题(“使用ffmepg的lib库调试,debug版本下调试无问题,但release版本会出现跑飞的现象”). 今天使用ffmpeg进行宿放和颜色格式转换,很简单的代码,却折腾了我一天,这里说来就气啊,全是一顿的蛋疼,这里记下来,防止以后再蛋疼.呵呵 开始的时候,我以为是我的代码问题,然后我把我的代码很多地方都注释了,发现debug没问题,release还是不断跑飞,啥原因? 于是我从新建了一个测试工程,很简单,就调用一句话. 整个工程的代码如下: 1 // ffmpegtest.cpp : 定

《软件调试的艺术》笔记--调试多线程程序

下面是于线程相关的GDB命令用法汇总: info threads:给出关于当前所有线程的信息. thread 3:改成线程3. break 88 thread 3 :当线程到达源代码88时停止执行. break 88 thread 3 if i == 2 当线程3到达源代码行88行,并且变量i的值为2时停止执行. 对下面的多线程进行调试: #include <stdio.h> #include <pthread.h> #include <string.h> #inclu

调试器开发实例_调试器框架设计

作为一个安全开发人员离不开调试器,它可以动态显示程序的执行过程,对于解决程序问题有极大的帮助,这些文章记录了我开发一个调试器雏形的过程,希望对你有帮助.或许我写的代码很拙劣,还请大家多多见谅! 我们使用  Microsoft Visual Studio 6.0 VC编译器来作为我们的开发工具想对一个程序进行调试,首先要做的当然是启动这个程序,这要使用CreateProcess这个Windows API来完成.例如: 1 // LilisiDebug.cpp : Defines the entry

调试器开发实例_调试器事件处理(一.事件到达)

上一章既然说到了调试循环事件,那么接下来我们该说说对调试器事件的处理了. 调试器的事件处理虽然有很多,但是并不是每一个都用得上的,接下来的文章中我们挑选一些经常用到的来给大家说说. CREATE_PROCESS_DEBUG_EVENT  创建进程之后的第一个调试事件,CREATE_PROCESS_DEBUG_INFO结构体描述了该类调试事件的详细信息. 该结构体有三个字段是句柄,分别是hFile,hProcess和hThread,同样要记得使用CloseHandle关闭它们! EXIT_PROC

无法在Web服务器上启动调试,已附加了一个调试器

运行环境:开发环境:Windows7旗舰版64bit.VisualStudio2008 With SP1.ArcEngine10.0.NetFrameWork4.0.IIS7和C#开发语言. 问题描述:ASP.NET调试时遇到的错误"无法在Web服务器上启动调试.已附加了一个调试器. 问题原因:我自己正在调试一个WebService,再次启动另外一个WebService调试则会报出这个错误,VS.NET不允许同时调试两个Web应用程序的. 无法在Web服务器上启动调试,已附加了一个调试器