仍然建立工程,在sopc builder里添加组件如图所示
其中SDRAM设置如下图所示
CPU的reset和exception地址都选择SDRAM
由于SDRAM对时序的要求非常严格,所以它的时钟要有一定的相移来匹配其他的信号(如DRAM_CKE)经过nios所造成的延迟
在bdf文件中加入锁相环PLL,具体的相移参考芯片手册(话说我也没找到具体的相移是多少,只是看过书上别人都是按这么多相移来做的……)
接着分配引脚,注意的是SDRAM的引脚在DE2给的手册里是按照DRAM_BA_0和DRAM_BA_1来的,而我们在nios设计里是按照DRAM_BA[1..0]来设计的,两者需要一致
同理,DRAM_UDQM和DRAM_LDQM。
在nios ide中编写代码。
主程序如下所示
/*
----------------------------------------------------------------
* Include
*---------------------------------------------------------------- */
#include < stdio.h >
#include " ../inc/sopc.h "
#include " system.h "
#include " string.h "
#include < unistd.h >
/* ---------------------------------------------------------------
* Variable
*--------------------------------------------------------------- */
unsigned short * ram = (unsigned short * )(SDRAM_BASE + 0x10000 ); // SDRAM地址,考虑到SDRAM存有其他内容,包括程序,所以偏移一定的地址,不固定
/*
* === FUNCTION ========================================
* Name: main
* Description: 函数主程序
* =====================================================
*/
int main( void )
{
int i;
memset(ram, 0 , 100 );
// 向ram中写数据,当ram写完以后,ram的地址已经变为(SDRAM_BASE+0x10100)
for (i = 0 ;i < 100 ;i ++ ){
* (ram ++ ) = i;
}
// 逆向读取ram中的数据
for (i = 0 ;i < 100 ;i ++ ){
printf( " %d\n " , * ( -- ram));
usleep( 1000000 );
}
return 0 ;
}
* Include
*---------------------------------------------------------------- */
#include < stdio.h >
#include " ../inc/sopc.h "
#include " system.h "
#include " string.h "
#include < unistd.h >
/* ---------------------------------------------------------------
* Variable
*--------------------------------------------------------------- */
unsigned short * ram = (unsigned short * )(SDRAM_BASE + 0x10000 ); // SDRAM地址,考虑到SDRAM存有其他内容,包括程序,所以偏移一定的地址,不固定
/*
* === FUNCTION ========================================
* Name: main
* Description: 函数主程序
* =====================================================
*/
int main( void )
{
int i;
memset(ram, 0 , 100 );
// 向ram中写数据,当ram写完以后,ram的地址已经变为(SDRAM_BASE+0x10100)
for (i = 0 ;i < 100 ;i ++ ){
* (ram ++ ) = i;
}
// 逆向读取ram中的数据
for (i = 0 ;i < 100 ;i ++ ){
printf( " %d\n " , * ( -- ram));
usleep( 1000000 );
}
return 0 ;
}