FPGA常用资源之IO概述

目录

一、前言

二、I/O资源

2.1 I/O端口资源

2.1.1 IOB

2.1.2 ILOGIC/OLOGIC

2.2 ZHOLD

2.3 IDDR/ODDR

2.4 IDELAY

2.5 ISERDES/OSERDES

2.6 IO Logic Resource连接

2.7 Device示意图

三、工程示例

3.1 工程代码

3.2 Device结果


一、前言

        FPGA芯片从内部结构看主要由CLM,可编程IO,可编程的互连线资源,数字信号处理单元DSP,存储单元BRAM,软核与硬核组成,本文对其中的可编程I/O结合开发工具Vivado进行基础的介绍。

二、I/O资源

2.1 I/O端口资源

    ​    ​Xilinx 7系列器件的I/O资源由I/O块(IOB)和逻辑资源(ILOGIC和OLOGIC)两部分组成,每个IOB都有一个直接连接的ILOGIC或OLOGIC。以器件xc7k420tffv1156-2为例,IOB和ILOGIC/OLOGIC如下图

2.1.1 IOB

    ​    ​7系列的IOB分为HP IOB和HR IOB两类,HP IOB/HR IOB内又可分为单端IOB和双端IOB,HP IOB的引脚结构图如下

    ​    ​单端的HR IOB结构图,相比HP IOB,少了一个DCITERMDISABLE输入,因为DCI是HP bank所具有的功能。

    ​    ​对于双端的HP IOB,会多一个差分输入DIFFI_IN,也即会使用到两个IOB,双端的HR IOB类似。

2.1.2 ILOGIC/OLOGIC

    ​    ​以ILOGIC为例,在HP I/O bank中的为ILOGICE2,在HR I/O bank中的为ILOGICE3,区别是ILOGICE3多了一个零保持延时单元ZHOLD, ILOGICE2的结构图如下

ILOGICE3的结构图如下

    ​    ​lLOGIC支持边沿触发的D触发器,IDDR模式,电平触发的锁存器以及异步/组合操作

2.2 ZHOLD

        ​ZHOLD延迟会自动与内部延迟相匹配时钟分布延迟,当使用时,确保pad到pad的保持时间为零。ILOGIC在输入端支持可选的静态无补偿零保持(ZHOLD)延迟线,以补偿时钟插入延迟。ZHOLD功能经过优化,可补偿时钟路径直接来自来自同一bank或相邻bank的BUFG/BUFGCE。ZHOLD是默认情况下启用,除非时钟源是MMCM或PLL,或者IOBDELAY属性在Xilinx设计约束(XDC)中设置。

2.3 IDDR/ODDR

    ​    ​IDDR(Input Double Data Rate)和ODDR(Output Double Data Rate),IDDR(输入双数据速率)主要用于接收数据,它能够在每个时钟边沿捕获数据,从而实现双倍数据速率的数据传输。当外部数据源的速率高于内部处理速度时,IDDR可以有效地提高数据吞吐率。IDDR的原语如下图,一路输入D,两路输出Q1,Q2分别在时钟的上升沿和下降沿。

IDDR #(.DDR_CLK_EDGE("OPPOSITE_EDGE"), // "OPPOSITE_EDGE", "SAME_EDGE" //    or "SAME_EDGE_PIPELINED" .INIT_Q1(1'b0), // Initial value of Q1: 1'b0 or 1'b1.INIT_Q2(1'b0), // Initial value of Q2: 1'b0 or 1'b1.SRTYPE("SYNC") // Set/Reset type: "SYNC" or "ASYNC" ) IDDR_inst (.Q1(Q1), // 1-bit output for positive edge of clock.Q2(Q2), // 1-bit output for negative edge of clock.C(C),   // 1-bit clock input.CE(CE), // 1-bit clock enable input.D(D),   // 1-bit DDR data input.R(R),   // 1-bit reset.S(S)    // 1-bit set);

    ​    ​ODDR(输出双数据速率)则用于产生双倍数据速率的输出信号。与IDDR类似,ODDR在每个时钟边沿都可以驱动数据,提高了输出数据的速率。ODDR在设计时需要特别关注数据的输出时序和时钟的相位关系,以确保在正确的时间点上提供有效的数据。

ODDR原语如下图所示,与IDDR类似,包括时钟输入、数据输入、使能信号、复位信号和输出信号等。不同之处在于,ODDR有两个数据输入端口D1和D2,分别对应于时钟的正边沿和负边沿。

   ODDR #(.DDR_CLK_EDGE("OPPOSITE_EDGE"), // "OPPOSITE_EDGE" or "SAME_EDGE" .INIT(1'b0),    // Initial value of Q: 1'b0 or 1'b1.SRTYPE("SYNC") // Set/Reset type: "SYNC" or "ASYNC" ) ODDR_inst (.Q(Q),   // 1-bit DDR output.C(C),   // 1-bit clock input.CE(CE), // 1-bit clock enable input.D1(D1), // 1-bit data input (positive edge).D2(D2), // 1-bit data input (negative edge).R(R),   // 1-bit reset.S(S)    // 1-bit set);

    ​    ​ODDR原语同样有多种工作模式,其中最常见的是“OPPOSITE_EDGE”模式。在此模式下,两个数据输入端口D1和D2的数据会被合成到一个时钟周期内,分别在时钟的正边沿和负边沿输出。

