MicroBlaze测试DDR3

我们在平常的调试过程中尤其在进行大批量数据处理时,经常需要缓存大量的数据,虽然较高级别的FPGA都用于大量的片内BlockRAM,但是在算法较为复杂时,BlockRAM依然显得捉襟见肘,外置的SDRAM容量大成本低,为FPGA扩容提供了良好的平台。Xilinx系列FPGA随软件拥有免费的SDRAM控制器,可以很方便的让用户对FPGA进行缓存扩容,而不用费神于如何控制SDRAM的读写时序和自刷新等繁杂的操作。

我们手中这块A7-50T的开发板上便集成了位宽为16bit,容量位256MB的DDR3-SDRAM。这次我们就着手测试一下开发板的DDR3存储。

测试内容为将DDR3扩展为MicroBlaze软核的存储空间。这样不但省掉我们用HDL语言去编辑整个用户时序,还可以在生成MicroBlaze软核时配置较小的片上缓存,而将较大的程序空间分配如DDR3内,从而可以节省出有限的片上缓存空间用于数据接口的缓存。

测试步骤:
1. 新建一个工程,在其内部新建一个Block Design,将我们需要的IP核加入到Block Design中,分别为UART核和MIG,新建完工程如图1。

2. 修改clk_wizard,增加一个输出clk_out2,如图2

3. 修改MIG,修改系统时钟为no buffer如图3,分配sys_rst为MIG的复位信号,如图4

4. 在SDK中编辑测试代码如下,对存储空间为0x80000000起始地址的64K DDR3存储空间进行存取校验

#include 
#include "xparameters.h"
#include "xil_cache.h"
int main()
{
Xil_ICacheEnable();
Xil_DCacheEnable();
print("---Entering main---\n\r");

unsigned int *test_val;
test_val=( unsigned int * ) 0x84000000;
for(unsigned int i = 0;i<65535;i++)
{
test_val[i] = i;
}
for(unsigned int j = 0;j<65535;j++)
{
if (test_val[j] != j)
{
print("ddr3 test failed!\n\r");
break;
}

}

print("---Exiting main---\n\r");
Xil_DCacheDisable();
Xil_ICacheDisable();
return 0;
}

5. Terminal 输出如图5,DDR3内存图为图6。

详细的测试过程,可以参考下面的视频:

http://v.youku.com/v_show/id_XMTgyNzc1NTAxNg==.html

  • 6
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
好的,针对您的问题,我可以给出以下建议的实现方案: 1. 在Vivado中创建一个MicroBlaze软核,确保其连接到DDR存储器。 2. 编写一个延时函数,该函数的输入为所需的延时时间(以微秒为单位)。函数的实现方式可以基于以下思路:使用MicroBlaze的内置计时器,将其初始化为计时器时钟的周期数,然后在延时函数中使用循环语句来等待所需的时间,直到计时器到达指定的计数值为止。 3. 为了确保精确度,可以通过对计时器时钟的周期进行校准来调整延时函数的精度。这可以通过使用外部时钟源来实现,或者使用PLL对内部时钟进行校准。 4. 测试和优化延时函数以确保其准确性和稳定性。 以下是一个简单的代码示例,用于演示如何实现一个基于MicroBlaze的延时函数: ```c #include "xparameters.h" #include "xil_io.h" #include "xil_types.h" #define TIMER_BASEADDR XPAR_AXI_TIMER_0_BASEADDR #define TIMER_CLK_FREQ_HZ XPAR_AXI_TIMER_0_CLOCK_FREQ_HZ void delay_us(u32 us) { u32 ticks = TIMER_CLK_FREQ_HZ / 1000000 * us; Xil_Out32(TIMER_BASEADDR + 0x04, 0x0); // Reset timer Xil_Out32(TIMER_BASEADDR + 0x00, ticks); Xil_Out32(TIMER_BASEADDR + 0x08, 0x01); // Start timer while(Xil_In32(TIMER_BASEADDR + 0x0c) == 0); // Wait for timer to complete } ``` 在这个例子中,我们使用AXI计时器的基地址和时钟频率来计算所需的计时器周期数,并将其写入计时器寄存器。然后,我们启动计时器,并等待计时器完成。这个延时函数的输入单位是微秒。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值