通常情况下,如果是320*240(X*Y)分辨率的图像,使用128K(17bitRAM做地址映射,分别取X寻址对应128K的低9bit(可使用地址为0-511)、Y寻址对应128K的高8bit(可使用地址为0-255)。
但如果是480*272分辨率的图像,使用320*240类似的存储器映射方式,则需要至少9(可寻址0-511)+9(可寻址0-511)=18条地址线,128K无法满足要求,相应的需要256K的替代。本身这种直接映射存储的方式虽然大大简化运算以及坐标定位,但却从某种程度上浪费了一些存储空间,尤其是类似480*272的分辨率,做一个简单的计算:
320*240=76800
480*272=130560
对应的
64K=65536
128K=131072
那么,320*240/480*272所需的存储量都居于64K和128K之间,64K肯定不够用,应该选用128K。但是理论上可以用128K存储的480*272在直接映射方式下却必须选用256K做存储,着实是一个很大的浪费。
基于此,在480*272的映射中,特权同学做了一些处理,一部分图像还是直接映射,另一部分图像充分利用余下的地址空间巧妙的转换后进行存储,达到了物尽其用,并且简单方便的效果。
假设1:(X0,Y0)为图像坐标,取:
X0:bit8-0,对应原始地址总线ADDB[8:0]
Y0:bit8-0,对应原始地址总线ADDB[17:9]
假设2:(X,Y)为相应的RAM存储坐标,取:
X:bit8-0,对应原始地址总线ADDR[8:0]
Y:bit7-0,对应原始地址总线ADDR[16:9]
映射变换如下:
当Y0<256(即ADDB[17]==0)时,直接映射:
ADDR=ADDB[16:9];
当Y0>=256(即ADDB[17]==1)时,转换映射:
ADDR[16:0]={ADDB[12:9],ADDB[8:5],4’b1111,ADDB[4:0]}
此类转换,用软件模拟自然有些繁琐,而FPGA逻辑实现却易如反掌,一条语句搞定。