精华内容
下载资源
问答
  • 在Nexys4 DDR上实现的DDR2读写例程

    万次阅读 热门讨论 2016-12-30 11:11:19
    · 最近项目需要用到DDR,于是在网上找相关资料,发现网上关于Xilinx DDR的资料不多,而且...(相信用到这篇文章的人不会不知道DDR是啥吧。。。)· 好了,闲话休提言归正传。 · 本文使用Vivado 2015.4在Nexys4 DDR

    · 本文使用Vivado 2015.4在Nexys4 DDR(以下简称N4DDR)开发板上实现DDR的读写。
    · FPGA如果需要对DDR进行读写,则需要一个DDR的控制器。根据官方的文档(UG586,下载链接在文末),DDR控制器的时序主要有三:
    (1)首先是控制信号,如下图:

    · 从上图可以看出,只有当app_rdy信号有效时,程序所发出的读写命令才会被控制器接收。这点必须注意。
    (2)然后是写操作时序,如下图:
    这里写图片描述
    · 由图可知,在向DDR写数据时,需要提供写命令app_cmd、地址app_addr、数据app_wdf_data等信号,且写入的数据最多可以比app_cmd提前一个时钟周期有效,最迟可以比app_cmd晚两个时钟周期有效。
    【特别注意】在写数据的时候必须检测app_rdy和app_wdf_rdy信号是否同时有效,否则写入命令无法成功写入到DDR控制器的命令FIFO中,从而导致写操作失败。
    (3)最后是读操作时序,如下图所示:
    这里写图片描述
    · 读操作的时序比较简单,只需要注意app_rdy是否有效即可,其余不再赘述。


    · Xilinx在Vivado中提供的Memory Interface Generator的IP核就是我们需要的DDR控制器,如下图所示。
    Vivado中的MIG核
    · 这里我们可以直接双击上面的MIG的IP核,开始例化我们所需的DDR控制器。(此时Win7以后的Windows版本(不含Win7)打开此IP核会报错,解决方法见http://blog.csdn.net/qq_20091945/article/details/53862467)
    · 打开后是如下图所示的界面,点Next。
    打开MIG
    · 给模块起个名字,根据实际情况选择控制器数量(这里笔者选择1),继续Next,如下图所示。
    给MIG IP核起名字
    · 在开发板芯片型号所对应的方框前打勾,如下图所示。
    选择芯片型号
    · 根据开发板上的DDR芯片选择DDR的种类,如N4DDR的开发板上的DDR芯片是DDR2的,因此如下图选择。
    选择DDR类型
    · 然后在Clock Period中输入合适的时钟周期长度(N4DDR的官方文档建议DDR的时钟为325MHz,故此处填3077ps);
    · 接着在Memory Part中选择开发板上的DDR芯片的具体型号(N4DDR官方文档上说明为MT47H64M16HR-25E);
    · 然后输入Data Width,此处以16为例。如下图所示。
    这里写图片描述
    · 选择Input Clock Period,这里填开发板的系统时钟(N4DDR为100MHz)。根据应用需要选择地址映射方式(这里保持默认的Bank-Row-Column)。
    选择时钟和地址映射方式
    · 然后,这里的System ClockReference Clock建议选择No Buffer,System Reset Polarity则根据应用需要灵活选择(这里设置为低电平有效),如下图所示。
    这里写图片描述
    · Internal Termination Impedence的选取应当参考开发板的官方文档说明,这里选50欧姆即可,继续Next。
    这里写图片描述
    · 选择Fixed Pin Out
    这里写图片描述
    · 接下来是DDR芯片的引脚分配。官网应该能找到,这里直接给出。文末会给出与此对应的引脚约束文件(n4ddr_ddr2_io_assign.ucf)。
    这里写图片描述
    这里写图片描述
    这里写图片描述
    · 耐心填完之后点击Validate按钮,没有错误的话会弹出一个对话框提示“Current Pinout is valid.”
    · 然后的3个信号建议选择No connect,后面由我们自己根据需要连接到板上的相应引脚。
    这里写图片描述
    · 后面一直Next下去,点Accept,然后就可以点击Generate了。后面会再弹出一个对话框,直接点默认选中的按钮即可。


    · 好了,下面是笔者自己编写的测试DDR2读写的程序。文末将提供对应工程的下载链接。

    //*****************************************************************************
    // Author			: Z.M.J. @ CSE, SEU
    // Application		: MIG v2.4
    // Filename			: example_top.v
    // Date Created		: Fri Dec 30 2016
    //
    // Device			: 7 Series (Nexys 4 DDR)
    // Design Name		: DDR2 SDRAM
    // Purpose			: A demo of DDR2's read and write
    // Reference		: ug586_7Series_MIS_v2.4.pdf
    //*****************************************************************************
    
    `timescale 1ps/1ps
    
    module example_top (
    	// system signals
    	input					sys_rst,
    	input					sys_clk_i,
    	// application signals
    	input  [15:0]			switch_i,
    	output [15:0]			led,
    	output [7:0]			an,
    	output [7:0]			select_seg,
    	// DDR2 chip signals
    	inout [15:0]			ddr2_dq,
    	inout [1:0]				ddr2_dqs_n,
    	inout [1:0]				ddr2_dqs_p,
    	output [12:0]			ddr2_addr,
    	output [2:0]			ddr2_ba,
    	output					ddr2_ras_n,
    	output					ddr2_cas_n,
    	output					ddr2_we_n,
    	output [0:0]			ddr2_ck_p,
    	output [0:0]			ddr2_ck_n,
    	output [0:0]			ddr2_cke,
    	output [0:0]			ddr2_cs_n,
    	output [1:0]			ddr2_dm,
    	output [0:0]			ddr2_odt
    );
    	
    	parameter DQ_WIDTH			= 16;
    	parameter ECC_TEST			= "OFF";
    	parameter ADDR_WIDTH		= 27;
    	parameter nCK_PER_CLK		= 4;
    	
    	localparam DATA_WIDTH		= 16;
    	localparam PAYLOAD_WIDTH	= (ECC_TEST == "OFF") ? DATA_WIDTH : DQ_WIDTH;
    	localparam APP_DATA_WIDTH	= 2 * nCK_PER_CLK * PAYLOAD_WIDTH;
    	localparam APP_MASK_WIDTH	= APP_DATA_WIDTH / 8;
    	
    	// Wire declarations
    	reg app_en, app_wdf_wren, app_wdf_end;
    	reg [2:0] app_cmd;
    	reg [ADDR_WIDTH-1:0] app_addr;
    	reg [APP_DATA_WIDTH-1:0] app_wdf_data;
    	wire [APP_DATA_WIDTH-1:0] app_rd_data;
    	wire [APP_MASK_WIDTH-1:0] app_wdf_mask;
    	wire app_rdy, app_rd_data_end, app_rd_data_valid, app_wdf_rdy;
    	
    	
    	
    	//***************************************************************************
    	wire [7:0] an;
    	wire [7:0] select_seg;
    	reg [31:0] digit_data;
    	always@ (posedge sys_clk_i) begin
    		if (switch_i[3])
    			digit_data <= app_addr;
    		else case (switch_i[1:0])
    			2'b00 : digit_data <= read_data[31:0];
    			2'b01 : digit_data <= read_data[63:32];
    			2'b10 : digit_data <= read_data[95:64];
    			2'b11 : digit_data <= read_data[127:96];
    		endcase
    	end
    	
    	digit U2(
    		.wb_clk_i(sys_clk_i),
    		.wb_rst_i(~sys_rst),
    		.wb_dat_i(digit_data),
    		.an(an),
    		.select_seg(select_seg)
    	);
    	
    	reg [1:0] read_valid = 2'b0;
    	reg [127:0] read_data = 128'h0;
    	always@ (posedge app_rd_data_valid) begin
    		read_data = app_rd_data;
    		read_valid[0] = (app_rd_data == data0);
    		read_valid[1] = (app_rd_data == data1);
    	end
    	
    	assign led[15] = app_en;
    	assign led[14] = init_calib_complete;
    	assign led[13] = app_rdy;
    	assign led[12] = app_wdf_rdy;
    	assign led[4] = sys_rst ? read_valid[1] : 1'b0;
    	assign led[3] = sys_rst ? read_valid[0] : 1'b0;
    	assign led[2] = stop_w[1];
    	assign led[1] = stop_w[0];
    	assign led[0] = app_cmd[0];
    	
    	reg [15:0] counter = 16'h0;
    	parameter cnt_init = 16'h1;	// minimum: 1
    	reg [26:0] addr0 = 27'h000_0008;
    	reg [26:0] addr1 = 27'h003_0100;
    	reg [127:0] data0 = 128'h1111_2222_3333_4444_5555_6666_7777_8888;
    	reg [127:0] data1 = 128'h9999_0000_aaaa_bbbb_cccc_dddd_eeee_ffff;
    	reg [1:0] stop_w = 2'b00;
    	always@ (posedge sys_clk_i or negedge sys_rst) begin
    		if (sys_rst == 1'b0) begin
    			counter = 12'b0;
    			stop_w = 2'b0;
    			app_en = 1'b0;
    			app_addr = 27'h0;
    			app_cmd = 3'b1;
    			app_wdf_data = 128'h0;
    			app_wdf_end = 1'b0;
    			app_wdf_wren = 1'b0;
    		end else begin
    			if (counter == cnt_init && ~stop_w[0])
    				if (app_rdy & app_wdf_rdy) begin
    					app_wdf_data = data0;
    					app_addr = addr0;
    					app_cmd = 3'b0;
    					app_wdf_wren = 1'b1;
    					app_wdf_end = 1'b1;
    					app_en = 1'b1;
    				end else		// Hold specific signals until app_wdf_rdy is asserted.
    					counter = counter - 16'h1;
    			else if (counter == cnt_init + 1 && ~stop_w[0])
    				if (app_rdy & app_wdf_rdy) begin
    					app_wdf_end = 1'b0;
    					app_wdf_wren = 1'b0;
    					app_en = 1'b0;
    					app_cmd = 3'b1;
    					stop_w[0] = 1'b1;
    				end else		// Hold specific signals until app_wdf_rdy is asserted.
    					counter = counter - 16'h1;
    			else if (counter == cnt_init + 8 && ~stop_w[1])
    				if (app_rdy & app_wdf_rdy) begin
    					app_wdf_data = data1;
    					app_addr = addr1;
    					app_cmd = 3'b0;
    					app_wdf_wren = 1'b1;
    					app_wdf_end = 1'b1;
    					app_en = 1'b1;
    				end else		// Hold specific signals until app_wdf_rdy is asserted.
    					counter = counter - 16'h1;
    			else if (counter == cnt_init + 9 && ~stop_w[1])
    				if (app_rdy & app_wdf_rdy) begin
    					app_wdf_end = 1'b0;
    					app_wdf_wren = 1'b0;
    					app_en = 1'b0;
    					app_cmd = 3'b1;
    					stop_w[1] = 1'b1;
    				end else		// Hold specific signals until app_wdf_rdy is asserted.
    					counter = counter - 16'h1;
    			else if (counter == cnt_init + 88) begin
    				app_addr = switch_i[2] ? addr1 : addr0;
    				app_en = 1'b1;
    				if (~app_rdy) counter = counter - 16'h1;
    			end else if (counter == cnt_init + 89)
    				app_en = 1'b0;
    			
    			counter = counter + 16'h1;
    		end
    	end
    	
    	// Start of User Design top instance
    	//***************************************************************************
    	// The User design is instantiated below. The memory interface ports are
    	// connected to the top-level and the application interface ports are
    	// connected to the traffic generator module. This provides a reference
    	// for connecting the memory controller to system.
    	//***************************************************************************
    	my_ddr u_my_ddr (
    		// Memory interface ports
    		.ddr2_cs_n					(ddr2_cs_n),
    		.ddr2_addr					(ddr2_addr),
    		.ddr2_ba					(ddr2_ba),
    		.ddr2_we_n					(ddr2_we_n),
    		.ddr2_ras_n					(ddr2_ras_n),
    		.ddr2_cas_n					(ddr2_cas_n),
    		.ddr2_ck_n					(ddr2_ck_n),
    		.ddr2_ck_p					(ddr2_ck_p),
    		.ddr2_cke					(ddr2_cke),
    		.ddr2_dq					(ddr2_dq),
    		.ddr2_dqs_n					(ddr2_dqs_n),
    		.ddr2_dqs_p					(ddr2_dqs_p),
    		.ddr2_dm					(ddr2_dm),
    		.ddr2_odt					(ddr2_odt),
    		// Application interface ports
    		.app_addr					(app_addr),
    		.app_cmd					(app_cmd),
    		.app_en						(app_en),
    		.app_wdf_rdy				(app_wdf_rdy),
    		.app_wdf_data				(app_wdf_data),
    		.app_wdf_end				(app_wdf_end),
    		.app_wdf_wren				(app_wdf_wren),
    		.app_rd_data				(app_rd_data),
    		.app_rd_data_end			(app_rd_data_end),
    		.app_rd_data_valid			(app_rd_data_valid),
    		.app_rdy					(app_rdy),
    		.app_sr_req					(1'b0),
    		.app_ref_req				(1'b0),
    		.app_zq_req					(1'b0),
    		.app_wdf_mask				(16'h0000),
    		.init_calib_complete		(init_calib_complete),
    		// System Clock Ports
    		.sys_clk_i					(sys_clk_i),
    		// Reference Clock Ports
    		.clk_ref_i					(sys_clk_i),
    		.sys_rst					(sys_rst)
    	);
    	
    endmodule
    
    

    · 保存后直接生成比特流就可以下板验证了。
    · 在摸索过程中笔者发现,写入了数据之后最快要到发出写命令的第8个系统时钟才能读出所写入的数据,且读操作必须在写操作后经过8的整数倍个时钟后进行。有时将比特流下载到N4DDR上面之后读写的数据有误,但是重启开发板再重新下载即可解决问题,知道个中缘由的朋友欢迎在评论中告知笔者,笔者在此先行谢过。
    · 需要说明的是,此处突发长度(BL)为8,因此app_addr必须是8对齐的地址。同时,由于前面选择的Data Width为16,因此每次读写数据的长度为8*16bit==128bit。


    · 笔者水平有限,文中难免存在纰漏,望读者在评论中慷慨指出。笔者在此先行谢过。


    · 参考文档:
    Nexys4-DDR_rm.pdf
    ug586_7Series_MIS_v2.4.pdf

    · 模板工程下载链接:
    http://download.csdn.net/detail/qq_20091945/9728980

    · 测试代码下载链接:
    http://download.csdn.net/detail/qq_20091945/9725407
    【注意】由于工程大小超出上限,此处仅提供工程的源码文件和比特流文件。

    · DDR2 IP核引脚约束文件下载链接:
    n4ddr_ddr2_io_assign.ucf

    展开全文
  • 1. DDR是啥? 2. ROM与RAM简介 3. DDR 4. DDR差别 1. DDR是啥? 这玩意属于RAM的一类,一般叫它内存,买电脑内存条会看到DDR3或者DDR4等,在嵌入式领域也有DDR,作用也类似,作为运行内存使用。 内存的概念...

    目录

     

    1. DDR是啥?

    2. ROM与RAM简介

    3. DDR

    4. DDR差别


     

    1. DDR是啥?

    这玩意属于RAM的一类,一般叫它内存,买电脑内存条会看到DDR3或者DDR4等,在嵌入式领域也有DDR,作用也类似,作为运行内存使用。

    内存的概念已经广义化,所包含的产品种类很多,DDR具体属于那种内存呢?


    2. ROM与RAM简介

    其主要的区别有两点:

    • ROM是可读可写,并且速度很快,而ROM只能事先写,然后就只能读取,所以程序在运行过程中必须读写,就必须要有RAM存在
    • ROM只作为储存用途,断电不会丢失数据;而RAM在断电的时候会丢失数据

    而对于RAM,可分为SRAM(静态随机存储器)和DRAM(动态随机存储器):

    具体的介绍可参考我另一篇文章:https://blog.csdn.net/wangguchao/article/details/102818238?spm=1001.2014.3001.5501 


     

    3. DDR

    DRAM下有个SDRAM,也就是同步DRAM的意思,“同步”是指内存工作需要同步时钟,内部命令的发送与数据的传输都以它为基准。内存频率与CPU外频同步,这大幅提升了数据传输效率,再加上64bit的数据位宽与当时CPU的总线一致,只需要一根内存就能让电脑正常工作了,这降低了采购内存的成本。

    DDR就是SDRAM,SDRAM从发展到现在,已经有了:第一代SDR SDRAM,第二代DDR SDRAM,第三代DDR2 SDRAM,第四代DDR3 SDRAM,甚至DDR5 SDRAM。

    • DDR SDRAM是Double Data Rate Synchronous Dynamic Random Access Memory(双数据率同步动态随机存储器)的简称,是由VIA等公司为了与RDRAM相抗衡而提出的内存标准,为第二代SDRAM标准。其常见标准有DDR 266、DDR 333和DDR 400。其对于SDRAM,主要它允许在时钟脉冲的上升沿和下降沿传输数据,这样不需要提高时钟的频率就能实现双倍的SDRAM速度,例如DDR266内存与PC133 SDRAM内存相比,工作频率同样是133MHz,但在内存带宽上前者比后者高一倍。这种做法相当于把单车道更换为双车道,内存的数据传输性能自然可以翻倍。
    • DDR2(Double Data Rate 2)SDRAM是由JEDEC(电子设备工程联合委员会)开发的第三代SDRAM内存技术标准,1.8v工作电压,240线接口,提供了相较于DDR SDRAM更高的运行效能与更低的电压,同样采用在时钟的上升/下降延同时进行数据传输的基本方式,但拥有两倍于上一代DDR内存预读取能力(即4bit数据读预取能力),其常见的频率规范有DDR2 400\533\667\800\1066\1333等,总线频率553MHz的DDR2内存只需133MHz的工作频率
    • DDR3 SDRAM相比起DDR2具备更低的工作电压(1.5v),240线接口,支持8bit预读,只需133MHz的工作频率便可实现1066MHz的总线频率。其频率从800MHz起跳,常见频率有DDR3 800\1066\1333\1600\1866\2133等。DDR3是当前流行的内存标准,Intel酷睿i系列(如LGA1156处理器平台)、AMD AM3主板及处理器的平台都是其“支持者”。
    • DDR4相比DDR3最大的区别有三点:16bit预取机制(DDR3为8bit),同样内核频率下理论速度是DDR3的两倍;更可靠的传输规范,数据可靠性进一步提升;工作电压降为1.2V,更节能

    4. DDR差别

    DDR到DDR5的主要变化,我们可以看到,为了配合整体行业对于性能,容量和省电的不断追求,规范的工作电压越来越低,芯片容量越来越大, IO的速率也越来越高。

    除了电压,容量和IO的速率变化之外,还列出了Bank, Bank Group,Prefetch和Burst Length的演进,bank数越来越多,到DDR4出现bank group,prefetch也从2n增加到4n,8n。虽然我们说现在DDR4的最大速率是3200MT/s, 但是这是指的DDR4的IO频率,即DDR4和memroy controller之间的接口数据传输速率。那么DRAM是怎么实现用比较低的核心传输频率来满足日益高涨的高速IO传输速率的需求呢?这就是靠prefetch来实现的。

    • 从DDR开始到DDR3很好理解,Prefetch相当于DRAM core同时修了多条高速公路连到外面的IO口,来解决IO速率比内部核心速率快的问题,IO数据速率跟核心频率的倍数关系就是prefetch。
    • burst length的长度跟CPU的cache line大小有关。Burst length的长度有可能大于或者等于prefetch。但是如果prefetch的长度大于burst length的长度,就有可能造成数据浪费,因为CPU一次用不了那么多。所以从DDR3到DDR4,如果在保持DDR4内存data lane还是64的前提下,继续采用增加prefetch的方式来提高IO速率的话,一次prefetch取到的数据就会大于一个cache line的大小 (512bits),对于目前的CPU系统,反而会带来性能问题。
    • DDR4出现了Bank Group,这就是DDR4在不改变prefetch的情况下,能继续提升IO速率的秘密武器。DDR4利用Bank group的interleave,实现IO速率在DDR3基础上进一步提升。

     

    展开全文
  • Flash存储器又称为闪存,是一种非易失性的ROM存储器,在EEPROM的基础上发展而来,但不同于EEPROM只能全盘擦写,闪存可以对某个特定的区块进行擦写,...DDR是一种技术,中文为双倍速率,并不属于一种存储器。DDR通常指DD

    Flash存储器又称为闪存,是一种非易失性的ROM存储器,在EEPROM的基础上发展而来,但不同于EEPROM只能全盘擦写,闪存可以对某个特定的区块进行擦写,这源于它和内存一样拥有独立地址线。闪存的读写速度快,但远不及RAM存储器;但它断电后不会像内存一样丢失数据,因此适合做外存储设备。用途:U盘、固态硬盘BIOS芯片等。

    DDR是一种技术,中文为双倍速率,并不属于一种存储器。DDR通常指DDR SDRAM存储器,全称为Double Date Rate Synchronous Dynamic Random Access Memory,双倍速率同步动态随机存储器。顾名思义,它有三个重要特性:Double Date Rate、Synchronous和Dynamic。首先是Dynamic(动态),表明存储元为电容,通过电容的电荷性判断数据0和1。而由于电容有漏电流,必须随时对电容进行充电,以防数据丢失,这个过程就叫动态刷新;其次是Synchronous(同步),表明读写过程由时钟信号控制,只能发生在时钟信号的上沿或下沿,是同步进行的,而不可以在随意时刻进行;最后是Double Date Rate(DDR),这是DDR内存最重要的特性,即相比SDRAM内存,DDR内存在时钟的上沿和下沿均可以完成一次数据发射,因此一个周期内可以传输两次数据,所以称为双倍速率。因此等效频率是SDRAM的两倍。用途:内存条和显存颗粒,如DDR、DDR2、DDR3、GDDR5

    RAM是Random Access Memory的缩写,中文为随机存储器。这个定义非常广,凡是可以进行随机读写的存储器,都可以称为RAM,和ROM(只读存储器)相对。用途:内存、显存、单片机、高速缓存等等

    SRAM是Static Random Access Memory的缩写,静态存储器,和动态存储器DRAM相对。由于SRAM工作原理是依靠晶体管组合来锁住电平,并不需要进行刷新,只要不断电,数据就不会丢失,因此称为静态RAM。相比动态RAM,优点:1.不需要刷新操作,省去刷新电路,布线简单;2.速度远高于DRAM。缺点:1.容量远小于DRAM;2.由于晶体管规模远大于DRAM,成本远高于DRAM。用途:寄存器、高速缓存、早期内存

    DRAM是Dynamic Random Access Memory的缩写,动态存储器。和上面的定义一样,由电容存储数据,需要实时刷新,因此叫动态RAM。和SDRAM的区别在于DRAM可以不需要时钟信号控制发射,但通常我们不严格区分它们,把SDRAM和DRAM都叫做DRAM。DDR SDRAM也属于一种DRAM。用途:内存、显存

    展开全文
  • DDR3调试笔记

    2017-09-17 21:39:00
    最近针对黑金的光纤开发板上的DDR3进行了代码学习及板级调试。该模块功能流程已经搞清楚,以后针对DDR3的...首先说明整个DDR3的工程模块DDR3的模块代码层次结构如上图所示,ddr2fifo_top是DDR3模块的顶...

    最近针对黑金的光纤开发板上的DDR3进行了代码学习及板级调试。该模块功能流程已经搞清楚,以后针对DDR3的控制模块可以直接修改调用了,哦也!

    有几个需要注意的细节列举如下:

    (1)整个DDR3控制模块的架构要清楚,方便以后使用(数据的产生源和消耗源);

     

     首先说明整个DDR3的工程模块是个啥。

    DDR3的模块代码层次结构如上图所示,ddr2fifo_top是DDR3模块的顶层,下分3个子模块,分别是ddr_ctrl.v、dcfifo_ctrl.v、bank_switch.v。接着说这3个子模块。

    ddr_ctrl.v:包含mem_burst.v模块,该模块具体实现DDR用户接口层的操作,用户接口信号如下图所示。另外还有个MIG 的IP核调用模块,它是最底层操作DDR时序的模块,有对应的用户接口(app_xxx)留出给用户使用,该模块需要在IP catlog里生成,注意生成的设置项选择。

     

     dcfifo_ctrl.v:封住两个FIFO,分别是wrfifo和rdfifo。其中wrfifo是数据源产生模块对接DDR的数据写入缓存,rdfifo是DDR的数据读出对接数据消耗模块的缓存。两个异步FIFO的读写位宽均设置为256bit,深度均设置为512。

    bank_switch.v是DDR3的BANK切换,该代码在MIG生成时,地址方式选择的是Bank+Row+Column方式,因此在实现乒乓操作时,通过切换Bank即可。DDR3的Bank地址有3bit,即有8个bank,代码只使用了其中的4个bank,代码里是将一帧图像写在一个Bank里,一帧图像的字节总数=1280x720x2(RGB565模式),写完一帧图像后通过bank_switch来切换BANK。

     下面说明数据源的产生及数据消耗模块是个啥。

    数据源的产生来自OV5640的相机数据,该相机采用的是RGB565的输出模式,即一个像素点是2个字节,每次在数据产生模块(相机模块里),都是凑到32个字节,发起wrfifo的写入操作,当分辨率设置的是1280x720,因此一个Bank内的最大写入地址wr_max_addr=1280x720x2x8bit/256bit=57600。放在低位上,高位是Bank地址,如下图所示。

     (2)地址递增的原因要搞清楚,若改变读写FIFO的位宽或硬线位宽,会影响递增值;

    具体是在mem_burst.v模块里地址的app_addr的每次递增是8,另外在该模块的状态机初始态Idle下,每次reload 起始地址时,起始地址都做了左移3bit,即x8。这个原因要搞清楚,方便以后复用。

    原因先写下,以免年纪大了又忘了。原因是因为每次突发写的长度为128,而每次从FIFO读出的数据位宽是256bit(即app_wr_data的位宽是256bit),而板上的DDR3的数据线硬线位宽是32位(2片DDR3控制线复用,数据线并用,扩展了数据线位宽),因此在一次突发写的过程中,每次app_addr需要加8(256bit/32bit=8),而当突发完一次128 length后,下一个起始地址都要加上128x8。

    然而在代码里的起始地址ddr_wraddr是在dcfifo_ctrl.v模块里产生的,该地址在每次ddr_wr_finish(对应mem_burst.v模块里的wr_burst_finish信号)拉高时,地址加上128。因此到了mem_burst.v模块里需要将起始地址左移3bit,即x8。同理,读操作的地址变化也是这么个过程。

    (3)为啥读写的突发长度的设置是128(1280x720的分辨率)

    (4)读写FIFO的位宽是256bit,即32个字节,这个可以更改,当然更改了会影响后面的地址递增,还有硬线位宽也影响地址的递增变化;256/32bit,这个公式会变化

    (5)读写地址的产生方式,这个在dcfifo_ctrl.v模块里,注意一些信号的使用技巧,可借鉴。如下图所示:

     代码里的wr_flag,用来执行每次256bit数据块的写操作完成标记。写完以后拉低,重新判断wrf_use是否大于一个128长度。

    (6)MIG核输出了一个时钟,phy_clk的频率是200M,根据MIG两端的带宽是匹配的,来推断出phy_clk的频率是200M。

      (200Mx256bit SDR )--->   MIG  ---> (800Mx32bitx2 DDR)

    (7)读写FIFO的计数判断,wr_fifo用的rd_cnt,rd_fifo用的wr_cnt。

     

    转载于:https://www.cnblogs.com/jaymyfriend/p/7511068.html

    展开全文
  • DDR线长匹配与时序

    2021-01-19 23:35:56
    我们来回顾一下,DDR布线,线长匹配的基本原则:地址,控制/命令信号与时钟做等长。数据信号与DQS做等长。为要做等长?大家会说是要让同组信号同时到达接收端,好让接收芯片能够同时处理这些信号。那么,时钟...
  • DDR4学习笔记02

    千次阅读 2020-04-28 11:06:46
    学习笔记01读完之后我们大致了解DDR4了,后面的工作就是对DDR4这种存储器进行控制了,要会控制DDR4,你需要以下几个基本知识。 1、vivado基本使用,包括添加IP以及quastasim/modelsim仿真 2、BRAM的读写时序...
  • 一、SDRAM? SDRAM:Synchronous Dynamic Random Access Memory,同步 动态 随机 存储器。同步指其时钟频率和CPU前端总线的系统时钟相同,并且内部命令的发送与数据的传输都以它为基准;动态指存储阵列...
  • 在pcb设计中占有举足轻重的地位,设计成功的关键就是要保证系统有充足的时序裕量。... 图1 地址/时钟仿真示意图 为方便计算,我们假设DDR的时钟频率为500MHz,这样对应的地址信号的速率就应该500Mbps,这里
  •  Sate210 256MDDR2 给了一个老客户测试,他以前买的real6410 的七寸LCD的,嘿嘿,这个LCD可以直接插在Sate210 上用的,但是插上去居然都不显示,后来不知道咋回事显示了bootloader的绿色,但是................
  • 布线在设计中占有举足轻重的地位,设计成功的关键就是要保证系统有充足的时序裕量。... 图1 地址/时钟仿真示意图 为方便计算,我们假设DDR的时钟频率为500MHz,这样对应的地址信号的速率就应该500Mbps,这
  • 我以为都仿真器没区别,ise和vivado都用的Isim仿真器(如果可以我或许会用modelsim)。而且我用ise跑demo代码的仿真泡一会儿就不停弹窗卡死,实在没法用,无奈才用的vivado。 个人估计原语的问题,vivado...
  • 一条小小的内存条凭能发挥这么大的作用?跟着宏旺半导体ICMAX一起来了解下吧! 内存条在电脑中的作用可以这样说内存条在电脑中的作用相当于一座桥梁,用以负责诸如硬盘、主板、显卡等硬件上的数据与处理器之间数据...
  • 串行为比并行快?

    千次阅读 多人点赞 2018-06-07 14:45:51
    作为一个电路设计师,我整个职业生涯都花在接口电路上,串行并行都做过,且速度不慢(DDR3-1600Mbps, SerDes 30Gbps),这个问题不答实在技痒难耐。当然,要说清楚这个问题,老司机这一次要从从电学特性和经济的角度...
  • Dell T40和Dell T140同等cpu内存硬盘配置情况下在价格上T40便宜很多。 那么T140贵在哪里了呢?...第四,T140内存支持UDIMM ECC,而T40则是DDR4。 第五,T140电源365W,T40300W。这个优势不是很明显,毕竟T14
  • 因为这个玩意儿真的没新意 第一款:google的TPU 架构图中DDR3仅仅用来传送数据量小的权重,因为DDR3的速度实在跟不上啊。而激活值采用167GiB/S 的速度传入和传出,中间那个矩阵乘法器65536个 ,运算力相当...
  • 购买内存条注意事项

    2012-06-16 09:45:00
    这首先要看你的CPU、主板支持什么样性能的内存,目前市场主流内存有DDR400、DDR2 533、DDR2 667、DDR800 ,老一点的机子一般使用的是DDR266/333,这一点很重要,买的不对,上不上,上上了不好使;还有主 板支持多大...
  • 听网易云的时候死机的,都在敲安卓代码,虚拟机有时候开有...还有个问题我前几天加了内存,拿了个金斯顿的DDR4 2134的和我原来的三星DDR4 2133的组成8G双通道,平时倒是没问题,一撸代码就死机了。。还是随机性的
  • 添加其他模块,特别aximm要传输至ddr的模块出现问题 包括:ddr 出现DQSCAL FAIL;pcie无法正常读写数据,但是bar和bypass可以正常工作 解决办法: 1.目前没好办法,通过增量编译,每次少添加模块,添加完编译...
  • 内存是我们平常接触最频繁的计算机硬件之一,内存的大小、多寡和型号和我们计算机、手机等性能密切相关。...2Rx8是啥,PC3又是啥,10600似乎和他想买的1333的差好远,后面那串数字又代表什么呢? .
  • 文章目录工程创建串口配置ddr配置GPIO配置约束文件SDK的使用烧写程序结果 工程创建 首先创建一个工程,就叫ps_axi_led吧,这次我们可以在...ddr3的型号MT41K512M16HA-125:A 不过这个里面没有,就用这个最接近的re
  • SQU,PSRAM,XIP

    2018-06-13 16:34:38
    SQU是啥? SRAM?PSRAM的芯片与SDRAM差不多,但是接口与SRAM一样,控制器简单DRAM是用PN结电容存储0/1的,由于漏电的存在,时间长了两级板电位差会消失也就是1会变成0,所以过一段时间需要根据里面的内容补充电荷,这...
  • 内存更换乌龙事件

    2021-05-23 10:02:44
    这只是想象中的剧本,有可能供应商的同事太忙了,或者其他原因,他们到达现成后发现本来应该过来换DDR3的内存的,现在手里带 过来的全是DDR4的内存,于是我们又让他们紧急派人送货过来,毕竟我们的停机时间也...
  • 先来简单介绍一下啥是OrangePi PC。OrangePi PC(香橙派平板)一款开源的单板电脑,新一代的arm开发板,它可以运行Android4.4、Ubuntu、Debian等操作系统。香橙派平板使用全志H3系统级芯片,同时拥有1GB DDR3 内存...
  • 1、为内存不是双通道? 首先通常情况下,要开启双通道内存模式,至少两条内存的容量和频率必须一致,而不少本本族在升级内存时,并没有考虑这个问题。比如同样1GB内存,标配的为三星DDR2 533,而升级后的为现代...
  • 两组内存条都京东上买的,当时买完两组之后插上就看看电影,跑跑虚拟机看看网页没发现问题。结果过了7天无条件退换的时间了,才发现玩游戏。TMD 动不动就闪退。再严重了蓝屏。 查找问题: 1、频率调成3000 去...
  • 前些阵子买了个WD的My Cloud EX2 Ultra,主要就是为了存放重要资料的。买回来发现配套的软件中竟然没有svn,于是便有了这篇折腾随笔了。 软硬件环境 1,WD My Cloud EX2 Ultra 硬件: Marvell® ARMADA® ...
  • vmware esxi 使用物理机usb口设备案例

    千次阅读 2020-07-20 20:47:20
    title: 通达oa2012物理服务器迁移至vmware esxi虚拟机 date: 2020-07-19 12:10:03 tags: [oa] category: 运维 背景 OA服务器配置: ...为拖的现在才想到迁移虚拟机呢,其实我也没办法的办法。刚来的这家公司.
  • RAM

    2016-01-06 21:39:00
    1. 前记 我们知道,不同的计算机结构对RAM 的使用方式有区别的,典型的计算机结构有两个,冯诺依曼结构和哈佛结构,而两大阵营...内存条,RAM中的一种,常见的应该是DDR SDRAM。相信各位都触摸过它,冷冰,无情,...
  • 刷BIOS

    2012-04-21 23:43:00
    BIOS是啥?最基本的系统唉,可不敢随便刷,不比操作系统,蓝屏了可以有多种方法补救,这个刷坏了基本就返厂了。 我怎么好端端的要动它呢? 还得说说背景:穷学生用笔记本配置过低,不堪支撑各种手机虚拟机调试。...
  • 初学英语的时候有这样的体会,26个英文字母都认识了,单词也没大问题,但只知道些基础语句,不能随心所欲的表达自己的意思。 学FPGA的时候,也有这样的感觉:UART、SPI等一些协议都熟悉了;DDR及FLASH等一些存储...

空空如也

空空如也

1 2
收藏数 34
精华内容 13
关键字:

ddr是啥