赛灵思7系列 ODDR、IDDR原语 与 ultrascale系列ODDRE1 、IDDRE1 原语
一、赛灵思7系列FPGA
1.1 ODDR:实现数据的双边沿发送
支持两种模式:OPPOSITE_EDGE模式、SAME_EDGE模式
ODDR #(
.DDR_CLK_EDGE("OPPOSITE_EDGE"), // "OPPOSITE_EDGE" or "SAME_EDGE"
.INIT(1'b0), // Initial value of Q: 1'b0 or 1'b1,Q初始值
.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,高电平置位
);
1.1.1、OPPOSITE_EDGE模式
时钟上升沿提取D1数据赋值给Q,时钟下降沿提取D2数据赋值给Q。Q输出相比较于时钟边沿,有一定的延迟。
1.1.2、SAME_EDGE模式
时钟上升沿提取D1和D2,然后依次在一个时钟内赋值给Q,发送出去。
1.2 IDDR:实现输入信号的时钟双边沿接收
支持3种模式:OPPOSITE_EDGE模式、SAME_EDGE模式、SAME_EDGE_PIPELINED模式。
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,Q1的初始值
.INIT_Q2(1'b0), // Initial value of Q2: 1'b0 or 1'b1 Q2的初始值
.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,IOB输入
.R(R), // 1-bit reset,高电平复位
.S(S) // 1-bit set,高电平置位
);
1.2.1、OPPOSITE_EDGE模式
时钟上升沿的DDR数据赋值给Q1,时钟下降沿时的数据赋值给Q2,Q1与Q2的输出相比较时钟上升沿与下降沿延迟了一段时间。
1.2.2、SAME_EDGE模式
在时钟上升沿同时将DDR数据赋值给Q1和Q2。时序图如下。CE有效后第一个时钟内,Q2为无效值。
1.2.3、SAME_EDGE_PIPELINED模式
在时钟上升沿将DDR数据赋值给Q1与Q2,Q1与Q2进行了流水线处理。
二、ultrascale架构FPGA
2.1、ODDRE1 实现数据的双边沿发送
仅支持SAME_EDGE模式。时钟上升沿提取数据,在一个时钟周期内发送出去。
ODDRE1 #(
.IS_C_INVERTED(1'b0), // Optional inversion for C,信号取反
.IS_D1_INVERTED(1'b0), // Unsupported, do not use
.IS_D2_INVERTED(1'b0), // Unsupported, do not use
.SIM_DEVICE("ULTRASCALE"), // Set the device version for simulation functionality (ULTRASCALE)
.SRVAL(1'b0) // Initializes the ODDRE1 Flip-Flops to the specified value (1'b0, 1'b1),复位后初始值
)
ODDRE1_inst (
.Q(Q), // 1-bit output: Data output to IOB
.C(C), // 1-bit input: High-speed clock input
.D1(D1), // 1-bit input: Parallel data input 1
.D2(D2), // 1-bit input: Parallel data input 2
.SR(SR) // 1-bit input: Active-High Async Reset
);
2.2、IDDRE1 实现数据的双边沿发送
支持3种模式:OPPOSITE_EDGE模式、SAME_EDGE模式、SAME_EDGE_PIPELINED模式。
IDDRE1 #(
.DDR_CLK_EDGE("OPPOSITE_EDGE"), // IDDRE1 mode (OPPOSITE_EDGE, SAME_EDGE, SAME_EDGE_PIPELINED)
.IS_CB_INVERTED(1'b0), // Optional inversion for CB,0时不对CB取反,1时对CB取反
.IS_C_INVERTED(1'b0) // Optional inversion for C,0时不对C取反,1时对C取反
)
IDDRE1_inst (
.Q1(Q1), // 1-bit output: Registered parallel output 1
.Q2(Q2), // 1-bit output: Registered parallel output 2
.C(C), // 1-bit input: High-speed clock
.CB(CB), // 1-bit input: Inversion of High-speed clock C,C时钟的取反输入
.D(D), // 1-bit input: Serial Data Input
.R(R) // 1-bit input: Active-High Async Reset,高电平有效
);
2.2.1、OPPOSITE_EDGE模式
时钟上升沿的DDR数据赋值给Q1,时钟下降沿时的数据赋值给Q2
2.2.2、SAME_EDGE模式
在时钟上升沿。Q1与Q2同时有效。
2.2.3、SAME_EDGE_PIPELINED模式
相似与SAME_EDGE模式,数据Q1与Q2在时钟上升沿同时有效,不过数据对没有被拆分到不同时钟。
三、通过实例解析原语
假设有一需求,将SPARTAN7 8bits位宽的数据,采用双边沿DDR的方式发送Ultrascale系列的任意FPGA上。为实现该需求进行设计(仿真模型设计)。
首先确认spartan7需要使用的原语为ODDR,ultrascale FPGA使用原语为IDDRE1。
Spartan7示例程序:
`timescale 1ns/1ps
module S7_model
(output ddr_clk,//DDR数据同步时钟
output data_valid,//数据有效标志
output [3:0] ddr_data
);//-------------------模拟生成时钟---------
reg clk=0;//模拟生成100M时钟
always
begin
#5 clk <= ~clk;
end//----------------------基于clk实现逻辑----------------
wire clk_bufg;
wire not_clk_bufg;
reg [7:0] clk_cnt =0;//时钟计数
reg data_valid;
reg [7:0]data=0;
wire [3:0] data_pos;
wire [3:0] data_neg;assign ddr_clk = clk_bufg;
BUFG BUFG_inst (
.O(clk_bufg), // 1-bit output: Clock output.
.I(clk) // 1-bit input: Clock input.
);always@(posedge clk_bufg)
begin
clk_cnt <= #1 clk_cnt + 1'b1;
endalways@(posedge clk_bufg)
begin
if(clk_cnt >= 8'h80) begin//clk_cnt从0x80到0x00有效
#1 data_valid <= 1'b1;
data <= clk_cnt;
end
else begin
#1 data_valid <= 1'b0;
end
endassign data_pos = data[3:0];
assign data_neg =data [7:4];//上升沿发送data_pos,下降沿发送data_neg.因为数据经过ODDR输出时存在延时,
//因此接收数据时,应该是上升沿接收data_neg,下降沿接收data_pos
generate
genvar i;
for(i=0;i<=3;i=i+1) begin
ODDR #(
.DDR_CLK_EDGE("OPPOSITE_EDGE"), // "OPPOSITE_EDGE" or "SAME_EDGE"
.INIT(1'b0), // Initial value of Q: 1'b0 or 1'b1
.SRTYPE("ASYNC") // Set/Reset type: "SYNC" or "ASYNC"
) ODDR_inst (
.Q(ddr_data[i]), // 1-bit DDR output
.C(clk_bufg), // 1-bit clock input
.CE(1'b1), // 1-bit clock enable input
.D1(data_pos[i]), // 1-bit data input (positive edge)
.D2(data_neg[i]), // 1-bit data input (negative edge)
.R(1'b0), // 1-bit reset
.S(1'b0) // 1-bit set
);
end
endgenerateendmodule
Ultra FPGA示例程序
`timescale 1ns / 1ps
module ultra_model(
input ddr_clk,//DDR数据同步时钟
input data_valid,//数据有效标志
input [3:0] ddr_data
);
wire [3:0] ddr_data_pos;//
wire [3:0] ddr_data_neg;//
wire [7:0] rx_data;//还原的8bits数据
reg rx_valid;//还原的数据有效标志wire ddr_clk_bufg;
BUFG BUFG_inst (
.O(ddr_clk_bufg), // 1-bit output: Clock output.
.I(ddr_clk) // 1-bit input: Clock input.
);
always@(posedge ddr_clk_bufg)
begin
#1 rx_valid <=data_valid;
end
assign rx_data = {ddr_data_pos,ddr_data_neg};
generate
genvar i;
for(i=0;i<=3;i=i+1) begin
IDDRE1 #(
.DDR_CLK_EDGE("OPPOSITE_EDGE"), // IDDRE1 mode (OPPOSITE_EDGE, SAME_EDGE, SAME_EDGE_PIPELINED)
.IS_CB_INVERTED(1'b0), // Optional inversion for CB
.IS_C_INVERTED(1'b0) // Optional inversion for C
)
IDDRE1_inst (
.Q1(ddr_data_pos[i]), // 1-bit output: Registered parallel output 1
.Q2(ddr_data_neg[i]), // 1-bit output: Registered parallel output 2
.C(ddr_clk_bufg), // 1-bit input: High-speed clock
.CB(~ddr_clk_bufg), // 1-bit input: Inversion of High-speed clock C
.D(ddr_data[i]), // 1-bit input: Serial Data Input
.R(1'b0) // 1-bit input: Active-High Async Reset
);
end
endgenerate
endmodule
仿真顶层文件
`timescale 1ns/1ps
module testbench_ddr();
wire ddr_clk;//DDR数据同步时钟
wire data_valid;//数据有效标志
wire [3:0] ddr_data;S7_model S7_model
( .ddr_clk(ddr_clk),//DDR数据同步时钟
.data_valid(data_valid),//数据有效标志
.ddr_data(ddr_data)
);ultra_model ultra_model
( .ddr_clk(ddr_clk),//DDR数据同步时钟
.data_valid(data_valid),//数据有效标志
.ddr_data(ddr_data)
);endmodule
仿真结果截图:
可以看到,Spartan7有效数据0x80、0x81、0x82·····,在ultra_model模块成功接收到0x80、0x81、0x82···
需要注意的是,S7上升沿发送数据A,则ultra接收该数据时,只能在下降沿提取到该数据A。因为A滞后于时钟上升沿。如果还是想在ultra FPGA的上升沿提取到该数据,则需要采取措施调整一下时钟数据的时序。比如:考虑在ultraFPGA使用IDELAYE3延迟一下时钟输入引脚,或者在spartan7上使用ODELAYE2,延迟以下数据输出引脚。
赛灵思7系列 ODDR、IDDR原语 与 ultrascale系列ODDRE1 、IDDRE1 原语相关推荐
- ddr4单颗粒最大_Zynq UltraScale +系列之“DDR4接口设计”
欢迎FPGA工程师加入官方微信技术群 点击蓝字关注我们FPGA之家-中国最好最大的FPGA纯工程师社群 本篇主要针对Zynq UltraScale + MPSoC的DDR接口,从硬件设计的角度进行详细 ...
- 基于 Kintex UltraScale 系列 FPGA 的高性能 VPX 数据预处理载板(4 路 SRIO X4、 XCKU115-2FFVA1517I)
VPX302 是一款基于 3U VPX 总线架构的高性能数据预处理FMC 载板,板卡具有 1 个 FMC+(HPC)接口,1 个 X8 GTH 背板互联接口,可以实现 1 路 PCIe x8:具有 4 ...
- ML:MLOps系列讲解之系列知识解读之完整总结系列内容(第一章~第九章)
ML:MLOps系列讲解之系列知识解读之完整总结系列内容(第一章~第九章) 导读:您将了解如何使用机器学习,了解需要管理的各种变更场景,以及基于ml的软件开发的迭代性质.最后,我们提供了MLOps的定 ...
- 华硕服务器主板那个系列好,华硕主板哪个系列好?华硕主板各个系列区别对比...
目前的DIY市场中,主板的品牌较多,而品牌之间又存在不同的系列,相信不少装机用户选购主板十分纠结.目前主板品牌中,龙头老大无疑是华硕主板,那么华硕主板哪个系列好?下面装机之家分享一下华硕主板各个系列区 ...
- List系列集合、泛型、Set系列集合、Collection系列集合使用场景总结
目录 List系列集合 LinkedList集合 遍历可能存在的问题 泛型 泛型类的概述 泛型方法的概述 泛型接口 通配符 Set系列集合 HashSet集合 LinkedHashSet集合 Tree ...
- Android盒子 摄像头,UVC系列1-Android盒子控制云台摄像头系列
微信公众号:Android部落格 个人网站:chengang.plus/ 文章最初发布在CSDN 1.知识点 Android作为host端控制云台摄像头整个实现过程中涉及了Android kernel ...
- 16系列显卡支持的计算机系统,GTX16系列显卡:GTX10系列显卡,正式再见
原标题:GTX16系列显卡:GTX10系列显卡,正式再见 GTX16系列显卡是NVIDIA今年发布的新卡,分别是GTX1660和1650系列,主打1000元到2000元级别的市场,相比上一代的GTX1 ...
- 西门子PLC S7-1500系列CPU与西门子PLC S7-300系列的通讯模块CP343-1进行TCP通讯的方法
西门子PLC S7-1500系列是西门子新一代PLC产品,它通过多方面的创新,为用户提供了更高性价比的产品,提高了用户的工程实施效率.西门子PLC S7-1500为用户在自动化控制系统中提供了更高的运 ...
- 三菱FX5U系列PLC与汇川IT6000系列触摸屏进行MODBUS TCP通信的具体方法
三菱FX5U系列PLC与汇川IT6000系列触摸屏进行MODBUS TCP通信的具体方法 本次和大家分享三菱FX5U系列PLC与汇川IT6000系列触摸屏进行MODBUS TCP通信的具体方法,由于汇 ...
最新文章
- 人工智能及其应用(第5版).蔡自兴-2章课后习题。【参考答案】
- R语言data.table导入数据实战:data.table中编写函数并使用SD数据对象
- 使用UPnP来穿透NAT使内网接口对外网可见
- 再谈 iptables 防火墙的 指令配置
- android NDk编程
- NLP:语言模型与n元语法
- 读取遥感图像中遇到的问题集锦
- ibm db2获取目标时间与当前时间的差值_【学术论文】高帧频视觉实时目标检测系统...
- python使用pdfminer解析页面内容,得到内容的详细坐标
- 友华PT939G移动光猫开启telnet获取配置文件
- 描述性统计分析案例题_SPSSAU描述性分析指标如何选择?
- Python网络爬虫入门篇
- Metadata 元数据信息详解
- 仙剑永恒的经典──仙剑诗集
- python爬取和平精英皮肤_Python——LOL官方商城皮肤信息爬取(一次练手)
- 来自朋友圈的“精神食粮”
- Neutron — Bonding SR-IOV ports
- 功能超级强大的计算器程序 免费开源 全部源码
- 通过股票代码识别所属板块(20190730)
- 再谈深度学习文本的表示
热门文章
- 关于word的HOOK(_WwG种)
- 零基础如何学好python爬虫?之python爬取B站小视频
- 解决error LNK2001: unresolved external symbol__imp__xxx
- SecureCRT命令方式上传文件
- eclipse更改代码后reload,不用重启服务器
- 一招长期引流并锁定客户的活动,饺子馆靠“比赛”做到月入10万
- 视觉slam爬坑——高翔深蓝学院——第一讲
- 关晓彤同款无米寿司,让你感受一下远离碳水也无敌幸福~
- 第四章 word2vec 的高速化
- 微信/QQ/TIM防撤回神器,看见没有,这就是撤回狗