在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁(yè) > 嵌入式系統(tǒng) > 牛人業(yè)話 > 【從零開(kāi)始走進(jìn)FPGA】 玩轉(zhuǎn)VGA

            【從零開(kāi)始走進(jìn)FPGA】 玩轉(zhuǎn)VGA

            ——
            作者: 時(shí)間:2015-06-11 來(lái)源:網(wǎng)絡(luò) 收藏
            2、代碼設(shè)計(jì)

              Bingo例程以16bit RGB 驅(qū)動(dòng)為例,不同位數(shù)的顯示只要改一下vga_data即可。

            本文引用地址:http://www.biyoush.com/article/275552.htm

              前文以及代碼講述了那么多,此處不再貼完整代碼,而是對(duì)代碼中部分結(jié)構(gòu)進(jìn)行解析。

              代碼下載地址:http://blog.chinaaet.com/detail/21606.html

              (1)vga_driver.v代碼分析

              a) 參數(shù)例化列表

              #(

              // _1024_768_60fps_65MHz

              // Horizontal Parameter ( Pixel )

              parameter H_DISP = 11'd1024,

              parameter H_FRONT = 11'd24,

              parameter H_SYNC = 11'd136,

              parameter H_BACK = 11'd160,

              parameter H_TOTAL = 11'd1344,

              // Virtical Parameter ( Line )

              parameter V_DISP = 10'd768,

              parameter V_FRONT = 10'd3,

              parameter V_SYNC = 10'd6,

              parameter V_BACK = 10'd29,

              parameter V_TOTAL = 10'd806

              )

              這樣寫(xiě)的目的是為了軟件封裝性,能夠在例化的時(shí)候修改法分辨率,同時(shí)電路結(jié)構(gòu)保持不變。

              DISP,F(xiàn)RONT ,SYNC,BACK,TOTAL分別為顯示期,消隱前肩,消音期,消隱后肩,總時(shí)間,各自對(duì)應(yīng)各自的行場(chǎng)信號(hào)。

              b) 行同步信號(hào)設(shè)計(jì)

              //------------------------------------------

              // 行同步信號(hào)發(fā)生器

              reg [10:0] hcnt;

              always @ (posedge clk_vga or negedge rst_n)

              begin

              if (!rst_n)

              hcnt <= 0;

              else

              begin

              if (hcnt < H_TOTAL-1'b1)

              hcnt <= hcnt + 1'b1;

              else

              hcnt <= 0;

              end

              end

              //------------------------------------------

              always@(posedge clk_vga or negedge rst_n)

              begin

              if(!rst_n)

              vga_hs <= 1;

              else

              begin

              if( (hcnt >= H_DISP+H_FRONT-1'b1) && (hcnt < H_DISP+H_FRONT+H_SYNC-1'b1) )

              vga_hs <= 0;

              else

              vga_hs <= 1;

              end

              end

              如上所示,分析代碼可以知道,行同步信號(hào)的計(jì)數(shù)狀態(tài)機(jī)按照時(shí)序的劃分,是以下過(guò)程:H_DISP,H_FRONT,H_SYNC,H_BACK,這似乎和上述分析的時(shí)序不是完全吻合。但是VGA時(shí)序是一個(gè)循環(huán),順推H_BACK個(gè)時(shí)終域便可以得到以上時(shí)期劃分,但是這樣更方便后續(xù)坐標(biāo)計(jì)數(shù),因?yàn)锽ingo此處這樣設(shè)計(jì),當(dāng)然實(shí)際證明是完全可行的。

              注意:(hcnt >= H_DISP+H_FRONT-1'b1) && (hcnt < H_DISP+H_FRONT+H_SYNC-1'b1) 只是因?yàn)楹罄m(xù)坐標(biāo)計(jì)算,就把時(shí)序提前了1個(gè)時(shí)鐘已達(dá)到同步。

              c) 場(chǎng)同步信號(hào)設(shè)計(jì)

              同上。

              d) 數(shù)據(jù)顯示坐標(biāo)以及輸出設(shè)計(jì)

              //------------------------------------------

              assign vga_xpos = (hcnt < H_DISP) ? hcnt[9:0]+1'b1 : 10'd0;

              assign vga_ypos = (vcnt < V_DISP) ? vcnt[9:0]+1'b1 : 10'd0;

              assign vga_rgb = ((hcnt < H_DISP) && (vcnt < V_DISP)) ? vga_data : 16'd0;

              這部分很容易理解,在顯示期坐標(biāo)根據(jù)顯示的掃描而改變,在非顯示期,坐標(biāo)置零。

              (2)Vga_display.v代碼分析

              a) 標(biāo)準(zhǔn)色彩定義

              //define colors RGB--5|6|5

              localparam RED = 16'hF800;

              localparam GREEN = 16'h07E0;

              localparam BLUE = 16'h001F;

              localparam WHITE = 16'hFFFF;

              localparam BLACK = 16'h0000;

              localparam YELLOW = 16'hFFE0;

              localparam CYAN = 16'hF81F;

              localparam ROYAL = 16'h07FF;

              定義當(dāng)?shù)氐膮?shù),目的是為了后續(xù)標(biāo)準(zhǔn)色彩調(diào)用的方便,沒(méi)有其他作用。

              b) 根據(jù)固定區(qū)域輸出數(shù)據(jù)

              always@(posedge clk or negedge rst_n)

              begin

              if(!rst_n)

              vga_data <= 16'h0;

              else

              begin

              if (vga_xpos >= 0 && vga_xpos < (H_DISP/3))

              vga_data <= RED;

              else if(vga_xpos >= (H_DISP>>3)*1 && vga_xpos < (H_DISP/3)*2)

              vga_data <= GREEN;

              else

              vga_data <= BLUE;

              end

              end

              如上代碼,根據(jù)xpos坐標(biāo),來(lái)輸出固定色彩。由于vga_driver模塊已經(jīng)完全設(shè)計(jì)好接口,因此vga_display.v模塊就是簡(jiǎn)單的根據(jù)區(qū)域,輸出設(shè)計(jì)的顏色。

              (3) Vga_ctrl.v代碼分析

              a) 同步化解析

              略。

              b) 可控鎖相環(huán)PLL設(shè)計(jì)

              

            wps_clip_image-4070

             

              本來(lái)可空鎖相環(huán)PLL設(shè)計(jì),Bingo想單獨(dú)成章來(lái)講述的,但覺(jué)得可能別的地方實(shí)際應(yīng)用價(jià)值不是很大,最后便在此處闡明這樣設(shè)計(jì)的原因。

              由于VGA不同分辨率的掃描時(shí)鐘不同,因此分辨率變化的時(shí)候,PLL的輸出時(shí)鐘是必要跟隨著變化。但是Bingo覺(jué)得好麻煩,于是想了偷懶的一招:PLL IP定義,無(wú)非是用Quartus II GUI對(duì)PLL參數(shù)的設(shè)定,最后生成pll.v這個(gè)文件。而這個(gè)文件相當(dāng)于是鎖相環(huán)的驅(qū)動(dòng)電路,故勢(shì)必包含著參數(shù)的定義。實(shí)際如下:

              altpll_component.clk0_divide_by = 1,

              altpll_component.clk0_duty_cycle = 50,

              altpll_component.clk0_multiply_by = 1,

              如上圖所示,每次修改參數(shù),這三個(gè)變量會(huì)相應(yīng)的發(fā)生變化。因此,何不把這三個(gè)參數(shù)作為例化的參數(shù),可以再頂層直接修改代碼來(lái)實(shí)現(xiàn)固定頻率的輸出?這樣豈不是很方便?

              因此設(shè)計(jì)參數(shù)例化接口如下:

              #(

              parameter DUTY_CYCLE = 50,

              parameter DIVIDE_DATA = 1,

              parameter MULTIPLY_DATA = 1

              )

              理論上是完全行得通的,這樣設(shè)計(jì)的另一個(gè)好處就是電路的封裝性更好Bingo實(shí)踐證明,完全可行,因此在此處說(shuō)明,要學(xué)會(huì)正確的偷懶呵呵。

              (4)Vga_design.v頂層文件代碼解析

              a) Vga接口定義

              //vga interface

              output vga_adv_clk,

              output vga_blank_n,

              output vga_sync_n,

              output vga_hs,

              output vga_vs,

              output [15:0] vga_rgb

              如上所示,上面三個(gè)信號(hào)線是在使用adv712x視頻轉(zhuǎn)換芯片的時(shí)候才會(huì)出現(xiàn),一般的電阻模擬電路,或者直接RGB3線驅(qū)動(dòng),可以直接刪除相關(guān)信號(hào)以及電路。

              b) 進(jìn)一步偷懶法則

              根據(jù)常用的幾種分辨率,Bingo進(jìn)行了總結(jié),以下三種應(yīng)用較多,因此進(jìn)一步偷懶法則,圍繞他們?nèi)邅?lái)(不在這三種以內(nèi)的話,自己模仿著再寫(xiě)一個(gè)):

              VGA_640_480_60FPS_25MHz

              VGA_800_600_72FPS_50MHz

              VGA_1024_768_60FPS_65MHz

              Verilog語(yǔ)法也有define的用法,是否還記得C語(yǔ)言中,大工程的調(diào)試經(jīng)常對(duì)相關(guān)變量的注釋,注銷來(lái)調(diào)整整個(gè)工程變量的應(yīng)用,因此此處Bingo套用這種思維模式,定義以上三種模式的變量,通過(guò)修改注釋define便可以輕松修改全局。具體如下所示:

              //----------------------------------------

              //vga parameter define

              //`define VGA_640_480_60FPS_25MHz

              //`define VGA_800_600_72FPS_50MHz

              `define VGA_1024_768_60FPS_65MHz

              `ifdef VGA_640_480_60FPS_25MHz

              parameter DUTY_CYCLE = 50;

              parameter DIVIDE_DATA = 2;

              parameter MULTIPLY_DATA = 1;

              parameter H_DISP = 11'd640;

              parameter H_FRONT = 11'd16;

              parameter H_SYNC = 11'd96;

              parameter H_BACK = 11'd48;

              parameter H_TOTAL = 11'd800;

              parameter V_DISP = 10'd480;

              parameter V_FRONT = 10'd10;

              parameter V_SYNC = 10'd2;

              parameter V_BACK = 10'd33;

              parameter V_TOTAL = 10'd525;

              `endif

              `ifdef VGA_800_600_72FPS_50MHz

              parameter DUTY_CYCLE = 50;

              parameter DIVIDE_DATA = 1;

              parameter MULTIPLY_DATA = 1;

              parameter H_DISP = 11'd800;

              parameter H_FRONT = 11'd56;

              parameter H_SYNC = 11'd120;

              parameter H_BACK = 11'd64;

              parameter H_TOTAL = 11'd1040;

              parameter V_DISP = 10'd600;

              parameter V_FRONT = 10'd37;

              parameter V_SYNC = 10'd6;

              parameter V_BACK = 10'd23;

              parameter V_TOTAL = 10'd666;

              `endif

              `ifdef VGA_1024_768_60FPS_65MHz

              parameter DUTY_CYCLE = 50;

              parameter DIVIDE_DATA = 10;

              parameter MULTIPLY_DATA = 13;

              parameter H_DISP = 11'd1024;

              parameter H_FRONT = 11'd24;

              parameter H_SYNC = 11'd136;

              parameter H_BACK = 11'd160;

              parameter H_TOTAL = 11'd1344;

              parameter V_DISP = 10'd768;

              parameter V_FRONT = 10'd3;

              parameter V_SYNC = 10'd6;

              parameter V_BACK = 10'd29;

              parameter V_TOTAL = 10'd806;

              `endif

              四、Display方案以及效果

              1、彩條

              (1)代碼

              always@(posedge clk or negedge rst_n)

              begin

              if(!rst_n)

              vga_data <= 16'h0;

              else

              begin

              if (vga_xpos >= 0 && vga_xpos < (H_DISP>>3))

              vga_data <= RED;

              else if(vga_xpos >= (H_DISP>>3)*1 && vga_xpos < (H_DISP>>3)*2)

              vga_data <= GREEN;

              else if(vga_xpos >= (H_DISP>>3)*2 && vga_xpos < (H_DISP>>3)*3)

              vga_data <= BLUE;

              else if(vga_xpos >= (H_DISP>>3)*3 && vga_xpos < (H_DISP>>3)*4)

              vga_data <= WHITE;

              else if(vga_xpos >= (H_DISP>>3)*4 && vga_xpos < (H_DISP>>3)*5)

              vga_data <= BLACK;

              else if(vga_xpos >= (H_DISP>>3)*5 && vga_xpos < (H_DISP>>3)*6)

              vga_data <= YELLOW;

              else if(vga_xpos >= (H_DISP>>3)*6 && vga_xpos < (H_DISP>>3)*7)

              vga_data <= CYAN;

              else// if(vga_xpos >= (H_DISP<<3)*7 && vga_xpos < (H_DISP<<3)*8)

              vga_data <= ROYAL;

              end

              end

              通過(guò)簡(jiǎn)單的對(duì)X坐標(biāo)地址的分割,來(lái)得到彩條。這是應(yīng)該是VGA初學(xué)者一開(kāi)始最興奮的幾個(gè)界面吧。

              (2)效果圖

              

            wps_clip_image-25343

             

              2、花型矩陣

              (1)代碼

              wire [19:0] vga_result = vga_xpos * vga_ypos;

              always@(posedge clk or negedge rst_n)

              begin

              if(!rst_n)

              vga_data <= 16'h0;

              else

              vga_data = vga_result[15:0];

              end

              通過(guò)x坐標(biāo)地址和y坐標(biāo)地址的乘積的值,取低16位,得到的數(shù)據(jù)有一定的規(guī)律。Bingo當(dāng)年也是不小心發(fā)現(xiàn)的,僅此獻(xiàn)給初學(xué)的孩子們,這個(gè)比彩條更帥氣。

              (2)效果圖

              

            wps_clip_image-756

            fpga相關(guān)文章:fpga是什么



            上一頁(yè) 1 2 下一頁(yè)

            關(guān)鍵詞: VGA FPGA

            評(píng)論


            相關(guān)推薦

            技術(shù)專區(qū)

            關(guān)閉