目錄
第一部分、實(shí)驗(yàn)結(jié)果
?1、橫的三色彩條效果
2、豎的三色彩條效果
第二部分、VGA驅(qū)動基本知識
1、VGA分辨率問題????????
2、VGA驅(qū)動波形
2.1、工業(yè)標(biāo)準(zhǔn)的時序波形圖
2.2、比上面那張圖更容易理解的圖
2.3、每個區(qū)域?qū)?yīng)的時間
2.4、不同分辨率的表格
3、VGA掃描范圍問題
第三部分、VGA的時序波形圖
第四部分、VGA的驅(qū)動代碼
1、top-down結(jié)構(gòu)圖:
2、vga_ctrl.v模塊代碼:
3、top層代碼
第五部分、總結(jié)
第一部分、實(shí)驗(yàn)結(jié)果
?1、橫的三色彩條效果
? 2、豎的三色彩條效果
第二部分、VGA驅(qū)動基本知識
? ? ? ? 首先,關(guān)于VGA的深層次工作原理可以百度自行了解。
????????我的理解比較簡單,我記得高中的物理課的時候物理老師有提過老式電視機(jī)的顯示原理,一般老式電視機(jī)的都特別大,而且都有個大屁股,這是因?yàn)楹竺嬗袀€電子槍,瘋狂的朝著電視的屏幕噴射電子,然后就出現(xiàn)的顯示,而且噴射的順序就是從屏幕的左上角到右下角。而VGA的原理和這個類似。
1、VGA分辨率問題????????
? ? ? ? 首先不同分辨率對應(yīng)的驅(qū)動程序是稍有區(qū)別的,正常情況下顯示器都支持很多種分辨率,例如我電腦屏幕現(xiàn)在用的顯示器分辨率為1920 * 1080@60Hz。(查看方式:選擇 “開始 > 設(shè)置 > 系統(tǒng) > 顯示 > 高級顯示器?)
? ? ? ? ?而本次實(shí)驗(yàn)選用的分辨率為640*480@60Hz,60Hz為刷新頻率,也就是1s鐘電腦顯示60張圖片,也就是從電子束從屏幕的左上角到右下角這個過程執(zhí)行了60次。
????????這里發(fā)射的過程可以理解為掃描的過程,這樣后面理解驅(qū)動程序時會簡單許多。
2、VGA驅(qū)動波形
? ? ? ? 2.1、工業(yè)標(biāo)準(zhǔn)的時序波形圖
? ? ? ? ? ? ? ? HSync稱作行同步信號,VSync稱作場同步信號或者垂直同步信號。
? ? ? ? ?2.2、比上面那張圖更容易理解的圖
? ? ? ? 圖片來源于該篇博客http://t.csdn.cn/Hqvtc,有問題聯(lián)系我刪除?????。這張圖翻譯了上面每條英文的意思。
?????????2.3、每個區(qū)域?qū)?yīng)的時間
? ? ? ? 這張圖來源于哪一篇博客我忘記了(有問題聯(lián)系我刪除?????),反正是一篇很好的博客,解釋的更加透徹,每段時間點(diǎn)都標(biāo)出來的。
????????2.4、不同分辨率的表格
? ? ? ? 該圖片還是來源于該篇博客http://t.csdn.cn/Hqvtc,有問題聯(lián)系我刪除?????。這個表格解釋不同分辨率,同步,后沿等時間的區(qū)別。
? ? ? ? 當(dāng)然這里也有一個網(wǎng)址可以參考:VGA Signal Timing (tinyvga.com)
? ? ? ? 這里不同分辨率的驅(qū)動時鐘計(jì)算方法如下:
? ? ?? ??????????????????????????時鐘 = 行掃描周期 * 場掃描周期 * 刷新頻率
以640*480@60分辨率的計(jì)算方式:
? ? ? ? ????????????????????????800 * 525 * 60 =?25,200,000 約等于 25MHz
3、VGA掃描范圍問題
? ? ? ? ?看了上面的表格,不知道大家有沒有有個問題,為什么分辨率640*480@60的行掃描為800(像素)而不是640(像素),場掃描為525(行數(shù))而不是480(行數(shù))?
? ? ? ? 因?yàn)?40只是有效圖像的像素點(diǎn)長度,除了這些還有其他的也要考慮進(jìn)去,所有像素點(diǎn)的總和才為800。如下圖所示,真正顯示在屏幕上的只是灰色區(qū)域。
第三部分、VGA的時序波形圖
? ? ? ? 由上面,關(guān)于VGA的時序了解了差不多,這里需要注意的是:行掃描時序要求(單位:像素,即輸出一個像素的時間間隔),場掃描時序要求(單位:行,即輸出一行的時間間隔)。
????????將上面的波形圖轉(zhuǎn)換為更容易理解的波形圖:
????????這里分別引入行掃描計(jì)數(shù)器和場掃描計(jì)數(shù)器用來計(jì)時
?
第四部分、VGA的驅(qū)動代碼
1、top-down結(jié)構(gòu)圖:
? ? ? ? ? ? ? ? gen_clk模塊為由PLL鎖相環(huán)產(chǎn)生的25MHz時鐘,vga_ctrl為vga的驅(qū)動模塊。
2、vga_ctrl.v模塊代碼:
// -----------------------------------------------------------------------------
// Copyright (c) 2014-2023 All rights reserved
// -----------------------------------------------------------------------------
// Author : BigFartPeach
// CSDN : 大屁桃
// E-mail : 2624507313@qq.com
// File : vga_ctrl.v
// Create : 2023-06-06 14:23:19
// -----------------------------------------------------------------------------
module vga_ctrl(
input wire clk_25M,
input wire rst_n,
output reg hsync,
output reg vsync,
output reg [7:0]rgb
);
reg [9:0] hsync_cnt;
reg [9:0] vsync_cnt;
//行掃描計(jì)數(shù)器
always @(posedge clk_25M or negedge rst_n) begin
if (rst_n == 0) begin
hsync_cnt <= 'd0;
end
else if (hsync_cnt == 'd799) begin
hsync_cnt <= 'd0;
end
else begin
hsync_cnt <= hsync_cnt + 1'b1;
end
end
//行同步信號
always @(posedge clk_25M or negedge rst_n) begin
if (rst_n == 0) begin
hsync <= 1'b1;
end
else if (hsync_cnt == 'd95) begin
hsync <= 1'b0;
end
else if(hsync_cnt == 'd799)begin
hsync <= 1'b1;
end
end
//場掃描計(jì)數(shù)器
always @(posedge clk_25M or negedge rst_n) begin
if (rst_n == 0) begin
vsync_cnt <= 'd0;
end
else if (vsync_cnt == 'd524 && hsync_cnt == 'd799) begin
vsync_cnt <= 'd0;
end
else if (hsync_cnt == 'd799) begin
vsync_cnt <= vsync_cnt + 1'b1;
end
end
//場掃描信號
always @(posedge clk_25M or negedge rst_n) begin
if (rst_n == 0) begin
vsync <= 1'b1;
end
else if (hsync_cnt == 'd799 && vsync_cnt == 'd1) begin
vsync <= 1'b0;
end
else if(hsync_cnt == 'd799 && vsync_cnt == 'd524) begin
vsync <= 1'b1;
end
end
//RGB信號輸出
always @(posedge clk_25M or negedge rst_n) begin
if (rst_n == 0) begin
rgb <= 'b000_000_00;
end
//橫彩條
// else if (hsync_cnt>= 144 && hsync_cnt <= 783 && vsync_cnt>= 35 && vsync_cnt <= 194) begin
// rgb <= 'b111_000_00;//紅色
// end
// else if (hsync_cnt>= 144 && hsync_cnt <= 783 && vsync_cnt>= 195 && vsync_cnt <= 354)begin
// rgb <= 'b000_111_00;//綠色
// end
// else if (hsync_cnt>= 144 && hsync_cnt <= 783 && vsync_cnt>= 355 && vsync_cnt <= 514)begin
// rgb <= 'b000_000_11;//藍(lán)色
// end
//豎彩條
else if (hsync_cnt>= 144 && hsync_cnt <= 356 && vsync_cnt>= 35 && vsync_cnt <= 514) begin
rgb <= 'b111_000_00;//紅色
end
else if (hsync_cnt>= 357 && hsync_cnt <= 569 && vsync_cnt>= 35 && vsync_cnt <= 514) begin
rgb <= 'b000_111_00;//綠色
end
else if (hsync_cnt>= 570 && hsync_cnt <= 783 && vsync_cnt>= 35 && vsync_cnt <= 514) begin
rgb <= 'b000_000_11;//藍(lán)色
end
else begin//其它區(qū)域
rgb <= 'b000_000_00;//不顯示
end
end
endmodule
3、top層代碼
// -----------------------------------------------------------------------------
// Copyright (c) 2014-2023 All rights reserved
// -----------------------------------------------------------------------------
// Author : BigFartPeach
// CSDN : 大屁桃
// E-mail : 2624507313@qq.com
// File : top_vga.v
// Create : 2023-06-06 15:35:13
// -----------------------------------------------------------------------------
module top_vga(
input wire clk,
input wire rst_n,
output wire hsync,
output wire vsync,
output wire [7:0] rgb
);
wire clk_25M;
//PLL產(chǎn)生25M的時鐘
gen_clk25 inst_clk25(
// Clock in ports
.CLK_IN1(clk), // IN
// Clock out ports
.CLK_OUT1(clk_25M)); // OUT
//例化640*480@60Hz驅(qū)動模塊
vga_ctrl inst_vga_ctrl (
.clk_25M(clk_25M),
.rst_n(rst_n),
.hsync(hsync),
.vsync(vsync),
.rgb(rgb));
endmodule
第五部分、總結(jié)
? ? ? ? 這里只是實(shí)現(xiàn)簡單的驅(qū)動,后面的這篇文中我將VGA的驅(qū)動程序重新修改了一下,使整個程序更容易移植,有需要的哥們可以接著往后看。
? ? ? ? 關(guān)于這篇文章的工程的代碼如下,工程基于ISE軟件,沒積分的哥們評論留下郵箱即可:
????????FPGA入門第七篇、FPGA實(shí)現(xiàn)VGA接口驅(qū)動資源-CSDN文庫文章來源:http://www.zghlxwxcb.cn/news/detail-727357.html
????????最后,希望我的博客對你有幫助????????,有需要的小伙伴可以查看本專欄更多的往期文章專欄鏈接如下:FPGA的學(xué)習(xí)之旅_大屁桃的博客-CSDN博客文章來源地址http://www.zghlxwxcb.cn/news/detail-727357.html
到了這里,關(guān)于【FPGA入門】第七篇、FPGA實(shí)現(xiàn)VGA接口驅(qū)動的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!