本帖最后由 Milinker_XU 于 2016-1-10 09:56 编辑
我们在使用ISE进行逻辑设计的时候,DDR3测试真是个费脑又伤神的活啊。然而,我们在MB系统中添加一个DDR3存储控制器,并对mis603上的DDR3进行测试,就显得非常轻松了。言归正传,我们来进行DDR3 MCB的添加,并完成后续操作。 ◎打开ISE14.7,新建MB_Demo,选择对应器件。
◎添加New Source,选择Embedded Processor,命名为mis603_soc。这里之所以选择新建个新的程序,而不是使用第一章的例子在里面添加组件,主要是添加DDR3所需要的组件和之间的互联非常复杂。所以推荐大家新建个程序,直接让工具帮我们添加好所需的组件。 ◎双击添加的mis603_soc,进入MB系统的XPS界面。弹出的对话框选择Yes。在弹出的BSB wizard对话框选择默认。 ◎弹出Base SystemBuilder—AXI flow对话框,保持处理时钟100Mhz不变,直接进入Next,默认即可。 ◎继续进行处理器的配置,在弹出的对话框中选择Add Device。 ◎点击添加AddDevice后,弹出Add IO Devices for Generic Board。点击OK后,继续点击Finish。 ◎这时候XPS窗口中可以看到所添加的DDR3 MCB。这里面还包括AXI4总线,连接外设与MB系统总线。还可以看到clock_generator_0已经添加的多个CLKOUT。具体系统与外设直接的总线互联请大家详细看这里面。 ◎修改clock_generator_0组件,设置输入时钟50Mhz,CLKOUT0为400Mhz,CLKOUT1为400Mhz,CLKOUT2为100Mhz。具体配置如下图所示。 ◎双击DDR3组件,开始配置MCB控制器。在弹出的配置界面中,按下图所选。选择Bank3的控制器。 ◎点击Next,这时候选择对应的DDR3 SDRAM的型号。工作时钟保持333.33Mhz不变。 ◎继续进入MemoryOptions,该项保持默认。进一步其位宽配置为128bit可读写,地址排列方式如下图所示。 ◎进入AXI选择,保持默认即可。 ◎继续配置下去,进入到设置终端电阻。其中RZQ pin和ZIO pin为PCB布线中所选择的,幸运的是mis603与该默认保持一致。点击Finish,即完成DDR3控制器添加。 ◎弹出连接对话框,选择microblaze_0系统,该系统是我们之前搭建的。此时XPS中有我们添加的ddr控制器了。当然也可以点击该组件名称,进行重命名,这里我们将其命名为MCB_DDR。 ◎打开MHS File,这时候可以看到工具已经为我们添加好硬件信息。但是需要注意修改差分时钟为单端时钟。 ◎打开UCF文件,添加时钟和复位的约束,注意DDR3的约束不需要添加。点击保存后,使用Hardware菜单栏产生网表。直到Console弹出“XST completed” Done!
◎回到ISE界面,产生顶层例化文件。 ◎再将mis603_soc.ucf约束文件添加进来,其文件路径为..\MB_Demo\MB_Demo\mis603_soc\data。综合该工程,产生bit文件。注意:这一步在MAP的时候可能会报错,比如下面错误。该错误可能是你的DDR3器件跟所设置的时钟不匹配,我们当前设置的时钟为400Mhz。如果出现该错误,可以提高到600Mhz,再进行编译。
◎在XPS中进入SDK平台,设置路径依然为.. \MB_Demo2\MB_Demo\MB_SDK。查看system.xml文件内部各个ip版本号是否都存在,如果有不存在的,重启SDK。 ◎新建个新的应用工程,做如下的操作。 ◎工程命名为DDR3_Test,其他保持默认即可。 ◎继续下一步,选择MemoryTests,点击finish完成。 ◎将ISE生成的bit文件下载到开发板上。下载完成后,运行SDK软件部分。在Run Configurations界面先配置好。 ◎点击运行Run,进行DDR3测试,可以看到SDK的Console界面在测试过程中打印出测试结果。这样DDR3测试成功。 ◎现在,让我们来看看这个DDR3_Test的程序架构,看看他到底是如何运行的。首先,硬件平台没什么好介绍的了,system.xml在之前介绍过了。打开src文件夹目录下的lscript.ld文件。 ◎其对应的地址如上图中所示。内部RAM大小为1FB0,堆栈大小为0x400,由0x1FB0+0x400=0x23B0。0x23B0/0x400=8Kb。即代码存储区所对应的大小为8Kb,起始地址为0x00000050,与当初设定的大小一致。 ◎DDR3大小为128M*16=2048Mb,即2G大小。从上图中可以看到,大小为0x08000000,0x08000000/0x400/0x400=0x80,即128Mb,数据位宽16bit,因此与设定大小相匹配。 ◎打开memorytest.c文件,具体看下内存测试程序。首先看到的是各个头文件,包括32位MB系统的各个参数头文件xparameter.h,数据类型头文件xil_types.h,内部或外设状态头文件xstatus.h,测试存储器所必须的头文件xil_testmem.h,MB平台初始化头文件platform.h以及内存配置头文件memory_config.h。这些文件均可打开查看,具体各个文件作用在此不细致介绍,后续慢慢再理。 ◎包含了两个函数的声明,打印数据putnum函数和print函数。 ◎测试所用到的函数,都在xil_testmem.c里面。在memory_config_g.c文件内给出了测试的起始地址0Xa8000000和测试的空间大小134217728(0x08000000),可以看出,包含了整个DDR3内存范围。 ◎接着是测试函数test_memory_range。这个函数是对存储测试的主要程序。先测试1024地址空间进行32bit的读写,写入0Xaaaa5555,读出校验位。再对2048地址空间的16bit数据读写,写入0Xaa55,再读出校验,最后对4096地址空间进行8bit读写。测试成功后,状态返回,并将测试结果用print打印出来。
◎使用JTAG可在线调试该程序。将ISE生成的bit文件下载进去后,配置调试。基本过程基本和Run一样。 ◎弹出对话框中,生成Debug。 ◎在想要调试的位置,设置好断点,然后运行调试,进入程序调试界面。在Variables里面可以右击添加要监控的变量。 ◎运行过程中,可以使用单步或逐行进行调试。这当然就跟VS环境一样啦。 ◎当然对于内存的调试,我们还可以添加memory端口来监控。 ◎进行调试后,即可查看到对应地址和地址中写入的数据。 ◎关于MB系统中内存的测试和使用,需要花点时间慢慢积累,搞清楚各个文件和寄存器的使用。在熟悉后,会发现比ISE开发轻松许多。当然,C语言功底是必不可少的。
|