高度な項目(7)VGA表示プログラムを説明するために設計さ

 EDITORIAL言葉

あなたは種々の波形を見てかもしれないと思う前に退屈な、より多くの単一設計されています。したがって、このセクションでは、いつも快適なあなたをもたらすために、あなたに新しい感覚、現代の電子技術、画像処理技術の急速な発展として記述することができ、そのユニークなビジュアル体験をもたらすことができるようになります。ここでは、誰もが翼の兄弟を夢とイメージの世界への扉をノックし、酔って、私たちは夢中にしましょう。

何であるVGAは

VGA(ビデオグラフィックアレイ、ビデオ・グラフィック・アレイ)は、IBMは、1987年に作られたコンピュータを使用して、アナログ信号が標準を示すです。この規格は、今日のPC市場は非常に時間となっているためになっています。そうであっても、VGAが共同VGA規格をサポートしている必要があり、独自のドライバをロードする前に、低い標準PCをサポートするメーカーの多くはまだです。

 VGAは、16色または640×480の高解像度で256のグレー階調を表示同時サポート、および320×240の解像度で256色を同時に表示することができます。

 XGA(拡張グラフィックスアレイ、拡張グラフィックスアレイ)は、1990年にIBMによって発明された、XGA新しいバージョントゥルーカラーXGA-2は、1024×768ピクセルを提供するために、800×600画素又は色の65,536種類の分解能を提供するために解像度、画像の解像度レベルは、両方の個人や中小企業、今日の最も一般的に使用されることがあります。

 VGA インターフェイス

ピン機能:

次のように開発ボードの回路図です。

 

回路図、私たちの外部VGAと特別なチップからわかるように、それは、次の私たちがはいVGAのどのような具体的な走査方式を見て、我々は集中したい場合があります唯一の事は、その原理と表示のタイミング、である、と言うことです。

8.7.4 VGAの表示原理

8.7.4.1 スキャンモード

    VGAモニタプログレッシブスキャンとインタレース走査に走査:プログレッシブ走査は左から右に、画面の左上隅から開始する最初のポイントであることにより、点走査、すべての行をスキャン、電子ビームバック画面の左側に次の行すべての行が走査された場合、1つのフレームは、形成されたフィールド同期便利同期信号、及びバックスキャンされ、ライン同期信号に同期したCRTの電子ビームのブランキング、各列の端部は、その中に、開始位置画面の左上に、同時に垂直帰線区間において、次のフレームが開始されます。これは、電子ビームの走査中Saowan次いでインタレース表示を迅速に点滅し、走査線の残りの部分に戻る画面をライン毎に走査するインターレース、ユーザは目の疲れ(プログレッシブ走査にこの実験を引き起こす可能性がラインを指し)の方法。

走査方式がクリアされて後、我々はすぐに見 VGA行、列の同期タイミング

タイミングランク

列の同期タイミング

 

 

ライン同期タイミング

VGAは、  行と列のタイミングに必要なタイミング同期パルス(定義セクション)、表示方向( Bの  部分)、計時部( Cの  部分)とディスプレイ(の先端のD  セグメント)は、4つの部品。業界標準のVGA表示モードが必要ですライン同期、同期列が負である、すなわち、同期パルスが必要とされる負のパルスです。

VGA  見かけのラインシーケンス:各ライン同期パルスは、負極性列(持つ部分)、終了フラグデータ線だけでなく、次の行の先頭フラグ。同期パルスが後(に表示された後、表示タイミング段落(C言語によって段落b)は  明表示処理としてパラ)、 RGBの  データは、それによって行を表示する、一つの行の各画素を駆動します。ディスプレイ(の最前線の最後の行における Dの  セグメント)。いいえ画像がスクリーンに投影されていないが、ブランキング信号は、表示期間より挿入します。前縁とディスプレイに沿って同期パルスを有効ブランキング水平ブランキング期間後に表示され、 RGB信号が無効である、画面データを表示しません。

標準ディスプレイ

次のように多くの標準VGAディスプレイは、があります。

この実験では、標準的なディスプレイ800 * 600 * 60Hzの  例。(800は  列の数であり、 600は、  行の数であり、一画面分の60Hzのリフレッシュ周波数)

タイミングライン:画面に対応するライン数が628(A + B + C +である D = E 600(Cの上)、  表示ラインのパラ);各ラインはライン同期信号(あるとしてセグメント) 4つのライン周期低レベル;

カラムタイミング:各ディスプレイ行備え 1056(A + B + C + D = E 有効表示領域の800(Cパラ)、カラムは、各カラムの同期信号(周期)を有する上記)、128行低サイクル。

以下に示すように、表示画面の有効面積

トップフレーム

原理は明らかである後、私たちの使命は、この設計することである VGAコントローラを、ドライブのLCDディスプレイは、すべての赤を示しています。今、設計系統図は次のように:

説明:

(1)モジュールを分割するクロック周波数(PLL)

