xilinx原语详解及仿真——ODDR

  ODDR位于OLOGIC中,可以把单沿传输的数据转换为双沿传输的数据, 在讲解ODDR功能之前,需要先了解OLOGIC的结构及功能。

1、OLOGIC

  OLOGIC块位于IOB的内侧,FPGA内部信号想要输出到管脚,都必须经过OLOGIC。OLOGIC资源的类型为OLOGICE2(HP I/O Bank)和OLOGICE3(HR I/O Bank),两者在功能和结构上是相同的,所以本文称为OLOGIC。

  图1是OLOGIC的结构框图,分为上下两部分,下半部分用于配置输出数据路径,上半部分用于配置三态控制路径,分别实现对数据、三态信号进行单沿转双沿的功能,两部分具有共同的时钟 (CLK),但是使能信号不同(OCE和TCE)。

在这里插入图片描述

图1 OLOGIC结构框图

  如果输出的信号不使用OLOGIC中的ODDR功能,那么此时信号从图1中红线路径进行传输,从组合逻辑电路输出到IOB模块。如果要使用OLOGIC模块中的D触发器功能,那么信号从D1进入OLOGIC模块,沿绿色信号线进行传输。如果要使用OLOGIC的ODDR功能,把单沿传输的信号转换为双沿传输的信号,此时需要两个输入信号D1、D2沿蓝色路径进行传输。

  图2是FPGA中OLOGIC实际的框图,因为该电路还可以被配置为OSERDESE2,所以相比图1会多出一些信号端口。

在这里插入图片描述

图2 OLOGIC在FPGA中结构框图

2、ODDR原语

  图3是ODDR原语框图,与IDDR一样不支持同时复位和置位。ODDR端口信号如表1所示,表2描述了ODDR原语的可用参数。

在这里插入图片描述

图3 ODDR原语框图

表1 ODDR端口信号
端口名含义
C时钟输入信号。
CE钟使能信号,高电平有效。
D1、D2ODDR输入信号。
S/R置位/复位引脚,高电平有效。
QODDR输出信号。
表2 ODDR原语的参数
参数名含义取值
DDR_CLK_EDGEODDR工作模式OPPOSITE_EDGE (默认), SAME_EDGE
INIT设置Q端口的初始值0(默认),1
SRTYPE设置复位/置位相对于时钟的类型ASYNC, SYNC(默认)

  上述的信号和参数都比较简单,与前面IDDR原语相似,不做过多解释。ODDR只有两种工作模式,相比IDDR会少一种,下文对两种模式进行讲解。

  图4是OPPOSITE_EDGE模式的时序图,在时钟CLK上升沿采集D1信号D1A,并在时钟上升沿把D1A输出到OQ。然后在时钟CLK下降沿采集D2信号D2A,并在下降沿将采集到的信号输出。这种模式使用起来会相对麻烦,FPGA内部需要在时钟上升沿给D1赋值,在时钟下降沿给D2赋值,一般不使用。

在这里插入图片描述

图4 OPPOSITE_EDGE模式

  图5是SAME_EDGE模式的时序图,在时钟CLK上升沿 同时采集D1、D2的数据,OQ再时钟上升沿输出采集的D1数据,再下降沿输出采集的D2数据。这种方式实现比较简单,属于常用模式。

在这里插入图片描述

图5 SAME_EDGE模式

3、ODDR模式仿真

​ODDR原语的模板如下所示:

   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的两种工作模式进行仿真,对应的设计文件如下所示,din0在内部D触发器打一拍后得到dout0输出,din0经过OLOGIC内部的D触发器打一拍后得到dout1输出。两个单沿输入的信号din1、din2转化位单沿信号dout2,对应代码如下所示。

