首页 > 编程知识 正文

bios设置pcie分配模式,时钟为什么用oddr2

时间:2023-05-04 11:21:52 阅读:54011 作者:3690

据了解,xilinx FPGA的selectio拥有ilogic和ologic资源,可以实现iddr/oddr、idelay和odelay等功能。 入门之初可能不太熟悉xilinx原语,但在vivado的tools- language templates中搜索iddr idelay等关键字后,可以在A7等设备上查看原语模板。 复制后画葫芦,模拟就基本上可以学习使用方法了。

1.oddr

oddr和iddr都一样。 以oddr为例,首先将模板复制到模板中。

添加模拟源,创建简单的模拟文件。

模块simu _ oddr (; reg clk=1'd0; always forever #2 clk=~ clk; ODDR# ).DDR_clk_edge(opposite_edge )、opposite_edge ) or'same_edge ).init (1' B0 )是//initid //1-bitclockinput.ce(1) D1 )、/1-bitclockenableinput.D1 )1)、/1-bitdatainput (定位边缘).)。 //1-bitdatainput (否定边缘).r )1) D0 ),/1-bitreset.s )1) D0 )//1-bit set ); endmodule ODDR的使用方法在selectoi参考手册ug471的第127页中进行了说明。 要使用这些资源,必须首先查阅官方资源手册。

简要说明:

CE为使能,c为时钟,时钟的上升沿、下降沿分别输出D1和D2。 q输出,S/R复位,R=1 Q输出0,S=1,q输出1。 默认情况下,两者都应该为0。 两者均为1时,输出0。 虽然在手册“OPPOSITE_EDGE' or 'SAME_EDGE”中也有描述,但表示采样时间不同。 我不知道具体有什么应用上的区别。

在模拟中,可以看到输出是什么样的,在上升沿输出1,在下降沿输出0,输出稍有延迟。 iddr和oddr可以通过rgmii接口轻松接收数据并迁移到gmii。 在一般情况下,需要注意时钟和数据的对齐。 采样时钟为90 1//4周期,输出时的时钟也可以相应地延迟一点。 根据实际情况,125M的DDR采样还很容易稳定。

2.idelay

在ug471中,只有惠普银行告诉我们他们有odelay。 ug475介绍了哪个系列有惠普银行。 简单来说,惠普银行相当快,支持延迟操作,电压只有1.2V- 1.8V。 其中A7全系没有odelay,只有K7 (留下意见,我简单看了一下),所以用语言模板搜索odelay就没有a系列的原语。

idelay的作用是实现输入延迟,实际上应该有更明确的使用方法,但这里是我自己学习时的介绍。 ug471同样介绍了idelay,具有固定延迟、可变延迟,使用时实例化idelay ctrl,延迟的精度与idelay ctrl的访问时钟有关。 一个银行只有一个idelay ctrl。 同一存储体使用idelay或odelay。 延迟精度相同。 idelay ctrl可以连接到200Mhz、300Mhz,但同一插槽只能连接一个。 也需要实例化。 如果多个存储体使用idelay,则需要多次实例化。

` timescal

e 1ns / 1psmodule s( ); reg clk = 1'd0; always forever #2.5 clk = ~ clk; (* IODELAY_GROUP = "idelay" *) IDELAYCTRL IDELAYCTRL_inst ( .RDY(), // 1-bit output: Ready output .REFCLK(clk), // 1-bit input: Reference clock input .RST(1'd0) // 1-bit input: Active high reset input ); reg clk2 = 1'd0; always @(posedge clk) clk2 <= ~clk2; wire DATAOUT; (* IODELAY_GROUP = "idelay" *) // Specifies group name for associated IDELAYs/ODELAYs and IDELAYCTRL IDELAYE2 #( .CINVCTRL_SEL("FALSE"), // Enable dynamic clock inversion (FALSE, TRUE) .DELAY_SRC("IDATAIN"), // Delay input (IDATAIN, DATAIN) .HIGH_PERFORMANCE_MODE("FALSE"), // Reduced jitter ("TRUE"), Reduced power ("FALSE") .IDELAY_TYPE("FIXED"), // FIXED, VARIABLE, VAR_LOAD, VAR_LOAD_PIPE .IDELAY_VALUE(31), // Input delay tap setting (0-31) .PIPE_SEL("FALSE"), // Select pipelined mode, FALSE, TRUE .REFCLK_FREQUENCY(200.0), // IDELAYCTRL clock input frequency in MHz (190.0-210.0, 290.0-310.0). .SIGNAL_PATTERN("DATA") // DATA, CLOCK input signal ) IDELAYE2_inst ( .CNTVALUEOUT(CNTVALUEOUT), // 5-bit output: Counter value output .DATAOUT(DATAOUT), // 1-bit output: Delayed data output .C(1'd1), // 1-bit input: Clock input .CE(1'd0), // 1-bit input: Active high enable increment/decrement input .CINVCTRL(1'd0), // 1-bit input: Dynamic clock inversion input .CNTVALUEIN(1'd0), // 5-bit input: Counter value input .DATAIN(1'd0), // 1-bit input: Internal delay data input .IDATAIN(clk2), // 1-bit input: Data input from the I/O .INC(1'd0), // 1-bit input: Increment / Decrement tap delay input .LD(1'd0), // 1-bit input: Load IDELAY_VALUE input .LDPIPEEN(1'd0), // 1-bit input: Enable PIPELINE register to load data input .REGRST(1'd0) // 1-bit input: Active-high reset tap-delay input );endmodule

这里例化了一个idelay ctrl,是属于idelay group的,这个声明还没有研究过有什么用,不知道是不是指定idelay2和哪个ctrl是绑定的。idelay ctrl端口很简单,仿真时复位rst接0就好了,实际中推荐接输入时钟的pll lock引脚取反,保证在时钟锁定前(lock = 0)idelay ctrl处于复位状态。

idelay2中按推荐配置,从DATAIN还是从IDATAIN输入区别为是内部延时还是从IO输入,FIXED固定延时,idelay value先输入0,,时钟是200M,其他全部接0。此处,idelay的作用就是把IDATAIN的信号接入ilogic中,延时0个tap再从DATAOUT输出。可变延时的使用说明ug471上都有,还没学习,有需要了再去看。

idelay 有0-31个tap,分割200M的半个周期2.5ns,每个tap就是2.5ns/32 = 0.078125 ns

value = 0 可以看到输出延迟了0.6ns,value = 10时,延时了1.38ns。 0.078125 * 10 + 0.6 = 1.38125,大体相近的。

其实oddr,idelay这些资源应该用起来都比较简单,可能我实际中就用了一下oddr/iddr,也没有觉得有多少难以调试的地方,本文简单介绍了这2个原语的使用方法,从复制原语,看手册介绍到仿真,其他原语也是类似的,学会如何去学习最重要。

文末再介绍一下generate,一样的在tools -> language templates中搜索。

genvar <var>; generate for (<var>=0; <var> < <limit>; <var>=<var>+1) begin: <label> <instantiation> end endgenerate

用这个可以很方便地例化出多个相似的模块。

genvar i; //genvar i;也可以定义到generate语句里面 generate for(i=0;i<10;i=i+1) begin:mymodule assign a[i]=reg[i]; end endgenerate

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。