Verilog程序12、VGA显示字符

更新时间:2023-07-24 18:20:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

Verilog程序

本地地址:E:\FPGA\vedio\vga_char\src\vga_char.v

`timescale 1ns / 1ps

//////////////////////////////////////////////////////////////////////////////////

// Company:

// Engineer:

//

// Create Date: 17:15:28 11/27/2010

// Design Name:

// Module Name: vga_char

// Project Name:

// Target Devices:

// Tool versions:

// Description:

// 在液晶上显示字符

// Dependencies:

//

// Revision:

// Revision 0.01 - File Created

// Additional Comments:

//

//////////////////////////////////////////////////////////////////////////////////

module vga_char(clk,rst_n,vsync,hsync,r,g,b);

input clk,rst_n;

output vsync,hsync;

output[2:0] r;

output[2:0] g;

output[1:0] b;

reg vsync,hsync;

reg[10:0] x_cnt;

reg[9:0] y_cnt;

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////// 水平扫描参数的设定

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// parameter LinePeriod =12'd1040; //行同步周期

parameter H_SyncPulse=10'd120; //?型叫藕? parameter H_BackPorch=10'd61; //行同步后肩

parameter H_ActivePix=10'd806; //行同步数据有效

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Verilog程序

////////// 垂直扫描参数的设定

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// parameter FramePeriod=10'd666;

parameter V_SyncPulse=10'd6;

parameter V_BackPorch=10'd21;

parameter V_ActivePix=10'd604;

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////// 水平扫描计数x_cnt只负责计数从0计数计到1040

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// always @ (posedge clk or negedge rst_n)

if(!rst_n) x_cnt <= 1; else if(x_cnt == LinePeriod) x_cnt <= 1;

else x_cnt <= x_cnt+ 1; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////// 水平扫描信号vsync产生 在0到120时为低电平

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// always @ (posedge clk or negedge rst_n)

if(!rst_n) hsync <= 1'b1;

else if(x_cnt == 1) hsync <= 1'b0; //产生hsync信号

else if(x_cnt == H_SyncPulse+1) hsync <= 1'b1;

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////// 垂直扫描计数

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// always @ (posedge clk or negedge rst_n)

if(!rst_n) y_cnt <= 1; else if(y_cnt == FramePeriod) y_cnt <= 1;

else if(x_cnt == LinePeriod) y_cnt <= y_cnt+1;

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////// 垂直扫描信号hsync产??

Verilog程序

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// always @ (posedge clk or negedge rst_n)

if(!rst_n) vsync <= 1'b1;

else if(y_cnt == 1) vsync <= 1'b0; //产生vsync信号

else if(y_cnt == V_SyncPulse+1) vsync <= 1'b1;

wire valid; //有效显示区标志

assign valid =

(x_cnt >= (H_SyncPulse+H_BackPorch)) &&

(x_cnt < (H_SyncPulse+H_BackPorch+H_ActivePix)) &&

(y_cnt >= (V_SyncPulse+V_BackPorch)) &&

(y_cnt < (V_SyncPulse+V_BackPorch+V_ActivePix));

wire[9:0] x_pos=x_cnt-H_SyncPulse-H_BackPorch;

wire[9:0] y_pos=y_cnt-V_SyncPulse-V_BackPorch;

//字符的字模

reg[7:0] vga_rgb;

/* 济(0) 大(1)

{0x00,0x80}, 00800100

{0x20,0x40}, 20400100

{0x17,0xFE}, 17fe0100

{0x12,0x08}, 12080100

{0x81,0x10}, 81100100

{0x40,0xA0}, 40a0fefe

{0x40,0x40}, 40400100

{0x11,0xB0}, 11b00100

{0x16,0x0E}, 160e0280

{0x21,0x10}, 21100280

{0xE1,0x10}, e1100440

{0x21,0x10}, 21100440

{0x21,0x10}, 21108020

{0x22,0x10}, 22101010

{0x22,0x10}, 22102008

{0x04,0x10}, 4010c006

{0x01,0x00},

{0x01,0x00},

Verilog程序

{0x01,0x00},

{0x01,0x00},

{0x01,0x00},

{0xFF,0xFE},

{0x01,0x00},

{0x01,0x00},

{0x02,0x80},

{0x02,0x80},

{0x04,0x40},

{0x04,0x40},

{0x08,0x20},

{0x10,0x10},

{0x20,0x08},

{0xC0,0x06},

*/

//此时的数字取模,如是汉字要第一个汉字的第一行加上第二个汉字的第一行。以此类推

parameter line0 = 32'h00800100,

line1 = 32'h20400100,

line2 = 32'h17fe0100,

line3 = 32'h12080100,

line4 = 32'h81100100,

line5 = 32'h40a0fefe,

line6 = 32'h40400100,

line7 = 32'h11b00100,

line8 = 32'h160e0280,

line9 = 32'h21100280,

linea = 32'he1100440,

lineb = 32'h21100440,

linec = 32'h21108020,

lined = 32'h22101010,

linee = 32'h22102008,

linef = 32'h4010c006;

//显示位数

reg[4:0] char_bit;

always @ (posedge clk or negedge rst_n)

if(!rst_n) char_bit <= 1'h1f;

else if(x_pos == 10'd384) char_bit <= 5'd32; //产生vsync信号

else if(x_pos > 10'd384 && x_pos <= 10'd416) char_bit <= char_bit - 1'b1;

Verilog程序

always @(posedge clk)

if(!valid)

vga_rgb <= 8'h00;

else if(x_pos > 10'd384 && x_pos <= 10'd416) begin

case(y_pos)

10'd292: if(line0[char_bit]) vga_rgb <= 8'b111_000_00;

else vga_rgb <= 8'b000_111_00;

10'd293: if(line1[char_bit]) vga_rgb <= 8'b111_000_00;

else vga_rgb <= 8'b000_111_00;

10'd294: if(line2[char_bit]) vga_rgb <= 8'b111_000_00;

else vga_rgb <= 8'b000_111_00;

10'd295: if(line3[char_bit]) vga_rgb <= 8'b111_000_00;

else vga_rgb <= 8'b000_111_00;

10'd296: if(line4[char_bit]) vga_rgb <= 8'b111_000_00;

else vga_rgb <= 8'b000_111_00;

10'd297: if(line5[char_bit]) vga_rgb <= 8'b111_000_00;

else vga_rgb <= 8'b000_111_00;

10'd298: if(line6[char_bit]) vga_rgb <= 8'b111_000_00;

else vga_rgb <= 8'b000_111_00;

10'd299: if(line7[char_bit]) vga_rgb <= 8'b111_000_00;

else vga_rgb <= 8'b000_111_00;

10'd300: if(line8[char_bit]) vga_rgb <= 8'b111_000_00;

else vga_rgb <= 8'b000_111_00;

10'd301: if(line9[char_bit]) vga_rgb <= 8'b111_000_00;

Verilog程序

else vga_rgb <= 8'b000_111_00;

10'd302: if(linea[char_bit]) vga_rgb <= 8'b111_000_00;

else vga_rgb <= 8'b000_111_00;

10'd303: if(lineb[char_bit]) vga_rgb <= 8'b111_000_00;

else vga_rgb <= 8'b000_111_00;

10'd304: if(linec[char_bit]) vga_rgb <= 8'b111_000_00;

else vga_rgb <= 8'b000_111_00;

10'd305: if(lined[char_bit]) vga_rgb <= 8'b111_000_00;

else vga_rgb <= 8'b000_111_00;

10'd306: if(linee[char_bit]) vga_rgb <= 8'b111_000_00;

else vga_rgb <= 8'b000_111_00;

10'd307: if(linef[char_bit]) vga_rgb <= 8'b111_000_00;

else vga_rgb <= 8'b000_111_00; default: vga_rgb <= 8'hff;

endcase

end

else

vga_rgb <= 8'h000_000_11;

assign r = vga_rgb[7:5];

assign g = vga_rgb[4:2];

assign b = vga_rgb[1:0];

endmodule

本地地址:E:\FPGA\vedio\vga_char\src\i_vga_char.ucf

NET "clk" LOC = P54;

NET "rst_n" LOC = P38;

NET "hsync" LOC = P39;

NET "vsync" LOC = P35;

NET "r<2>" LOC = P70;

Verilog程序

NET "r<1>" LOC = P68; NET "r<0>" LOC = P67; NET "g<2>" LOC = P52; NET "g<1>" LOC = P51; NET "g<0>" LOC = P50; NET "b<1>" LOC = P44; NET "b<0>" LOC = P43; 运行效果图:

放大图:

Verilog程序

本文来源:https://www.bwwdw.com/article/srnm.html

Top