微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 再问xilinx ip 核之srio之例化使用

再问xilinx ip 核之srio之例化使用

时间:10-02 整理:3721RD 点击:
以前问的太笼统,ip核的example design又很复杂。因此我决定只使用一个简单的功能来入手。这就是HELLO format格式的NWRITE操作。即对简单的写操作进行仿真。但是很可惜,还是有些地方不明白,而且仿不出结果来,因此再来问一问,希望能得到您的解答(万分期待):
这是一个模块
module srio_nwrite_gen(
    input             log_clk,
    input             log_rst,
    input             val_ireq_tready,
//    input      [15:0] src_id,
//    input      [15:0] dest_id,
//    input      [15:0] source_id,
    output reg        val_ireq_tvalid,
//    input             val_ireq_tready,
//    output reg        val_ireq_tlast,
    output reg [63:0] val_ireq_tdata,
    output      [7:0] val_ireq_tkeep,
    output     [31:0] val_ireq_tuser
    );
localparam [7:0] src_id=8'hff;
localparam [7:0] dest_id=8'hff;
localparam [3:0] NWRITE=4'd5;
localparam [3:0] TNWR  =4'd4;        
localparam [64*19-1:0] nwrite_instruction = {
      // NWRITEs
      {12'h000, NWRITE, TNWR,   36'h198877600, 8'd5},
      {12'h000, NWRITE, TNWR,   36'h198877601, 8'd6},
      {12'h000, NWRITE, TNWR,   36'h2ABBCCDD8, 8'd6},
      {12'h000, NWRITE, TNWR,   36'h2ABBCCDD8, 8'd7},
      {12'h000, NWRITE, TNWR,   36'h2ABBCCDD8, 8'd15},
      {12'h000, NWRITE, TNWR,   36'h2ABBCCDD8, 8'd31},
      {12'h000, NWRITE, TNWR,   36'h120000600, 8'd63},
      {12'h000, NWRITE, TNWR,   36'h230000600, 8'd95},
      {12'h000, NWRITE, TNWR,   36'h340000600, 8'd127},
      {12'h000, NWRITE, TNWR,   36'h450000600, 8'd255},
      {12'h000, NWRITE, TNWR,   36'h560000600, 8'd15},
      {12'h000, NWRITE, TNWR,   36'h670000600, 8'd31},
      {12'h000, NWRITE, TNWR,   36'h780000600, 8'd63},
      {12'h000, NWRITE, TNWR,   36'h890000600, 8'd95},
      {12'h000, NWRITE, TNWR,   36'h9A0000600, 8'd127},
      {12'h000, NWRITE, TNWR,   36'hAB0000600, 8'd255},
      {12'h000, NWRITE, TNWR,   36'hBC0000600, 8'd15},
      {12'h000, NWRITE, TNWR,   36'hCD0000600, 8'd15},
      {12'h000, NWRITE, TNWR,   36'hDE0000600, 8'd15}};
wire [63:0] instruction[0:18];     
genvar ii;
generate
  for (ii = 0; ii <19; ii = ii + 1) begin : instruction_gen
    assign instruction[ii] = nwrite_instruction[(ii+1)*64-1:ii*64];      
    end
    endgenerate
reg [4:0] i;
reg val_ireq_tlast;
always @(posedge log_clk or negedge log_rst)
  if(log_rst)
    begin
    val_ireq_tvalid<=1'b0;
    val_ireq_tdata<=64'd0;
    val_ireq_tlast<=1'b0;
    i<=4'd0;
    end
  else
    begin
    if(val_ireq_tready)
      begin
      case(i)
        0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17:
          begin
          val_ireq_tvalid<=1'b1;
          val_ireq_tdata<=instruction;
          val_ireq_tlast<=1'b0;
          i<=i+1'b1;
          end
        18:
          begin
          val_ireq_tvalid<=1'b1;
          val_ireq_tdata<=instruction;
          val_ireq_tlast<=1'b1;
          i<=i+1'b1;         
          end
        19:
          begin
           val_ireq_tvalid<=1'b0;
           val_ireq_tdata<=instruction;
           val_ireq_tlast<=1'b1;
           i<=i+1'b1;         
          end
        default:
          begin
          val_ireq_tvalid<=1'b0;
          val_ireq_tdata<=64'd0;
          val_ireq_tlast<=1'b0;
          end
      endcase
      end
      else
        begin
       val_ireq_tvalid<=1'b0;
       val_ireq_tdata<=64'd0;
       val_ireq_tlast<=1'b0;
       end
      end
  
assign val_ireq_tuser  = {8'h0,src_id,8'h0, dest_id};
assign val_ireq_tkeep=8'hff;  

endmodule

顶层文件
module top(
  input log_rst,
  input sys_clkn,
  input sys_clkp,
  output srio_txn0,
  output srio_txp0
    );
wire [7:0] val_ireq_tkeep;
wire [31:0] val_ireq_tuser;
wire [63:0] val_ireq_tdata;
wire val_ireq_tvalid;
wire log_clk_out;
wire val_ireq_tready;
srio_nwrite_gen U1(
  .log_clk(log_clk_out),
  .log_rst(log_rst),
  .val_ireq_tvalid(val_ireq_tvalid),
  .val_ireq_tkeep(val_ireq_tkeep),
  .val_ireq_tuser(val_ireq_tuser),
  .val_ireq_tready(val_ireq_tready),
  .val_ireq_tdata(val_ireq_tdata)
);   
//wire srio_txn0;
//wire srio_txp0;
rio ip_rio(//调用的ip核
  .log_clk_out(log_clk_out),
  .s_axis_ireq_tdata(val_ireq_tdata),
  .s_axis_ireq_tkeep(val_ireq_tkeep),
  .s_axis_ireq_tvalid(val_ireq_tvalid),
  .s_axis_ireq_tuser(val_ireq_tuser),
  .s_axis_ireq_tready(val_ireq_tready),
  .srio_txn0(srio_txn0),
  .srio_txp0(srio_txp0),
  .srio_rxn0(srio_txn0),
  .srio_rxp0(srio_txp0),
  .sys_clkn(sys_clkn),
  .sys_clkp(sys_clkp),
  .sys_rst(log_rst)
);
endmodule
添加的激励如下:
module sim(
  input log_rst,
  input sys_clkn,
  input sys_clkp,
  output srio_txn0,
  output srio_txp0
    );
top sim_top(
  .log_rst(log_rst),
  .sys_clkn(sys_clkn),
  .sys_clkp(sys_clkp),
  .srio_txn0(srio_txn0),
  .srio_txp0(srio_txp0)
);

reg sys_clkp_reg;
initial begin
    sys_clkp_reg = 1'b0;
    forever #40 sys_clkp_reg = ~sys_clkp_reg;
  end
  assign sys_clkn = ~sys_clkp_reg;
  assign sys_clkp=sys_clkp_reg;

  // reset generator
  reg log_rst_reg;
  initial begin
    log_rst_reg = 1'b1;
    #1000
    log_rst_reg = 1'b0;
  end
  assign log_rst=log_rst_reg;
endmodule
RTL图示如下,很简单:做的是回环测试:



仿真图片如下:问题也很明显了,就是srio_txp0,srio_txp0,srio_rxn0,srio_rxp0始终保持高电平,就是没没有传输成功。



问题到底出在哪里了,跪求大神的解答,真是没有办法了,就是搞不定,也没地方去问,百度一下,翻了几十页都没有实例解说,真是把我搞得一点信心都没有了,真心希望智者给解答一下,感激不尽。

看个简单的问题吧,上面的内容可能不愿意看,大家来看一个更简单的吧:






看看这两张图,我们这里只看NWRITE这种传输格式:tdata首先是发送一个包头header,他是64位的,这个包头里包含了很多信息,我们只看size 和addr部分,






Figure 3-3 shows a typical transfer with data on one of the user interface ports. This
particular transfer has a data payload of four DWORDs (32 bytes). On the interface, it takes
five total cycles including the transfer of the header.
假设传输4个字节(32bytes),就是第一张图,说明书就是这么说的。我纳闷的地方出来了:
1.包头给了个地址,没问题,最终传给目的地的时候,按给出的地址写进去数据D0,但是D1,D2,D3的地址可怎么处理啊。
2.假设传输4个字节,tdata是64位啊,每个时钟可怎么给tdata输入D0,D1,D2,D3,四个数据啊,每个只有8bytes,却要填进64位的tdata,还是说数据量太小,只能造成浪费。
3.size到底是什么意思?最大是设置成256个bytes,假设就设置成了255,过了包头之后,每来一个时钟,按照上图,传送8个字节,需要走32个时钟,才能传完256个字节,这不是浪费了tdata这个64位的接口了吗?只是header用的到64位,之后只用8位。还是说就是这样的,我的理解是正确的。

你的serders都没有正常工作

你的clk_lock_out中间是低的,会不会是没初始化成功?

查看了一下,确实是link_initialized 还有port_initialized两个输出端口始终保持为0,就是没有初始化成功。原先以为,置位sys_clk一段时间,在清零之后就可以完成ip核的初始化。那么究竟怎样进行初始化呢?

我做过

这个要多等一段时间  我在modelsim上仿的时候  大概要到1300us?左右才会初始化成功
总之  要很长时间才行

[img][/img]



我的疑问是link_initialized还有port_initialized始终都都无法变为1,这是为什么呢?究竟怎样操作才能使他变为1,不变1不能进行数据传输,看我上传的图片。phy_link_reset没有将link_initialized变为1,抓狂中。



  
您做过,千万教教我啊,您要是不教我,那就是在我的心口上扎刀子啊。前辈请指点一二,在我眼前的是重重迷雾,看不到srio的本质,您赐教啊。



   您能说的再清楚一点吗?srio中会嵌有serdes吗,您的意思是并转串并没有实现,也就是txp,txn没有数值,您觉得是什么问题呢?期待您的指教。

请问有srio的license吗?无法生成bit文件啊

没有。

我是来水贴的,不好意思哈

我也很困惑,srio的使用越来越广泛,但是这个IP核是收费的,而且费用非常高,很令人生气,难道用的人都要买吗,真是蛋疼。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top