用数据说话,逐步推理,一招把洗碗机打散架!
1、VGA 640*480 60hz 模式下,每个像素点的扫描时间为 0.039683 us。这个数据是有资料可查的,也是可以计算出来的。
2、如果你打算做每行300点,那么每个显示分辨点的扫描时间最起码要做到 0.084657 us以下。当然,如果你只是做固定图像(每个点的状态预先知道),用最傻的方法是可以做出来的。前提是芯片的指令周期要<0.084657 us。
3、但是,如果要做的是动态图像,由于每个点的状态预先不知道,那么为了提高显示扫描速度,建立显示缓冲区是必然选择(因为只有这样才能在送显时提高速度)。假设你用显示缓冲区的每一位代表一个点,那么在做显示时,每个点必须先判断显缓区的值,并决定IO口的状态。每个点的显示,需要3条指令(其中一条是判断分支指令,另外两条分别置位和清零)实现一个点的显示。也就是说,这3条指令需要在0.084657 us之内完成,即每条指令执行时间要<=0.028219us。
4、既然水平方向准备做300点,那么垂直方向总不能太少吧?就算你做200点如何?那么一共有200*300=60000的点 ,再去除以8,为7500个字节。也就是说,如果你打算全屏缓存的话,你得准备7500个字节RAM做缓冲区。并且这些RAM必须是全部可以位寻址的,不能用间接寻址,也不能切换页,更不能外挂RAM(因为任何附加的动作都需要指令来完成,都会降低访问速度)。
5、这么大的RAM区肯定难找,那么我们可以变通一下,不要做全屏缓存,而是做单行缓存(匠人目前就是这么做的)。也就是说,每当一行扫描完成后,利用空白显示以及消隐期间的时间去刷新下一行的显示数据,这么一来,只需要缓存300个点,即38个字节。但是问题是,要在行与行的间隔时间里,完成这300个缓存位的设置,需要多少时间?(提示一下,每行的扫描时间,总共只有31.75us,刨去显示区的扫描时间后只剩下6.34928us,你需要在这个时间内准备好下一行的数据)。
说到这里,洗碗机还有信心接招吗?呵呵,欧耶! |