1、介绍
ibufds、和obufds都是差分信号缓冲器,用于不同电平接口之间的缓冲和转换。ibufds 用于差分输入,obufds用于差分输出。
2、ibufds
2.1、理论
ibufds是差分输入缓冲器,支持低压差分信号(如lvcmos、lvds等)。在ibufds中,一个电平接口用两个独特的电平接口(i和ib)表示。一个可以认为是主信号,另一个可以认为是从信号。
ibufds原语示意图如下所示:
端口说明如下表:
信号真值表如下:
2.2、仿真
打开vivado--tools--language templates,搜索“ibufds”,可以找到xilinx提供的模板如下:
ibufds #(
.diff_term(false), // differential termination
.ibuf_low_pwr(true), // low power=true, highest
.iostandard(default) // specify the input i/o standard
) ibufds_inst (
.o(o), // buffer output
.i(i), // diff_p buffer input (connect directly to top-level port)
.ib(ib) // diff_n buffer input (connect directly to top-level port)
);
diff_term、ibuf_low_pwr分别指定差分终端和性能模式,iostandard指定你需要输出的电平标准。
接下来例化一个ibufds原语进行测试,verilog代码如下:
//------------------------------------------------------------------------
//--ibufds测试模块
//------------------------------------------------------------------------
//----------------------------------------------------
module ibufds_test(
input clk , //时钟,50m
input rst_n , //复位,低电平有效
input data_p , //输入数据,差分+
input data_n , //输入数据,差分-
output out
);
//----------------------------------------------------
ibufds #(
.diff_term (false) , // differential termination
.ibuf_low_pwr (true) , // low power=true, highest
.iostandard (default) // 选择i/o电平标准,这里选择默认
)
ibufds_inst (
.o (out) , // 输出
.i (data_p) , // 差分输入+(需要直接连接到顶层端口)
.ib (data_n) // 差分输入-(需要直接连接到顶层端口)
);
endmodule
每隔20ns分别随机生成2个1位2进制数据作为差分输入,观察输出,testbench如下:
//------------------------------------------------
//--ibufds原语仿真
//------------------------------------------------
`timescale 1ns/1ns //时间单位/精度
//----------------------------------------------------
module tb_ibufds_test();
reg clk ;
reg rst_n ;
reg data_p ;
reg data_n ;
wire out ;
//----------------------------------------------------
ibufds_test ibufds_test_inst(
.clk (clk) ,
.rst_n (rst_n) ,
.data_p (data_p) ,
.data_n (data_n) ,
.out (out)
);
//----------------------------------------------------
initial begin
clk = 1'b1; //初始时钟为1
rst_n data_p data_n #60 //60个时钟周期后
rst_n end
//----------------------------------------------------------
always #10 clk = ~clk; //系统时钟周期20ns
always #20 data_p always #20 data_n
endmodule
仿真结果如下:
每隔20ns,2个差分输入端口分别随机生成2个1位2进制数据;输出输入符合上述的真值表。
3、obufds
3.1、理论
obufds 是一个差分输出缓冲器,用于将来自 fpga 内部逻辑的信号转换成差分信号输出,支持 tmds、lvds等电平标准。它的输出用o和ob两个独立接口表示。一个可以认为是主信号,另一个可以认为是从信号。
obufds原语示意图如下所示:
端口说明如下表:
信号真值表如下:
可以看出,输出+端与输入一致,输出-端与输入相反。
3.2、仿真
打开vivado--tools--language templates,搜索“obufds”,可以找到xilinx提供的模板如下:
obufds #(
.iostandard(default), // specify the output i/o standard
.slew(slow) // specify the output slew rate
) obufds_inst (
.o(o), // diff_p output (connect directly to top-level port)
.ob(ob), // diff_n output (connect directly to top-level port)
.i(i) // buffer input
);
其中iostandard指定你需要输出的差分电平标准,slew根据你的要求输出fast或者slow。
接下来例化一个obufds原语进行测试,verilog代码如下:
//------------------------------------------------------------------------
//--obufds测试模块
//------------------------------------------------------------------------
//----------------------------------------------------
module obufds_test(
input clk , //时钟,50m
input rst_n , //复位,低电平有效
input data , //输入数据
output out_p , //输出数据,差分+
output out_n //输出数据,差分-
);
//----------------------------------------------------
obufds #(
.iostandard (default) , // 选择i/o电平标准,这里选择默认
.slew (slow) // 选择输出速率,这里选择slow
)
obufds_inst (
.o (out_p) , // 差分输出+(需要直接连接到顶层端口)
.ob (out_n) , // 差分输出-(需要直接连接到顶层端口)
.i (data) // 输入
);
endmodule
每隔20ns随机生成一个1位2进制数据,观察差分输出,testbench如下:
//------------------------------------------------
//--obufds原语仿真
//------------------------------------------------
`timescale 1ns/1ns //时间单位/精度
//----------------------------------------------------
module tb_obufds_test();
reg clk ;
reg rst_n ;
reg data ;
wire out_p ;
wire out_n ;
//----------------------------------------------------
obufds_test obufds_test_inst(
.clk (clk),
.rst_n (rst_n),
.data (data),
.out_p (out_p),
.out_n (out_n)
);
//----------------------------------------------------
initial begin
clk = 1'b1; //初始时钟为1
rst_n data #60 //60个时钟周期后
rst_n end
//----------------------------------------------------------
always #10 clk = ~clk; //系统时钟周期20ns
always #20 data
endmodule
仿真结果如下:
每隔20ns,data随机生成0或者1,out_p与输入一致,out_n与输入相反;差分输出信号符合上述的真值表。
【应用场景】安科瑞智能微型断路器在银行的应用
高德新功能:手机秒变导航遥控器
传感器在物联网战略中是什么位置
C语言进制之间的转换
微软发布自动系统平台使机器人更加智能
Xilinx原语IBUFDS、OBUFDS的使用及仿真
国产芯动力|迷你ITX国产工业主板助力智慧金融
一组能够在没有地图的情况下可靠地导航室内环境的人工智能模型
3D聚碳酸酯后盖打造极致性价比,红米Redmi 7售价699起
LoRa到底“神”在哪里?
永磁同步电机在压滤行业的应用前景有哪些
TI、Xillinx、ADI等国际半导体巨头与鼎阳科技深度合作
中芯国际宣誓进入7纳米 华米采购国产芯片100万颗
我国制造业的发展基础比较薄弱必须不断完善智能制造标准体系
学习再学习,详细介绍武汉中科电力生产的微水测试仪的界面操作步骤
iPhone6S Plus、华为P10对比评测:iPhone6S Plus、华为P10买那个好?iPhone6S Plus“暴跌”至比华为P10还便宜几百,好纠结
业余无线电台呼号管理办法
变频器差分放大器的五大故障实例
华为4G路由2Pro评测 省钱首选刚需必买
爱德数智:获3大信创认证