
vga顯示靜態圖品主要分為兩個部分,一個是驅動vga,另一部分控制vga顯示。
vga驅動部分之前寫過,直接例化過來用即可。
另一個是vga顯示,從網上找了一個200*200的lena圖品,然后用BMP2Mif軟件
將圖片轉換成mif文件,24*40000,24代表rgb三原色,4000代表像素,在200*200
的區域內,一共有40000個像素點,然后把mif文件存進rom里,vga顯示出來即可。
/*----------------------------------------------------------------------- Date : 2017-XX-XX Description : Design for . -----------------------------------------------------------------------*/ module vga_control ( //global clock input clk, //system clock input rst_n, //sync reset //vga interface input [10:0] value_x, input [10:0] value_y, output [23:0] rgb, //rom interface output reg [15:0] rom_addr, // input [23:0] rom_q ); //-------------------------------- //Funtion : display_區域 wire display_addr; assign display_addr = ((value_x >= 8'd100 && value_x < 9'd300) && (value_y >= 8'd100 && value_y < 9'd300)) ? 1'b1 : 1'b0; //-------------------------------- //Funtion : rgb assign rgb = (display_addr == 1'b1) ? rom_q : 1'd0; //-------------------------------- //Funtion : rom_addr wire [10:0] display_x; wire [10:0] display_y; assign display_x = value_x - 8'd100; assign display_y = value_y - 8'd100; always @(posedge clk or negedge rst_n) begin if(!rst_n) rom_addr <= 1'd0; else if(display_addr) rom_addr <= display_x + display_y*200; else rom_addr <= 1'd0; end endmodule
將圖品進行灰度處理,把圖片進行灰度化我搜了一下,一是可以加快運算速度,第二點色彩對於計算本身並沒有作用,所以把它舍棄。
彩色轉灰度公式 : gray = RX0.299 + GX0.587 + BX0.114;
fpga里面的寄存器都是整數,所以需要對數據進行放大,可能思維固化了吧,第一反應是這樣的
因為都是三位小數,我會乘上1000然后除1000,但是除法速度明顯不如移位,其實可以這樣
把每位都乘上2^16,然后右移16位即可
//-------------------------------- //Funtion : rgb //assign rgb = (display_addr == 1'b1) ? rom_q : 1'd0; assign rgb = (display_addr == 1'b1) ? {3{gray}} : 1'd0; //-------------------------------- //Funtion : 轉灰度處理 wire [7:0] gray; assign gray = (rom_q[23:16]*19595 + rom_q[15:8]*38469 + rom_q[7:0]*7472) >> 16;
這樣一看,灰度化其實也挺簡單的,沒有那么神秘
