当前位置: 首页 > news >正文

LVDS系列3:Xilinx的IOBUFDS原语

前面两节讲解了差分转单端的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:原语的输入端口,控制原语的功能模式;

功能模式说明:
输入模式(T=1):
IO和IOB由外部设备驱动,作为差分输入信号。
内部逻辑将IO和IOB的差分值(IO - IOB)转换为单端信号输出至O。
例如,若IO=1且IOB=0,则O=1;若IO=0且IOB=1,则O=0,此时功能与IBUFDS一致。
若外部差分信号未驱动(高阻态),O可能保持前一次有效值或进入不定态(X),需通过外部约束或硬件设计避免此情况。
此时T=1,输出缓存被禁用,I到IO、IOB的路径关闭,原语的I端口输入任何值(无论0/1或是悬空)都不会对IO、IOB的电压状态造成任何影响;

输出模式(T=0):
I的单端信号被转换为差分信号,驱动到IO(与I同相)和IOB(与I反相)。
例如,若I=1,则IO=1且IOB=0;若I=0,则IO=0且IOB=1,此时功能与OBUFDS一致。
此时T=1,输出缓存启用,可以看到在原语的图中,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, high=input, low=output
);

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则是两节里都讲过,这里不再赘述;
不过这里可以看到模板默认的电平标准是BLVDS,BLVDS 仅在 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, high=input, low=output
);

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产生任何影响;

相关文章:

LVDS系列3:Xilinx的IOBUFDS原语

前面两节讲解了差分转单端的IBUFDS原语和单端转差分的OBUFDS原语,今天来讲一个同时带有两者功能的原语IOBUFDS; 前述的IBUFDS原语只能接收外部差分信号,此时连接管脚为input管脚,OBUFDS只能向外部输出差分信号,此时连接…...

Git和GitHub基础教学

文章目录 1. 前言2. 历史3. 下载安装Git3.1 下载Git3.2 安装Git3.3 验证安装是否成功 4. 配置Git5. Git基础使用5.1 通过Git Bash使用5.1.1 创建一个新的仓库。5.1.1.1 克隆别人的仓库5.1.1.2 自己创建一个本地仓库 5.1.2 管理存档 5.2 通过Visual Studio Code使用 6. Git完成远…...

Django-ORM-select_related

Django-ORM-select_related 作用使用场景示例无 select_related 的查询有 select_related 的查询 如何理解 "只发起一次查询,包含所有相关作者信息"1. select_related 的工作原理2. 具体示例解析3. 为什么只发起一次查询 数据库中的books量巨大&#xff0…...

蓝桥杯 k倍区间

题目描述 给定一个长度为 NN 的数列,A1,A2,⋯ANA1​,A2​,⋯AN​,如果其中一段连续的子序列 Ai,Ai1,⋯AjAi​,Ai​1,⋯Aj​ ( i≤ji≤j ) 之和是 KK 的倍数,我们就称这个区间 [i,j][i,j] 是 K 倍区间。 你能求出数列中总共有多少个 KK 倍区间…...

数据结构(蓝桥杯常考点)

数据结构 前言:这个是针对于蓝桥杯竞赛常考的数据结构内容,基础算法比如高精度这些会在下期给大家总结 数据结构 竞赛中,时间复杂度不能超过10的7次方(1秒)到10的8次方(2秒) 空间限制&#x…...

Tomcat+Servlet运行后出现404错误解决方案

TomcatServlet运行后出现404错误解决方案 一、错误效果复现 后续的解决方案,仅仅针对我遇到的情况。对不能涵盖大部分情况感到抱歉。 二、错误分析 先看看源代码? package com.example.secondclass.Servlet; import java.io.*; import jakarta.servl…...

论文摘要生成器:用TextRank算法实现文献关键信息提取

我们基于python代码,使用PyQt5创建图形用户界面(GUI),同时支持中英文两种语言的文本论文文献关键信息提取。 PyQt5:用于创建GUI应用程序。 jieba:中文分词库,用于中文文本的处理。 re&#xff…...

Flutter中网络图片加载显示Image.network的具体用法

Image.network的具体用法 Image.network 是 Flutter 中用于从网络加载图片的便捷方法。它基于 NetworkImage,可以快速加载并显示网络图片。以下是 Image.network 的具体用法和常见参数说明。 基本用法 最简单的用法是提供一个图片的 URL: dart 复制 …...

【HarmonyOS Next】鸿蒙应用故障处理思路详解

【HarmonyOS Next】鸿蒙应用崩溃处理思路详解 一、崩溃问题发现后定位 1. 崩溃现象: 常见的崩溃问题表现为,应用操作后白屏闪退,或者应用显示无响应卡死。 2.定位问题: 发现崩溃后,我们首先需要了解复现步骤&#x…...

狮子座大数据分析(python爬虫版)

十二星座爱情性格 - 星座屋 首先找到一个星座网站,作为基础内容,来获取信息 网页爬取与信息提取 我们首先利用爬虫技术(如 Python 中的 requests 与 BeautifulSoup 库)获取页面内容。该页面(xzw.com/astro/leo/&…...

QT系列教程(18) MVC结构之QItemSelectionModel模型介绍

视频教程 https://www.bilibili.com/video/BV1FP4y1z75U/?vd_source8be9e83424c2ed2c9b2a3ed1d01385e9 QItemSelectionModel Qt的MVC结构支持多个View共享同一个model,包括该model的选中状态等。我们可以通过设置QItemSelectionModel,来更改View的选…...

git设置本地仓库和远程仓库

设置本地仓库和远程仓库是使用Git进行版本控制的基本操作。以下是详细步骤: 创建本地仓库 初始化本地仓库: 打开命令行工具(如Terminal或Git Bash)。导航到你希望创建Git仓库的项目文件夹。运行以下命令来初始化一个新的Git仓库&…...

openharmony中HDF驱动框架源码梳理-驱动加载流程

要想大概了解一个公司,我们可能只需要知道它的运行逻辑即可,例如我们只需要知道它有财务有研发有运营等,财务报销、研发负责产品等即可,但是如果想深入具体的了解的话我们就要了解都有什么部门(对象)、各部门都包含哪些职责(对象方…...

golang 高性能的 MySQL 数据导出

需求导出方式对比方案1:快照导出(耗时:1.5s)方案2: 偏移分页(耗时:4s)方案 3:普通分页(耗时:4min40s) 需求 导出 MySQL 数据 分析: 一次性 select 大量数据带来的问题 性能问题: 数据库负载:大量数据查询会增加数据库的CPU、内存和I/O负担&#xff…...

31-判断子序列

给定字符串 s 和 t ,判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列&#x…...

leetcode日记(95)将有序数组转换为二叉搜索树

很简单,感觉自己越来越适应数据结构题目了…… /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : va…...

使用SSH密钥连接本地git 和 github

目录 配置本地SSH,添加到github首先查看本地是否有SSH密钥生成SSH密钥,和邮箱绑定将 SSH 密钥添加到 ssh-agent:显示本地公钥*把下面这一串生成的公钥存到github上* 验证SSH配置是否成功终端跳转到本地仓库把http协议改为SSH(如果…...

C语言基础之【内存管理】

C语言基础之【内存管理】 存储类型作用域普通局部变量静态局部变量普通全局变量静态全局变量全局函数和静态函数 内存布局内存分区存储类型与内存四区内存操作函数memset()memcpy()memmove()memcmp() 堆区内存分配和释放malloc()free() 内存分区代码分析返回栈区地址返回data区…...

C盘清理技巧分享:释放空间,提升电脑性能

目录 1. 引言 2. C盘空间不足的影响 3. C盘清理的必要性 4. C盘清理的具体技巧 4.1 删除临时文件 4.2 清理系统还原点 4.3 卸载不必要的程序 4.4 清理下载文件夹 4.5 移动大文件到其他盘 4.6 清理系统缓存 4.7 使用磁盘清理工具 4.8 清理Windows更新文件 4.9 禁用…...

每天一道算法题【蓝桥杯】【两两交换链表中的节点】

思路 本质问题可以分成若干个子问题 即把前两个链表交换,并与后面的链表相连 故实现函数功能调用自身递归即可 #define _CRT_SECURE_NO_WARNINGS 1 struct ListNode {int val;ListNode *next;ListNode() : val(0), next(nullptr) {}ListNode(int x) : val(x), nex…...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

Java - Mysql数据类型对应

Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935&#xff0c;SRS管理页面端口是8080&#xff0c;可…...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块&#xff0c;它提供了一个轻量级的 HTTP 服务器实现&#xff0c;主要用于构建基于 HTTP 的应用程序和服务。 功能介绍&#xff1a; 主要功能 HTTP服务器功能&#xff1a; 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...

九天毕昇深度学习平台 | 如何安装库?

pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子&#xff1a; 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

服务器--宝塔命令

一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行&#xff01; sudo su - 1. CentOS 系统&#xff1a; yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化

缓存架构 代码结构 代码详情 功能点&#xff1a; 多级缓存&#xff0c;先查本地缓存&#xff0c;再查Redis&#xff0c;最后才查数据库热点数据重建逻辑使用分布式锁&#xff0c;二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...