私たちは、結晶の開発ボードは使用理由は私達の表示標準の、50MHZ 800 * 600 * 60Hzの、40MHzの所望の表示モードのシステムクロック周波数であるので、我々はPLL実装を呼び出すことで割ます。

(2)VGA同期モジュールランクを制御する(VGA)

 VGA表示規格は、VGAドライバモジュールの中核である有効表示領域を較正するために、同期信号のランクを設定する必要があります

(3)VGAカラー表示制御モジュール(R_g_b)

有効表示領域、カラー画像出力制御 R、G、B信号

ポート説明トップモジュール

ポート名

ポート説明

CLK_SYS

50MHzのシステム・クロック入力

RST_N

低システムリセット

vga_r

レッド原色信号出力VGA

vga_g

緑の原色信号出力VGA

vga_b

青の原色信号出力VGA

vga_hs

VGA同期信号出力列

vga_vs

VGA出力ライン同期信号

次は、前の章のに対し、我々は、位相ロックループの特別な議論を持っていたので、私たちはここではそれらを繰り返すことはしません、我々は位相ロックループを使用する高周波モジュールのために、各モジュールは、達成するための固有のコードを、学びます。

8.7.7 コードの実装

同期制御モジュールのVGAランク

/ ************************************************* ***          

 *エンジニア:ドリーム・ブラザーウイング

 * QQ:761664056

 *モジュール機能:同期制御モジュールのVGAランク

 * ************************************************* **** /

01   モジュールの  VGA

02       入力        CLK    // 40MHzのように分周クロックに接続されています

03       INPUTの        RST_N  //低リセット

04      

05       出力 REGの   vga_hs // VGA列同期信号

06       出力 REGの   vga_vs // VGA水平同期信号

07       出力       EN //表示を有効信号領域

08       );

09

10   パラメータ  hy_all =  11'd1056   //カラムタイミング

Hy_a 11    =  11'd128

12 hy_b    =  11'd88

13 hy_c    =  11'd800

14 hy_d    =  11'd40

15              

16              vy_all = 11'd628,   //行时序

17              vy_a   = 11'd4,

18              vy_b   = 11'd23,

19              vy_c   = 11'd600,

20              vy_d   = 11'd1;

21                  

22  //用计数器限定VGA显示相应区域           

23  reg [10:0] cnt_h;//列计数器

24  reg [10:0] cnt_v;//行计数器 

25

26  //-----------------------列计数-----------------     

27  always@(posedge clk or negedge rst_n) 

28      if(!rst_n)

29          cnt_h   <= 11'd0;//列计数器复位

30      else    if(cnt_h == (hy_all-1))//所有列扫描完毕

31          cnt_h   <= 11'd0;//列计数器清零

32      else    

33          cnt_h <= cnt_h + 1'b1;//列计数器累加

34          

35  //-----------------------行计数--------------------              

36  always@(posedge clk or negedge rst_n)//在一列计数完之后将行加1

37      if(!rst_n)

38          cnt_v   <= 11'd0;//行计数器复位

39      else    if(cnt_v == (vy_all-1))//所有行扫描完毕

40          cnt_v   <= 11'd0;//行计数器清零

41      else    if(cnt_h ==(hy_all-1))//所有列扫描完毕

42          cnt_v   <= cnt_v + 1'b1;//行计数器加一

43

44  //---------------------限定列同步信号---------------

45  always@(posedge clk or negedge rst_n) 

46      if(!rst_n)

47          vga_hs  <= 1'b1;    //复位时置列同步信号为高电平

48      else if(cnt_h ==0)      //列开始扫描

49          vga_hs  <= 1'b0;    //置列同步信号为低电平

50      else if(cnt_h == hy_a)  //保持hy_a个时钟周期

51          vga_hs  <= 1'b1;    //置列同步信号为高电平        

52          

53  //---------------限定行同步信号--------------------  

54  always@(posedge clk or negedge rst_n)

55      if(!rst_n)

56         vga_vs   <= 1'b1;    //复位时置行同步信号为高电平

57      else if(cnt_v ==0)      //行开始扫描

58          vga_vs  <= 1'b0;    //置行同步信号为低电平

59      else   if(cnt_v == vy_a)//保持vy_a个时钟周期

60          vga_vs  <= 1'b1;    //置行同步信号为高电平

61

62  //----------限定显示有效区域,设定使能信号----------

63  wire [12:0] en1;//列有效标志

64  wire [12:0] en2;//行有效标志

65  //列有效区域       

66  assign en1 = (cnt_h >= hy_a + hy_b && cnt_h <= 

67  hy_a + hy_b + hy_c)?(cnt_h-hy_a-hy_b):11'd0;

68  //行有效区域

69  assign en2 = (cnt_v >= vy_a + vy_b && cnt_v <=

70   vy_a + vy_b + vy_c)?(cnt_v-vy_a-vy_b):11'd0;

71  assign en = (en1 > 0 && en2 > 0 )?1'b1:1'b0;//行、列共同有效区域800*600

