在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 5007|回复: 4

[求助] serdesip核以及lvds的仿真

[复制链接]
发表于 2017-6-8 15:51:26 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
仿真不正确,明明clk_div_out1有数值.dataout竟然没有数值.是什么原因呢,还有各种时钟,lvds的,都没有数值显示,这是为什么。

原理图如下:
与所编写的程序有所出入。主要是时钟的部分。

                               
登录/注册后可看大图

真正的rtl图示:只截取并转串的一部分截图。

                               
登录/注册后可看大图

主程序如下:
`timescale 1ns / 1ps

module Serdes_Test(
  input clk_50m,//全局时钟
  input rstn, //复位
  input clk_reset,
  input clk_in_from_pin_p,         //lvds时钟输出P
  input clk_in_from_pin_n,         //lvds时钟输入N
  input data_in_from_pin_p,        //lvds输入数据P
  input data_in_from_pin_n,        //lvds输入数据N
  
  output clk_out_to_pin_p,         //lvds时钟输出P
  output clk_out_to_pin_n,         //lvds时钟输出N
  output data_out_to_pin_p,        //lvds输出数据P
  output data_out_to_pin_n         //lvds输出数据N  
    );


wire clk_div_out_1;      //低速时钟1,串行发送时钟的8分频
wire clk_div_out_2;      //低速时钟2,串行接收时钟的8分频

wire [7:0] datain;       //LVDS输入的8位并行数据

//产生LVDS发送的测试数据,0~FF
reg [7:0] dataout;
always @(posedge clk_div_out_1) begin
//always @(posedge clk_50m) begin
   if (~rstn)
     dataout <= 0;
   else if (dataout == 8'hff)
     dataout <= 0;
    else
     dataout <= dataout + 1'b1;   
end


//产生BITSLIP信号,用于修改串转并的Bit的起始位置
wire [7:0] data_delay;
reg BITSLIP=1'b0;
reg slip_check;
reg equal=1'b0;
assign data_delay=datain;

always @(posedge clk_div_out_2)
begin
        if (~rstn)
             slip_check <= 1'b0;
        else if(data_delay==8'h80)      //当串转并的输入的数据为0x80的时候,检测开始
              slip_check <= 1'b1;      
        else
              slip_check <= 1'b0;        
end

always @(posedge clk_div_out_2)
begin
        if (~rstn) begin
              BITSLIP <= 1'b0;
           equal<=1'b0;        
        end      
        else if((slip_check==1'b1) && (equal==1'b0))
          if (data_delay ==8'h81) begin  //如果检测到数据0x80后面的下一个时钟的数据为0x81时
             BITSLIP <= 1'b0;            //BITSLIP不为高
           equal<=1'b1;                   //数据正确信号为高         
        end
          else begin
             BITSLIP <= 1'b1;           //BITSLIP产生一个高脉冲,改变串转并的数据排列
           equal<=1'b0;                  //数据正确信号为低
        end     
        else begin
             BITSLIP <= 1'b0;
           equal<=equal;   
      end              
end
         
//并转串,8位数据dataout转换成串行数据,并通过lvds差分信号输出
wire dataout_w;
assign dataout_w=dataout;
p_to_s p_to_s_inst
   (
  // From the device out to the system
    .data_out_from_device(dataout_w), //Input pins
    .data_out_to_pins_p(data_out_to_pin_p), //Output pins
    .data_out_to_pins_n(data_out_to_pin_n), //Output pins
    .clk_to_pins_p(clk_out_to_pin_p), //Output pins
    .clk_to_pins_n(clk_out_to_pin_n), //Output pins

    .clk_in(clk_50m),        // Single ended clock from IOB
    .clk_div_out(clk_div_out_1),   // Slow clock output
//    .clk_reset(clk_reset),
//    .io_reset(~rstn)  //system reset
    .clk_reset(1'b0),
    .io_reset(1'b0)  //system reset
);

//串转并,LVDS差分信号转换成单端信号再通过串转并,转换为8位数据datain
s_to_p s_to_p_inst
   (
  // From the system into the device
    .data_in_from_pins_p(data_in_from_pin_p), //Input pins
    .data_in_from_pins_n(data_in_from_pin_n), //Input pins
    .data_in_to_device(datain), //Output pins

    .bitslip(BITSLIP), //Input pin
    .clk_in_p(clk_in_from_pin_p),      // Differential clock from IOB
    .clk_in_n(clk_in_from_pin_n),      // Differential clock from IOB
    .clk_div_out(clk_div_out_2),   // Slow clock output
//    .clk_reset(clk_reset),
//    .io_reset(~rstn)  //system reset
   .clk_reset(1'b0),
   .io_reset(1'b0)  //system reset
);

endmodule
激励文件如下:
module sim(
  input clk_50m,//全局时钟
  input rstn, //复位
  input clk_reset,
  input clk_in_from_pin_p,         //lvds时钟输出P
  input clk_in_from_pin_n,         //lvds时钟输入N
  input data_in_from_pin_p,        //lvds输入数据P
  input data_in_from_pin_n,        //lvds输入数据N
  
  output clk_out_to_pin_p,         //lvds时钟输出P
  output clk_out_to_pin_n,         //lvds时钟输出N
  output data_out_to_pin_p,        //lvds输出数据P
  output data_out_to_pin_n         //lvds输出数据N  
    );
   
Serdes_Test U1(
    .clk_50m(clk_50m),
    .rstn(rstn)
   
);

reg rst_n_reg;
reg clk_50m_reg;
assign rstn=rst_n_reg;
assign clk_50m=clk_50m_reg;
initial
  begin
  rst_n_reg=1'b0; #80 rst_n_reg=1'b1;
  clk_50m_reg=1'b1; forever #4 clk_50m_reg=~clk_50m_reg;
  end
endmodule

仿真文件如下:

                               
登录/注册后可看大图
 楼主| 发表于 2017-6-10 09:21:41 | 显示全部楼层
因为网速不好,图片没有加载上,现在补齐。大家没时间的话,只看红色代码,并参考仿真图,为什么在clk_div_out1的激励下,dataout的电平是XX.
并转串的部分RTL,只截取了发送部分,这里有问题,请结合代码红色部分。


                               
登录/注册后可看大图




下面是仿真图,我不明白为什么dataout没有数值,明明激励他的时钟都都波形。是因为LVDS的原因吗?真相令人震惊?有没有做过的帮忙看一下,好歹回复一下,留下足迹。


                               
登录/注册后可看大图
发表于 2017-6-10 11:06:16 | 显示全部楼层
第一 你的dataout在声明的时候没有初始化赋值为0,第二 rst_n信号在时钟产生之前就已经变为1了
复位信号和时钟分开写
 楼主| 发表于 2017-6-10 16:33:06 | 显示全部楼层
这是发射端的RTL:
111111111111111.PNG

这是仿真图:
2222222222222.PNG

3333333333333333.PNG
按照楼主的要求,只改了一个地方,就是dataout初始化为0,然后dataout终于有数值了。这个错误是完全可以避免的。楼主的第二点,让我把激励rst_n还有激励clk分开写?我有点困惑,不是并行执行吗?只要rst_n为0,时钟就不会出现,我改了一下代码,天啊,initial begin end中的内容竟然是顺序执行的,没天理了。激励文件中的begin end中的内容是顺序执行的,我仿真了一下,确实如此。源代码中的begin end 语句是并行执行的这个没有假吧?
那么,进一步讨论,仿真图中,clk_div_out1是有数值的,因此我判断发送模块应该正常工作了,但是它的lvds的引脚输出在仿真图中是高阻状态,因此我猜测是低压的缘故,导致这写个差分信号无法显示,需要有特定的设置才可以进行显示仿真。到底如何不清楚,希望懂的人给讲一下,lvds是很有用的知识。
 楼主| 发表于 2017-6-14 16:53:48 | 显示全部楼层
怎么就不对呢?仿真差分信号都没有波形?看了看example design感觉围绕这个ip核的外围电路也太多了点,看不懂。问题到底出在哪里?这个ip核的引脚很少啊?而且这个clk_div_out1还有clk_in看波形应该是做到了同步啊,这个模块已经把同步做好了呀。郁闷死了。。。
并转串难道就没有人做过吗?求指点啊。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

X

小黑屋| 手机版| 关于我们| 联系我们| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2025-7-6 16:39 , Processed in 0.038717 second(s), 8 queries , Gzip On, MemCached On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表