在上一篇的缩放实验中出现了一个问题,一直没有解决,今天调试了一下找到了问题所在,今天记录一下。上一篇帖子的记录:
上次调试未解决的问题:缩放后的图片分成了四部分:
初步判断是两行参考像素生成一行缩放后像素的缩放过程出问题,这部分在上一篇的“2.2.1 缩放模块”有详细描述,这个缩放是由其他缩放比改到缩放比为2:1的缩放,改成2:1时没有降原来的缩放比改掉。lcd_2scale1.v中REF_LINE_LENTH为上一个缩放的值,下图是更改代码后的情况,之前没有定义常量REF_LINE_LENTH。改代码之前59行代码是“if(wr_cnt == 3 - 1)begin”由上一篇帖子的“2.2.1 缩放模块”可知应该为“if(wr_cnt == 2 - 1)begin”图片的REF_LINE_LENTH值为2,因为缩放比为2:1即两行参考像素生成1行缩放后的数据。
第一次调试结果:图片分成更多块了。看似越调越差,实则胜利就在眼前。
刚开始看到这个现象也是有点懵,但是仔细观察一下发现有三棵草(一张图片可能在帧图像上显示了三次),而且图片并没有显示全(可能是半张图片重复显示,也可能是三分之一张图片)。一想到这里第一印象是数据源的图片尺寸是否正确,查看了一下sd_read_photo.v中的图片地址,确认了是800*480的图片没错。之后就接着往下查问题,图片从SD卡读出后存到DDR中,存进DDR之前还有一个确定DDR读写的起始地址大小的计算,sd_ddr_size.v文件中根据目标屏幕计算存到DDR中起始地址的大小,该部分根据lcd_id计算,800*480的源图片进过2:1的缩放在480*272的屏幕显示,所以这里使用的屏幕尺寸是480*272,所以sd_ddr_size.v根据这个lcd_id计算出的起始地址的大小是480*272图片的大小,而实际上DDR要存的是800*480的图片,也就是说DDR存800*480的图片,分配的地址大小只够存480*272图片的大小,所以这里去掉sd_ddr_size.v文件直接对ddr_max_addr(DDR存储地址大小),sd_sec_num(SD卡扇区地址)两个变量直接赋值。
修改后进行验证:问题完美解决。因为800*480图片经过2:1的缩放后不能填满整个480*272的屏幕,所以需要进行裁剪,屏幕多余的部分用白色填充。
调试的视屏:
scale
最后附上源码: