Xinlix原语IBUFDS、OBUFDS的使用和仿真

1、介绍

IBUFDS、和OBUFDS都是差分信号缓冲器,用于不同电平接口之间的缓冲和转换。IBUFDS 用于差分输入,OBUFDS用于差分输出。

2、IBUFDS

2.1、理论

IBUFDS是差分输入缓冲器,支持低压差分信号(如LVCMOS、LVDS等)。在IBUFDS中,一个电平接口用两个独特的电平接口(I和IB)表示。一个可以认为是主信号,另一个可以认为是从信号。

IBUFDS原语示意图如下所示:

 端口说明如下表:

端口类型位宽功能
I输入1差分输入+端
IB输入1差分输入-端
O输出1输出

信号真值表如下:

输入输出
IIBO
00不改变,同上次输出
010
101
11不改变,同上次输出

2.2、仿真

打开VIvado--Tools--Language Templates,搜索“IBUFDS”,可以找到Xilinx提供的模板如下:


  
  
  1. IBUFDS #(
  2. . DIFF_TERM( "FALSE"), // Differential Termination
  3. . IBUF_LOW_PWR( "TRUE"), // Low power="TRUE", Highest performance="FALSE"
  4. . IOSTANDARD( "DEFAULT") // Specify the input I/O standard
  5. ) IBUFDS_inst (
  6. . O(O), // Buffer output
  7. . I(I), // Diff_p buffer input (connect directly to top-level port)
  8. . IB(IB) // Diff_n buffer input (connect directly to top-level port)
  9. );

 DIFF_TERM、IBUF_LOW_PWR分别指定差分终端和性能模式,IOSTANDARD指定你需要输出的电平标准。

 接下来例化一个IBUFDS原语进行测试,Verilog代码如下:


  
  
  1. //------------------------------------------------------------------------
  2. //--IBUFDS测试模块
  3. //------------------------------------------------------------------------
  4. //------------<模块及端口声明>----------------------------------------
  5. module IBUFDS_test(
  6. input clk , //时钟,50M
  7. input rst_n , //复位,低电平有效
  8. input data_p , //输入数据,差分+
  9. input data_n , //输入数据,差分-
  10. output out
  11. );
  12. //------------<例化原语>----------------------------------------
  13. IBUFDS #(
  14. .DIFF_TERM ( "FALSE") , // Differential Termination
  15. .IBUF_LOW_PWR ( "TRUE") , // Low power="TRUE", Highest performance="FALSE"
  16. .IOSTANDARD ( "DEFAULT") // 选择I/O电平标准,这里选择默认
  17. )
  18. IBUFDS_inst (
  19. .O ( out) , // 输出
  20. .I (data_p) , // 差分输入+(需要直接连接到顶层端口)
  21. .IB (data_n) // 差分输入-(需要直接连接到顶层端口)
  22. );
  23. endmodule

