基于PLD的嵌入式系统外存模块设计
摘要:以MCS-96系列单片机为例,介绍了一种采用可编程逻辑器件(PLD)的存储器模块的设计方案,该模块包含了Flash闪存和RAM。提出了一种方便的存储器扩展方法,该方法有效地解决了嵌入式系统尤其是数据采集、存储等系统中存在的存储空间不足问题。该方案具有通用性强、读写控制简单等特点,具有很强的实用性。
在嵌入式系统中,由于设计成本和体积等因素的限制,往往会使CPU(包括DSP、单片机等)存在地址空间不足的问题。很多文献(如参考文献[1]都有相关的存储器扩展方法的介绍, 目前已有的方法通常是借助于CPU的I/0接口产生片选或者高位地址信号,利用这些信号将内存分页,但当页间跳转时将给程序设计带来不便。对于没有内部存储器并且采用统一编址的CPU,如80C196KC20[1],这种页间切换将造成CPU无法继续执行当前程序而产生错误(见图1)。在CPU执行页面切换操作后,本应该继续执行页面1的指令,可是却错误地执行了页面2中的相应指令,这种结果不是所需要的。因此寻找一个有效的存储器扩展方法是实际应用中亟待解决的问题。
1 存储器扩展方法解决方案
在对MCS-96系列单片机的使用中发现,64K字节的存储空间用来存放程序能满足绝大多数的使用需求(通常用户的应用程序不到10K字节),但如果使用其进行数据存储控制,则会带来存储空间上的严重不足。通过对实际应用的统计分析发现,在很多情况下,数据的
存取仅限于顺序的连续操作。利用这个特点,可以对数据存储空间进行简化设计,具体的说就是通过对同一个地址连续读或者连续写来进行批量数据的存取,从而节省地址空间。在16位CPU中,可以将任何一段64K字(2的16次方)的存储空间映射到两个地址(一个作为读取的位置,一个作为写入的位置),采用这样的映射方法可以将内存最大扩展到2G字(2的31次方),但这样的设计同时也带来了诸多逻辑控制上的困难。随着可编程逻辑器件(PLD)包括FPGA、EPLDE4[4]、CPLD等的迅速发展,数字逻辑电路的设计得到了大大简化,从而使这种存储器扩展想法可以得到实现。
2 存储器扩展方法的具体实现
下面以笔者设计的系统为例来详细说明这种存储器扩展方法的实现。该系统是一个多功能数据采集设备,能够以最高40k次/s的速率进行12位A/D转换,并且可以将采集到的数据保存至Flash ROM中,以防止掉电丢失。技术参数要求如下:①最多可以保存32K字节的采样数据;②可以同时存储4段系统工作配置程序,每段4K字节,共计16K字节;③由于Flash ROM自身的特点,在写人数据后的编程阶段不能进行读写操作,因此为了保证系统采样和单片机运行的正常进行,需要额外增加32K字节的RAM作为数据缓存;④系统程序、中断服务程序等共占用56K字节(Flash ROM和RAM各保留28K字节),总计需要存储空间136K字节。这个需求已经超过96系列单片机的64K字节寻址范围,为此设计了一个存储器模块,其结构如图2所示。
图2
Flash ROM采用ATMEL公司的AT29C1024,容量为128K字节,数据线宽度为16位;RAM存储器由两片CY7C199组成,数据线宽度为16位,容量为64K字节。80C196单片机的ALE为地址锁存信号,/WE为写有效信号,/RD为读有效信号,READY为准备就绪信号。MCS-96系列单片机支持8位和16位两种工作模式,为了提高系统的性能,选择16位工作模式。96系列单片机地址是按照字节的方式来计算的,因此在16位工作模式下的A0=0没有实际意义。在通常的读写情况下,取经过锁存后的AD1~AD15地址作为A1~A15而A16=0。 clock信号要保证在写Address_F_RP地址修改读取位置时,或读Address_F_R地址取数据时都能产生上升沿信号。总线a0-a15和D0~D15分别是由AD0-AD15分离出来的地址和数据总线。多路选择器则根据地址译码产生的S0-S3选择输出地址,输出地址直接连接到RAM和Flash ROM的地址线上。如果访问除Address_F_RP和Address_F_RP以外的地址,则地址输出总线A115..1)=a[15..1]、A16=0,即单片机直接访问存储器;如果读取Address_F_R,则片选/CS2有效并且A[16..1)Q(15..0]作为输出地址。这样就可以自动地在不同存储区域进行切换,从而大大地增加了内存的扩充能力,并且简化了程序设计。运用同样的方法还可以定义FlashROM中的数据块写入地址Address_F_W和写位置指针地址Address_F_WP,RAM中也有类似的方法定义Address_R_(RAM数据块读地址)、Address_R_RP(RAM数据块的读位置指针地址)、Address_R_W(RAM数据块写地址)和Address_R_WP(RAM数据块的写位置指针地址)。这样可以方便地对内存的扩展部分进行读写。下面以MCS-96的汇编语言为例来说明程序中是如何操作的。比如需要从IOPORT0口连续采集数据,然后存放到RAM中指定的数据块等待处理,则可以写出如下程序: 从上面这个简单的例子可以看出,这种存储器组织方法大大简化了编程的的复杂性,并且可以采用对位置指针赋初值的方法来实现对扩展存储器中任何一个位置的读写操作。 上面的分配方案可以通过对地址总线进行译码生成相应的片选信号/CSl和/CS2来实现。这样分配后,Flash ROM 和 RAM 的使用情况如图4所示。 可是实际故障依旧,通过测试得到的时序信号如图6所示。 前面详细地介绍了一种实用的存储器扩展方法,该方法是基于PLD器件实现的,有效地解决了嵌入式系统,尤其是数据采集、存储系统中内存扩展的问题。该方法能够简化程序设计,并且不需要随CPU型号的变化而修改设计,具有很好的可移植性。同时还给出了一种较为复杂的单片机外部存储器的组织方案,包括了Flash ROM和RAM构成的存储系统。最后提出了将READY信号由同步产生改为异步产生的方式,解决了CPU在高速RAM与低速Flash ROM之间切换产生的问题,最终设计成了一套较为完善的CPU外部存储器系统。
- 什么是module 以及如何写一个module(转)(04-23)
- 在Linux 2.6内核下编译可以加载的内核模块(04-23)
- 用DSP56F805 PWM模块输出高频正弦波(05-25)
- DSP与PC机的无线交换调制模块设计(09-17)
- 基于TMS320F28334的伺服系统模块设计(02-25)
- Linux安全模块(LSM)简介(06-12)