2.4 IDELAY

    ​    ​以IDELAY为例,每个I/O块都包含一个名为IDELAYE2的可编程延迟单元。IDELAY可以连接到ILOGICE2/ISERDES2或ILOGICE3/ISERDESE2块。IDELAYE2是一个31抽头、环绕式具有校准的抽头分辨率的延迟单元。它可以应用于组合输入路径、寄存输入路径或两者同时使用。它也可以直接从FPGA逻辑中获取。IDELAY可以在单个输入引脚的基础上延迟输入信号,抽头延迟精度通过使用IDELAYCTRL参考时钟进行控制,IDELAYE2的端口如下图

2.5 ISERDES/OSERDES

    ​    ​FPGA中的ISERESE2是一个专用的串行到并行转换器,具有特定的时钟和逻辑功能,用于实现高速源同步。在接收到来自外部的高速串行数据(如ADC输入、高速串行通信接口),将其解串为FPGA内部可处理的并行数据,ISERDES的端口图如下

    ​    ​OSERDES作用相反,实现并行转串行输出,用于驱动高速接口(如LVDS、HDMI、DDR存储器接口等),将FPGA内部的并行数据转换为串行数据流输出。OSERDES的端口图如下

2.6 IO Logic Resource连接

    ​    ​当同时存在IDELAY和ILOGICE3,ISERDES,OSERDES等单元,位于HR Bank时,连接关系如下图

当位于HP Bank时,连接关系如下图

2.7 Device示意图

    ​    ​在Device图中,每一对IOB对应的LOGIC由三个部分组成,ILOGICE3,IDELAYE2,

OLOGICE3。ILOGICE3如下图,可以放置ZHOLD_DELAY以及IDDR以及触发器。

IDELAYE2单元如下图所示,放置DELAY模块

OLOGICE3模块如下图,可以放置ODDR、OSERDES模块

三、工程示例

3.1 工程代码

以ODDR/IDDR/OSERDES为例

module IOB_resource(D1,D2,CE,C,R,S,RST,T,D3,D4,D5,D6,D7,D8,CLK,CLKDIV,O,IO1,IO2,out1,out2 );
input D1,D2,CE,C,R,S,RST,T;
input D3,D4,D5,D6,D7,D8,CLK,CLKDIV;
output O;
inout IO1,IO2;
output out1,out2;wire n_oddr,n_iobuf;ODDR #(.DDR_CLK_EDGE("OPPOSITE_EDGE"), // "OPPOSITE_EDGE" or "SAME_EDGE" .INIT(1'b0),    // Initial value of Q: 1'b0 or 1'b1.SRTYPE("SYNC") // Set/Reset type: "SYNC" or "ASYNC" ) ODDR_inst (.Q(n_oddr),   // 1-bit DDR output.C(C),   // 1-bit clock input.CE(CE), // 1-bit clock enable input.D1(D1), // 1-bit data input (positive edge).D2(D2), // 1-bit data input (negative edge).R(),   // 1-bit reset.S(S)    // 1-bit set);IOBUF #(.DRIVE(12), // Specify the output drive strength.IBUF_LOW_PWR("TRUE"),  // Low Power - "TRUE", High Performance = "FALSE" .IOSTANDARD("DEFAULT"), // Specify the I/O standard.SLEW("SLOW") // Specify the output slew rate) IOBUF_inst (.O(n_iobuf),     // Buffer output.IO(IO1),   // Buffer inout port (connect directly to top-level port).I(n_oddr),     // Buffer input.T(T)      // 3-state enable input, high=input, low=output);IDDR #(.DDR_CLK_EDGE("OPPOSITE_EDGE"), // "OPPOSITE_EDGE", "SAME_EDGE" //    or "SAME_EDGE_PIPELINED" .INIT_Q1(1'b0), // Initial value of Q1: 1'b0 or 1'b1.INIT_Q2(1'b0), // Initial value of Q2: 1'b0 or 1'b1.SRTYPE("SYNC") // Set/Reset type: "SYNC" or "ASYNC" ) IDDR_inst (.Q1(out1), // 1-bit output for positive edge of clock.Q2(out2), // 1-bit output for negative edge of clock.C(C),   // 1-bit clock input.CE(CE), // 1-bit clock enable input.D(n_iobuf),   // 1-bit DDR data input.R(R),   // 1-bit reset.S(S)    // 1-bit set);OSERDESE2 #(.DATA_RATE_OQ("DDR"),   // DDR, SDR.DATA_RATE_TQ("DDR"),   // DDR, BUF, SDR.DATA_WIDTH(4),         // Parallel data width (2-8,10,14).INIT_OQ(1'b0),         // Initial value of OQ output (1'b0,1'b1).INIT_TQ(1'b0),         // Initial value of TQ output (1'b0,1'b1).SERDES_MODE("MASTER"), // MASTER, SLAVE.SRVAL_OQ(1'b0),        // OQ output value when SR is used (1'b0,1'b1).SRVAL_TQ(1'b0),        // TQ output value when SR is used (1'b0,1'b1).TBYTE_CTL("FALSE"),    // Enable tristate byte operation (FALSE, TRUE).TBYTE_SRC("FALSE"),    // Tristate byte source (FALSE, TRUE).TRISTATE_WIDTH(4)      // 3-state converter width (1,4))OSERDESE2_inst (.TQ(n_tq),               // 1-bi.OQ(n_oserdes),               // 1-bit output: Data path output.CLK(CLK),             // 1-bit input: High speed clock.CLKDIV(CLKDIV),       // 1-bit input: Divided clock// D1 - D8: 1-bit (each) input: Parallel data inputs (1-bit each).D1(D1),.D2(D2),.D3(D3),.D4(D4),.D5(D5),.D6(D6),.D7(D7),.D8(D8),.OCE(CE),             // 1-bit input: Output data clock enable.RST(RST),             // 1-bit input: Reset.TCE(CE)              // 1-bit input: 3-state clock enable);IOBUF #(.DRIVE(12), // Specify the output drive strength.IBUF_LOW_PWR("TRUE"),  // Low Power - "TRUE", High Performance = "FALSE" .IOSTANDARD("DEFAULT"), // Specify the I/O standard.SLEW("SLOW") // Specify the output slew rate) IOBUF_inst2 (.O(O),     // Buffer output.IO(IO2),   // Buffer inout port (connect directly to top-level port).I(n_oserdes),     // Buffer input.T(n_tq)      // 3-state enable input, high=input, low=output);
endmodule

