<?xml version="1.0" encoding="gbk"?> <rss version="2.0"><channel> <title>定阅帖子更新</title> <link>http://www.broadkey.com.cn/XML.ASP</link><description>TEAM Board - 意得法电子</description> <copyright>TEAM 2.0.5 Release</copyright><generator>TEAM Board by TEAM5.Cn Studio</generator> <ttl>30</ttl><item><link>http://www.broadkey.com.cn/Thread.asp?tid=166 </link><title>使用&amp;nbsp;FPGA&amp;nbsp;控制&amp;nbsp;VGA&amp;nbsp;显示</title><author>lily</author><pubDate>2009-12-01 8:59:47</pubDate><description><![CDATA[&nbsp;<a style="color: blue; font-weight: normal; text-decoration: none" href="/news/listbylabel/label/显示">显示</a>器因为其输出信息量大，输出形式多样等特点已经成为现在大多数设计的常用输出设备。在&nbsp; <a style="color: blue; font-weight: normal; text-decoration: none" href="/news/listbylabel/label/FPGA">FPGA</a>&nbsp; 的设计中可以使用很少的资源，就产生&nbsp; <a style="color: blue; font-weight: normal; text-decoration: none" href="/news/listbylabel/label/VGA">VGA</a> 各种控制信号。这个示例在 RHicSP2200B&nbsp; FPGA&nbsp; 开发板/学习板上使用&nbsp; VGA&nbsp; 接口在显示器上显示了文字以及简单的图形，可以作为VGA 显示设计的参考，如果在使用这个例子的过程中有任何问题都可以通过邮件&nbsp; <img alt="" src="http://editerupload.eaw.com.cn/200906/edb48c3ac26556db111d2410b155265a.jpg" width="284" height="186" /><br />
&nbsp;<br />
说明：有效时间包括&nbsp; 6&nbsp; 列过扫描边界列，有些时序表将这几列加在后沿和前沿中<br />
表 2&nbsp; 垂直时序
<p><img alt="" src="http://editerupload.eaw.com.cn/200906/81fd91a504e257106cd7c5c9b56d88b6.jpg" width="269" height="187" /><br />
说明：有效时间包括&nbsp; 4&nbsp; 行过扫描边界行，有些时序表中将这几行加在后沿和前沿中。</p>
<p>*当有效时间增加时，它超过了 vsync 信号的上升沿，因此前沿为－1</p>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在实际设计中如何通过不同的系统频率确定适当的显示模式 ？ 例如在 RhicSP2200&nbsp; 开发板中FPGA&nbsp; 的系统时钟频率为&nbsp; 50MHz。这个时钟频率可以用来设计 显示&nbsp; 800X600&nbsp; 模式，为了显示器显示效果好，采用场频（刷新频率）75Hz，那么帧长可以确定为&nbsp; 666，而行总长设计为&nbsp; 1000&nbsp; 像素。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 根据以上所述，我们可以设计如Examples1类似HDL代码，使用这段代码在Valid 有效期间对RGB 中 Blue 两位赋值1，得到一个蓝色屏幕显示边界如图1 所示。</p>
<p><img alt="" src="http://editerupload.eaw.com.cn/200906/45788c867b169d675bdb47e842cbcf81.jpg" width="247" height="208" /></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 色彩原理</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RGB&nbsp; 色彩模式是工业界的一种颜色标准，是通过对红(R)、绿(G)、蓝(B)三个颜色 通道的变化以及它们相互之间的叠加来得到各式各样的颜色的，RGB&nbsp; 即是代表红、 绿、蓝三个通道的颜色，通过三种基本颜色亮度值从 0~255 不同产生出其他各种颜色，这种模式叫加色模式。为什么叫加色模式呢，举个例子，通常使用的电视屏幕和电脑 屏幕上的显示就是这样的模式，在没有图象时，屏幕是黑的，若R，G，B 三色亮度都为255&nbsp; 时混合叠加打在屏幕上时则显示成白色。就是加起来是白色的意思，叫加色模式。这个标准几乎包括了人类视力所能感知的所有颜色，是目前运用最广的颜色系统之 一。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 而与我们电脑相关的地方，就是目前的显示器大都是采用了 RGB 颜色标准，这就是为什么它对我们来说这么重要了。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在显示器上，是通过电子枪打在屏幕的红、绿、蓝三色发光极上来产生色彩的，目前的电脑一般都能显示&nbsp; 32&nbsp; 位颜色，约有一百万种以上的颜色。如果说它所显示的颜色 还不能完全吻合自然界中的某种色彩的话，那已经几乎是我们肉眼所不能分辩出来的了。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 而&nbsp; RhicSP2200&nbsp; 开发板系统中每一个色 彩都是使 用&nbsp;&nbsp; 2bit&nbsp;&nbsp; 来 表示的，因 此可见 RhicSP2200&nbsp; 系统可以出现64&nbsp; 种不同的颜 色。其他色彩的使用请在实际工作中更多的加以体会。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 显示</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 通过以上的讲述，已经可以在计算机显示器上显示一个有颜色的区域了，在这个小节中我们再举一个简单的例子，在显示器中显示两个镶嵌的正方形，字符等显示与其类似，可以参考瑞芯科技其他设计示例。 例如我们可以在 xpos 与 ypos 的某一区间给 RGB 信号赋不同的值将得到如图2 所示的显示效果。</p>
<p><img alt="" src="http://editerupload.eaw.com.cn/200906/d0908f6def405c68ab4d4890d75a30d4.jpg" width="246" height="207" /></p>
<p>例子&nbsp; 1：使用&nbsp; 50MHz&nbsp; 时钟频率产生的 VGA 同步脉冲以及视频有效信号</p>
<p>module sync_gen_50m( <br />
&nbsp;&nbsp;&nbsp; rst_n,// synthesis attribute clock_buffer of rst_n is ibufg; <br />
&nbsp;&nbsp;&nbsp; clk, <br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; hsync, <br />
&nbsp;&nbsp;&nbsp; vsync, <br />
&nbsp;&nbsp;&nbsp; valid, <br />
&nbsp;&nbsp;&nbsp; x_cnt, <br />
&nbsp;&nbsp;&nbsp; y_cnt <br />
&nbsp;&nbsp;&nbsp; ); <br />
input&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rst_n&nbsp;&nbsp; ; <br />
input&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; clk&nbsp;&nbsp;&nbsp;&nbsp; ; <br />
&nbsp;<br />
output&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hsync&nbsp;&nbsp; ; <br />
output&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vsync&nbsp;&nbsp; ; <br />
output&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; valid&nbsp;&nbsp; ; <br />
output&nbsp; [9:0]&nbsp;&nbsp; x_cnt&nbsp;&nbsp; ; <br />
output&nbsp; [9:0]&nbsp;&nbsp; y_cnt&nbsp;&nbsp; ; <br />
&nbsp;<br />
reg&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hsync&nbsp;&nbsp; ; <br />
reg&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vsync&nbsp;&nbsp; ; <br />
reg&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; valid&nbsp;&nbsp; ; <br />
reg&nbsp;&nbsp;&nbsp;&nbsp; [9:0]&nbsp;&nbsp; x_cnt&nbsp;&nbsp; ; <br />
reg&nbsp;&nbsp;&nbsp;&nbsp; [9:0]&nbsp;&nbsp; y_cnt&nbsp;&nbsp; ; <br />
&nbsp;<br />
always @ ( posedge clk or negedge rst_n ) <br />
&nbsp;&nbsp;&nbsp; if ( !rst_n ) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x_cnt &lt;= 10'd0; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if ( x_cnt == 10'd1000 ) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x_cnt &lt;= 10'd0; <br />
&nbsp;&nbsp;&nbsp; else <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x_cnt &lt;= x_cnt + 1'b1; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
always @ ( posedge clk or negedge rst_n ) <br />
&nbsp;&nbsp;&nbsp; if ( !rst_n ) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; y_cnt &lt;= 10'd0; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if ( y_cnt == 10'd665 ) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; y_cnt &lt;= 10'd0;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if ( x_cnt == 10'd1000 ) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; y_cnt &lt;= y_cnt + 1'b1;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
always @ ( posedge clk or negedge rst_n ) <br />
&nbsp;&nbsp;&nbsp; if ( !rst_n ) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; begin <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hsync &lt;= 1'b0; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vsync &lt;= 1'b0; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end <br />
&nbsp;&nbsp;&nbsp; else <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; begin <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hsync &lt;= x_cnt &lt;= 10'd50; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vsync &lt;= y_cnt &lt;= 10'd6; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;<br />
always @ ( posedge clk or negedge rst_n )&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; if ( !rst_n ) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; valid &lt;= 1'b0; <br />
&nbsp;&nbsp;&nbsp; else <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; valid &lt;=&nbsp;&nbsp;&nbsp; ( ( x_cnt &gt; 10'd180 ) &amp;&amp; ( x_cnt &lt; 10'd980) &amp;&amp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ( y_cnt &gt; 10'd35)&nbsp;&nbsp; &amp;&amp; ( y_cnt &lt; 10'd635) );&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
endmodule</p>]]></description></item></channel></rss>