module oddr_ctrl(input       clk      ,//系统时钟信号;input       rst      ,//系统复位信号,高电平有效;input       clk_en   ,//时钟使能信号;input       din0     ,//输入数据;input       din1     ,//输入数据;input       din2     ,//输入数据;output      dout0    ,//输出数据output      dout1    ,//输出数据output      dout2    
); reg         dout0   ;(* IOB = "TRUE" *)reg dout1 ;//将dout1放在ILOGICE中;always@(posedge clk)begindout0 <= din0;dout1 <= din0;end//例化ODDR原语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    ( dout2   ),// 1-bit DDR output.C    ( clk     ),// 1-bit clock input.CE   ( clk_en  ),// 1-bit clock enable input.D1   ( din1    ),// 1-bit data input (positive edge).D2   ( din2    ),// 1-bit data input (negative edge).R    ( rst     ),// 1-bit reset.S    ( 1'b0    ) // 1-bit set);endmodule

对应的Test​Bench文件如下所示:

`timescale 1 ns/1 ns
module test();parameter	CYCLE		=   10      ;//系统时钟周期,单位ns,默认10ns;reg			                clk     ;//系统时钟,默认100MHz;reg			                rst     ;//系统复位,默认高电平有效;reg                         clk_en  ;reg                         din0    ;reg                         din1    ;reg                         din2    ;wire                        dout0   ;wire                        dout1   ;wire                        dout2   ;oddr_ctrl  u_oddr_ctrl (.clk        ( clk       ),.rst        ( rst       ),.clk_en     ( clk_en    ),.din0       ( din0      ),.din1       ( din1      ),.din2       ( din2      ),.dout0      ( dout0     ),.dout1      ( dout1     ),.dout2      ( dout2     ));//生成周期为CYCLE数值的系统时钟;initial beginclk = 1;forever #(CYCLE/2) clk = ~clk;end//生成复位信号;initial beginrst = 0;#2;rst = 1;//开始时复位10个时钟;#(10*CYCLE);rst = 0;endinitial begin#1;clk_en = 1'b0;din2 = 1'b0;din0 = 1'b0;din1 = 1'b0;#(CYCLE*20);clk_en = 1'b1;#(CYCLE);repeat(100)begin//产生100个双沿时钟数据。#(CYCLE/2);din0 = ({$random} % 2);din1 = ({$random} % 2);#(CYCLE/2);din2 = ({$random} % 2);end#(CYCLE);clk_en = 1'b0;#(10*CYCLE);$stop;//停止仿真;endendmodule

  首先对OPPOSITE_EDGE模式进行仿真,对应的TestBench代码如下所示,仿真结果如图6所示。

在这里插入图片描述

图6 OPPOSITE_EDGE模式

  图6仿真结果与图4的时序图一致,不做过多解释。

  然后对SAME_EDGE模式进行仿真,对应的设计文件:

module oddr_ctrl(input       clk      ,//系统时钟信号;input       rst      ,//系统复位信号,高电平有效;input       clk_en   ,//时钟使能信号;input       din0     ,//输入数据;input       din1     ,//输入数据;input       din2     ,//输入数据;output      dout0    ,//输出数据output      dout1    ,//输出数据output      dout2    
); reg         dout0   ;reg         doutr   ;(* IOB = "TRUE" *)reg dout1 ;//将dout1放在ILOGICE中;always@(posedge clk)begindoutr <= din0;dout0 <= doutr;dout1 <= doutr;end//例化ODDR原语ODDR #(.DDR_CLK_EDGE ( "SAME_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    ( dout2   ),// 1-bit DDR output.C    ( clk     ),// 1-bit clock input.CE   ( clk_en  ),// 1-bit clock enable input.D1   ( din1    ),// 1-bit data input (positive edge).D2   ( din2    ),// 1-bit data input (negative edge).R    ( rst     ),// 1-bit reset.S    ( 1'b0    ) // 1-bit set);endmodule

TestBench文件如下所示:

`timescale 1 ns/1 ns
module test();parameter	CYCLE		=   10      ;//系统时钟周期,单位ns,默认10ns;reg			                clk     ;//系统时钟,默认100MHz;reg			                rst     ;//系统复位,默认高电平有效;reg                         clk_en  ;reg                         din0    ;reg                         din1    ;reg                         din2    ;wire                        dout0   ;wire                        dout1   ;wire                        dout2   ;oddr_ctrl  u_oddr_ctrl (.clk        ( clk       ),.rst        ( rst       ),.clk_en     ( clk_en    ),.din0       ( din0      ),.din1       ( din1      ),.din2       ( din2      ),.dout0      ( dout0     ),.dout1      ( dout1     ),.dout2      ( dout2     ));//生成周期为CYCLE数值的系统时钟;initial beginclk = 1;forever #(CYCLE/2) clk = ~clk;end//生成复位信号;initial beginrst = 0;#2;rst = 1;//开始时复位10个时钟;#(10*CYCLE);rst = 0;endinitial begin#1;clk_en = 1'b0;din2 = 1'b0;din0 = 1'b0;din1 = 1'b0;#(CYCLE*20);clk_en = 1'b1;#(CYCLE);repeat(100)begin//产生100个双沿时钟数据。#(CYCLE);din0 = ({$random} % 2);din1 = ({$random} % 2);din2 = ({$random} % 2);end#(CYCLE);clk_en = 1'b0;#(10*CYCLE);$stop;//停止仿真;endendmodule

