线性RAM地址非线性映射转换充分应用RAM地址空间TFT液晶驱动

800*600 的TFT液晶

800*600  这个线性地址的话要10+10=20位地址了,即10位行地址,10位列地址,1M大的SRAM。

实际800*600,需要的多少空间呢? 800*600=480000字节=468.75K。

依照上面的思路,能不能转换成512K,即把原来的20位地址转换成19位地址呢。

Xs[9:0]    799 =   11,0001,1111 

Ys[9:0]     599 =  10,0101,0111

转后后的19位地址为Xd,Yd。

(I).X9位Y10位   看上面的数据,Xs 按最高位是0是1来判辨 ,然后数据在进行拼接,Xs[9] = 1 or 0 ?  这个不行,地址有重复。

(II).X10位Y9位  再来看看Ys     Ys 按最高位是0是1来判辨 ,然后数据在进行拼接, Ys[9] = 0 ,Yd[8:0]=Ys[8:0],Xs;

然后Ys[9]=1,我们来拼接下试试: Ys[6:0],Xs[9:8] , ? , Xs[7:0]  。?是个2位, 看来还是有地址重复 。不行,继续搞。

 Ys[9]=0 ,   {Xd,Yd}  =  {Xs[9:0],Ys[8:0]};

 Ys[9]=1,    {Xd,Yd}  =  {    {2'b11,Xs[9:2]}  ,  {X[1:0],Y[6:0]} } ;   看前面一组数据Xd[9:0] = {2'b11,Xs[9:2]} 地址空间指向 768-967,有地址重复,在加个地址+32,就是800-999。在简单处理下Xs[9:2] + 32 = Xs[9:2] + 6'b10,0000; 即Xs[9:7]+3'b001;

整理下,Ys[9]=1,    {Xd,Yd} = {    {2'b11,{Xs[9:7]+3'b001} ,Xs[6:2]}  ,   {X[1:0],Y[6:0]}  } ;  

最后 assign {Xd,Yd} = Ys[9]? {    {2'b11,{Xs[9:7]+3'b001} ,Xs[6:2]}  ,   {X[1:0],Y[6:0]}  } : {Xs[9:0],Ys[8:0]};

It's so easy for FPGA ...

结果是出来了,可以了,就是除了一个判断Y[9]外,还要进行一个3位加法,还有什么办法仅仅进行拼接等简单的逻辑操作就能实现?

原文地址:https://www.cnblogs.com/linkfeel/p/3049539.html