微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 模拟电路设计 > 低成本的MP3播放机系统集成技术

低成本的MP3播放机系统集成技术

时间:10-07 来源:互联网 点击:

■地址映像内存的写入功能生效
允许对地址映像内存进行写入作业。不过,它只允许微控制器在0xFF00至0xFF1F的内存区域写入数据。

■DMA参数内存的写入功能生效
允许对DMA参数内存进行写入作业。微控制器能写入这些参数,而且,这些参数也可以被状态机更新,例如:在进行DMA传输作业时,状态机可以改变它们。

■16位的递增/递减电路
在进行DMA传输作业时,16位的递增/递减可以用来更新参数值。递增电路是为了计算DRAM的目标地址,递减电路是为了计算字组。DMA参数内存的输出值会被送至此电路中,而且也会被送至16个多任务器中,以允许DMA参数被转译成地址,就好像它们来自于微控制器的地址总线(address bus)一样。

■零、壹和奇数值检测器
当DMA参数值被改变时,这个电路能够立即得知;如果DMA参数值是零、壹或奇数地址,这个电路也能够通知状态机。当DMA参数值是零时,状态机会清除DMA的请求旗标,以终止DMA作业,并将「完成DMA传输」的中断旗标设为1。

■微控制器的「地址锁定致能(address latch enable;ALE)」讯号之同步
能使微控制器的ALE讯号和FPGA 的时脉同步。微控制器的其它控制讯号也是采用类似的同步机制,但是它们位于主电路中。

■2:1多任务器/4位
此电路允许在每32 byte内存内的地址,可以被内存的一般功能控制,或被微控制器的总线控制(当韧体从这些缓存器中读出或写入,来改变地址映像或建立DMA传输时)。

■2:1多任务器/8位
它被使用在IDE区块内。它允许从微控制器的数据区域中,将数据加载至输出缓冲器内。

■2:1多任务器/16位
当执行一个DMA周期时,利用这个电路,可以从微控制器的地址总线(一般作业),切换成DMA参数内存的地址总线。

■2:1多任务器/16位
利用这个电路可以选择DMA参数内存的输入值;它是在更新的DMA参数(在一个DMA周期内)和微控制器的数据总线(当微控制器写入DMA设定值)之间做切换。单独设计这个16位的多任务器,是因为FPGA开发工具的「可设定的逻辑区块(configurable logic block;CLB)」之映像,无法将额外的逻辑闸纳入上列的那些2:1多任务器内(如此会浪费8个CLB,并在重要的时序路径上,增加额外的延迟时间),除非逻辑闸是在同一个电路设计图内。

■16至8位总线,三态(tri-state)缓冲器
此三态缓冲器允许一个16位总线的任一半字节(8 bit)去驱动一个8位总线。它可以让微控制器从宽16位的内存中读取数据。

■8至16位总线缓冲器
连接两个8位的总线成为一个16位总线(但FPGA开发工具并不会因此混淆)。

■8至16位总线缓冲器
连接一个8位的总线两次,成为一个16位总线(但FPGA开发工具并不会因此混淆)。此16位总线的任一半字节都是来自于此8位总线,如附(图三)。
 


■8位缓存器
一个8位缓存器,用来收集微控制器的地址位。

此外,由于不同的FPGA开发工具的性能差异,可能还需要:
●数个具有不同位数(例如:5至9位)的位移缓存器:它们在状态机中使用。可以避免因为在同一电路设计图内具有太多的符号,而使FPGA开发工具当机。
●正反器(在CLB中):这是唯一的CLB正反器,以一个比在FPGA开发链接库(library)中还要小的符号来重设计。
●正反器(在IOB中):这是唯一的「I/O区块(IOB)」正反器,以一个比在FPGA开发链接库(library)中还要小的符号来重设计。

FPGA电路算是此MP3播放机系统中,比较复杂的一部份,一般的OEM/ODM可以指定规格委外设计。另一个OEM/ODM厂商必须注意的是韧体的设计;或许韧体也可以委外设计,但是他们必须懂得如何使用底层韧体(汇编语言)所提供的应用程序接口(API),来设计上层的使用者程序(C语言程序)。

 


应用程序接口

应用程序接口至少包含:动态配置内存(memory allocation)、档案/目录的读取、MP3音乐的播放、与其它外围的通讯(包括:可当作除错用途的串行端口、LCD显示器…..等)。这里仅介绍动态配置内存的应用程序接口如下:

■动态配置内存
对使用者程序而言,一定需要配置内存来储存字符串、结构、或其它项目。它的功能就像C语言里的malloc( )一样。这里使用的是simm_malloc( ),它的原式如下所示:

●simm_id simm_malloc (unsigned int num_bytes):
分配num_bytes的DRAM内存空间,并传回simm_id代表这个空间。simm_id不是一个指标(pointer),而是一个号码。想要得到配置好的实际的内存空间地址,必须透过addrX函式,如下所示:
●xdata void * addr5 (simm_id addr32):映射至0x5000~0x5FFF
●xdata void * addr6 (simm_id addr32):映射至0x6000~0x6FFF
●xdata void * addr7 (simm_id addr32):映射至0x7000~0x7FFF

将simm_id所代表的内存空间映像至微控制器的地址空间,并传回一个指标。这些函式的回传值几乎是使用「类型转换(typecast)」,例如:(xdata char *)addr5(string_id)。每一个函式会分别映像至一个属于微控制器地址空间的特殊区段。如果有任何一个指标已经被使用了,这个特殊区段就不是有效的;因此,对同一个simm_id而言,只能透过上列的3个函式,获得3个不同的指标,而且它们不能被使用,这样的地址空间才是有效的。

想要释放simm_malloc( )先前配置的内存空间,必须使用下列的函式:
void simm_free (simm_id addr32)

在表一中,从0x0000至0xEFFF的区域是储存数据用的分页(page),其余都是缓存器。每一个分页(或区块)大小是4K(Bytes)。所支持的DRAM模块大小,是从1024(4MBytes)至8192(32MBytes)个区块。系统初始化后,这些4K大的区块会被配置且闲置着(free)。当一组区块被配置时,通常第一个区块的号码会先被用掉,后面的区块是透过呼叫next_block( )函式来依序存取。DRAM控制器允许任何15个区块能映像至微控制器的地址空间中,从0x0000至0xEFFF。下面条列出与分页管理相关的函式(是以汇编语言写成的):

●init_memory_mgr:将「内存管理者(memory manager)」初始化。它会检测出DRAM模块的大小,少部份的内存区块会被保留下来,供作设计所有区块的链接串行(linked list)之用。此链接串行可以追踪哪些区块是闲置的,哪些是被使用的。当应用程序需要一组区块时,这个被保留的内存区块就会储存那组区块的串行。在使用其它函式之前,必须先呼叫此函式。
●malloc_blocks:配置1个或更多个区块(4K大的分页),并传回第一个区块的号码。若要配置一个以上的区块,须配合使用next_block函式来撷取其它区块。请注意,它和simm_malloc( )一样,这些区块并不会自动映射至微控制器的寻址空间。
●map_block:将一个区块映射至微控制器的寻址空间。输入分页号码(0~14)和区块数量。
●free_blocks:将配置好的区块释放。释放后的区块之映射并不会自动消失。输入第一个区块的号码,与它同一组的区块都会被释放。
●next_block:撷取一个以上的区块时,配合malloc_blocks使用。输入目前的区块的号码,它会传回下一个区块的号码。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top