基于FPGA的VGA可移植模塊終極設計
b) 進一步偷懶法則
根據常用的幾種分辨率,Bingo進行了總結,以下三種應用較多,因此進一步偷懶法則,圍繞他們三者來(不在這三種以內的話,自己模仿著再寫一個):
VGA_640_480_60FPS_25MHz
VGA_800_600_72FPS_50MHz
VGA_1024_768_60FPS_65MHz
Verilog語法也有define的用法,是否還記得C語言中,大工程的調試經常對相關變量的注釋,注銷來調整整個工程變量的應用,因此此處Bingo套用這種思維模式,定義以上三種模式的變量,通過修改注釋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_DISP3)*7 vga_xpos (H_DISP3)*8)
vga_data = ROYAL;
end
end
通過簡單的對X坐標地址的分割,來得到彩條。這是應該是VGA初學者一開始最興奮的幾個界面吧。
評論