基于FPGA的VGA协议实现
目录
一、VGA简介
二、VGA引脚的定义
三、VGA显示原理:
四、VESA标准下的VGA时序:
五、VGA显示模式以及相关参数:
六、数字信号与模拟信号的转换
实战演练一:VGA显示彩条
1、实验目标
2、各模块框图及其波形图
3、模块代码
4、实验结果编辑
实战演练二:显示自定义字符:我爱交大
1、实验目标:
2、各模块框图及其波箱图
3、模块代码:
4、实验结果
一、VGA简介
VGA,英文全称"Video Graphics Array”,译为视频图形阵列,是一种使用模拟信号进行视频传输的标准协议,由IBM公司于1987年推出,因其分辨率高、显示速度快、颜色丰富等优点,广泛应用于彩色显示器领域。
VGA接口:
母头:
公头:
VGA连接线两头都是公头:
使用VGA连接线将计算机和VGA显示器连接起来
二、VGA引脚的定义
1(红基色)、2(绿基色)、3(蓝基色)、13(行同步信号)、14(场同步信号)拐角最为重要
RGB色彩显示标准:根据三原色中红色、绿色、蓝色所占比例以及三原色相互之间的叠加来显示各式各样的颜色
三、VGA显示原理:
VGA显示器逐行扫描原理:逐行扫描是扫描从屏幕左上角一点开始,从左至右逐点扫描,每扫描完一行,电子束回到屏幕的左边下一行的起始位置。在这期间,CRT对电子束进行消隐,每行结束时,用行同步信号HS进行同步;当扫描完所有的行,形成一帧,用场同步信号VS进行帧同步,并使扫描回到屏幕左上方,同时进行场消隐,开始下一帧。
四、VESA标准下的VGA时序:
①行同步时序图
Video图像信息,GSync行同步信号
行同步信号自上升沿起到下一个上升沿止为一个周期,这个周期成为行扫描周期,一个完整的行扫描周期包含六个部分:同步、后延、左边框、有效图像、右边框、前沿。这六个部分的基本单位是一个像素,在图像传输过程中,每一个时钟周期传输一个像素点,这六个部分的基本单位也可以称作一个像素时钟周期,在一个完整的行扫描周期内,图像信息是在行同步信号的同步下完成一行图像的扫描,图像信息只有在“有效图像阶段”才是有效的,行同步信号只在同步阶段才保持高电平。
②场同步时序图
场同步信号自上升沿起到下一个上升沿止为一个周期,这个周期成为场扫描周期,一个完整的场扫描周期包含六个部分:同步、后延、左边框、有效图像、右边框、前沿。这六个部分的基本单位是一行。在一个完整的场扫描周期中,图像信息需要在行同步信号和场同步信号的共同作用下完成一帧图像的显示,图像信息只有在“场有效图像”、‘’行有效图像“两个阶段才是有效的
③VGA时序图
红色和黄色相交的位置就是VGA图像的最终显示区域
五、VGA显示模式以及相关参数:
显示模式640x480@60,640表示在一个完整的行扫描周期中,有效显示图像每一行有640个像素点,480表示一帧完整的图像有480行
640x480≈30万,表示一帧图片约包含30万个像素点,60是帧率表示在640x480@60显示模式下,每秒刷新图像60次,也就是每秒显示60帧图像。时钟25.175MHZ表示VGA显示的工作时钟,就是像素点扫描的频率,96表示在同步阶段保持96个时钟周期,40表示在后延阶段保持40个时钟周期。行扫描周期800等于行同步信号的六个阶段时钟周期相加
注:行扫描周期x场扫描周期x帧率=时钟F
例:在显示模式640x480@75中,840x500x75=31500000HZ=31.5MHZ
六、数字信号与模拟信号的转换
VGA传输协议传输的是模拟信号,VGA显示器只能识别模拟信号,尔FPGA处理的是数字信号,将数字信号转换为模拟限号有两种方式:AD7123等转换芯片(稳定但成本稍高)、权电阻网络(成本低)
权电阻网络原理图
征途系列开发板使用RGB565图像模式,每个像素点的位宽是16位宽(5+6+5)(红+绿+蓝),在图像显示时FPGA通过VGA_D端口将图像信号传输到权电阻网络,经过权电阻网络的数模转换,生成能够被VGA识别的图像信号VGA_R,VGA_G,VGA_B,生成的三路模拟信号的电压范围是0~0.714V,0V表示无色,0.714V表示满色
实战演练一:VGA显示彩条
1、实验目标
驱动VGA显示器,在640x480@60显示模式下显示十种颜色等宽彩条的显示
2、各模块框图及其波形图
①②顶层模块:
rgb[15:0]:图像信息,使用的是RGB565图像模式,所以位宽为16位,此信号由FPGA产生然后传输给权电阻网络
hsync:行同步信号,此信号由FPGA产生然后传输给权电阻网络
vsync:场同步限号,此信号由FPGA产生然后传输给权电阻网络
注:locked锁定信号只有为高电平的时候,分频后的时钟信号才是有效的,所以需要将系统复位信号sys_rst_n和locked进行”与''操作后再接入Vga_pic和Vga_ctrl的复位信号
②时钟分频模块:将50MHZ的系统时钟分频成25MHZ,fpga系统时钟为50MHZ,而640x480@60显示模式下时钟频率为25.175MHZ,由于25.175MHZ的频率不太方便生成。为了便于时钟的生成,这里使用25MHZ代替25.175MHZ
CLK_in:输入50MHZ的系统时钟
areset:异步复位信号
CLK_out:输出25Mhz的输出时钟
locked:锁定信号,此信号为高电平则CLK_out才可以被使用
③VGA_ctrl模块:生成rgb[15:0]、hsync、vsync三路信号,以及图像的横纵坐标
Vga_clk:分频后产生的25MHZ的时
sys_rst_n:系统复位信号
Pix_data[15:0]:图像信息,和rgb[15:0]相同
rgb[15:0]:图像信息,使用的是RGB565图像模式,所以位宽为16位
hsync:行同步信号
vsync:场同步限号
Pix_x:有效图像横坐标
Pix_y:有效图像纵坐标
VGA_ctrl模块信号波形图:
cnt_h[9:0]:行计数器,对行扫描周期计数,最大值799
cnt_v[9:0]:场计数器,对场扫描周期计数,行计数器完成了一个完整的行扫描周期的计数,场计数器加一,最大值524
hsync:行同步信号,在行计数器计数到0~95时(行同步阶段)时拉高,其他时间为低电平
vsync:场同步信号,在场计数器计数到0~1时(行场同步阶段)时拉高,其他时间为低电平
rgb_valid:图像有效信号,行计数器计数到有效图像范围144~783并且场计数器计数到有效图像范围35~514,此信号为高电平
Pix_x:有效图像横坐标,有效图像为高电平时,在数值上等于行计数器数值减去行同步、行后延、行边框三个阶段数值之和
Pix_y:有效图像纵坐标,有效图像为高电平时,在数值上等于场计数器数值减去场同步、场后延、场边框三个阶段数值之和
rgb[15:0]:有效图像信息,初值全零表示显示黑色,当图像有效信号rgb_valid为高电平时,rgb[15:0]=Pix_data[15:0]
图④像信息生成模块:根据有效图像坐标信息产生要显示的图像数据
vga_clk:分频后的时钟
sys_rst_n:复位信号 Pix_x:横坐标 Pix_y:纵坐标
Pix_data[15:0]:生成的图像信息
3、模块代码
clk_gen:调用pll锁相环
vga_ctrl:
`timescale 1ns/1nsmodule vga_ctrl ( //VGA控制模块input wire vga_clk ,input wire sys_rst_n ,input wire [15:0] pix_data ,//图像数据output wire [9:0] pix_x ,output wire [9:0] pix_y ,output wire hsync ,//行扫描信号output wire vsync ,//场扫描信号output wire [15:0] rgb
);parameter H_SYNC = 10'd96 , //行同步H_BACK = 10'd40 , //行时序后沿H_LEFT = 10'd8 , //行时序左边框H_VALID = 10'd640 , //行有效数据H_RIGHT = 10'd8 , //行时序右边框H_FRONT = 10'd8 , //行时序前沿H_TOTAL = 10'd800 ; //行扫描周期
parameter V_SYNC = 10'd2 , //场同步V_BACK = 10'd25 , //场时序后沿V_TOP = 10'd8 , //场时序上边框V_VALID = 10'd480 , //场有效数据V_BOTTOM = 10'd8 , //场时序下边框V_FRONT = 10'd2 , //场时序前沿V_TOTAL = 10'd525 ; //场扫描周期reg [9:0] cnt_h ;
reg [9:0] cnt_v ;
wire pix_data_req ;
wire rgb_valid ; //图像有效信号,行扫描信号位于有效图像范围并且场扫描信号位于有效图像范围时图像有效信号为高电平//cnt_h:行同步信号计数器
always @(posedge vga_clk or negedge sys_rst_n ) beginif(sys_rst_n == 1'b0)cnt_h <= 10'd0;else if(cnt_h == H_TOTAL - 1'b1 )cnt_h <= 10'd0;elsecnt_h <= cnt_h + 10'd1;
end//hsync:行同步信号
assign hsync = (cnt_h <= H_SYNC - 1'd1) ? 1'b1 : 1'b0 ;//cnt_v:场同步信号计数器
always @(posedge vga_clk or negedge sys_rst_n ) beginif(sys_rst_n == 1'b0)cnt_v <= 10'd0;else if((cnt_v == V_TOTAL - 1'd1) && (cnt_h == H_TOTAL-1'd1))cnt_v <= 10'd0;else if(cnt_h == H_TOTAL -10'd1 )cnt_v <= cnt_v + 1'd1;elsecnt_v <= cnt_v;
end
//vsync:场同步信号
assign vsync = (cnt_v <= V_SYNC - 1'd1) ? 1'b1 : 1'b0 ;//图像有效信号
assign rgb_valid = (((cnt_h >= H_SYNC + H_BACK + H_LEFT)&& (cnt_h < H_SYNC + H_BACK + H_LEFT + H_VALID))&&((cnt_v >= V_SYNC + V_BACK + V_TOP)&& (cnt_v < V_SYNC + V_BACK + V_TOP + V_VALID)))? 1'b1 : 1'b0;assign pix_data_req = (((cnt_h >= H_SYNC + H_BACK + H_LEFT - 1'b1)&& (cnt_h < H_SYNC + H_BACK + H_LEFT + H_VALID - 1'b1))&&((cnt_v >= V_SYNC + V_BACK + V_TOP)&& (cnt_v < V_SYNC + V_BACK + V_TOP + V_VALID)))? 1'b1 : 1'b0;//pix_x,pix_y:VGA有效显示区域像素点坐标
assign pix_x = (pix_data_req == 1'b1)? (cnt_h - (H_SYNC + H_BACK + H_LEFT-1'b1)) : 10'h3ff;
assign pix_y = (pix_data_req == 1'b1)? (cnt_v - (V_SYNC + V_BACK + V_TOP)) : 10'h3ff;//rgb:输出像素点色彩信息
assign rgb = (rgb_valid == 1'b1) ? pix_data : 16'b0 ;
endmodule
vga_pic:
`timescale 1ns/1ns
module vga_pic
(input wire vga_clk , //输入工作时钟,频率25MHzinput wire sys_rst_n , //输入复位信号,低电平有效input wire [9:0] pix_x , //输入VGA有效显示区域像素点X轴坐标input wire [9:0] pix_y , //输入VGA有效显示区域像素点Y轴坐标output reg [15:0] pix_data //输出像素点色彩信息
);parameter H_VALID = 10'd640 , //行有效数据V_VALID = 10'd480 ; //场有效数据parameter RED = 16'hF800, //红色ORANGE = 16'hFC00, //橙色YELLOW = 16'hFFE0, //黄色GREEN = 16'h07E0, //绿色CYAN = 16'h07FF, //青色BLUE = 16'h001F, //蓝色PURPPLE = 16'hF81F, //紫色BLACK = 16'h0000, //黑色WHITE = 16'hFFFF, //白色GRAY = 16'hD69A; //灰色always@(posedge vga_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0)pix_data <= 16'd0;else if((pix_x >= 0) && (pix_x < (H_VALID/10)*1))pix_data <= RED;else if((pix_x >= (H_VALID/10)*1) && (pix_x < (H_VALID/10)*2))pix_data <= ORANGE;else if((pix_x >= (H_VALID/10)*2) && (pix_x < (H_VALID/10)*3))pix_data <= YELLOW;else if((pix_x >= (H_VALID/10)*3) && (pix_x < (H_VALID/10)*4))pix_data <= GREEN;else if((pix_x >= (H_VALID/10)*4) && (pix_x < (H_VALID/10)*5))pix_data <= CYAN;else if((pix_x >= (H_VALID/10)*5) && (pix_x < (H_VALID/10)*6))pix_data <= BLUE;else if((pix_x >= (H_VALID/10)*6) && (pix_x < (H_VALID/10)*7))pix_data <= PURPPLE;else if((pix_x >= (H_VALID/10)*7) && (pix_x < (H_VALID/10)*8))pix_data <= BLACK;else if((pix_x >= (H_VALID/10)*8) && (pix_x < (H_VALID/10)*9))pix_data <= WHITE;else if((pix_x >= (H_VALID/10)*9) && (pix_x < H_VALID))pix_data <= GRAY;elsepix_data <= BLACK;
endmodule
vga_colorbar:
`timescale 1ns/1nsmodule vga_colorbar
(input wire sys_clk , input wire sys_rst_n , output wire hsync , output wire vsync , output wire [15:0] rgb
);wire vga_clk ;
wire locked ;
wire rst_n ;
wire [9:0] pix_x ;
wire [9:0] pix_y ;
wire [15:0] pix_data; assign rst_n = (sys_rst_n & locked);clk_gen clk_gen_inst
(.areset (~sys_rst_n ), .inclk0 (sys_clk ), .c0 (vga_clk ), .locked (locked )
);vga_ctrl vga_ctrl_inst
(.vga_clk (vga_clk ), .sys_rst_n (rst_n ), .pix_data (pix_data ), .pix_x (pix_x ), .pix_y (pix_y ), .hsync (hsync ), .vsync (vsync ), .rgb (rgb )
);vga_pic vga_pic_inst
(.vga_clk (vga_clk ), .sys_rst_n (rst_n ), .pix_x (pix_x ), .pix_y (pix_y ), .pix_data (pix_data ) );endmodule
4、实验结果
实战演练二:显示自定义字符:我爱交大
1、实验目标:
在vga显示屏上,显示点阵大小64x64,字宽x字高=56x56,显示模式640x480@60,背景为黑色的野火科技四个字符,如下:
2、各模块框图及其波箱图
顶层模块:
时钟分频模块:
vga控制模块:
图像信息生成模块:
图像信息生成模块波形图:
Vga_clk:经过时钟分频模块分频后的时钟 sys_rst_n:系统复位信号 Pix_x:由vga_ctrl产生的有效图像横坐标 Pix_y:由vga_ctrl产生的有效图像纵坐标 char_x:字符区域横坐标 char_y:字符区域纵坐标 Pix_data[15:0]:图像信息
3、模块代码:
顶层模块vga_char:
`timescale 1ns/1nsmodule vga_char
(input wire sys_clk , input wire sys_rst_n , output wire hsync , output wire vsync , output wire [15:0] rgb
);wire vga_clk ;
wire locked ;
wire rst_n ;
wire [9:0] pix_x ;
wire [9:0] pix_y ;
wire [15:0] pix_data; assign rst_n = (sys_rst_n & locked);clk_gen clk_gen_inst
(.areset (~sys_rst_n ), .inclk0 (sys_clk ), .c0 (vga_clk ), .locked (locked )
);vga_ctrl vga_ctrl_inst
(.vga_clk (vga_clk ), .sys_rst_n (rst_n ), .pix_data (pix_data ), .pix_x (pix_x ), .pix_y (pix_y ), .hsync (hsync ), .vsync (vsync ), .rgb (rgb )
);vga_pic vga_pic_inst
(.vga_clk (vga_clk ), .sys_rst_n (rst_n ), .pix_x (pix_x ), .pix_y (pix_y ), .pix_data (pix_data ) );endmodule
时钟分频模块:clk_gen,调用pll锁相环
vga控制模块:
`timescale 1ns/1nsmodule vga_ctrl
(input wire vga_clk , input wire sys_rst_n , input wire [15:0] pix_data , output wire [9:0] pix_x , output wire [9:0] pix_y , output wire hsync , output wire vsync , output wire [15:0] rgb
);parameter H_SYNC = 10'd96 , //行同步H_BACK = 10'd40 , //行时序后沿H_LEFT = 10'd8 , //行时序左边框H_VALID = 10'd640 , //行有效数据H_RIGHT = 10'd8 , //行时序右边框H_FRONT = 10'd8 , //行时序前沿H_TOTAL = 10'd800 ; //行扫描周期
parameter V_SYNC = 10'd2 , //场同步V_BACK = 10'd25 , //场时序后沿V_TOP = 10'd8 , //场时序上边框V_VALID = 10'd480 , //场有效数据V_BOTTOM = 10'd8 , //场时序下边框V_FRONT = 10'd2 , //场时序前沿V_TOTAL = 10'd525 ; //场扫描周期//wire define
wire rgb_valid ; //VGA有效显示区域
wire pix_data_req ; //像素点色彩信息请求信号//reg define
reg [9:0] cnt_h ; //行同步信号计数器
reg [9:0] cnt_v ; //场同步信号计数器//cnt_h:行同步信号计数器
always@(posedge vga_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0)cnt_h <= 10'd0 ;else if(cnt_h == H_TOTAL - 1'b1)cnt_h <= 10'd0 ;elsecnt_h <= cnt_h + 1'd1 ;//hsync:行同步信号
assign hsync = (cnt_h <= H_SYNC - 1'd1) ? 1'b1 : 1'b0 ;//cnt_v:场同步信号计数器
always@(posedge vga_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0)cnt_v <= 10'd0 ;else if((cnt_v == V_TOTAL - 1'd1) && (cnt_h == H_TOTAL-1'd1))cnt_v <= 10'd0 ;else if(cnt_h == H_TOTAL - 1'd1)cnt_v <= cnt_v + 1'd1 ;elsecnt_v <= cnt_v ;//vsync:场同步信号
assign vsync = (cnt_v <= V_SYNC - 1'd1) ? 1'b1 : 1'b0 ;//rgb_valid:VGA有效显示区域
assign rgb_valid = (((cnt_h >= H_SYNC + H_BACK + H_LEFT)&& (cnt_h < H_SYNC + H_BACK + H_LEFT + H_VALID))&&((cnt_v >= V_SYNC + V_BACK + V_TOP)&& (cnt_v < V_SYNC + V_BACK + V_TOP + V_VALID)))? 1'b1 : 1'b0;//pix_data_req:像素点色彩信息请求信号,超前rgb_valid信号一个时钟周期
assign pix_data_req = (((cnt_h >= H_SYNC + H_BACK + H_LEFT - 1'b1)&& (cnt_h < H_SYNC + H_BACK + H_LEFT + H_VALID - 1'b1))&&((cnt_v >= V_SYNC + V_BACK + V_TOP)&& (cnt_v < V_SYNC + V_BACK + V_TOP + V_VALID)))? 1'b1 : 1'b0;//pix_x,pix_y:VGA有效显示区域像素点坐标
assign pix_x = (pix_data_req == 1'b1)? (cnt_h - (H_SYNC + H_BACK + H_LEFT - 1'b1)) : 10'h3ff;
assign pix_y = (pix_data_req == 1'b1)? (cnt_v - (V_SYNC + V_BACK + V_TOP)) : 10'h3ff;//rgb:输出像素点色彩信息
assign rgb = (rgb_valid == 1'b1) ? pix_data : 16'b0 ;endmodule
图像信息生成模块:
module vga_pic (input wire vga_clk,input wire sys_rst_n,input wire [9:0] pix_x,input wire [9:0] pix_y,output reg [15:0] pix_data
);
parameter CHAR_B_H = 10'd192 ,//字符开始X轴坐标CHAR_B_V = 10'd208 ;//字符开始Y轴坐标parameter CHAR_W = 10'd256,//字符宽度CHAR_H = 10'd64 ;//字符高度parameter BLACK = 16'h0000,GOLDEN = 16'hFEC0;reg [CHAR_W-1:0] char [CHAR_H -1:0]; //存储器变量,位宽256,深度64,表示char有64个存储单元,每个单元能存储的位宽是256wire [9:0] char_x;
wire [9:0] char_y;assign char_x = (((pix_x >= CHAR_B_H) && (pix_x < CHAR_B_H + CHAR_W)) && ((pix_y >= CHAR_B_V) && (pix_y < CHAR_B_V + CHAR_H)))? (pix_x - CHAR_B_H) : 10'h3ff;assign char_y = (((pix_x >= CHAR_B_H) && (pix_x < CHAR_B_H + CHAR_W)) && ((pix_y >= CHAR_B_V) && (pix_y < CHAR_B_V + CHAR_H)))? (pix_y - CHAR_B_V) : 10'h3ff;always@(posedge vga_clk)
beginchar[0]<=256'h0000000000000000000000000000000000000000000000000000000000000000;
char[1]<=256'h0000000000000000000000000000000000000000000000000000000000000000;
char[2]<=256'h0000000000070000000000000000001E0000000003C000000000000000E00000;
char[3]<=256'h00000000038F800000000000000000FE0000000003E000000000000000F80000;
char[4]<=256'h000000000FCFE0000000000000001FFF0000000003F000000000000000FE0000;
char[5]<=256'h000000003FCFEF00000000000007FFFF0000000001F800000000000001FE0000;
char[6]<=256'h00000001FFDFCF800000000007FFFFFF0000000001FC00000000000001F80000;
char[7]<=256'h0000001FFFDF87E0000001FFFFFFFFC00000000001FC00000000000001F00000;
char[8]<=256'h000003FFFE1F07F0000001FFFFC003E00000000000FC000E0000000003F00000;
char[9]<=256'h00003FFFC01F03F80000001C03C007F00000000000F8001E0000000003F00000;
char[10]<=256'h00003F0F803F03F80000001E03E00FF00000000000F8007F0000000003E00000;
char[11]<=256'h0000000F803E03F80000001F01F01FC00000000000F000FF0000000007E00000;
char[12]<=256'h0000001F803E01F80000001F81F83F800000FFFFFFFFFFFF0000000007E00000;
char[13]<=256'h0000001F007E01F80000001F81F83E000000FFFFFFFFFFFF0000000007C0001C;
char[14]<=256'h0000001F007C01F00000000F81F87C000000000000000000000000000FC0003C;
char[15]<=256'h0000003F007C00E00000000F81F0F80000000007800E0000000000000FC000FE;
char[16]<=256'h0000003E00FC007000001C0F81F1F0000000000FC00F8000000000000F8001FE;
char[17]<=256'h0000003E00F801F800001C0F01E3C0780000003FC007E0000003FFFFFFFFFFFF;
char[18]<=256'h0000007E00F803FC00003C0E000381FC0000007FC003F8000003FFFFFFFFFFFF;
char[19]<=256'h0007FFFFFFFFFFFC00007FFFFFFFFFFC000000FF0001FC00000000001F000000;
char[20]<=256'h0007FFFFFFFFFFFC0000FFFFFFFFFFFC000001FC0000FF00000000003F000000;
char[21]<=256'h000000FC01F000000000F801C00003F8000007F800007F80000000003F000000;
char[22]<=256'h000000F801F000000003F003F00007E000000FF8003C7F80000000007F000000;
char[23]<=256'h000000F803F01E000007F003F0000F8000003FB8003F3F80000000007F000000;
char[24]<=256'h000001F803E03E00000FE007F0001F0000007F38007F9F8000000000FF000000;
char[25]<=256'h000001F003E07F00000FE007E0003E000001FC3800FF9F8000000000FF000000;
char[26]<=256'h000001F003E0FF00000F8007C00078000003F03800FE0F8000000001FF000000;
char[27]<=256'h000003F07BE1FE000000000FC001FC00000FC03C01FC0F0000000001FF000000;
char[28]<=256'h000003E3FFC3F8000001FFFFFFFFFE00003F003C03F8000000000003FF000000;
char[29]<=256'h000003FFE7C7F0000001FFFFFFFFFE00003C003C03F0000000000007EF000000;
char[30]<=256'h000007FF07CFE0000000003F000000000000003C07E0000000000007EF800000;
char[31]<=256'h00001FF807DFC0000000003E000700000000003C0FC000000000000FCF800000;
char[32]<=256'h0001FFE007FF80000000007E001F80000000003E1F8000000000001F87800000;
char[33]<=256'h001FFFC00FFF0000000000FFFFFFC0000000003E3F8000000000001F87800000;
char[34]<=256'h01FFFF800FFE0000000000FFFFFFC0000000001E7F0000000000003F07C00000;
char[35]<=256'h01FFFF800FF80000000001FE007F80000000001FFE0000000000007E07C00000;
char[36]<=256'h01FF1F000FF00000000003FE00FE00000000001FFC000000000000FC07C00000;
char[37]<=256'h00FC1F000FE00000000007FF01FC00000000001FF8000000000001F803E00000;
char[38]<=256'h00F03F001FC0070000000FDF03F800000000001FE0000000000003F803E00000;
char[39]<=256'h00003E007FC00F0000001F8F8FF000000000000FC0000000000007F003F00000;
char[40]<=256'h00003E00FFE00E0000003F0F9FC000000000003FC000000000000FE001F80000;
char[41]<=256'h00007E03FFE01E0000007E07FF8000000000007FE000000000001FC001FC0000;
char[42]<=256'h00007C0FF7F01E000001F807FF000000000001FFF000000000007F0001FE0000;
char[43]<=256'h00007C3FC3F83C000003F003FC000000000007FBFC0000000000FE0000FF0000;
char[44]<=256'h0000FC7F03F83C000007E007FC00000000001FE1FF0000000001FC0000FF8000;
char[45]<=256'h0000F9FC01FE7C00001F801FFF00000000007F80FFC000000007F000007FE000;
char[46]<=256'h00E1FFF001FF7800003F007FFFF000000001FE007FFC0000001FE000003FFC00;
char[47]<=256'h00FFFF8000FFF80000FC01FF7FFFE0000007F8003FFFFC00003F8000001FFC00;
char[48]<=256'h00FFFC00007FF80001F80FFC1FFFF800003FE0001FFFFC0000FE0000001FFC00;
char[49]<=256'h003FF000003FF80007E07FE007FFF80001FF000007FFF80007F80000000FE000;
char[50]<=256'h001FE000001FF8000F87FF0000FFE0000FF8000000FFE0001FC0000000078000;
char[51]<=256'h000F80000003F8000E3FF000001FC0003FC00000001FC0007F00000000000000;
char[52]<=256'h000E000000007800003E0000000000003C000000000000007800000000000000;
char[53]<=256'hFFFFFFFFFFFFFF80FFFFFFFFFFFFFF80FFFFFFFFFFFFFF80FFFFFFFFFFFFFF80;
char[54]<=256'hFFFFFFFFFFFFFF80FFFFFFFFFFFFFF80FFFFFFFFFFFFFF80FFFFFFFFFFFFFF80;
char[55]<=256'hFFFFFFFFFFFFFF80FFFFFFFFFFFFFF80FFFFFFFFFFFFFF80FFFFFFFFFFFFFF80;
char[56]<=256'h0000000000000000000000000000000000000000000000000000000000000000;
char[57]<=256'h0000000000000000000000000000000000000000000000000000000000000000;
char[58]<=256'h0000000000000000000000000000000000000000000000000000000000000000;
char[59]<=256'h0000000000000000000000000000000000000000000000000000000000000000;
char[60]<=256'h0000000000000000000000000000000000000000000000000000000000000000;
char[61]<=256'h0000000000000000000000000000000000000000000000000000000000000000;
char[62]<=256'h0000000000000000000000000000000000000000000000000000000000000000;
char[63]<=256'h0000000000000000000000000000000000000000000000000000000000000000;
endalways@(posedge vga_clk or negedge sys_rst_n)beginif(sys_rst_n == 1'b0)pix_data <= BLACK;else if((((pix_x >= CHAR_B_H-1'b1) && (pix_x <= CHAR_B_H + CHAR_W-1'b1)) && ((pix_y >= CHAR_B_V) && (pix_y <= CHAR_B_V + CHAR_H)))&& (char[char_y][10'd255- char_x] == 1'b1))pix_data <= GOLDEN;else pix_data <= BLACK;
endendmodule
4、实验结果
相关文章:
基于FPGA的VGA协议实现
目录 一、VGA简介 二、VGA引脚的定义 三、VGA显示原理: 四、VESA标准下的VGA时序: 五、VGA显示模式以及相关参数: 六、数字信号与模拟信号的转换 实战演练一:VGA显示彩条 1、实验目标 2、各模块框图及其波形图 3、模块代…...
Java线程池的抛弃策略
Java线程池的抛弃策略 Java线程池是Java并发编程中非常重要的一个组件。它通过重用已创建的线程来减少线程创建和销毁的开销,从而提高应用程序的性能和响应速度。然而,当线程池中的任务数量超过其处理能力时,就需要一种机制来处理新提交的任…...
【python】Sklearn—Cluster
参考学习来自 10种聚类算法的完整python操作示例 文章目录 聚类数据集亲和力传播——AffinityPropagation聚合聚类——AgglomerationClusteringBIRCH——Birch(✔)DBSCAN——DBSCANK均值——KMeansMini-Batch K-均值——MiniBatchKMeans均值漂移聚类——…...
测试开发面经分享,面试七天速成 DAY 1
1. get、post、put、delete的区别 a. get请求: i. 用于从服务器获取资源。请求参数附加在URL的查询字符串中。 ii. 对服务器的请求是幂等的,即多次相同的GET请求应该返回相同的结果。 iii. 可以被缓存,可以被收藏为书签。 iv. 对于敏感数据不…...
C++ Primer Plus第五版笔记(p201-250)
第六章 函数(下) 在含有return语句的循环后面应该也有一条return语句 不要返回局部对象的引用或指针,当函数结束时临时对象占用的空间也就随之释放掉了,所以两条return语句都指向了不再可用的内存空间。 如果函数返回指针、引用…...
vba学习系列(5)--指定区域指定字符串计数
系列文章目录 文章目录 系列文章目录前言一、需求背景二、vba自定义函数1.引入库 总结 前言 一、需求背景 想知道所有客诉项目里面什么项目最多,出现过多少次。 二、vba自定义函数 1.引入库 引用: CountCharInRange(区域,“字符串”) Function CountCh…...
将Firefox插件导入Edge/Chrome中
目录 将Firefox插件导入Edge/Chrome中前言导出火狐插件.xpi格式插件导入edge/chorme中错误示范1错误示范2修改过程manifest.jsondict文件夹修改backgroundScript.jsinjectedScript.jsdebug过程最终backgroundScript.js和injectedScript.js代码 完工阶段修改后的源码 将Firefox插…...
云计算【第一阶段(14)】Linux的目录和结构
一、Liunx目录结构 1.1、linux目录结构 linux目录结构是树形目录结构 根目录(树根) 所有分区,目录,文件等的位置起点整个树形目录结构中,使用独立的一个"/",表示 1.2、常见的子目录 必须知道 目录路径目…...
Zynq学习笔记--AXI4-Stream到视频输出IP是如何工作的?
目录 1. 简介 2. 原理详解 2.1 示例工程 2.2 AXI4-Stream to Video Out 3. Master/Slave Timing Mode 3.1 Slave Timing Mode 3.2 Master Timing Mode 4. 总结 1. 简介 本文主要介绍了 AXI4-Stream 到视频输出 的内容。其中,示例工程展示了一个具体的设计&…...
2016-2023 年美国农业部作物序列边界
简介 2016-2023 年美国农业部作物序列边界 作物序列边界(CSB)是与美国农业部经济研究局合作开发的,它提供了美国毗连地区的田间边界、作物种植面积和作物轮作的估计数据。该数据集利用卫星图像和其他公共数据,并且是开放源码的,使用户能够对美国种植的商品进行面积和统计…...
数字人源码部署怎么做?如何高效搭建好用的数字人系统?
作为人工智能时代的风口项目,AI数字人自出现之日起便引发了大量的关注。不少创业者都有了搭建数字人系统的想法,但却苦于没有强大的专业背景和雄厚资金支撑,只能在局外徘徊,而这恰恰为数字人源码公司推出的数字人源码部署服务的火…...
解决虚拟机Ubuntu IP总是掉的问题
问题 嵌入式开发过程中,需要使用NFS/TFTP等等,虚拟机Ubuntu就需要和板卡进行网络连接,但是我发现虚拟机Ubuntu的IP地址经常动不动就掉线,本文记录解决该问题的一些思路。 其实这个问题很简单,我早该想到,…...
[13] CUDA_Opencv联合编译过程
CUDA_Opencv联合编译过程 详细编译过程可见我之前的文章:Win10下OpencvCUDA联合编译详细教程(版本455、460、470,亲测可用!!!)本文给出Windows\linux下的opencvcuda的编译总结,摘自 <基于GP…...
uni-app canvas创建画布
canvasTmp: function(arr2, store_name, successFn, errFun) {let that this;const ctx uni.createCanvasContext(myCanvas);ctx.clearRect(0, 0, 0, 0);/*** 只能获取合法域名下的图片信息,本地调试无法获取* */uni.getImageInfo({ src: arr2[0],success: function(res) {…...
Spring MVC详解(上)
一、Spring MVC初步认识 1.1介绍 Spring MVC是Spring Framework提供的Web组件,全称是Spring Web MVC,是目前主流的实现MVC设计模式的框架,提供前端路由映射、视图解析等功能 Java Web开发者必须要掌握的技术框架 1.2MVC是什么 MVC是一种软件架构思想…...
【Linux硬盘读取】Windows下读取Linux系统的文件解决方案:Linux Reader4.5 By DiskInternals
前言 相信做机器视觉相关的很多人都会安装 Windows 和 Linux 双系统。在 Linux 下,我们可以很方便的访问Windows的磁盘,反过来却不行。但是这又是必须的。通过亲身体验,向大家推荐这么一个工具,可以让 Windows 方便的访问 Ext 2/3…...
操作系统—页表(实验)
文章目录 页表1.实验目标2.实验过程记录(1).增加打印页表函数(2).独立内核页表(3).简化软件模拟地址翻译 3.实验问题及相应解答问题1问题2问题3问题4 实验小结 页表 1.实验目标 了解xv6内核当中页表的实现原理,修改页表,使内核更方便地进行用户虚拟地址…...
github 本地仓库上传及报错处理
一.本地文件上传 这里为上传部分,关于gitbash安装配置,读者可自行搜索,由于已经安装完成,未进行截图保存,这里便不做赘述。 1.登录git账号并创建一个仓库 点击仓库打开后会看到这个仓库的网址链接(这个链…...
【ZZULIOJ】1104: 求因子和(函数专题)
题目描述 输入正整数n(2<n<1000),计算并输出n的所有正因子(包括1,不包括自身)之和。要求程序定义一个FacSum ()函数和一个main()函数,FacSum ()函数计算并返回n的所有正因子之和,其余功能在main()函…...
轨迹优化 | 图解欧氏距离场与梯度场算法(附ROS C++/Python实现)
目录 0 专栏介绍1 什么是距离场?2 欧氏距离场计算原理3 双线性插值与欧式梯度场4 仿真实现4.1 ROS C实现4.2 Python实现 0 专栏介绍 🔥课程设计、毕业设计、创新竞赛、学术研究必备!本专栏涉及更高阶的运动规划算法实战:曲线生成…...
【二维差分】2132. 用邮票贴满网格图
本文涉及知识点 二维差分 LeetCode2132. 用邮票贴满网格图 给你一个 m x n 的二进制矩阵 grid ,每个格子要么为 0 (空)要么为 1 (被占据)。 给你邮票的尺寸为 stampHeight x stampWidth 。我们想将邮票贴进二进制矩…...
【前端项目笔记】2 主页布局
主页布局 element-ui提供的组件名称就是它的类名 ☆☆ CSS选择器: (1)基本选择器 类型选择器 p/span/div…… 类选择器 (.classname) ID选择器 (#idname) 通配选择器 ( * ) (2)属性选择器 选择具有特定属性或属性值的…...
t265 jetpack 6 px4 ros2
Ubuntu22.04 realsenseSDK2和ROS2Wrapper安装方法,包含T265版本踩坑问题_ros2 realsense-CSDN博客 210 git clone https://github.com/IntelRealSense/librealsense.git 212 git branch 215 git tag 218 git checkout v2.51.1 219 git branch 265 git clone https://…...
vue 应用测试(一) --- 介绍
vue 应用测试(一) ---介绍 前端测试简介组件测试Jest 测试框架简介其他测试框架 第一个测试避免误报如何组织测试代码 组件挂载Vue2 组件挂载的方式Vue3 的挂载方式vue-test-utils挂载选项 如何调试测试用例参考小结 前端测试简介 软件测试:…...
Perl 语言入门学习
一、介绍 Perl 是一种高级的、动态的、解释型的通用编程语言,由Larry Wall于1987年开发。它是一种非常灵活和强大的语言,广泛用于文本处理、系统管理、网络编程、图形编程等领域。 Perl 语言的设计理念是“用一种简单的语法,去解决复杂的编…...
HarmongOS打包[保姆级]
创建应用 首先进入 华为开发者联盟-HarmonyOS开发者官网 然后进行登录。 登录成功后,鼠标悬停在在登录右上角那个位置后再点击管理中心,进入下面这个界面。 再点击:应用服务–>应用发布–>新建–>完善信息 构建和生成私钥和证书请求…...
SpringBoot怎么实现自定义接口全局异常捕获?详细教程
自定义异常 package com.single.bean;import org.springframework.core.NestedRuntimeException;public class FDWException extends NestedRuntimeException {private static final long serialVersionUID = 6046035491210083235L;public FDWException(String msg) {super(msg…...
Ms08067安全实验室成功实施多家业务系统渗透测试项目
点击星标,即时接收最新推文 近日,Ms08067安全实验室针对多家公司重要系统实施渗透测试项目。公司网络信息系统的业务应用和存储的重要信息资产均较多,存在网络系统结构的复杂性和庞杂等特点,使得公司网络信息系统面临一定风险。项…...
小熊家政帮day22-day23 订单系统优化(订单状态机、练习分库分表、索引、订单缓存)
目录 1 状态机1.1 状态机介绍1.1.1 当前存在的问题1.1.2 使用状态机解决问题 1.2 实现订单状态机1.2.1 编写订单状态机1.2.1.1 依赖引入1.2.1.2 订单状态枚举类1.2.1.3 状态变更事件枚举类1.2.1.4 定义订单快照类1.2.1.5 定义事件变更动作类1.2.1.5 定义订单状态机类1.2.1.6 状…...
LeetCode 1731, 151, 148
目录 1731. 每位经理的下属员工数量题目链接表要求知识点思路代码 151. 反转字符串中的单词题目链接标签思路代码 148. 排序链表题目链接标签Collections.sort()思路代码 归并排序思路代码 1731. 每位经理的下属员工数量 题目链接 1731. 每位经理的下属员工数量 表 表Emplo…...
aspcms网站栏目调用/昆明百度推广开户
Ansibel之roles的使用 roles介绍 roles能够根据层次型结构自动装载变量文件、task以及handlers等。简单来讲,roles就是通过分别将变量、文件、任务、模块及处理器放置于单独的目录中,并可以便捷地include它们,roles一般用于基于主机构建服务的…...
建一网站要多少钱/百度收录时间
1.图形化界面启动 右击“计算机”,在快捷菜单中选择“管理”命令,如图所示,打开“计算机管理”对话框。也可以执行“开始”|“控制面板”|“管理工具”|“服务”来启动服务。 改成手动模式,每次电脑开机都需要点击启动服务 2. 命令行启动…...
日语网站设计/十大软件免费下载网站排行榜
c语言没有String类型,更没有String.length()方法,那么要怎么求数组长度呢? 数组举例:int arr[]{2,3,1,4}, char str[]{“Hello”} 获得数组长度可以用这个方法: 比如int数组 sizeOf(arr)/sizeOf(int) 可以求出数组长…...
网络营销内容有哪些方面/seo网站排名推广
问题: 项目中 前端传JSON数据到后端接口时 数据尾部多了一个等于号 解决办法: 前端 设置请求体类型 以及 数据格式 后端也要指定 接受数据 的格式 在写前后端接口的时候,我的前端将表单的数据封装后转成JSON格式 想着传到后端来解析一波 前端…...
东营网站建设报价/百度网址大全 官网
本文翻译整理自youtube 7 Amazing Developer Tools that youre not using yet 1. BundlePhobia BundlePhobia用于分析npm package的依赖、bundle后的大小、下载速度预估等等,帮助你在引用一个package之前了解引入该package的代价: 你也可以将项目的pac…...
广东微信网站制作多少钱/网站建设公司网站
1.下列关于继承的哪项叙述是正确的? A.在java中类允许多继承 B.在java中一个类只能实现一个接口 C.在java中一个类不能同时继承一个类和实现一个接口 D.java的单一继承使代码更可靠 正确答案: D 2.abstract和final可以同时作为一个类的修饰符。( &#…...