IntelFPGA_DDR_IP

0.DDR概述

  • DDR=Double Data Rate 双倍速率。有两个显著好处,首先可以提高 memory 速率,其
    次可以减少 IO port 的占用。以高速接口为例:
    一般在一个时钟周期内只传输一次数据,它是在时钟的上升期进行数据传输;而 DDR 内
    存则是一个时钟周期内传度输两次数据,它能够在时钟的上升期和下降期各传输一次数
    据,因此称为双倍速率数据传输。比如我们的数据总线是 32bit 的,但是输出端口是 16bit。
    可以用 DDR IP,datain_l 给低 16bit,datain_h 给高 16bit,以双倍速度输出数据。
  • 需要注意的一点是DDR是高低位交替传输的。

1.DDO

  • DDO原理图及时序图
    IntelFPGA_DDR_IP_第1张图片
    IntelFPGA_DDR_IP_第2张图片
  • datain_l 和datain_h是在同一个输出clk下给出的,只不过在链接输出PIN的时候,用CLK电平做了一个选择,分时输出高位部分和低位部分。输出时先输出高位后输出低位。(调用的是DDO IP只有.aclr ( rst_n ), .datain_h ( data_i_h ), .datain_l ( data_i_l ), .outclock ( clk_o ), .dataout ( data_o ))。

2.DDI

  • DDI原理图及时序图

IntelFPGA_DDR_IP_第3张图片

  • 输入DDI的数据,先通过本地时钟的上升和下降沿缓冲到本地寄存器,接下来再都用上升沿去同步到本地时钟下。为了确保数据被有效稳定采样,最好通过时序约束让data_in数据中间与采样沿对齐。
    IntelFPGA_DDR_IP_第4张图片

3.DDIO

  • DDI原理图及时序图

IntelFPGA_DDR_IP_第5张图片

  • DDIO虽然既可以作为输入也可以作为输出,但是同一时间下只能有一个功能。
  • DDIO_I:双向端口作为输入。数据从ddr端口输入(也就是下图的data_io),FPGA内部时钟在上升沿采样高位数据,下降沿采样低位数据,并把他们锁存在缓冲寄存器中,下一次上升沿到来后将缓冲寄存器中的数据读取到ddr_out_h/l(也就是下图中的data_o_h/l)。输入的时候先输入的数据给低位寄存器,后输入的给高位寄存器。比如42给低,232给高。
    在这里插入图片描述
reg [7:0] data_io;
wire [7:0] data_i_w; //链接inout端口
task data_gen();
	integer i;	
	for(i=0;i<16;i=i+1) begin
	 	@(posedge clk_i or negedge clk_i) begin		
			 data_io = {$random}%255;
		end
		force  data_i_w = data_io;//DDIO_i  inout 默认是输出的 要用 force 强制 inout 为输入端口
	end
endtask
  • DDIO_O:双向端口作为输出。数据从ddr_in_h/l输入(也就是下图的data_i_h/l),数据通过双向端口以两倍速率输出,先输出高位后输出低位。同时,输出的数据也会通过原理图中的下半部分流回FPGA内部,注意流回的部分高低位和输出的时候相反,但是和上面的DDIO_I是一样的。
    IntelFPGA_DDR_IP_第6张图片
wire [7:0] data_io;//链接inout端口,默认作为输出
reg [7:0] data_i_l,data_i_h;//链接IP的输入端口,作为要输出的数据
task data_gen();
	integer i;	
	for(i=0;i<16;i=i+1) begin
	 	@(posedge clk_i) begin					//DDO DDIO_o 这两个正常
			data_i_l = {$random}%255;
			data_i_h = {$random}%255;
		end
	end
endtask

你可能感兴趣的:(FPGA设计基础)