基于FPGA的VGA可移植模塊終極設計
c) 場同步信號設計
同上。
d) 數(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;
這部分很容易理解,在顯示期坐標根據(jù)顯示的掃描而改變,在非顯示期,坐標置零。
(2)Vga_display.v代碼分析
a) 標準色彩定義
//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;
定義當?shù)氐膮?shù),目的是為了后續(xù)標準色彩調用的方便,沒有其他作用。
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坐標,來輸出固定色彩。由于vga_driver模塊已經(jīng)完全設計好接口,因此vga_display.v模塊就是簡單的根據(jù)區(qū)域,輸出設計的顏色。
(3) Vga_ctrl.v代碼分析
a) 同步化解析
略。
b) 可控鎖相環(huán)PLL設計
本來可空鎖相環(huán)PLL設計,Bingo想單獨成章來講述的,但覺得可能別的地方實際應用價值不是很大,最后便在此處闡明這樣設計的原因。
由于VGA不同分辨率的掃描時鐘不同,因此分辨率變化的時候,PLL的輸出時鐘是必要跟隨著變化。但是Bingo覺得好麻煩,于是想了偷懶的一招:PLL IP定義,無非是用Quartus II GUI對PLL參數(shù)的設定,最后生成pll.v這個文件。而這個文件相當于是鎖相環(huán)的驅動電路,故勢必包含著參數(shù)的定義。實際如下:
altpll_component.clk0_divide_by = 1,
altpll_component.clk0_duty_cycle = 50,
altpll_component.clk0_multiply_by = 1,
如上圖所示,每次修改參數(shù),這三個變量會相應的發(fā)生變化。因此,何不把這三個參數(shù)作為例化的參數(shù),可以再頂層直接修改代碼來實現(xiàn)固定頻率的輸出?這樣豈不是很方便?
因此設計參數(shù)例化接口如下:
#(
parameter DUTY_CYCLE = 50,
parameter DIVIDE_DATA = 1,
parameter MULTIPLY_DATA = 1
)
理論上是完全行得通的,這樣設計的另一個好處就是電路的封裝性更好Bingo實踐證明,完全可行,因此在此處說明,要學會正確的偷懶呵呵。
(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
如上所示,上面三個信號線是在使用adv712x視頻轉換芯片的時候才會出現(xiàn),一般的電阻模擬電路,或者直接RGB3線驅動,可以直接刪除相關信號以及電路。
評論