ddr 和 selectio ip 为什么能实现高速
两个 ip 实现高速的 核心部分phy 是由 xiphy 和 iob 构成
其中 ddr 的 iob 根据管脚的不同 由 OBUF(ADDR or CTRL), IBUF, IOBUFE3(DQ or DM), OBUFDS (CK), IBUFDS , IOBUFDS(DQS) 等组成
case (IOBTYPE[bitNum*3+:3])3'b001: //ADDR or CTRLbeginOBUF OBUF(.I(phy2iob_q_out_byte[bitNum]),.O(iob_pin[bitNum]));assign iob2phy_d_in_byte[bitNum] = '0;end3'b010: beginIBUF IBUF(.O(iob2phy_d_in_byte[bitNum]),.I(iob_pin[bitNum]));end3'b011: begin //DQ or DMif (DRAM_TYPE == "DDR4") beginif (EN_LVAUX == "TRUE") begin IOBUFE3 IOBUF(.I(phy2iob_q_out_byte[bitNum]),.T(phy2iob_t[bitNum]),.O(iob2phy_d_in_byte[bitNum]),.IO(iob_pin[bitNum]),.OSC_EN (1'b0),.OSC (4'b0000),.DCITERMDISABLE ((USE_DYNAMIC_DCI == 1) ? phy2iob_odt_out_byte[bitNum] : 1'b0),.IBUFDISABLE (1'b0));endelse begin IOBUFE3 IOBUF(.I(phy2iob_q_out_byte[bitNum]),.T(phy2iob_t[bitNum]),.O(iob2phy_d_in_byte[bitNum]),.IO(iob_pin[bitNum]),.VREF (Vref),.OSC_EN (1'b0),.OSC (4'b0000),.DCITERMDISABLE ((USE_DYNAMIC_DCI == 1) ? phy2iob_odt_out_byte[bitNum] : 1'b0),.IBUFDISABLE (1'b0));endendelse beginif (BANK_TYPE == "HP_IO") beginIOBUFE3 IOBUF(.I(phy2iob_q_out_byte[bitNum]),.T(phy2iob_t[bitNum]),.O(iob2phy_d_in_byte[bitNum]),.IO(iob_pin[bitNum]),.VREF (1'b0),.OSC_EN (1'b0),.OSC (4'b0000),.DCITERMDISABLE ((USE_DYNAMIC_DCI == 1) ? phy2iob_odt_out_byte[bitNum] : 1'b0),.IBUFDISABLE (1'b0));end else if (BANK_TYPE == "HR_IO") beginIOBUF_INTERMDISABLE #(.SIM_DEVICE ("ULTRASCALE"))IOBUF(.I(phy2iob_q_out_byte[bitNum]),.T(phy2iob_t[bitNum]),.O(iob2phy_d_in_byte[bitNum]),.IO(iob_pin[bitNum]),.INTERMDISABLE ((USE_DYNAMIC_DCI == 1) ? phy2iob_odt_out_byte[bitNum] : 1'b0),.IBUFDISABLE (1'b0));end else beginIOBUF IOBUF(.I(phy2iob_q_out_byte[bitNum]),.T(phy2iob_t[bitNum]),.O(iob2phy_d_in_byte[bitNum]),.IO(iob_pin[bitNum]));endendend3'b101: // CK if (bitNum % 2 == 0) begin // generate for even onlyOBUFDS OBUFDS(.I(phy2iob_q_out_byte[bitNum]),.O(iob_pin[bitNum]),.OB(iob_pin[bitNum+1]));assign iob2phy_d_in_byte[bitNum] = '0;end3'b110: if (bitNum % 2 == 0) beginIBUFDS #(.DQS_BIAS(DQS_BIAS)) IBUFDS(.O(iob2phy_d_in_byte[bitNum]),.I(iob_pin[bitNum]),.IB(iob_pin[bitNum+1]));end3'b111: // DQSif (bitNum % 2 == 0) beginIOBUFDS #(.DQS_BIAS(DQS_BIAS)) IO_BUFDS(.I(phy2iob_q_out_byte[bitNum]),.T(phy2iob_t[bitNum]),.O(iob2phy_d_in_byte[bitNum]),.IO(iob_pin[bitNum]),.IOB(iob_pin[bitNum+1]));enddefault: begin// No IO buffer!end
endcase
xiphy 由 txrx_bitslice / tx_bitslice / rx_bitslice 组成,xxx_bitslice 是一个4:1或者 8:1的串并转换FIFO,给串行数据打拍的 高速clk ,直接由 FIFO_RD_CLK 或者 FIFO_WR_CLK 8倍频或 4倍频 得到,不需要额外提供高速clk;
此元器件即为实现高速的核心元件,在内部较低速度的并行逻辑下,实现接口的高速串行输出。
DQS或者CK信号都是由2倍速的串行高速clk打拍形成,为普通逻辑信号,所以可以实现上下沿同时采集,FIFO_RD_CLK 或者 FIFO_WR_CLK 为实际速率的1/8或1/4,
即传输速率为2400Mbps的DDR4,其串行clk频率即为2400M,其接口CK_T/CK_C的频率为1200M,内部逻辑的clk(FIFO_RD_CLK) 为300M ([7:0],1/8).
如下所示 rx_bitslice, 其中CLK是给LOAD,CE,INC 打拍的低速clk,如果不用delay功能,此clk可不接;
实际即为从 DATAIN 串行输入,Q[7:0] 为 FIFO 的输出,FIFO_RD_CLK, FIFO_RD_EN, FIFO_EMPTY 为指示信号
如果是tx_bitslice 或者 txrx_bitslice 则方向相反,
xx_bitslice 由 bitslice_control 控制
元器件库参考:
UltraScale Architecture Libraries Guide : ug974 ug571
下面是 iodelay 元件的使用
使用 VAR_LOAD的 LOAD或者 VARIABLE 的 INC 功能时要求 EN_VTC = 0;
而在FIXED 模式时 IDELAYCTRL 没有rdy 之前,要求 EN_VTC =1;
IDELAYCTRL 的每个 nibble 共用一个,即每个bank有 8个 IDELAYCTRL;
iodelay 使用 time 模式 并且 对应的 nibble 中没有例化过 bitslice类型的元件(bitslice中含有IDELAYCTRL, bitslice 为 native primitive,iodelay 等 是 Component Primitives,Component Primitives 是 native primitive 的特殊配置生成,用于等效老器件的元件 ),则应使用 IDELAYCTRL
module project(input sysclk_p,input sysclk_n,// input rst,output out0,output out1,output out2);wire clk_in;wire clk;wire rdy;reg out0_reg;
reg out1_reg;
reg out2_reg ;
wire [8:0] CNTVALUEOUT;
wire [8:0] CNTVALUEIN;
wire probe_out0;
wire LOAD,INC,CE,RST,EN_VTC;IBUFDS IBUFDS_refclk (.O(clk_in), // 1-bit output: Buffer output.I(sysclk_p), // 1-bit input: Diff_p buffer input (connect directly to top-level port).IB(sysclk_n) // 1-bit input: Diff_n buffer input (connect directly to top-level port)); clk_wiz_0 instance_name(// Clock out ports.clk_out1(clk), // output clk_out1// Status and control signals.reset(1'b0), // input reset.locked(), // output locked// Clock in ports.clk_in1(clk_in)); always @(posedge clk or posedge RST) if(RST)beginout0_reg <= 'h0;out1_reg <= 'h0;out2_reg <= 'h0; endelsebeginout0_reg <= ~out0_reg;out1_reg <= ~out1_reg;out2_reg <= ~out2_reg;end assign out1 = out1_reg;assign out2 = out2_reg;IDELAYCTRL #(.SIM_DEVICE("ULTRASCALE") // Must be set to "ULTRASCALE" )IDELAYCTRL_inst (.RDY(rdy), // 1-bit output: Ready output.REFCLK(clk), // 1-bit input: Reference clock input.RST(RST) // 1-bit input: Active high reset input. Asynchronous assert, synchronous deassert to// REFCLK.);ODELAYE3 #(.CASCADE("NONE"), // Cascade setting (MASTER, NONE, SLAVE_END, SLAVE_MIDDLE).DELAY_FORMAT("TIME"), // (COUNT, TIME).DELAY_TYPE("VAR_LOAD"), // Set the type of tap delay line (FIXED, VARIABLE, VAR_LOAD).DELAY_VALUE('d1100), // Output delay tap setting.IS_CLK_INVERTED(1'b0), // Optional inversion for CLK.IS_RST_INVERTED(1'b0), // Optional inversion for RST.REFCLK_FREQUENCY(300.0), // IDELAYCTRL clock input frequency in MHz (200.0-2667.0)..SIM_DEVICE("ULTRASCALE_PLUS"), // Set the device version (ULTRASCALE, ULTRASCALE_PLUS,// ULTRASCALE_PLUS_ES1, ULTRASCALE_PLUS_ES2).UPDATE_MODE("ASYNC") // Determines when updates to the delay will take effect (ASYNC, MANUAL,// SYNC))ODELAYE3_inst (.CASC_OUT(), // 1-bit output: Cascade delay output to IDELAY input cascade.CNTVALUEOUT(CNTVALUEOUT), // 9-bit output: Counter value output.DATAOUT(out0), // 1-bit output: Delayed data from ODATAIN input port.CASC_IN(), // 1-bit input: Cascade delay input from slave IDELAY CASCADE_OUT.CASC_RETURN(), // 1-bit input: Cascade delay returning from slave IDELAY DATAOUT.CE(CE), // 1-bit input: Active high enable increment/decrement input.CLK(clk), // 1-bit input: Clock input.CNTVALUEIN(CNTVALUEIN), // 9-bit input: Counter value input.EN_VTC(EN_VTC), // 1-bit input: Keep delay constant over VT.INC(INC), // 1-bit input: Increment/Decrement tap delay input.LOAD(LOAD), // 1-bit input: Load DELAY_VALUE input.ODATAIN(out0_reg), // 1-bit input: Data input.RST(~rdy) // 1-bit input: Asynchronous Reset to the DELAY_VALUE); ila_0 ila_0 (.clk(clk), // input wire clk.probe0(CNTVALUEOUT), // input wire [0:0] probe0.probe1(rdy)
); vio_0 vio_0 (.clk(clk), // input wire clk.probe_in0(CNTVALUEOUT), // input wire [8 : 0] probe_in0.probe_out0(RST), // output wire [0 : 0] probe_out0.probe_out1(LOAD),.probe_out2(INC),.probe_out3(CE),.probe_out4(CNTVALUEIN),.probe_out5(EN_VTC)
); endmodule
ddr 和 selectio ip 为什么能实现高速相关推荐
- Anydesk远程桌面及IP直连实现高速远程桌面
Anydesk远程桌面及IP直连实现高速远程桌面 下载: Anydesk官网 于官网下载Anydesk,于本地以及你想要远程连接的电脑,我后面都称本地机器为客户端,远程电脑为服务端. 量子互联 htt ...
- 【TCP/IP入门】18.高速PLC(华为全屋智能)
这里的PLC不是工业控制上的控制器,而是power line communication(高速电力线通信) 这个最近华为的全屋智能应该是有用,可以了解下 不错的参考文档: 电力线通信(Power Li ...
- 基于zynq的千兆网udp项目_米联客 ZYNQ/SOC 精品教程 S05-CH05 PS 千兆 UDP 加速
软件版本:VIVADO2017.4 操作系统:WIN10 64bit 硬件平台:适用米联客 ZYNQ系列开发板 米联客(MSXBO)论坛:www.osrc.cn答疑解惑专栏开通,欢迎大家给我提问!! ...
- 基于SelectIO的高速ADC时序实现(二)
Learning is the only thing the mind never exhausts, never fears and never regrets. ...
- 紫光fpga logos2 pango design 开发工具 黑金 axp100开发板资料 带 ddr 以及高速收发器例子
紫光fpga logos2 pango design 开发工具 黑金 axp100开发板资料 带 ddr 以及高速收发器例子 有双相机采集存储 ddr 后进行hdmi输出叠加显示的工程 包含1多个例子 ...
- PCB模块化设计13——FLASH、DDR和eMMC高速PCB布局布线设计规范
目录 PCB模块化设计13--FLASH和DDR高速PCB布局布线设计规范 一.Flash高速PCB布局布线设计规范 1.Flash介绍 2.NOR和NAND性能比较 3. NAND Flash的用途 ...
- 双通道14位、500 MSPS采样率的AD9684 高速并行LVDS ADC接口介绍
双通道14位.500 MSPS采样率的AD9684 高速并行LVDS ADC接口 本文为明德扬原创文章,转载请注明出处! AD9684是一款双通道14位.500 MSPS采样率 ,并行LVDS接口的模 ...
- 物联网之IP Camera解决方案简介
不看这几篇好文,就别说自己了解物联网 前言 IP Camera即网络摄像头,是物联网领域中的一个重要场景.本文将带领读者了解IP Camera这一典型物联网场景的市场.IP Camera的重要组成部分 ...
- xilinx项目XDMA/PCIE高速传输解决方案传输效率90%
明德扬在PCIE高速传输方案积累了丰富的技术,传输的带宽利用率可达到90%以上,延迟可达到理论的最低延迟值. 明德扬能够根据客户的需求(需求.延迟和应用等),为客户提供定制的PCIE解决方案,欢迎您与 ...
最新文章
- 计算机系统与网络技术简答题,计算机与网络技术基础 简答题
- 经典设计模式——策略模式
- linux各个服务器的软件自启动
- linux aspnet服务器,在Linux中安装ASPNET.Core3.0运行时的示例代码
- 一、AJAX学习笔记——原生AJAX (ajax简介、XML简介、ajax优缺点、ajax的使用)
- androidbyte数组使用_android byte的用法
- Nunit中如何进行事务性单元测试
- redis五种数据类型的使用场景
- Bailian4022 买房子【迭代】
- 计算机round是什么函数,计算机roundup函数是什么意思
- Mariadb 安装FederatedX引擎
- 【2018年12月04日】钢铁行业的估值高度排名
- 齐大计算机与控制学院在哪个校区阮,齐齐哈尔大学各个学院所在校区做个介绍...
- numpy使用np.dot函数或者@操作符计算两个numpy数组的点积数量积(dot product、scalar product)
- FPGA开发第四弹:触摸按键控制LED灯实验
- 2015校园O2O商业模式解析——从物流切入
- 关于移动宽带连不上某些网站的解决办法
- 探究阿里云物联网开发板1-Haas 100
- 【问题描述】编写一个程序计算出球、圆柱和圆锥的表面积和体积。
- C++技术的主要应用领域
热门文章
- 你不得不知的数字营销四大趋势,开启2019年“营销新世界”
- java和vue的学生健康管理系统疫情打卡系统
- python 爬虫(一)
- 池馆刷题助手一键答题显示答案综合教程交互英语
- [转载]C#开源项目(国外的还是很多)
- spring5.3.x源码阅读环境搭建
- Ruby on Rails 教程之快速入门
- 计算机搜索没办法打汉字,Win10左下角搜索框无法输入字符的两种解决方法
- 百度实习面经2022-4-24(第一次面试,暂时只面了一场,感觉人无了)
- Codeforces9C dfs暴力