仿真结果如图7所示。

在这里插入图片描述

图7 SAME_EDGE模式

  图7仿真结果与图5基本一致,不再过多解释。图8是该模式下时钟使能无效时仿真结果,此时输出信号将保持不变。

在这里插入图片描述

图8 SAME_EDGE模式下EN信号拉低

  上述仿真均与前文理论一致,下面将工程信号引脚分配,对工程进行编译,查看走线的图。

4、OLOGIC中触发器(OFD)的使用方式

  在vivado中打开走线的方式在讲解IDDR原语时已经进行了讲解,本文不再赘述。

  前文的代码中dout0与dout1的代码都相同,都是使用D触发器对din0打一拍,然后输出,通过查看dout0和dout1的寄存器位置,得到OLOGIC中组合电路和触发器功能的使用方式。图9是din0到dout0信号的走线图,红框处是寄存器所在位置,白线是信号的走线。

在这里插入图片描述

图9 dout0信号走向

  dout0信号是没有使用OLOGIC中的触发器和ODDR功能的,图10就是dou0信号经过OLOGIC时的路径,与前文讲解一致,直接经过组合逻辑输出。

在这里插入图片描述

图10 dout0经过OLOGIC

  如图11所示,是dout1信号在FPGA内部的走向,路径上又两个触发器,其中一个在OLOGIC中。

在这里插入图片描述

图11 dout1信号走向

  将OLOGIC放大,如图12所示,可知dout1触发器在OLOGIC中。

在这里插入图片描述

图12 dout1经过OLOGIC

  最后查看dout2信号的走向,如图13所示,din1和din2输入FPGA后,在OLOGIC进行单沿转双沿信号,然后通过dout2管脚输出。

在这里插入图片描述

图13 dout2信号走向

  将对应的OLOGIC放大,可见其实现的是ODDR功能,信号流向与前文讲解一致。

在这里插入图片描述

图13 dout2经过OLOGIC

  综上,OLOGIC与ILOGIC功能类似,本文主要是讲解ODDR的工作模式,并对工作模式进行仿真,同时将OLOGIC的使用方式进行讲解。掌握ODDR使用方式的同时,也知道如何使用OLOGIC中的触发器(使用IOB=TRUE原语,查看设计文件中dout1信号的定义)功能,以及OLOGIC在FPGA中的位置。

  OLOGIC中的触发器相对于FPGA内部触发器更靠近管脚,并且触发器输出与IOB之间的路径是固定的,对于多bit数据输出更有利于对齐。

  最后需要此工程文件的用户,在公众号后台回复“ODDR”(不包括引号)即可。

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

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

相关文章

