FPGA学习总结2(VGA rom的设置)

℡╲_俬逩灬. 提交于 2020-02-29 01:59:11
  1. 存储行列颠倒

第一个总结来自博文
当需要显示大小规格如下图所示高为32bit 宽为224bit的字符时
一般可以设置存储字符数据的rom的尺寸大小为位宽32,深度224
图片1
rom的尺寸如下图所示
在这里插入图片描述
由于这些字符的像素数据是通过取字模的方式得到的,而且有按列扫描,存储从高位到低位的特质
如上图所示,字符的第一列共32位,存在存储器的地址位addr0的地方,第二列存在addr1的地方。所以深度为224.当从存储器中取数的时候,扫描屏幕的一行,对应存储器中一列(第一行的像素数据对应着每一个rom_data的最高位)如上图中剪头所示,例如:显示字符的第一行,访问的存储器依次为:addr0,rom_data[31];addr1,rom_data[31];addr2,rom_data[31];…;addr223,rom_data[31];
因此,这个功能实现的时候,显示控制模块如果设置M计显示的行数(注意,这个行数不是总的行数计数,也不是有效显示行数的计数,而是跟显示图片尺寸大小的高有关的计数),N计显示的列数。那么在扫描某一行时,M应该指向rom_data中的某一位,N则随着其值的变化指向各列对应的Addr。 对于第二行,M=rom_data[30],第二行的第三个像素,N指向Addr2。

  1. 存储行列没有颠倒
    如果需要存储16x16x1bit的图像,且这样的图像有6幅,那么总共需要的rom的尺寸为16x16x9=16x96.设置rom的尺寸为位宽16,深度96.注意这里与前面不同的是,这里的位宽是一行像素需要的位数,而上面的例子中的位宽则设置的是一列像素需要的位数。并且这个rom也是按照从高位到低位进行存储的,一行的第一个像素数据存在rom_data[15],最后一个存在rom_data[0];因此,在这个例子中,如果设M计显示图的行数,N计显示图的列数,那么在扫描第一幅图的某一行时,M应该指向addr0至addr15中的某一个地址,N则随着其值的变化指向这个地址上的rom_data中的不同位。
    然后就是这个6幅图像要怎么区分开:因为每一幅图像的大小都一样,但里面的数据却不一样,像素数据全部放在一个rom里面,所以要区分这6幅画的显示,就要把rom的addr分成6份。第一幅图的addr为addr0—addr15 第二幅图为addr16—31 以此类推。那么又该如何判断显示每一幅图像的时机呢?首先,要在同步模块中设置一个参数A,每当一帧图像扫描完成,就令这个参数A为1;接下来,将这个参数A传递到显示控制模块中,同时设置一个参数B。每当这个参数A被检测为1,就令参数B加1,参数B的数值范围可以根据你想让一幅图像显示多少帧(X)来确定;然后就是要在显示控制模块设置一个地址判断功能的语句,每来一个CLK就判断一次是否参数A为1,如果为1,就转入下一帧的判断代码中(i+1)。如果不为1,那就让参数raddr为这幅图的起始地址。不用担心每一个CLK都让raddr都为起始地址就寻址不到这幅图的对应行了,寻址行的参数是addr,不是raddr,可以让addr=raddr+m来实现功能。
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!