FPGA实现24位彩图VGA显示

大致流程:通过MATLAB提取图像RGB数据分别存入三个.mif文件。然后通过quartus调3个ip核 ROM,分别存三个.mif文件数据。最后通过VGA协议显示出来。
首先讲解MATLAB如何读取图片:
A=imread('C:\Users\Administrator\Desktop\flower.bmp')%读取图像,通过画图工具修改合适分辨率和格式
fide=fopen('rgb.mif','wt');%按文本写打开,没有自动创建
for i=1:222                         %按  地址:数据; 格式存数据到.MIF文件中(295×222分辨率)
for j=1:295
z2(i,j)=(i+443)*295+j;
end
end
for i=1:222
for j=1:295
fprintf(fide,'%x\t:\t%x;\n',z2(i,j),A(i,j,3)); %按  地址:数据; 格式存数据到.MIF文件中
end
end
[r c d]=size(A);%r和c为分辨率d表示维度(3维:R,G,B)
red =A;
red(:,:,1)=A(:,:,1);%获取红色分量
red(:,:,2)=zeros(r,c);
red(:,:,3)=zeros(r,c);
red=uint8(red);
subplot(1,4,1)
imshow(red)
fide=fopen('Red.mif','wt');
for i=1:222
for j=1:295
z(i,j)=(i-1)*295+j;
end
end
for i=1:222
for j=1:295
fprintf(fide,'%x\t:\t%x;\n',z(i,j),red(i,j,1));%将红色分量存入 'Red.mif'文件中
end
end
fprintf(fide,'end;');
green=A;
green(:,:,1)=zeros(r,c);
green(:,:,2)=A(:,:,2);% 获取绿色分量
green(:,:,3)=zeros(r,c);
green=uint8(green);
subplot(1,4,2)
imshow(green)
fide=fopen('Green.mif','wt');
for i=1:222
for j=1:295
fprintf(fide,'%x\t:\t%x;\n',z(i,j),green(i,j,2)); %将绿色分量存入 'Red.mif'文件中
end
end
fprintf(fide,'end;');
blue=A
blue(:,:,1)=zeros(r,c);
blue(:,:,2)=zeros(r,c);
blue(:,:,3)=A(:,:,3); % 获取蓝色分量
blue=uint8(blue);
subplot(1,4,3)
imshow(blue)
fide=fopen('Blue.mif','wt');
for i=1:222
for j=1:295
fprintf(fide,'%x\t:\t%x;\n',z(i,j),blue(i,j,3)); %将蓝色分量存入 'Red.mif'文件中
end
end
fprintf(fide,'end;');
fclose(fide);
RGB图像显示:
FPGA实现24位彩图VGA显示
图1
接下来打开QUARTUS软件,调ROM 初始化三分量的.mif文件。modesim调试ROM
FPGA实现24位彩图VGA显示
图2
可以看到数据总是会比地址数据慢一拍出来,原因是初始化rom时在输出与了下CLK时钟。这会使3个ROM输出数据更加稳定。
调试ok后加入VGA显示控制。
FPGA实现24位彩图VGA显示
图3
  咱们可以看到start_flag信号,它的作用:由于图片显示的分辨率是295*222的,比较小,所以在VGA800*600分辨率只占据一部分位置。故需要设置好开始显示的位置范围。当VGA从左上角逐行扫描到右下角时,一旦达到预先设置好的显示范围则start_flag由0-》1,而前面的ROM模块收到start为1信号后地址随VGA时钟上升沿累加,对应的ROM地址内数据输出到VGA控制模块,平时( start_flag=0)vga_r/g/b端口输出为0, start_flag=1时正常输出数据。
这边贴出本次用的DE2-115的VGA显示硬件电路
FPGA实现24位彩图VGA显示
图4
输出RGB各为8位。

最后给出板级调试(signal tap2的波形)
FPGA实现24位彩图VGA显示
图5
可以看到数据比地址完了两个时钟周期,这是因为初始化ROM中的时钟在前后各打了一拍。
FPGA实现24位彩图VGA显示
图6

最后给出实际在显示器上的结果图: FPGA实现24位彩图VGA显示

实验感悟:
实验中少不了各种奇葩小问题的出现,其中就有一个,浪费了半天的时间:当将 vga_r/g/b端口全置为0时,按照正常RGB混合原理应该是黑色,但是我的显示器却显示墨绿色,我通过网上在线配色工具发现它是在R和B分量为0而G置于0~255之间的一个量,然后我modelsim仿真和板级调试都显示我没有将该G分量所处的管脚拉高的情况,后面发现是显示器的问题,换了一台就好了,这个结果让我很崩溃,因为中途我也是换过一次,可能是心急没有发现问题,后面又换了一次才发现问题的。所以,这告诉我们,遇到问题要冷静分析,科研也必将是在一个个BUG中走出来的一条康庄大道。希望以后能在这方面的问题上有所觉悟和提升能力。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值