3.2 Device结果

IDDR_inst布局在ILOGICE2上

ODDR_inst单元布局在OLOGICE2上

OSERDESE2_inst布局位置如下,和ODDR占用相同的Device资源

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/92971.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/92971.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

密集遮挡场景识别率↑31%!陌讯轻量化部署方案在智慧零售的实战解析

一、零售业痛点:当技术遇上客流洪流据《2024智慧零售技术白皮书》统计,高峰期超市顾客密度超3人/㎡时,​​目标漏检率高达48%​​。核心挑战包括:​​动态遮挡​​:购物车/货架造成的持续性目标截断​​计算瓶颈​​&a…

力扣(O(1) 时间插入、删除和获取随机元素)

一、题目分析(一)功能需求 我们需要实现 RandomizedSet 类,包含以下功能: RandomizedSet():初始化数据结构。bool insert(int val):当元素 val 不存在时,插入该元素并返回 true;若已…

前端开发的面试自我介绍与准备

前端面试自我介绍不知道怎么说的,直接参考下面的模板,然后换成你的经历 自我介绍控制在1分钟左右,千万不要说的太久,面试官会烦的,但是又不好意思打断你 切记面试是人和人面对面的交流,要有,面试…

10、系统规划与分析

一、系统规划步骤系统规划步骤对现有系统进行初步调查分析和确定系统目标分析子系统的组成和基本功能拟定系统的实施方案拟定系统的可行性研究指定系统建设方案系统规划阶段的产出物:可行性研究报告、系统设计任务书。习题1、拟定系统的实施方案是在系统规划阶段完成…

Nginx学习笔记(六)—— Nginx反向代理

📚Nginx学习笔记(六)—— Nginx反向代理 📌 一、反向代理核心概念 本质原理: #mermaid-svg-UkFRDp2Ut7MK5T2N {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-s…

三伍微电子GSR2406 IoT FEM 2.4G PA 射频前端模组芯片

三伍微电子GSR2406 IoT FEM 2.4G PA 射频前端模组芯片规格书Product Description The GSR2406 is a high-performance, fully integrated RF front-end module (FEM) designed for Zigbee technology, Thread, and Bluetooth (including low energy) applications. The GSR2406…

开发避坑指南(24):RocketMQ磁盘空间告急异常处理,CODE 14 “service not available“解决方案

异常信息 Caused by: org.apache.rocketmq.client.exception.MQBrokerException: CODE: 14 DESC: service not available now, maybe disk full, CL: 0.94 CQ: 0.94 INDEX: 0.94, maybe your broker machine memory too small.异常背景 一个项目里面用到了rocketmq&#x…