每隔20ns分别随机生成2个1位2进制数据作为差分输入,观察输出,Testbench如下:


  
  
  1. //------------------------------------------------
  2. //--IBUFDS原语仿真
  3. //------------------------------------------------
  4. `timescale 1ns/ 1ns //时间单位/精度
  5. //------------<模块及端口声明>----------------------------------------
  6. module tb_IBUFDS_test();
  7. reg clk ;
  8. reg rst_n ;
  9. reg data_p ;
  10. reg data_n ;
  11. wire out ;
  12. //------------<例化被测试模块>----------------------------------------
  13. IBUFDS_test IBUFDS_test_inst(
  14. .clk (clk) ,
  15. .rst_n (rst_n) ,
  16. .data_p (data_p) ,
  17. .data_n (data_n) ,
  18. .out (out)
  19. );
  20. //------------<设置初始测试条件>----------------------------------------
  21. initial begin
  22. clk = 1'b1; //初始时钟为1
  23. rst_n <= 1'b0; //初始复位
  24. data_p <= 1'b0;
  25. data_n <= 1'b0;
  26. #60 //60个时钟周期后
  27. rst_n <= 1'b1; //拉高复位,系统进入工作状态
  28. end
  29. //------------<设置时钟>----------------------------------------------
  30. always #10 clk = ~clk; //系统时钟周期20ns
  31. always #20 data_p <= $random % 2; //每20ns生成 1 或者 0
  32. always #20 data_n <= $random % 2; //每20ns生成 1 或者 0
  33. endmodule

仿真结果如下:

 每隔20ns,2个差分输入端口分别随机生成2个1位2进制数据;输出输入符合上述的真值表。

3、OBUFDS

3.1、理论

OBUFDS 是一个差分输出缓冲器,用于将来自 FPGA 内部逻辑的信号转换成差分信号输出,支持 TMDS、LVDS等电平标准。它的输出用O和OB两个独立接口表示。一个可以认为是主信号,另一个可以认为是从信号。

OBUFDS原语示意图如下所示:

 端口说明如下表:

端口类型位宽功能
O输出1差分输出+端
OB输出1差分输出-端
I输入1输入

信号真值表如下:

输入输出
IOOB
001
110

可以看出,输出+端与输入一致,输出-端与输入相反。

3.2、仿真

打开VIvado--Tools--Language Templates,搜索“OBUFDS”,可以找到Xilinx提供的模板如下:


  
  
  1. OBUFDS #(
  2. . IOSTANDARD( "DEFAULT"), // Specify the output I/O standard
  3. . SLEW( "SLOW") // Specify the output slew rate
  4. ) OBUFDS_inst (
  5. . O(O), // Diff_p output (connect directly to top-level port)
  6. . OB(OB), // Diff_n output (connect directly to top-level port)
  7. . I(I) // Buffer input
  8. );

其中IOSTANDARD指定你需要输出的差分电平标准,SLEW根据你的要求输出FAST或者SLOW。

接下来例化一个OBUFDS原语进行测试,Verilog代码如下:


  
  
  1. //------------------------------------------------------------------------
  2. //--OBUFDS测试模块
  3. //------------------------------------------------------------------------
  4. //------------<模块及端口声明>----------------------------------------
  5. module OBUFDS_test(
  6. input clk , //时钟,50M
  7. input rst_n , //复位,低电平有效
  8. input data , //输入数据
  9. output out_p , //输出数据,差分+
  10. output out_n //输出数据,差分-
  11. );
  12. //------------<例化原语>----------------------------------------
  13. OBUFDS #(
  14. .IOSTANDARD ( "DEFAULT") , // 选择I/O电平标准,这里选择默认
  15. .SLEW ( "SLOW") // 选择输出速率,这里选择SLOW
  16. )
  17. OBUFDS_inst (
  18. .O (out_p) , // 差分输出+(需要直接连接到顶层端口)
  19. .OB (out_n) , // 差分输出-(需要直接连接到顶层端口)
  20. .I ( data) // 输入
  21. );
  22. endmodule

每隔20ns随机生成一个1位2进制数据,观察差分输出,Testbench如下:


  
  
  1. //------------------------------------------------
  2. //--OBUFDS原语仿真
  3. //------------------------------------------------
  4. `timescale 1ns/ 1ns //时间单位/精度
  5. //------------<模块及端口声明>----------------------------------------
  6. module tb_OBUFDS_test();
  7. reg clk ;
  8. reg rst_n ;
  9. reg data ;
  10. wire out_p ;
  11. wire out_n ;
  12. //------------<例化被测试模块>----------------------------------------
  13. OBUFDS_test OBUFDS_test_inst(
  14. . clk (clk),
  15. . rst_n (rst_n),
  16. . data (data),
  17. . out_p (out_p),
  18. . out_n (out_n)
  19. );
  20. //------------<设置初始测试条件>----------------------------------------
  21. initial begin
  22. clk = 1 'b1; //初始时钟为1
  23. rst_n <= 1 'b0; //初始复位
  24. data <= 1 'b0;
  25. # 60 //60个时钟周期后
  26. rst_n <= 1 'b1; //拉高复位,系统进入工作状态
  27. end
  28. //------------<设置时钟>----------------------------------------------
  29. always # 10 clk = ~clk; //系统时钟周期20ns
  30. always # 20 data <= $random % 2; //每20ns生成 1 或者 0
  31. endmodule

 仿真结果如下:

每隔20ns,data随机生成0或者1,out_p与输入一致,out_n与输入相反;差分输出信号符合上述的真值表。 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值