《电子技术应用》
您所在的位置:首页 > 嵌入式技术 > 设计应用 > 一种基于CPLD译码的DSP外部Flash烧写方法
一种基于CPLD译码的DSP外部Flash烧写方法
张芝贤1,邱委华1,朱庆贤2,王
摘要: 以实际的图像监控系统为背景,介绍了对S29AL008D Flash存储器进行操作的指令格式和控制方法。通过CPLD实现DSP和Flash存储器之间的硬件连接,给出了部分VHDL源程序。利用TMS320C5509A DSP通过CPLD快速译码实现Flash烧写具有接口简单、通用性强的优点,在实践中证明了方法的有效性。
关键词: DSP CPLD VHDL TMS320C5509A
Abstract:
Key words :

  摘 要: 以实际的图像监控系统为背景,介绍了对S29AL008D Flash存储器进行操作的指令格式和控制方法。通过CPLD实现DSP和Flash存储器之间的硬件连接,给出了部分VHDL源程序。利用TMS320C5509A DSP通过CPLD快速译码实现Flash烧写具有接口简单、通用性强的优点,在实践中证明了方法的有效性。
    关键词: DSP;S29AL008D;CPLD译码;Flash烧写

 

   数字信号处理器DSP因其运算精度高,实时性强等特点,在通信、工业控制和消费类电子等领域得到了广泛应用,成为进行数字信号处理的首选器件。在图像监控系统中,往往要对大量的数据和应用程序进行处理和非易失性存储。采用Flash存储器对这些大量数据和应用程序进行存储是一种性价比较高的选择。本文设计的以TI公司DSP芯片TMS320VC5509A(以下简称VC5509A)为主处理器的图像监控系统中,使用了AMD公司S29AL008D Flash存储器作为数据和应用程序存储芯片。使用VC5509A对S29AL008D进行操作,在硬件接口设计中采用CPLD进行译码和时序控制。
1 VC5509A及其外部存储空间
    TMS320VC5509A是TI公司的一款16位高速低功耗定点DSP芯片,主要应用于对音频、静态图像的数字信号处理,是设计便携设备的较佳解决方案。该DSP芯片在核心电压为1.35 V时最大工作频率为144 MHz;地址线为24位,对地址的寻址范围为16 M×8 bit或8 M×16 bit。VC5509A采用统一的编址方式,即存储空间地址没有重叠但是寻址方式却有2种不同的方式:字节寻址和字寻址[1]。当DSP中的CPU访问VC5509A程序存储空间时,通过外部存储器接口(EMIF)对外部存储空间进行管理。外部存储空间被分成CE0~CE3 4个空间,分别由EMIF的CE0#~CE3#引脚管理,外部存储空间划分如图1所示[2]。CEn#(n=0~3)与外设的片选端连接。

 


2 硬件电路设计
2.1 VC5509A与Flash的硬件连接
    使用PGE封装的VC5509A对外只提供14条地址线引脚,因此只能寻址8 K×16 bit的空间范围[3],要对S29AL008D的512 K×16 bit存储空间寻址需19条地址线。解决办法是用CPLD实现锁存译码使D[5:0]具有数据/地址复用功能,为S29AL008D Flash存储器提供高6位地址[4]。VC5509A和CPLD与S29AL008D的硬件接口电路如图2所示[5]。通过CPLD的快速译码功能在CE2空间模拟1个Flash高位地址控制寄存器(换页控制寄存器)FPCR,上电复位后通过写FPCR控制FLASH的高位地址来实现换页功能。此处用VHDL对XC9536XL进行编程将FPCR映射到0x400000,由于篇幅限制仅给出如下部分核心源程序:
    begain
    fce<=ce1;
    foe<=aoe;
    fwe<=awe;
    addr<=a3&a2&a1;
    datain<=d5&d4&d3&d2&d1&d0;
    facs<='1' when ce2='0' and addr='000'   
        else'0';
    FAR:process(facs,awe,reset)
    begain
    if reset='0'  then
       fa<='000000';
    else if reset='1' then
if awe'event and awe='1' then
       if facs='1' then
    fa<=datain(5 downto 0);
            end if;
         end if;
      end if;  
    end process;
    dataout<=fa when aoe='0' and facs='1'
    else 'ZZZZZZ';
    ……


