zynq高速通信实例serdes

之前想要验证zynq通过serdes传输数据的实验,网上找了一篇文章,照着做了,没有一篇能完全实现,到了关键的地方都是一笔带过,大量的篇幅在讲DC平衡、高速信号产生串扰的原理,其实这些内容应该放在原理性的文章中。看到这种类型的文章,读者只想按部就班的把实验做出来。以下的内容就是基于这个思想的。

1、vivado工程的创建:

在ip Catalog 中找到如下图的IP,双击
zynq高速通信实例serdes_第1张图片第一页的设置不要动,也动不了好像
zynq高速通信实例serdes_第2张图片第二页要设置通信速率以及外部接口,至于为什么这么做网上有大量的介绍
zynq高速通信实例serdes_第3张图片第三页照着下图选就行了,8/10b也不多介绍,为了解决DC平衡的。
zynq高速通信实例serdes_第4张图片第四页主要设置下对齐字节:
zynq高速通信实例serdes_第5张图片第五页要设置loopback,这个对于单板测试很重要。为什么要把loopback放着pcie,sata这一页,害的我找了好久。很呆
zynq高速通信实例serdes_第6张图片其余的不用动。
直接点击OK,打开example project。需要修改几个地方:
zynq高速通信实例serdes_第7张图片
这个是设置远端回环的,如果是000则不使用回环。具体各个位怎么设置其他的文章很容易找到。这里的010就能满足本次实验。

还需要自己写一段测试代码,用来产生测试数据:

module add_self(
       // User Interface
    output reg  [79:0]  TX_DATA_OUT,
    output reg  [7:0]   TXCTRL_OUT,
    
       // System Interface
    input  wire         USER_CLK,
    input  wire         SYSTEM_RESET 
    );
    
    reg    [63:0]  data;
    reg    [7:0]   tx_ctrl_i;
    (* ASYNC_REG = "TRUE" *) (* keep = "true" *)    reg     system_reset_r; 
    (* ASYNC_REG = "TRUE" *) (* keep = "true" *)    reg     system_reset_r2; 

//___________ synchronizing the async reset for ease of timing simulation ________
always@(posedge USER_CLK)
begin
    system_reset_r <=  SYSTEM_RESET;
    system_reset_r2 <= system_reset_r;
end


parameter DATA_LEN = 7'd100;

parameter START_FREAM = 3'b001;
parameter USER_DATA   = 3'b010;
parameter IDEL        = 3'b100;

reg [ 3:0]current_state;
reg [ 3:0]next_state;
reg [31:0]user_data;

wire send_finish=1'b0;


//时序电路,状态转换
always@(posedge USER_CLK)
begin
    if(system_reset_r2)
        current_state<=IDEL;
    else 
        current_state<=next_state;
end

//组合电路,根据条件控制转换状态
always@(*)
begin
    case(current_state)
    IDEL:
        if(!system_reset_r2) 
            next_state=START_FREAM;
        else
            next_state=IDEL;
     START_FREAM:
        next_state=USER_DATA;
     USER_DATA:
         if(send_finish)         //传输完成,发送下一个bound
             next_state=START_FREAM;       
         else if(system_reset_r2)
             next_state=IDEL;  
         else if(user_data==DATA_LEN)
             next_state=START_FREAM;     
         else
             next_state=USER_DATA;//循环发送数据
      default:next_state=IDEL;
      endcase
end

//data gen
always@(posedge USER_CLK)
begin
    if(system_reset_r2)
        user_data<=32'b0;
     else if(current_state == USER_DATA && user_data

我写的比较随意,有兴趣的可以自己按照自己的想法来写。好了,按照以上的步骤就能做一个简单的高速通信实验。

你可能感兴趣的:(FPGA,硬件相关)