CleanMyMac4.16中文最新版本下载

当很多人还在为电脑运行缓慢、工作问题不能快速得到解决而烦恼的时候&#xff0c;我已经使用过了多款系统清理工具&#xff0c;并找到了最适合我的那一款。我的电脑是超耐用的Mac book&#xff0c;接下来给大家介绍三种在众多苹果电脑清理软件的排名较高的软件。 一、Maintena…

NVIDIA与 Sparkfun 的合作伙伴在 Hackster.io 上发起了人工智能创新挑战赛,喊你来参加!

NVIDIA与 Sparkfun 的合作伙伴在 Hackster.io 上发起了人工智能创新挑战赛&#xff0c;喊你来参加&#xff01; 本次竞赛的目标旨在吸引开发者社区在 NVIDIA Jetson Orin 平台上为边缘构建生成式 AI 应用程序和模型&#xff0c;希望通过本次比赛提高人们对新 Jetson 生成式 AI…

四元数,欧拉角,旋转矩阵,旋转向量

四元数&#xff0c;旋转矩阵&#xff0c;旋转向量&#xff0c;欧拉角 一、欧拉角 1、欧拉角是表达旋转的最简单的一种方式&#xff0c;形式上它是一个三维向量&#xff0c;其值分别代表物体绕坐标系三个轴(x,y,z轴&#xff09;的旋转角度&#xff0c;默认旋转正向为逆坐标轴逆…

C#winform上下班打卡系统Demo

C# winform上下班打卡系统Demo 系统效果如图所示 7个label控件(lblUsername、lblLoggedInEmployeeId、lab_IP、lblCheckOutTime、lblCheckInTime、lab_starttime、lab_endtime)、3个按钮、1个dataGridView控件、2个groupBox控件 C#代码实现 using System; using System.Dat…

Java零基础——Elasticsearch篇

1.Elasticsearch简介 Elasticsearch是一个基于Lucene的一个开源的分布式、RESTful 风格的搜索和数据分析引擎。Elasticsearch是用Java语言开发的&#xff0c;并作为Apache许可条款下的开放源码发布&#xff0c;是一种流行的企业级搜索引擎。Elasticsearch用于云计算中&#xf…

【Ambari】Python调用Rest API 获取YARN HA状态信息并发送钉钉告警

&#x1f984; 个人主页——&#x1f390;开着拖拉机回家_Linux,大数据运维-CSDN博客 &#x1f390;✨&#x1f341; &#x1fa81;&#x1f341;&#x1fa81;&#x1f341;&#x1fa81;&#x1f341;&#x1fa81;&#x1f341; &#x1fa81;&#x1f341;&#x1fa81;&am…

二层交换原理

二层交换设备工作在OSI模型的第二层&#xff0c;即数据链路层&#xff0c;它对数据包的转发是建立在MAC&#xff08;Media Access Control &#xff09;地址基础之上的。二层交换设备不同的接口发送和接收数据独立&#xff0c;各接口属于不同的冲突域&#xff0c;因此有效地隔离…

【C/PTA —— 15.结构体2(课内实践)】

C/PTA —— 15.结构体2&#xff08;课内实践&#xff09; 7-1 计算职工工资7-2 计算平均成绩7-3 找出总分最高的学生7-4 通讯录的录入与显示 7-1 计算职工工资 #include<stdio.h> #include<stdlib.h> typedef struct GZ {char name[6];double j;double f;double z;…

记一次由 jedis 引发的离谱选学问题

背景 我的应用中&#xff0c;使用 jedis 作为连接 redis 的客户端&#xff0c;一直在用的好好的&#xff0c;后来有一个新的组件&#xff0c;也需要使用 redis&#xff0c;但是组件是内部封装的&#xff0c;我只能提供一个 StringReidsTempalte&#xff0c;所以我基于应用本身…

【无线网络技术】——无线广域网(学习笔记)