2.2 VC5509ADSP相关寄存器的初始化
    在DSP对S29AL008D 进行读写访问之前,要对DSP内相关寄存器进行正确的设置。此系统的初始化设置如下[6-7]:
    ioport unsigned int *ebsr=(unsigned int *) 0x6c00;
    ioport unsigned int *egcr=(unsigned int *) 0x800;
    ioport unsigned int *ce11=(unsigned int *) 0x806;
    ioport unsigned int *ce12=(unsigned int *) 0x807;
    ioport unsigned int *ce13=(unsigned int *) 0x808;
    *ebsr=0x01;   //外部总线选择寄存器选定完全EMIF模式
    *egcr=0x0a10;    //关闭ARDY控制
    在CPU一半工作频率下,设置CE1
    *ce11=0x162a     //设置存储器模式为异步16位,读操作的setup、strobe、hold与写操作的相同
    *ce12=0x162a; //写操作的setup、strobe、hold
    *ce13=0;
2.3 Flash存储器的操作
    对S29AL008D的读写过程必须严格按照S29AL008D提供的命令时序来完成。表1给出了S29AL008D对数据字进行复位、擦除、读、写的命令时序[7]。

           


    Flash操作写子函数C程序如下:
    # define flash_ba 0x200000
    //ptr是FLASH存储器映射在整个DSP系统地址空间中的基地址
    # define FAR
    unsigned int PA,PD;
    void write_se(unsigned int se_addr,unsigned int se_data)
    {
      unsigned int *flash_adr,*FAR=(unsignedint*)
         0x400000;
     flash_adr=(unsigned int * )
         (flash_ba+se_addr);
     //se_addr由FAR和A[13:1]来决定
        *flash_adr=se_data;
    }
    对Flash进行写操作前必须先擦除片内原有的数据。Flash的整片字擦除操作时序C语言实现如下:
    void Erase-Chip()
    {
       void write_se (0x555,0xAA);
       void write_se 0x2AA,0x55);
       void write_se 0x555,0x80);
       void write_se 0x555,0Xaa);
       void write_se 0x2AA,0x55);
       void write_se 0x555,0x10);
    }
    Flash要对写入的数据进行校验以及判断操作是否正确完成。Flash写校验C语言实现如下:
    void program_check (void)
    {
        unsigned int algorithm_out;
        unsigned int datapolling_bit;
        unsigned int exceed_time;
        algorithm_out = read_arry( PA);
        datapolling_bit = intalgorith_out &0x80;
    exceed_time = algorithm_out &0x20 ;
    while((datapolling_bit !=PD&0x0080)
            &&(exceed_time != 0x20))
        {
        algorith_out = read_arry( PA);
        datapolling_bit = algorith_out &0x80;
        exceed_time = algorith_out &0x20;
        }
    if (exceed_time = = 0x20)
        {
         datapolling_bit =read_arry(PA) &0x80 ;
        if (datapolling_bit !=PD & 0x0080)
         {
          reset_flash();
          wrong();
          }
         }
    }
    Flash字编程程序如下:
    void Word-Program(void)

    {
        write_se (0x555,0xAA);
        write_se 0x2AA,0x55) 
        write_se (0x555,0XA0);
        write_se (PA,PD);
        program_check();
    }
    由于篇幅所限,本文仅给出部分核心程序代码,读者可利用上述代码编写一个完整的程序。
    本文以解决DSP静态图像无线传输系统项目中对大规模程序和大量图像数据的存储问题为背景,并最终在整个系统调试中实现其存储功能和程序的二次加载。经验证,本接口设计和编程实现具有操作方便,易于扩展等优点。
    对DSP外部Flash编程虽不是一项关键技术,但它在整个DSP嵌入式系统开发中却有着至关重要的作用。如果开发者在设计之初就掌握了这项技术,将会大大方便系统的调试,缩短开发时间。


参考文献
[1] Texas Instruments. TMS320VC5509 DSP external memory interface(EMIF) reference guide[S]. Literature Number:SP-2 RU670, October 2003.
[2] 彭启琮,武乐琴.TMS320VC55X系列DSP的CPU与外设[M].北京:清华大学出版社,2005:191-212.
[3] Texas Instruments.TMS320C55x DSP CPU reference guide[S]. Literature Number:SPRU371F,February 2004.
[4] 申敏,邓矣冰.DSP原理及其在移动通信系统中的应用[M].北京:人民邮电出版社,2001:130-139.
[5] 刘伟,闫玉华.基于CPLD译码的DSP二次Bootloader方法[J].电子技术应用,2008,34(10):61-63.
[6] 李坤,肖恒.TMS320VC33的引导加载方法设计与实现[J].电子技术应用,2003,23(2):166-168.
[7] Publication number S29AL008D_00 revision A amendment 3. Issue Date June 16, 2005.

 

此内容为AET网站原创,未经授权禁止转载。