15762|36

35

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

【Altera SOC体验之旅】(一)VGA的图片显示 [复制链接]

 
本帖最后由 Jackzhang1992 于 2015-4-17 15:14 编辑

(一)VGA的图片显示
一、目标
       经过三个月来的对DE1-SOC基本操作的学习,现在开始慢慢进行收尾,结合以前所学的FPGA知识和基础,我准备在DE1-SOC上实现一个具有PS2键盘和VGA显示器进行I/O操作的计算机系统,具体功能是一个俄罗斯方块游戏。分为四个阶段:VGA显示,键盘与字符显示,键盘的移动。本篇实现第一步:VGA的图片显示。VGA是常用的计算机显示器之一,操作时序也不复杂,可是如何实现VGA的图片显示对于没有做过的人来说也完全没有概念,参考《计算机原理与设计—VerilogHDL》一书以及网上资料,我慢慢开始学习VGA显示,并最终实现了VGA的图片显示。

二、VGA时序
       VGA接口信号HS(1bit),VS(1 bit), R(8bit), G(8bit), B(1bit)。VGA显示器常用的分辨率为640x480,即操作的时候FPGA想办法向VGA显示器输出640行480列个点位数据(共307200个数据)。那具体是如何操作的呢?
基本操作流程:VS叫场扫描信号或者帧扫描信号,首先VS发一个负脉冲,告诉显示器我要开始发送一副图片了,你准备接收。然后,HS行扫描信号,发一个负脉冲,告诉显示器我要开始发送第一行数据了,准备接受。跟在HS负脉冲信号后,接着就每个一个时钟周期发送一组R,G,B点位的数据,一直发送640组。接下来HS再发一个负脉冲,告诉显示器我要开始发送第二行数据了,准备接收,然后发送第2行的640组R,G,B数据,以此类推,第3行,第4行。一直发送到第480行结束后,所有307200个数据就发送完全了。然后VS信号再发一个负脉冲,发第二幅图片的信息。以此类推。

具体时序数据:下图就对应了具体行扫描和场扫描阶段每个操作具体所需要的周期数。一目了然。注意HS,VS负脉冲后要等待几个周期才正式发送数据这是为了满足VGA的器件要求而定的。下图给了周期数,然后计算VGA的时钟频率。一般VGA显示器的刷新频率为60帧/s,每一秒显示60幅图片,即一帧数据需要1/60s发送。由下图可知,完整发送一帧数据(一副图片)需要800*525=420000个周期。则VGA时钟频率为420000/(1/60)=25.2MHZ。近似等于25MHZ。开发板上的主频时钟为50MHZ,所以只要二分频就OK啦。





