首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

求助:接片外存储器

求助:接片外存储器

用UP3,没有SLS 61LV6416的IPCore,只好自己做存储控制。是一个64K*16BIT的片外SRAM,对应开发板上的连接,管脚都没有错,用三态脚。现在用下面的程序控制电路,可是发现测试的时候老是出错,请帮忙看看。写完之后,读取其中值的时候,发现返回的是错误的值。

#include "system.h"
#include "altera_avalon_pio_regs.h"
#include "alt_types.h"


#define TEST_ADDR  0x0000  


#define CONTROL_DEFAULT 0x1f      //0001111



int write_sram(alt_u16 sram_addr,int data_wr)
{
  //data_int should between :-32000 to 32000
  //follow the following steps to write
  //step1:   enable LB 0 UB 0     00011100
  //step2:   write addr_l addr_h  and data_l data_h  
  //step3:   enable WE 0 disable OE:1 00010100   
  //step4:   enable CE:0    00000100
  //step5:   wait for a while
  //step6:   disable CE:1  00011111
  int i=0;
  alt_u16 data=(alt_16)data_wr;
  alt_u8 sram_addr_l=0x00;
  alt_u8 sram_addr_h=0x00;
  alt_u8 data_l=0x00;
  alt_u8 data_h=0x00;
  data_l=(alt_u8) (data&0x00ff);
  data_h=(alt_u8) ((data&0xff00)>>8);
  sram_addr_l=(alt_u8) (sram_addr&0x00ff);
  sram_addr_h=(alt_u8) ((sram_addr&0xff00)>>8);
  IOWR_ALTERA_AVALON_PIO_DATA(CONTROL_PIO_BASE, CONTROL_DEFAULT); //step0
  IOWR_ALTERA_AVALON_PIO_DATA(CONTROL_PIO_BASE, 0x1c);   //step1
  IOWR_ALTERA_AVALON_PIO_DATA(ADDR_H_BASE, sram_addr_h);   //step2
  IOWR_ALTERA_AVALON_PIO_DATA(ADDR_L_BASE, sram_addr_l);
  IOWR_ALTERA_AVALON_PIO_DATA(DATA_H_BASE, data_h);
  IOWR_ALTERA_AVALON_PIO_DATA(DATA_L_BASE, data_l);
  IOWR_ALTERA_AVALON_PIO_DATA(CONTROL_PIO_BASE, 0x14);   //step3
  IOWR_ALTERA_AVALON_PIO_DATA(CONTROL_PIO_BASE, 0x04);   //step4
  i = 0;                                   //step5
  while (i<2000)
      i++;                          
  IOWR_ALTERA_AVALON_PIO_DATA(CONTROL_PIO_BASE,CONTROL_DEFAULT);   //step6
  return(1);
}



int read_sram(alt_u16 sram_addr,int *data_rd)
{
  //data_rd can between: -32000 to 32000
  //follow the following steps to read
  //step0:   disable chip:CE:1
  //step1:   enable LB 0 UB 0     00011100
  //step2:   write addr_l addr_h    
  //step3:   enable OE 0 disable WE:1 00011000   
  //step4:   enable chip:CE:0    00001000
  //step5:   read  data_l data_h 
  //step6:   disable CE:1  00011111
  int i=0;
  alt_u16 data=0;
  alt_u8 sram_addr_l=0x00;
  alt_u8 sram_addr_h=0x00;
  alt_u8 data_l=0x00;
  alt_u8 data_h=0x00;
  //data_l=(alt_u8) (data&0x00ff);
  //data_h=(alt_u8) ((data&0xff00)>>8);
  //sram_addr_l=(alt_u8) (sram_addr&0x00ff);
  //sram_addr_h=(alt_u8) ((sram_addr&0xff00)>>8);
   
  IOWR_ALTERA_AVALON_PIO_DATA(CONTROL_PIO_BASE, CONTROL_DEFAULT); //step0
  IOWR_ALTERA_AVALON_PIO_DATA(CONTROL_PIO_BASE, 0x1c);   //step1
  IOWR_ALTERA_AVALON_PIO_DATA(ADDR_H_BASE, sram_addr_h);   //step2
  IOWR_ALTERA_AVALON_PIO_DATA(ADDR_L_BASE, sram_addr_l);
  IOWR_ALTERA_AVALON_PIO_DATA(CONTROL_PIO_BASE, 0x18);   //step3
  IOWR_ALTERA_AVALON_PIO_DATA(CONTROL_PIO_BASE, 0x08);   //step4
  i = 0;                                 
  while (i<2000)
      i++;
  data_h=IORD_ALTERA_AVALON_PIO_DATA(DATA_H_BASE);     //step5
  data_l=IORD_ALTERA_AVALON_PIO_DATA(DATA_L_BASE); 
  i = 0;                                
  while (i<2000)
      i++;                          
  IOWR_ALTERA_AVALON_PIO_DATA(CONTROL_PIO_BASE,CONTROL_DEFAULT);   //step6
  data=(alt_u16)(data_l)+(alt_u16)(data_h<<8);
  *data_rd=(int)data; 
  return(1);
}


int main (void) __attribute__ ((weak, alias ("alt_main")));


int alt_main (void)
{
  alt_u8 led = 0x00;
  volatile int i;
  int data_wr1=0;
  int data_rd1=0;
 
  data_rd1=3;
  data_wr1=15;
  write_sram(TEST_ADDR,data_wr1);
  read_sram(TEST_ADDR,&data_rd1);
 
  led=(alt_u8)(data_rd1);
  IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE, led);
 
  while (1)
  {
  /* 
    data_rd1=0;
    data_wr1++;
    write_sram(TEST_ADDR,data_wr1);
    read_sram(TEST_ADDR,&data_rd1);
 
    led=(alt_u8)(data_rd1>>0);
    IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE, led);
    //IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE, led);
     * */
    i = 0;
    while (i<200000)
      i++;
     
   
  }


  return 0;
}

多多交流!谢谢!
看了一下程序,觉得时序上没有什么问题,你用示波器或者逻辑分析仪测试一下sram的引脚信号都发到了没有啊。其实你可以用自定义逻辑做啊,没有必要用PIO模拟这么麻烦,sram应该很好操作。
在交流中前进,共同实现nios的应用。
谢谢版主,刚在学用逻辑分析仪,我测测看。
多多交流!谢谢!
不用谢,最好查出来了告诉我一声,我也想知道是出了什么问题。
在交流中前进,共同实现nios的应用。
自己用SOPC builder做一个SRAM的component,很简单,直接指定时序和引线就可以了
用不着写verilog的
返回列表