&#x1f4d6; 前言&#xff1a;无线广域网(WWAN)是指覆盖全国或全球范围内的无线网络&#xff0c;提供更大范围内的无线接入&#xff0c;与无线个域网、无线局域网和无线城域网相比&#xff0c;它更加强调的是快速移动性。典型的无线广域网&#xff1a;蜂窝移动通信系统和卫星…

Java期末复习题之抽象类、接口

点击返回标题->23年Java期末复习-CSDN博客 第1题. 首先设计一个学生抽象类Student&#xff0c;其数据成员有name(姓名)、age(年龄)和degree(学位)&#xff0c;以及一个抽象方法show()。然后由Student类派生出本科生类Undergraduate和研究生类Graduate&#xff0c;本科生类Un…

第 7 部分 — 增强 LLM 安全性的策略:数学和伦理框架

一、说明 增强大型语言模型 (LLM) 安全性的追求是技术创新、道德考虑和实际应用的复杂相互作用。这项努力需要一种深入而富有洞察力的方法&#xff0c;将先进的数学模型与道德原则和谐地融合在一起&#xff0c;以确保LLM的发展不仅在技术上稳健&#xff0c;而且在道德上合理且对…

网络攻击(一)--安全渗透简介

1. 安全渗透概述 目标 了解渗透测试的基本概念了解渗透测试从业人员的注意事项 1.1. 写在前面的话 在了解渗透测试之前&#xff0c;我们先看看&#xff0c;信息安全相关的法律是怎么样的 中华人民共和国网络安全法 《中华人民共和国网络安全法》由全国人民代表大会常务委员会…

Spring Cloud切换内嵌Tomcat为宝兰德Application Server

目录 替换Tomcat中间件Tomcat是什么Spring Cloud剔除tomcat引入宝兰德Application Server打包运行授权导入 替换Tomcat中间件 Tomcat是什么 Spring Cloud剔除tomcat <!--集成springmvc框架 --><dependency><groupId>org.springframework.boot</groupId&…

Java安全之Commons Collections6分析

CC6分析 import org.apache.commons.collections.*; import org.apache.commons.collections.functors.ChainedTransformer; import org.apache.commons.collections.functors.ConstantTransformer; import org.apache.commons.collections.functors.InvokerTransformer; impo…

上网监控软件——安全与隐私的平衡

网络已经成为人们生活和工作中不可或缺的一部分。然而&#xff0c;随着网络使用的普及&#xff0c;网络安全问题也日益突出。上网监控软件作为网络安全领域的一个重要组成部分&#xff0c;在保护企业和家庭网络安全方面发挥着重要作用。 本文将探讨上网监控软件的背景、功能、优…

1-2算法基础-常用库函数

1.排序 sort(first,last,cmp) first指向要排序范围的第一个元素&#xff0c;从0起 last指向要排序范围的最后一个元素的下一个位置 cmp&#xff08;可选&#xff09;&#xff0c;自定义函数&#xff0c;默认从小到大 评测系统 #include <iostream> #include<algorith…

Java一对一聊天

服务端 package 一对一用户;import java.awt.BorderLayout; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.Vector;…

three.js 入门三:buffergeometry贴图属性(position、index和uvs)

环境&#xff1a; three.js 0.159.0 一、基础知识 geometry&#xff1a;决定物体的几何形状、轮廓&#xff1b;material&#xff1a;决定物体呈现的色彩、光影特性、贴图皮肤&#xff1b;mesh&#xff1a;场景中的物体&#xff0c;由geometry和materia组成&#xff1b;textu…

十五、机器学习进阶知识:K-Means聚类算法

文章目录 1、聚类概述2、K-Means聚类算法原理3、K-Means聚类实现3.1 基于SKlearn实现K-Means聚类3.2 自编写方式实现K-Means聚类 4、算法不足与解决思路4.1 存在的问题4.2 常见K值确定方法4.3 算法评估优化思路 1、聚类概述 聚类&#xff08;Clustering&#xff09;是指将不同…