开源WAF新标杆:雷池SafeLine用语义分析重构网站安全边界

文章目录前言【视频教程】1.安装Docker2.本地部署SafeLine3.使用SafeLine4.cpolar内网穿透工具安装5.创建远程连接公网地址6.固定Uptime Kuma公网地址前言 当个人或企业站点上线后面临的首要威胁往往来自网络攻击——据统计,超过60%的Web应用漏洞利用尝试在流量到达…

Mac M1探索AnythingLLM+SearXNG

SearXNG 能聚合来自多达 200 多个搜索服务,可私有化部署,并提供了灵活自定义选项。 AnythingLLMSearXNG,刚好能解决AnythingLLM因为网络限制导致web search不可用的问题。 1 安装docker 下载mac m1版本的docker并安装。 https://docs.dock…

模式设计:策略模式及其应用场景

简介 策略模式(Strategy Pattern)是一种行为型设计模式,它允许在运行时动态选择算法或行为。核心思想是将算法封装成独立的类(策略),使它们可以相互替换,让算法的变化独立于使用它的客户端。 核心思想 解耦:将算法的定义与使用分离。每个算法封装起来,使它们可以互…

Squash Merge(压缩合并)和Rebase Merge(变基合并)介绍

文章目录**1. Squash Merge(压缩合并)****定义****操作步骤****特点****优点****缺点****2. Rebase Merge(变基合并)****定义****操作步骤****特点****优点****缺点****3. 对比总结****4. 选择建议****5. 示例场景****Squash Merg…

Linux编程 —— framebuffer

一、framebuffer概念framebuffer:帧缓冲,帧缓存技术Linux内核专门为图形化显示提供的一套应用程序接口。二、基本操作步骤1. 打开显示设备(/dev/fb0) 2. 获取显示设备相关参数(分辨率,像素格式)---》ioctl 3. 建立显存…

文件编辑html

<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>文件行内容编辑器</title><script src&…

具有熔断能力和活性探测的服务负载均衡解决方案

一、整体架构设计 1.核心组件 负载均衡器&#xff1a;负责选择可用的服务节点健康检查器&#xff1a;定期检测服务节点的可用性服务节点管理&#xff1a;维护所有可用节点的状态信息 2.负载均衡策略 轮询(Round Robin)随机(Random)加权轮询(Weighted Round Robin)最少连接(Leas…

技术演进中的开发沉思-62 DELPHI VCL系列:VCL下的设计模式

今天聊聊设计模式&#xff0c;当然这个章节目前仅限于DELPHI VCL,因为接下来梳理的Factory/Factory Method、Bootstrap 和 ForEach 这三种设计样例&#xff0c;看似独立&#xff0c;却在实际开发中相互配合&#xff0c;共同构建起高效、灵活的程序架构。在 DELPHI VCL 开发的技…

Docker 101:面向初学者的综合教程

掌握 Docker 已成为软件开发中的一项关键技能。本教程探讨了容器化的世界&#xff0c;包括其核心概念、优缺点&#xff0c;以及开始使用容器化的分步指南。 无论是 Docker 的新手&#xff0c;还是希望复习基础知识的更有经验的开发人员&#xff0c;本指南都能满足需求。 什么…

RTOS YAFFS

在 YAFFS (Yet Another Flash File System) 的语境中&#xff0c;“Check Point” 并不是一个标准的、核心的官方术语。它更可能是对 YAFFS 关键机制 Summary 或 Checkpointing 功能的非正式表述或理解偏差。其核心含义是指 YAFFS 在特定时刻保存文件系统关键元数据的状态&…

【SpringBoot系列-02】自动配置机制源码剖析

【SpringBoot系列-02】自动配置机制源码剖析 咱们天天用Spring Boot&#xff0c;一个SpringBootApplication注解扔进去&#xff0c;啥配置都不用写&#xff0c;项目就跑起来了。你有没有过这种疑惑&#xff1a;那些DispatcherServlet、DataSource是从哪冒出来的&#xff1f;今天…

51单片机-51单片机最小系统

本章概述思维导图&#xff1a;51单片机最小系统51单片机最小系统是51系列单片机&#xff08;如AT89C51、STC89C52等&#xff09;能够独立工作的最简电路配置&#xff0c;它为单片机提供了运行所需的基本条件。51单片机最小系统板是嵌入式系统开发的基础平台&#xff0c;集成了单…

git学习1

目录引入版本控制集中式和分布式版本控制git工作机制代码托管中心Git常用命令设置用户签名初始化本地库查看库状态add和提交版本穿梭git分支操作分支定义分支好处分支操作查看分支创建分支切换分支分支合并&#x1f495;✨&#x1fa77;合并冲突git团队协作团队内协作跨团队协作…