C语言二维数组映射到显示器的原理分析以及实现实例
学习内容
本课将 在上一课的基础上 修改一下 AXI_LITE_SLAVE外设,不再使用寄存
器而直接对 VGA显存里的数据进行进行写操作,达到以数组索引方式对显示画
面进行更新 的效果。
实现步骤
1 二维数组映射原理分析
如上图640480 显示器对应一个 640480 的二维数组,每个像素点是每一个数
组元素,实现对数组的操作实际就是直接对像素点的读写操作。
二维数组在物理空间的存放实际是以一维数组的方式实现的,例如下图:
对于640列, 480行 的二维数组,在 C 程序中访问下标为 [y][x]元素时,实际
访问地址为 基地址 +(640*x+y)。
实际通过地址对VGA 显存空间操作的代码可见工程提供的源码:片段代码 .txt 中:
2 本课通过对 27课工程进行修改
Step1 打开工程,编辑已有 IP。
由于需要实现直接地址索引的方式,且需要使用
PS 进行读和写,需要加入一个双口的 Block Ram。新建 Block Design ,加入 Block Ram IP ,由于需要读和写,则设置为 True Dual Port RAM
将Port A 和 Port B Options字节宽度设为 12bit,深度设为 307200,引出引脚,
生成 HDL 顶层文件,如下:
在vga_drv.v 中例化刚刚生成的模块:
修改vga_drv 的模块接口和多余输出位置 0
修改AXI 接口文件中对 vga 驱动模块的例化:
修改顶层文件中的地址宽度
尝试编译一下证明无误后,修改版本号退出IP 编辑。
Step2 在 vivado 工程中加入新的 IP ,综合实现,生成 bitstream,导出硬件到 SDK。
Step3 在 SDK里做对应的 代码 修 改,分别使用二维和一维数组的思路来进行显 示:
复制提供工程中的代码,并进行分析:
1 分析主程序 helloworld.c,对二维数组的元素进行操作
对一维数组形式进行操作:
在VGA.c 中:
使用两种显示方式进行测试:
读取显示数据,并进行检验测试:
Step4 找到 design_1_wrapper.bit vga_test.elf ZYNQ_FSBL.elf 生成 BOOT.bin。
至此BOOT.bin 生成,复制到 SD 卡,即可查看效果。