代码:
module vga_controler( input CLOCK_50, input[3:0] KEY, output VGA_CLK, //should be 25MHz output[7:0] VGA_R, output[7:0] VGA_G, output[7:0] VGA_B, output VGA_BLANK_N, output VGA_SYNC_N, output VGA_HS, output VGA_VS ); reg[9:0] H_Cont; //行扫描计数器 reg[9:0] V_Cont; //列扫描计数器 wire[7:0] vga_r; wire[7:0] vga_g; wire[7:0] vga_b; reg vga_hs; reg vga_vs; reg[10:0] X; reg[10:0] Y; assign VGA_R=vga_r; assign VGA_G=vga_g; assign VGA_B=vga_b; assign VGA_HS=vga_hs; assign VGA_VS=vga_vs; //Horizontal Parameter 16+96+48+640=800 parameter H_FRONT=16; parameter H_SYNC=96; parameter H_BACK=48; parameter H_ACT=640; parameter H_BLANK=H_FRONT+H_SYNC+H_BACK; parameter H_TOTAL=H_FRONT+H_SYNC+H_BACK+H_ACT; //Vertical Parameter 11+2+32+480=525 parameter V_FRONT=10; parameter V_SYNC=2; parameter V_BACK=33; parameter V_ACT=480; parameter V_BLANK=V_FRONT+V_SYNC+V_BACK; parameter V_TOTAL=V_FRONT+V_SYNC+V_BACK+V_ACT; //parameter X_Start=H_BACK+H_SYNC; //parameter Y_Start=V_BACK+V_SYNC; wire CLK_25; //VGA Signal 460x480@60Hz Pixel freq:800*525*59.94=25.175MHz wire RST_N; // Generator DAC_CLOCK 25MHz pll pll_inst ( .inclk0 ( CLOCK_50 ), .c0 ( CLK_25 ) ); //Select DAC CLOCK assign VGA_CLK=CLK_25; assign VGA_SYNC_N=1'b0; //If not SOG, Sync input should be tied to 0; assign VGA_BLANK_N=~((H_Cont<H_BLANK)||(V_Cont<V_BLANK)); //VGA logic 0 active, VGA_BLANK=(H_Cont<H_BLANK)||(V_Cont<V_BLANK); //assign VGA_BLANK_N=H_SYNC&&V_SYNC; assign RST_N=KEY[0]; //Horizontal Generator:Refer to the pixel clock always@(posedge CLK_25, negedge RST_N)begin if(!RST_N)begin H_Cont<=0; vga_hs<=1; X<=0; end else begin if(H_Cont<H_TOTAL) H_Cont<=H_Cont+1'b1; else H_Cont<=0; //horizontal Sync if(H_Cont==H_FRONT-1) //Front porch end vga_hs<=1'b0; if(H_Cont==H_FRONT+H_SYNC-1) vga_hs<=1'b1; //Current X if(H_Cont>=H_BLANK) X<=H_Cont-H_BLANK; else X<=0; end end //vertical Generator: Refer to the horizontal sync always@(posedge VGA_HS, negedge RST_N)begin if(!RST_N)begin V_Cont<=0; vga_vs<=1; Y<=0; end else begin if(V_Cont<V_TOTAL) V_Cont<=V_Cont+1'b1; else V_Cont<=0; //Vertical Sync if(V_Cont==V_FRONT-1) vga_vs<=1'b0; if(V_Cont==V_FRONT+V_SYNC-1) vga_vs<=1'b1; //Current Y if(V_Cont>=V_BLANK) Y<=V_Cont-V_BLANK; else Y<=0; end end //有效显示标志位产生 /* reg valid_yr; //行显示有效信号 always @ (posedge CLK_25 or negedge RST_N) if(!RST_N) valid_yr <= 1'b0; else if(V_Cont == 10'd32) valid_yr <= 1'b1; else if(V_Cont == 10'd512) valid_yr <= 1'b0; wire valid_y = valid_yr; reg valid_r; // VGA有效显示区标志位 always @ (posedge CLK_25 or negedge RST_N) if(!RST_N) valid_r <= 1'b0; else if((H_Cont == 10'd143) && valid_y) valid_r <= 1'b1; else if((H_Cont == 10'd783) && valid_y) valid_r <= 1'b0; wire valid = valid_r; */ wire valid; assign valid=(H_Cont>X)&&(H_Cont<X+H_ACT)&&(V_Cont>Y)&&(V_Cont<Y+V_ACT); //wire[9:0] x_dis; //横坐标显示有效区域相对坐标值0-639 wire[9:0] y_dis; //竖坐标显示有效区域相对坐标值0-479 //assign x_dis = H_Cont - 10'd143; assign y_dis = V_Cont - 10'd33; //-------------------------------------------------- //-------------------------------------------------- // VGA色彩信号产生 /* RGB = 000 黑色 RGB = 100 红色 = 001 蓝色 = 101 紫色 = 010 绿色 = 110 黄色 = 011 青色 = 111 白色 */ //www.njodin.com /* parameter char_line0 = 32'h00000000, char_line1 = 32'h00000000, char_line2 = 32'h00000000, char_line3 = 32'h38063000, char_line4 = 32'h44023000, char_line5 = 32'h82020000, char_line6 = 32'h82020000, char_line7 = 32'h821E70DC, char_line8 = 32'h82021062, char_line9 = 32'h82421042, char_linea = 32'h82421042, char_lineb = 32'h82421042, char_linec = 32'h44261042, char_lined = 32'h381B7CE7, char_linee = 32'h00000000, char_linef = 32'h00000000;*/ //www.njodin.com /* parameter char_line0 = 56'h0000000000000000000000000000, char_line1 = 56'h0000000000000000000000000000, char_line2 = 56'h0000000000000000000000000000, char_line3 = 56'h00000000000C0002180000000000, char_line4 = 56'h0000000000040002100000000000, char_line5 = 56'h0000000000000002000000000000, char_line6 = 56'h0000000000000002000000000000, char_line7 = 56'hDBDBDB005E0C3C7E185E003C3CF7, char_line8 = 56'hDADADA00620C46461862004646DB, char_line9 = 56'h5A5A5A00420C42421842004042DB, char_linea = 56'h6A6A6A00420C42421842004042DB, char_lineb = 56'h66666600420C42461842004242DB, char_linec = 56'h64646460420C66661842606666DB, char_lined = 56'h24242460420C183A1842603818DB, char_linee = 56'h00000000004C0000000000000000, char_linef = 56'h0000000000780000000000000000; */ parameter char_line0 = 112'h0000000000000000000000000000, char_line1 = 112'h0000000000000000000000000000, char_line2 = 112'h0000000000000000000000000000, char_line3 = 112'h00000000000C0002180000000000, char_line4 = 112'h0000000000040002100000000000, char_line5 = 112'h0000000000000002000000000000, char_line6 = 112'h0000000000000002000000000000, char_line7 = 112'hDBDBDB005E0C3C7E185E003C3CF7, char_line8 = 112'hDADADA00620C46461862004646DB, char_line9 = 112'h5A5A5A00420C42421842004042DB, char_linea = 112'h6A6A6A00420C42421842004042DB, char_lineb = 112'h66666600420C42461842004242DB, char_linec = 112'h64646460420C66661842606666DB, char_lined = 112'h24242460420C183A1842603818DB, char_linee = 112'h00000000004C0000000000000000, char_linef = 112'h0000000000780000000000000000; //南京欧帝科技 parameter char_line00 = 192'h000000000000000000000000000000000000000000000000, char_line01 = 192'h000000000000000000000000000000000000000000000000, char_line02 = 192'h000100000002000000000000000600000000000000000000, char_line03 = 192'h0001C0000003800000000000000380000000070000601800, char_line04 = 192'h0001C0000001C0000000180000018000000C038000701C00, char_line05 = 192'h000180000000C00000001C0000000000000E030000601C00, char_line06 = 192'h0001800000000000000E18000000FE000038030000600C00, char_line07 = 192'h00019C0000001FF008FC1000003FC0000060030000600800, char_line08 = 192'h0001FC00000FFFF00FC030000010700000E0330000600800, char_line09 = 192'h003FC0001FFC00000C102000000C600003303B0000600FC0, char_line0a = 192'h000300000E0000000C1861E0000C41C000300B0000607F00, char_line0b = 192'h0003018000003C000C1C5FE000045FE00026030000F9F800, char_line0c = 192'h00021FE00003FE000E18E0C0060FE070003E03000FE01800, char_line0d = 192'h0007E0F0007C1C000D98818007F3007803E0730000601800, char_line0e = 192'h0DF8E070003018000CF12100060300C03F60330000601800, char_line0f = 192'h0610C060003018000C72380006010C001860030C00681F00, char_line10 = 192'h0618C060003018000C7010000C01FE0000F803FE00707F80, char_line11 = 192'h0608B0600017F8000C7010000C7F060001AC1F800063C300, char_line12 = 192'h0601F060001900000C583000086106000123F30001E00300, char_line13 = 192'h063F00600001C0000CD83000006106000220030003618200, char_line14 = 192'h02030060004088000988380000610600042003001E606600, char_line15 = 192'h02033C600040870009082C0000610600082003003C603600, char_line16 = 192'h0203F06000C083800A00640000611E001020030018601C00, char_line17 = 192'h027F006000C081C00800460000010C002020030000601C00, char_line18 = 192'h06030060018080C0083CC300000104000020030000603F00, char_line19 = 192'h060300E0018080401FF0838000010000006003000060E380, char_line1a = 192'h060304E0010080001C0101E0000100000060030001E3C1F0, char_line1b = 192'h060303C0000F8000000601F8000100000020010000E400FE, char_line1c = 192'h020301C0000780000000007C000100000020010000400000, char_line1d = 192'h000001C00001000000000000000100000000010000000000, char_line1e = 192'h000000800000000000000000000100000000000000000000, char_line1f = 192'h000000000000000000000000000000000000000000000000; reg[6:0] char_bit; //显示位计算 reg[7:0] char_bit1; //显示位计算 always @(posedge CLK_25 or negedge RST_N) if(!RST_N) begin char_bit <= 7'd111;char_bit1<=8'd191; end else if(H_Cont == 10'd402) char_bit <= 7'd111; //显示最高位数据 else if(H_Cont == 10'd362) char_bit1<=8'd191; else if(H_Cont > 10'd402 && H_Cont < 10'd516&&y_dis>=231&&y_dis<=246) char_bit <= char_bit-1'b1; //依次显示后面的数据 else if(H_Cont > 10'd362 && H_Cont < 10'd556&&y_dis>=247&&y_dis<=278) char_bit1 <= char_bit1-1'b1; reg[23:0] vga_rgb; // VGA色彩显示寄存器 always @ (posedge CLK_25) if(!valid) vga_rgb <= 23'd0; //else if(H_Cont > 10'd442 && H_Cont < 10'd474) begin else if(H_Cont > 10'd362&& H_Cont < 10'd556) begin //555-363=192 case(y_dis) 10'd231: if(char_line0[char_bit]) vga_rgb <= 24'b11111111_00000000_00000000; //红色 else vga_rgb <= 24'b00000000_11111111_00000000; //绿色 10'd232: if(char_line1[char_bit]) vga_rgb <= 24'b11111111_00000000_00000000; else vga_rgb <= 24'b00000000_11111111_00000000; 10'd233: if(char_line2[char_bit]) vga_rgb <= 24'b11111111_00000000_00000000; else vga_rgb <= 24'b00000000_11111111_00000000; 10'd234: if(char_line3[char_bit]) vga_rgb <= 24'b11111111_00000000_00000000; else vga_rgb <= 24'b00000000_11111111_00000000; 10'd235: if(char_line4[char_bit]) vga_rgb <= 24'b11111111_00000000_00000000; else vga_rgb <= 24'b00000000_11111111_00000000; 10'd236: if(char_line5[char_bit]) vga_rgb <= 24'b11111111_00000000_00000000; else vga_rgb <= 24'b00000000_11111111_00000000; 10'd237: if(char_line6[char_bit]) vga_rgb <= 24'b11111111_00000000_00000000; else vga_rgb <= 24'b00000000_11111111_00000000; 10'd238: if(char_line7[char_bit]) vga_rgb <= 24'b11111111_00000000_00000000; else vga_rgb <= 24'b00000000_11111111_00000000; 10'd239: if(char_line8[char_bit]) vga_rgb <= 24'b11111111_00000000_00000000; else vga_rgb <= 24'b00000000_11111111_00000000; 10'd240: if(char_line9[char_bit]) vga_rgb <= 24'b11111111_00000000_00000000; else vga_rgb <= 24'b00000000_11111111_00000000; 10'd241: if(char_linea[char_bit]) vga_rgb <= 24'b11111111_00000000_00000000; else vga_rgb <= 24'b00000000_11111111_00000000; 10'd242: if(char_lineb[char_bit]) vga_rgb <= 24'b11111111_00000000_00000000; else vga_rgb <= 24'b00000000_11111111_00000000; 10'd243: if(char_linec[char_bit]) vga_rgb <= 24'b11111111_00000000_00000000; else vga_rgb <= 24'b00000000_11111111_00000000; 10'd244: if(char_lined[char_bit]) vga_rgb <= 24'b11111111_00000000_00000000; else vga_rgb <= 24'b00000000_11111111_00000000; 10'd245: if(char_linee[char_bit]) vga_rgb <= 24'b11111111_00000000_00000000; else vga_rgb <= 24'b00000000_11111111_00000000; 10'd246: if(char_linef[char_bit]) vga_rgb <= 24'b11111111_00000000_00000000; else vga_rgb <= 24'b00000000_11111111_00000000; 10'd247: if(char_line00[char_bit1]) vga_rgb <= 24'b11111111_00000000_00000000; else vga_rgb <= 24'b00000000_11111111_00000000; 10'd246: if(char_line01[char_bit1]) vga_rgb <= 24'b11111111_00000000_00000000; else vga_rgb <= 24'b00000000_11111111_00000000; 10'd249: if(char_line02[char_bit1]) vga_rgb <= 24'b11111111_00000000_00000000; else vga_rgb <= 24'b00000000_11111111_00000000; 10'd250: if(char_line03[char_bit1]) vga_rgb <= 24'b11111111_00000000_00000000; else vga_rgb <= 24'b00000000_11111111_00000000; 10'd251: if(char_line04[char_bit1]) vga_rgb <= 24'b11111111_00000000_00000000; else vga_rgb <= 24'b00000000_11111111_00000000; 10'd252: if(char_line05[char_bit1]) vga_rgb <= 24'b11111111_00000000_00000000; else vga_rgb <= 24'b00000000_11111111_00000000; 10'd253: if(char_line06[char_bit1]) vga_rgb <= 24'b11111111_00000000_00000000; else vga_rgb <= 24'b00000000_11111111_00000000; 10'd254: if(char_line07[char_bit1]) vga_rgb <= 24'b11111111_00000000_00000000; else vga_rgb <= 24'b00000000_11111111_00000000; 10'd255: if(char_line08[char_bit1]) vga_rgb <= 24'b11111111_00000000_00000000; else vga_rgb <= 24'b00000000_11111111_00000000; 10'd256: if(char_line09[char_bit1]) vga_rgb <= 24'b11111111_00000000_00000000; else vga_rgb <= 24'b00000000_11111111_00000000; 10'd257: if(char_line0a[char_bit1]) vga_rgb <= 24'b11111111_00000000_00000000; else vga_rgb <= 24'b00000000_11111111_00000000; 10'd258: if(char_line0b[char_bit1]) vga_rgb <= 24'b11111111_00000000_00000000; else vga_rgb <= 24'b00000000_11111111_00000000; 10'd259: if(char_line0c[char_bit1]) vga_rgb <= 24'b11111111_00000000_00000000; else vga_rgb <= 24'b00000000_11111111_00000000; 10'd260: if(char_line0d[char_bit1]) vga_rgb <= 24'b11111111_00000000_00000000; else vga_rgb <= 24'b00000000_11111111_00000000; 10'd261: if(char_line0e[char_bit1]) vga_rgb <= 24'b11111111_00000000_00000000; else vga_rgb <= 24'b00000000_11111111_00000000; 10'd262: if(char_line0f[char_bit1]) vga_rgb <= 24'b11111111_00000000_00000000; else vga_rgb <= 24'b00000000_11111111_00000000; 10'd263: if(char_line10[char_bit1]) vga_rgb <= 24'b11111111_00000000_00000000; else vga_rgb <= 24'b00000000_11111111_00000000; 10'd264: if(char_line11[char_bit1]) vga_rgb <= 24'b11111111_00000000_00000000; else vga_rgb <= 24'b00000000_11111111_00000000; 10'd265: if(char_line12[char_bit1]) vga_rgb <= 24'b11111111_00000000_00000000; else vga_rgb <= 24'b00000000_11111111_00000000; 10'd266: if(char_line13[char_bit1]) vga_rgb <= 24'b11111111_00000000_00000000; else vga_rgb <= 24'b00000000_11111111_00000000; 10'd267: if(char_line14[char_bit1]) vga_rgb <= 24'b11111111_00000000_00000000; else vga_rgb <= 24'b00000000_11111111_00000000; 10'd268: if(char_line15[char_bit1]) vga_rgb <= 24'b11111111_00000000_00000000; else vga_rgb <= 24'b00000000_11111111_00000000; 10'd269: if(char_line16[char_bit1]) vga_rgb <= 24'b11111111_00000000_00000000; else vga_rgb <= 24'b00000000_11111111_00000000; 10'd270: if(char_line17[char_bit1]) vga_rgb <= 24'b11111111_00000000_00000000; else vga_rgb <= 24'b00000000_11111111_00000000; 10'd271: if(char_line18[char_bit1]) vga_rgb <= 24'b11111111_00000000_00000000; else vga_rgb <= 24'b00000000_11111111_00000000; 10'd272: if(char_line19[char_bit1]) vga_rgb <= 24'b11111111_00000000_00000000; else vga_rgb <= 24'b00000000_11111111_00000000; 10'd273: if(char_line1a[char_bit1]) vga_rgb <= 24'b11111111_00000000_00000000; else vga_rgb <= 24'b00000000_11111111_00000000; 10'd274: if(char_line1b[char_bit1]) vga_rgb <= 24'b11111111_00000000_00000000; else vga_rgb <= 24'b00000000_11111111_00000000; 10'd275: if(char_line1c[char_bit1]) vga_rgb <= 24'b11111111_00000000_00000000; else vga_rgb <= 24'b00000000_11111111_00000000; 10'd276: if(char_line1d[char_bit1]) vga_rgb <= 24'b11111111_00000000_00000000; else vga_rgb <= 24'b00000000_11111111_00000000; 10'd277: if(char_line1e[char_bit1]) vga_rgb <= 24'b11111111_00000000_00000000; else vga_rgb <= 24'b00000000_11111111_00000000; 10'd278: if(char_line1f[char_bit1]) vga_rgb <= 24'b11111111_00000000_00000000; else vga_rgb <= 24'b00000000_11111111_00000000; default: vga_rgb <= 24'h000000; endcase end else vga_rgb <= 24'h000000; //r,g,b控制液晶屏颜色显示
assign vga_r = vga_rgb[23:16]; assign vga_g = vga_rgb[15:8]; assign vga_b = vga_rgb[7:0]; endmodule
效果图:
![](https://pic002.cnblogs.com/images/2011/153456/2011052623041836.jpg)