三、RTL code
`timescale 1ns/1ns
module vga_c(
input clk,                                    // 系统时钟50MHZ
input clrn,                                  //复位信号
input [23:0]datain,                       //输入R,G,B数据24bit
output rdn,                                 //读使能信号,低电平有效。
output [18:0]rd_a,                       //读地址,read_address={row(9),col(10bit)}
output reg[9:0]h_count=10'd0      //列计数器 0-799
output reg[9:0]v_count=10'd0,     //行计数器  0-524
output reg vga_clk=1'b0           //vga时钟 25MHZ  

//VGA接口信号
output hs,                                        //行扫描信号
output vs,                                          //场扫描信号
output [7:0]r,g,b                          //R,G,B输出信号
);

//refreshrate=25*10^6/((96+48+640+16)*(480+2+33+10))=59.5=60

//1.VGA时钟生成,vga_clk:25MHZ   
always @( negedge clrn or posedge clk  )
vga_clk<=(!clrn)?1'b0: ~vga_clk;

//2.计数器v_count(0-524) and h_count(0-799)
always @( negedge clrn or posedge vga_clk  )
     if(!clrn) begin v_count<=10'd0;h_count<=10'd0;end
         else if(v_count==10'd524)
          v_count<=10'd0;
         else
         begin
         if(h_count==10'd799)
                begin h_count<=10'd0;      v_count<=v_count+1'b1;end
         else
                h_count<=h_count+1'b1;   
     end


// 3.锁存输入数据data_inrdn=0时,外部有存储器有40ns的时间提供datain数据。
regvideo_out=1'b0;
reg [23:0]data_reg=24'd0;

always @(negedge clrn or posedge vga_clk)
              if(!clrn)
                            beginvideo_out<=1'b0;data_reg<=24'd0;end
              else
                            beginvideo_out<=~rdn; data_reg<=datain;end


//4.接口信号生成   
assign hs=(h_count>=96);               //HS波形输出
assign vs=(v_count>=2);               //VS波形输出
wire [9:0]rol=v_count-10'd35;        //计算行地址
wire [9:0]col =h_count-10'd143;     //计算列地址
assign rd_a={rol[8:0],col[9:0]};    //行列地址拼接成一个rd_a
assign rdn=~(((h_count>=10'd143)&&(h_count<10'd783))&&((v_count>=10'd35)&&(v_count<10'd515)));                                            //只有在有效的数据位rdn才置0
assign r=(video_out)?data_reg[23:16]:8'd0;
assign g=(video_out)?data_reg[15:8]:8'd0;
assign b=(video_out)?data_reg[7:0]:8'd0;

endmodule

这份代码核心思想是生成两个计数器h_count和v_count,作为绝对参考基准。
然后根据具体h_count和v_count的值生成端口信号(组合逻辑),因此没有太多的时序逻辑。结构简单,功能明确。


四、图片的存储 mif文件生成
首先在网上找一副640x480的彩色图片。
然后打开matlab,file—>importdata,导入数据。


接着运行如下代码,生成mif文件。为了存储不超过FPGA片内存储器极限,matlab代码中R,G,B8位数据只取了其中高3位,使每个点位的r, gb数据总共占9位。即每幅图片占用640*480*9=2764800,小于FPGA内部最大的memorybit数目。


fh=fopen('jackVGA.mif','w+');   %打开建立文件
fprintf(fh,'\t WIDTH=9;\r\n');
fprintf(fh,'\t DEPTH=307200;\r\n\n');
fprintf(fh,'\tADDRESS_RADIX=UNS;\r\n');
fprintf(fh,'\tDATA_RADIX=UNS;\r\n\n');
fprintf(fh,'\t CONTENT BEGIN \r\n');
for i=1:480
   for j=1:640
jackfilter(i,j,1)=bitand(jack(i,j,1),240); %i,j)位数据的R通道数据&0xf0,取
jackfilter(i,j,2)=bitand(jack(i,j,2),240);
jackfilter(i,j,3)=bitand(jack(i,j,3),240);
   end
end



for i=1:480
   for j=1:640

tempR=bitshift(uint32(jack(i,j,1)),-5); %i,j)数据的R通道右移5
tempG=bitshift(uint32(jack(i,j,2)),-5);%i,j)数据的G通道右移5
tempB=bitshift(uint32(jack(i,j,3)),-5);%i,j)数据的B通道右移5
tempR=bitshift(tempR,6); %R通道左移6
tempG=bitshift(tempG,3);%G通道左移3
data=bitor(bitor(tempR,tempG),tempB);%将三个3位数据拼接成一个9位数据

fprintf(fh,'\t %d :%d;\r\n',(i-1)*640+j-1,data); %打印数据,换行
   end
end
fprintf(fh,'\t END; \r\n'); %打印结束符号END,换行

fclose(fh);     %关闭


最后在verilog顶层模块建立一个ROM,相应端口信号链接起来即可。


//=======================================================
// 顶层模块连线
//=======================================================

wire[8:0]q;
rom2     rom_inst (
       .address( address ),
       .clock( CLOCK_50 ),
       .rden( ~rdn ),
       .q ( q )
       );


assign VGA_BLANK_N=~rdn;
wire[23:0]datain={q[8:6],5'd0,q[5:3],5'd0,q[2:0],5'd0};
wire[18:0]rd_a;
wire[18:0]address=(rd_a[18:10]*640)+rd_a[9:0];
wire rdn;
wire vga_clk;
assign VGA_CLK=vga_clk;
vga_c u0(
.clk(CLOCK_50),//50MHZ
.clrn(KEY[0]),
.datain(datain),
.h_count(),
.v_count(),
.vga_clk(vga_clk),
.rdn(rdn), //read enable"0"active
.rd_a(rd_a),//read_address={row(9),col(10bit)}
.hs(VGA_HS),
.vs(VGA_VS),
.r(VGA_R),
.g(VGA_G),
.b(VGA_B));


五、效果






此帖出自FPGA/CPLD论坛

最新回复

可以提供一下源代码吗,楼主  详情 回复 发表于 2020-12-22 16:15
点赞 关注(2)
 

回复
举报

1950

帖子

4

TA的资源

版主

推荐
 
楼主算上进的可以了,赞!

两点建议:
1. vga_clk<=(!clrn)?1'b0: ~vga_clk;
   --vga_clk请用 PLL 来生成

2.  assign hs=(h_count>=96);
   -- 所有输出请用寄存器
此帖出自FPGA/CPLD论坛
个人签名MicroPython中文社区https://micropython.org.cn/forum/  
 
 

回复

2144

帖子

3

TA的资源

五彩晶圆(中级)

沙发
 
楼主继续加油
把图放到linux文件系统中,搞起来。。
此帖出自FPGA/CPLD论坛
个人签名电工
 
 
 

回复

5979

帖子

8

TA的资源

版主

板凳
 
支持!
此帖出自FPGA/CPLD论坛
个人签名生活就是油盐酱醋再加一点糖,快活就是一天到晚乐呵呵的忙
===================================
做一个简单的人,踏实而务实,不沉溺幻想,不庸人自扰
 
 
 

回复

1025

帖子

1

TA的资源

纯净的硅(高级)

4
 
哈哈,能自己摸索出来,非常不错,点赞

另外,撸主的俄罗斯方块打算在SOC上裸跑实现?还是基于OS来做?

如果是裸跑的话,我很是期待哦
此帖出自FPGA/CPLD论坛

点评

俄罗斯方块是在SOC上裸跑的,用汇编来编写的  详情 回复 发表于 2017-2-3 19:25
 
 
 

回复

1891

帖子

2

TA的资源

纯净的硅(中级)

5
 
有点厉害
此帖出自FPGA/CPLD论坛
个人签名
分享铸就美好未来。。。




 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

6
 
能麻烦楼主提供一下源码供我研究一下吗?245128018@qq.com谢谢楼主
此帖出自FPGA/CPLD论坛
 
 
 

回复

4

帖子

0

TA的资源

一粒金砂(初级)

7
 
matlab程序有问题呐
此帖出自FPGA/CPLD论坛
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

8
 
楼主好厉害,我现在要做一个摄像头采集然后进行图像处理的任务,完成这个目标后会再进行VGA显示,现在是一旦头绪也没有
此帖出自FPGA/CPLD论坛
 
 
 

回复

38

帖子

1

TA的资源

一粒金砂(中级)

9
 
此帖出自FPGA/CPLD论坛
 
 
 

回复

4

帖子

0

TA的资源

一粒金砂(初级)

10
 
浅风敲竹 发表于 2016-2-1 18:16
楼主好厉害,我现在要做一个摄像头采集然后进行图像处理的任务,完成这个目标后会再进行 ...

我也在做这个实验,参考的黑金DEMO
此帖出自FPGA/CPLD论坛
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

11
 
martinwang44 发表于 2016-3-14 20:51
我也在做这个实验,参考的黑金DEMO

恩,我也有参考的demo,现在遇到的问题是时序要求不满足,主要是OV7670的pclk像素时钟有问题,但我真心不知道咋改,一头雾水啊哭死了
此帖出自FPGA/CPLD论坛
 
 
 

回复

14

帖子

0

TA的资源

一粒金砂(初级)

12
 
浅风敲竹 发表于 2016-2-1 18:16
楼主好厉害,我现在要做一个摄像头采集然后进行图像处理的任务,完成这个目标后会再进行 ...

我是后辈,请问你有什么收获或者头绪了吗,不妨传授给我!
此帖出自FPGA/CPLD论坛
 
 
 

回复

14

帖子

0

TA的资源

一粒金砂(初级)

13
 
martinwang44 发表于 2016-3-14 20:51
我也在做这个实验,参考的黑金DEMO

做出来了吗,看了黑金的自己也不会移植
此帖出自FPGA/CPLD论坛
 
 
 

回复

14

帖子

0

TA的资源

一粒金砂(初级)

14
 

能麻烦楼主提供一下源码供我研究一下吗?381060236@qq.com谢谢楼主
此帖出自FPGA/CPLD论坛
 
 
 

回复

4

帖子

0

TA的资源

一粒金砂(初级)

16
 
5525 发表于 2016-6-19 21:30
楼主算上进的可以了,赞!

两点建议:
1. vga_clk

专业大神 加个好友以后有问题可以交流
此帖出自FPGA/CPLD论坛

点评

有事情发贴吧,这样大家都能看到, 这样 1 不会耽误你的时间 2 你还能吸取多方意见  详情 回复 发表于 2016-6-20 11:35
 
 
 

回复

1950

帖子

4

TA的资源

版主

17
 
849398998 发表于 2016-6-20 10:39
专业大神 加个好友以后有问题可以交流

有事情发贴吧,这样大家都能看到,
这样
1 不会耽误你的时间
2 你还能吸取多方意见
此帖出自FPGA/CPLD论坛
个人签名MicroPython中文社区https://micropython.org.cn/forum/  
 
 
 

回复

4

帖子

0

TA的资源

一粒金砂(初级)

18
 
5525 发表于 2016-6-20 11:35
有事情发贴吧,这样大家都能看到,
这样
1 不会耽误你的时间
2 你还能吸取多方意见

好的  这个可以有  
此帖出自FPGA/CPLD论坛
 
 
 

回复

5

帖子

0

TA的资源

一粒金砂(中级)

19
 
matlab运行出错,是不是因为里面有新建的库函数??
此帖出自FPGA/CPLD论坛

点评

没有内建新的库函数呢。都是用matlab的自带库  详情 回复 发表于 2017-2-3 19:24
 
 
 

回复

35

帖子

0

TA的资源

一粒金砂(中级)

20
 
chare杰 发表于 2016-8-20 15:26
matlab运行出错,是不是因为里面有新建的库函数??

没有内建新的库函数呢。都是用matlab的自带库
此帖出自FPGA/CPLD论坛

点评

恩,谢谢回答,上千吧????  详情 回复 发表于 2017-2-4 12:18
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表