三.图像显示、缩放、移动
1.调用PLL(phase locked loop)
同上一篇讲的讲用ROM ip核类似,直接搜索pll即可,懂点英文调用很简单,这里不再具体阐述。
2.行扫描与场扫描
第一篇里的VGA原理中,我们知道由于视觉暂留效应,并避免前一次图像的的余辉影响下一个图像,所以每行、每场的像素显示必须有消隐的过程。
行扫描:
always@(posedge iclk or posedge irst)
if(irst)
begin
h_cont<=0;
ovga_hs<=1;
end
else
begin
if(h_cont<H_TOTAL)
h_cont<=h_cont+1'b1;
else
h_cont<=0;
if(h_cont<=H_TA-1)
ovga_hs<=1'b0;
else
ovga_hs<=1'b1;
end
场扫描:(注意到ovga_hs源自行扫描)
always@(posedge ovga_hs or posedge irst)
begin
if(irst)
begin
v_cont<=0;
ovga_vs<=1;
end
else
begin
if(v_cont<V_TOTAL)
v_cont<=v_cont+1'b1;
else
v_cont<=0;
if(v_cont<=V_TA-1)
ovga_vs<=1'b0;
else
ovga_vs<=1'b1;
end
end
3 .图像缩放
截取的部分代码中,amplify_rate是放大倍数,shrink_rate是缩小倍数,h_cont是行计数,v_cont是列计数,也就是说如果amplify_rate=2,则相当于图像的长度(变量:LENGTH)扩展为原来的两倍,而对LENGTH采取除的操作,即除以shrink_rate则相当于将图像的长度缩短;同理对图像的宽度的操作也是如此。
if((!per)&&h_cont<(xpos+H_TA+H_TB+H_TC+(LENGTH*amplify_rate)/shrink_rate) && (h_cont>=xpos+H_TA+H_TB+H_TC) && v_cont<(ypos+V_TA+V_TB+V_TC+(WIDTH*amplify_rate)/shrink_rate)&&(v_cont>=ypos+V_TA+V_TB+V_TC))
4.图像移动
改变读取第一个地址像素值的位置, 即通过控制xpos、ypos来改变首地址读取位置
if((!per)&&h_cont<(xpos+H_TA+H_TB+H_TC+(LENGTH*amplify_rate)/shrink_rate) && (h_cont>=xpos+H_TA+H_TB+H_TC) && v_cont<(ypos+V_TA+V_TB+V_TC+(WIDTH*amplify_rate)/shrink_rate)&&(v_cont>=ypos+V_TA+V_TB+V_TC))
后面还实现了图像的旋转。整个工程文件在下:
https://download.youkuaiyun.com/download/wxkhturfun/12111123