FPGA:圖形 LCD 面板- 圖形
圖形 LCD 面板 3 - 圖形
讓我們研究一下生成圖形視頻數(shù)據(jù)的 3 種方法。
本文引用地址:http://cafeforensic.com/article/202401/454788.htm柵格化位圖
在 LCD 上顯示圖形的經(jīng)典(且簡單)方法是將光柵化位圖數(shù)據(jù)保存到 RAM 中。
我們將在這里使用一個 blockram。
我們在這里顯示一個 128x32 像素的小位圖(非常適合 4Kbits 塊內(nèi)存):
// Use a blockram to hold the graphical data wire [7:0] BitmapData; blockram_8x512 RAM_bitmap(.clk(clk), .rd_adr({CounterY[4:0],CounterX[4:1]}), .data_out(BitmapData)); // Let's say we need 4 bits at a time wire [3:0] LCD_Bitmap4 = CounterX[0] ? BitmapData[3:0] : BitmapData[7:4]; // Display the data into a chessboard pattern wire [3:0] LCD_BitmapChessboard = (CounterY[5] ^ CounterX[5]) ? 4'b000 : LCD_Bitmap4 ^ {4{CounterY[5]}};
上面未顯示RAM的寫入方式。最簡單的方法是將其視為ROM(RAM內(nèi)容是FPGA配置的一部分,在FPGA運(yùn)行時不會改變)。
下面是一個微距鏡頭:
光柵化位圖的缺點(diǎn)是需要足夠大的 RAM 來保存位圖的每個像素的狀態(tài)。 使用內(nèi)部FPGA RAM的成本很高,因此通常使用外部RAM。
現(xiàn)在,讓我們探索更多創(chuàng)建圖形的原始方法。
曲線 y=F(x)
假設(shè)我們想要顯示一個 y=F(x) 波形,就像正弦波一樣。這出乎意料地容易做到。 我們將“Y”值保存到一個塊函數(shù)中,并通過讀取RAM并將這些值與“CounterY”(當(dāng)前行號)進(jìn)行比較來逐行生成圖片。
// We assume CounterX and CounterY are available: // CounterX is the pixel number of the current line // CounterY is the line number // We use a RAM to hold the "Y" values // Y=F(CounterX) wire [7:0] RAM_Y_value; blockram_8x512 RAM_FXY(.clk(clk), .rd_adr(CounterX), .data_out(RAM_Y_value)); // check for equality between the "Y" values and "CounterY" reg grcpeq1; always @(posedge clk) grcpeq1 <= (RAM_Y_value==CounterY); reg grcpeq2; always @(posedge clk) grcpeq2 <= grcpeq1; // check for "greater-than" between the "Y" values and "CounterY" reg grcp1; always @(posedge clk) grcp1 <= (RAM_Y_value>CounterY); reg grcp2; always @(posedge clk) grcp2 <= grcp1; // display a pixel if equality, or if "CounterY" is between 2 successive "Y" values wire FXpix= grcpeq2 | (grcp1 ^ grcp2);
以下是使用 F(x)=cos(x*2*pi/480)*sin(x*2*pi/480*4) 的結(jié)果:
旋轉(zhuǎn)縮放
Rotozoom 是顯示具有線性幾何變形的位圖的有效方法。 特別是,這允許輕松旋轉(zhuǎn)和縮放圖片。在下面的實(shí)現(xiàn)中,我們在屏幕上顯示一個旋轉(zhuǎn)的棋盤圖案。
reg [15:0] X0, Y0, X1, Y1;always @(posedge clk)if(Vsync) begin X0 <= 0; Y0 <= 0; X1 <= 0; Y1 <= 0;end else if(Hsync) begin X0 <= X1 - 100; Y0 <= Y1 + 400; X1 <= X1 - 100; Y1 <= Y1 + 400;end elsebegin X0 <= X0 + 400; Y0 <= Y0 + 100;end // Display a chessboard pattern by XOR'ing the MSB of X and Y counters // You could also display a rotozoomed bitmap by feeding X and Y to a bitmap in a RAM wire rotozoom_pix = X0[15] ^ Y0[15];
這被簡化了,因?yàn)樵隽恐凳枪潭ǖ模?00 和 100 以上)。 您可能希望在實(shí)際實(shí)現(xiàn)中改變它們。 通過改變系數(shù),您可以旋轉(zhuǎn)和縮放棋盤。
這是與上一個波形混合的結(jié)果:
然后,您可以將其與一些文本混合在一起......
評論