帮别人做网站规划,企业为什么交税,许昌做网站,海南网站建设报价前面两节讲解了差分转单端的IBUFDS原语和单端转差分的OBUFDS原语#xff0c;今天来讲一个同时带有两者功能的原语IOBUFDS#xff1b; 前述的IBUFDS原语只能接收外部差分信号#xff0c;此时连接管脚为input管脚#xff0c;OBUFDS只能向外部输出差分信号#xff0c;此时连接…前面两节讲解了差分转单端的IBUFDS原语和单端转差分的OBUFDS原语今天来讲一个同时带有两者功能的原语IOBUFDS 前述的IBUFDS原语只能接收外部差分信号此时连接管脚为input管脚OBUFDS只能向外部输出差分信号此时连接管脚为output管脚但差分信号还有可能出现IO类型也就是inout管脚一对差分信号可以输入也可以输出此时使用IBUFDS和OBUFDS就不能解决问题需要使用到IOBUFDS原语 如有一个典型的例子DDR接口中的DQS数据选通信号就是差分双向管脚DQS_P、DQS_N 该信号为双向信号因为该信号与DQ数据采集相关当对DDR读取时该信号由DRAM驱动当向DDR写入时该信号由内存控制器驱动 且由于DDR通信的频率速率比较高通常达几千Mbps且数据选通信号需要用于8/16或更多数据信号线的捕获所以需要其在传输过程中受的影响尽可能小信号尽可能稳定所以使用抗干扰能力更强的差分信号则成了必要 所以该信号就需要使用IOBUFDS这样的三态双向差分信号原语 IOBUFDS原语 IOBUFDS为差分输入/输出缓存原语。 T 管脚上的逻辑高电平表示禁用输出缓存。 端口IO、IOB双向端口连接到焊盘上的双向差分信号 端口I原语的输入端口接收FPGA内部数据变换后从IO和IOB输出 端口O原语的输出端口IO和IOB接收数据转换后从O端口输出到FPGA内部 端口T原语的输入端口控制原语的功能模式
功能模式说明 输入模式T1 IO和IOB由外部设备驱动作为差分输入信号。 内部逻辑将IO和IOB的差分值IO - IOB转换为单端信号输出至O。 例如若IO1且IOB0则O1若IO0且IOB1则O0此时功能与IBUFDS一致。 若外部差分信号未驱动高阻态O可能保持前一次有效值或进入不定态X需通过外部约束或硬件设计避免此情况。 此时T1输出缓存被禁用I到IO、IOB的路径关闭原语的I端口输入任何值无论0/1或是悬空都不会对IO、IOB的电压状态造成任何影响
输出模式T0 I的单端信号被转换为差分信号驱动到IO与I同相和IOB与I反相。 例如若I1则IO1且IOB0若I0则IO0且IOB1此时功能与OBUFDS一致。 此时T1输出缓存启用可以看到在原语的图中IO、IOB到O的路径没有受到T端口开关的影响此时O的输出来自IO、IOB而IO、IOB的值此时来自于I所以O值与I值相同。
原语例化如下 7系 IOBUFDS #( .DIFF_TERM(“FALSE”), // Differential Termination (“TRUE”/“FALSE”) .IBUF_LOW_PWR(“TRUE”), // Low Power - “TRUE”, High Performance “FALSE” .IOSTANDARD(“BLVDS_25”), // Specify the I/O standard .SLEW(“SLOW”) // Specify the output slew rate ) IOBUFDS_inst ( .O(O), // Buffer output .IO(IO), // Diff_p inout (connect directly to top-level port) .IOB(IOB), // Diff_n inout (connect directly to top-level port) .I(I), // Buffer input .T(T) // 3-state enable input, highinput, lowoutput );
Ultrascale系 IOBUFDS IOBUFDS_inst ( .O(O), // 1-bit output: Buffer output .I(I), // 1-bit input: Buffer input .IO(IO), // 1-bit inout: Diff_p inout (connect directly to top-level port) .IOB(IOB), // 1-bit inout: Diff_n inout (connect directly to top-level port) .T(T) // 1-bit input: 3-state enable input );
可以看到两个原语的端口一致不过7系的原语同样比Ultrascale系多几个参数Ultrascale的参数如前述被整合到约束部分 7系例化里可以看到参数DIFF_TERM、IBUF_LOW_PWR在IBUFDS部分讲解过SLEW在OBUFDS部分讲解过IOSTANDARD则是两节里都讲过这里不再赘述 不过这里可以看到模板默认的电平标准是BLVDSBLVDS 仅在 HR I/O bank 中可用并且要求 VCCO 电压电平为 2.5V。 IOSTANDARD 称为BLVDS_25在下一讲将简单汇总下FPGA中常见的差分电平标准。
IOBUFDS原语仿真 测试模块 module top_7series_iobufds( input wire clk, input wire rst, inout wire PAD_IO, inout wire PAD_IOB, input wire iob_t, input wire iob_in, output wire iob_out );
IOBUFDS #( .DIFF_TERM(“FALSE”), // Differential Termination (“TRUE”/“FALSE”) .IBUF_LOW_PWR(“TRUE”), // Low Power - “TRUE”, High Performance “FALSE” .IOSTANDARD(“BLVDS_25”), // Specify the I/O standard .SLEW(“SLOW”) // Specify the output slew rate ) IOBUFDS_inst ( .O(iob_out), // Buffer output .IO(PAD_IO), // Diff_p inout (connect directly to top-level port) .IOB(PAD_IOB), // Diff_n inout (connect directly to top-level port) .I(iob_in), // Buffer input .T(iob_t) // 3-state enable input, highinput, lowoutput );
endmodule
testbench 这里将原语的T端口每隔1000ns切换一次且设置50ns变化一次的两个随机值分别赋值给端口IO/IOB和端口I然后仿真查看根据T端口的变化原语的各端口输入输出如何变化 module tb; reg clk; reg rst; reg data1; reg data2; wire PAD_IO; wire PAD_IOB; reg iob_t; wire iob_in; wire iob_out; wire pad_dio; wire pad_diob;
initial begin clk 0; rst 1; #100 rst 0; end
always #50 clk ~clk;
initial begin data1 0; data2 0; while(1)begin #50 data1 $random(); data2 $random(); end end
initial begin iob_t 0; while(1)begin #1000 iob_t ~iob_t; end end
assign iob_in iob_t ? 1’bz : data1; assign {PAD_IO,PAD_IOB} iob_t ? {data2,~data2} : 2’bz; assign pad_dio PAD_IO; assign pad_diob PAD_IOB;
top_7series_iobufds inst_top_7series_iobufds( .clk (clk), .rst (rst), .PAD_IO (PAD_IO), .PAD_IOB (PAD_IOB), .iob_t (iob_t), .iob_in (iob_in), .iob_out (iob_out) );
endmodule 仿真结果 仿真波形如图所示 为方便描述上图中4根黄线将波形分为4个区域区域1/3的iob_t设置为0表示原语处于输出模式区域2/4的iob_t设置为1表示原语处于输入模式
可以看到
区域1/3输出模式下iob_in输入的值将被转换为差分的同相的PAD_IO和反相的PAD_IOB输出可以看到在此范围内PAD_IO输出值与iob_in相同PAD_IOB输出值与iob_in相反 此时iob_out的值与iob_in相同
区域2/4输入模式下PAD_IO和PAD_IOB将作为输入转换后端口O输出可以看到在此范围内端口O输出与PAD_IO相同与PAD_IOB相反 而且此时iob_in输入接口给了一个悬空的高阻状态但是可以看到图中所示这个iob_in的高阻输入也不会对PAD_IO和PAD_IOB产生任何影响