72

73  endmodule

 

代码说明:本模块是VGA行列同步控制模块,第10~20行定义了显示标准为800*600*60的一些参数,第26~42行写的是行列计数器,当计数满一行之后,行计数器清零,当所有列扫面完毕之后,列计数器清零;第45~60行是限定列显示和行显示的控制逻辑;第63~71行定义了2个有效区域,第66~67是列有效区域,69~70是行有效区域,第71行是当列有效区域和行有效区域都有效的区域。

VGA色彩输出控制器模块

/****************************************************          

 *   Engineer      :   梦翼师兄

 *   QQ             :   761664056

 

 *   The module function:VGA色彩输出控制器模块

 *  *****************************************************/

01  module r_g_b(    //颜色控制模块

02  //端口信号:模块的输入输出接口

03      input         en,  //使能信号

04      

05      output [2:0]  vga_r, //红色(3位:根据数值的变化,控制颜色的深浅)

06      output [2:0]  vga_g, //绿色(3位:根据数值的变化,控制颜色的深浅)

07      output [1:0]  vga_b  //蓝色(2位:根据数值的变化,控制颜色的深浅)

08      );

09

10  //-----------在使能区域显示相应的颜色----------

11  assign vga_r = en?3'b111:3'b000;//在使能信号下输出红色

12  assign vga_g = 3'b000;  //无绿色输出

13  assign vga_b = 2'b00;   //无蓝色输出

14

15  endmodule

 11行在输入en信号有效的情况下,输出全红基色信号,绿色和蓝色都不输出。

VGA显示顶层模块

/****************************************************          

 *   Engineer      :   梦翼师兄

 *   QQ             :   761664056

 *   The module function:VGA显示顶层模块

 *  *****************************************************/

01  module top(     //顶层模块:将各个模块组合

02   //外部接口

03      input            clk,  //系统时钟50MHz

04      input            rst_n,//低电平复位

05      output           vga_vs,//VGA行同步信号

06      output           vga_hs,//VGA列同步信号

07      output [2:0]     vga_r,//红色输出信号

08      output [2:0]     vga_g,//绿色输出信号

09      output [1:0]     vga_b  //蓝色输出信号

10      );

11  //内部信号:模块内部的接口信号,比如模块pll的输出信号c0,

12  //通过内部信号clk_40与模块vga的输入信号clk相连

13  wire clk_40;

14  wire en;

15

16  //模块例化

17  pll pll(          //分频时钟,用锁相环产生,

18      .inclk0(clk), //在显示标准800*600*60HZ中,时钟指定为40MHz

19      .c0(clk_40)

20      );

21          

22  vga vga(     //接入分频时钟,限定显示的有效区域  

23      .clk(clk_40),

24      .rst_n(rst_n),

25      .vga_vs(vga_vs),

26      .vga_hs(vga_hs),

27      .en(en)

28     );

29      

30  r_g_b r_g_b(   //在有效区域内,显示相应颜色

31      .en(en),

32      .vga_r(vga_r),

33      .vga_g(vga_g),

34      .vga_b(vga_b)

35      ); 

36      

37  endmodule

 综合编译以后,我们可以查看RTL视图,查看电路综合结果和预想是否一致,调用RTL视图如下:

由此可以看到电路综合出的结果和我们预先设计的框架相同。接下来我们编写测试代码,用来验证我们设计的正确性。

/****************************************************          

 *   Engineer      :   梦翼师兄

 *   QQ             :   761664056

 *   The module function:VGA显示测试模块

 *  *****************************************************/

01  `timescale 1 ns/ 1 ps  //设置仿真时间单位与精度分别为1ns/1ps           

02  module test;  

03  //端口信号定义,激励信号为reg型

04  reg          clk;

05  reg          rst_n;                                             

06  wire [2:0]  vga_r;

07  wire [2:0]  vga_g;

08  wire [1:0]  vga_b;

09  wire         vga_hs;

10  wire        vga_vs;

11  //初始化激励,以及给相应激励赋值

12  initial                                                

13      begin                                                  

14         clk = 0;

15         rst_n = 0;       //在复位阶段,将激励赋初值

16         #200.1  rst_n = 1; //在延时200ns后将复位信号置为1

17      end                                                    

18  always  #10 clk = ~clk; //时钟为1/20ns = 50MHZ                                          

19  //模块例化                        

20  top top( 

21              .clk(clk),

22              .rst_n(rst_n),

23              .vga_hs(vga_hs),

24              .vga_vs(vga_vs),

25              .vga_r(vga_r),

26              .vga_g(vga_g),

27              .vga_b(vga_b)

28          );  

29  endmodule

 

仿真分析

 

从波形可以看出,当en有效时,vga_r输出3’b111,说明设计是正确的。

将代码下载到开发板,可以看到整个屏幕全部显示红色,说明我们本次的设计是正确的。

 

おすすめ

転載: www.cnblogs.com/mengyi1989/p/11518356.html