fpga实操训练(vga测试)

news2024/11/19 7:35:14

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

        我自己读书那会,买的电脑还是以台式机居多,平板显示器也是才刚刚流行、且价格较高,视频接口也是以VGA为主。不像现在,基本上视频接口都是以HDMI为主。和HDMI相比较,VGA简单、方便,十分合适用来学习应用。

1、VGA接口

         开发板上的VGA部分,接口还是非常简单的。虽然接口有15个,但是其中5个是悬空(NC),5个是接地,真正有用的信号其实只有5个。这5个信号分别是红、绿、蓝、行同步、场同步。

2、FPGA和VGA的连接

         FPGA和VGA直接的接口还需要通过上面这一层电路转换,才能输出红、绿、蓝。其中红色有5位,绿色有6位,蓝色有5位,所以可以表现的颜色总共有16位,也就是65536种颜色。0也是一种颜色。

3、VGA的视频时序

        VGA视频时序,是我们编写verilog代码的关键。比如说一个1024*768分辨率、60帧每秒的视频流来说,真正VGA处理过的数据是1344*806,这其中还包括了(HSYNC、HBP、HFP,VSYNC、VBP、VFP),这些都是不显示的,所以显示的只是中间一部分内容。整个带宽的话,如果按照1344*806*60来算,大约是65M左右。所以,在fpga实现的过程当中,需要对原来的50M时钟进行倍频处理。

       另外需要注意的是,HBP处于前侧,而HFP是处于后侧。同样,VBP处于上方,而VFP处于下方的位置。但是编写verilog的时候,需要从HFP、VFP开始算起,这是比较容易引起疑问的一个地方。

4、准备PLL倍频

        倍频之前讨论过。这里只有几个地方需要注意下即可。1)输入时钟为50M,

         2)取消复位和lock锁定,

         3)只生成一个65M的输出时钟,

5、有了基础的pll,下面可以构建top层代码


module vga_test(
	input                       clk,
	input                       rst_n,
	//vga output        
	output                      vga_out_hs, //vga horizontal synchronization         
	output                      vga_out_vs, //vga vertical synchronization                  
	output[4:0]                 vga_out_r,  //vga red
	output[5:0]                 vga_out_g,  //vga green
	output[4:0]                 vga_out_b   //vga blue
	
);

wire                            video_clk;
wire                            video_hs;
wire                            video_vs;
wire                            video_de;
wire[7:0]                       video_r;
wire[7:0]                       video_g;
wire[7:0]                       video_b;

assign vga_out_hs = video_hs;
assign vga_out_vs = video_vs;
assign vga_out_r  = video_r[7:3]; //discard low bit data
assign vga_out_g  = video_g[7:2]; //discard low bit data
assign vga_out_b  = video_b[7:3]; //discard low bit data

//generate video pixel clock
 video_pll video_pll_m0(
	.inclk0(clk),
	.c0(video_clk));

color_bar color_bar_m0(
	.clk(video_clk),
	.rst(~rst_n),
	.hs(video_hs),
	.vs(video_vs),
	.de(video_de),
	.rgb_r(video_r),
	.rgb_g(video_g),
	.rgb_b(video_b)
);
endmodule

        top层代码比较简单,这里主要就是实例化video_pll和color_bar两个模块。video_pll刚才已经生成,下面就只需要谈谈color_bar。

6、关于color_bar.v代码

`include "video_define.v"
module color_bar(
	input                 clk,           //pixel clock
	input                 rst,           //reset signal high active
	output                hs,            //horizontal synchronization
	output                vs,            //vertical synchronization
	output                de,            //video valid
	output[7:0]           rgb_r,         //video red data
	output[7:0]           rgb_g,         //video green data
	output[7:0]           rgb_b          //video blue data
);
//video timing parameter definition
`ifdef  VIDEO_1280_720
parameter H_ACTIVE = 16'd1280;           //horizontal active time (pixels)
parameter H_FP = 16'd110;                //horizontal front porch (pixels)
parameter H_SYNC = 16'd40;               //horizontal sync time(pixels)
parameter H_BP = 16'd220;                //horizontal back porch (pixels)
parameter V_ACTIVE = 16'd720;            //vertical active Time (lines)
parameter V_FP  = 16'd5;                 //vertical front porch (lines)
parameter V_SYNC  = 16'd5;               //vertical sync time (lines)
parameter V_BP  = 16'd20;                //vertical back porch (lines)
parameter HS_POL = 1'b1;                 //horizontal sync polarity, 1 : POSITIVE,0 : NEGATIVE;
parameter VS_POL = 1'b1;                 //vertical sync polarity, 1 : POSITIVE,0 : NEGATIVE;
`endif

//480x272 9Mhz
`ifdef  VIDEO_480_272
parameter H_ACTIVE = 16'd480; 
parameter H_FP = 16'd2;       
parameter H_SYNC = 16'd41;    
parameter H_BP = 16'd2;       
parameter V_ACTIVE = 16'd272; 
parameter V_FP  = 16'd2;     
parameter V_SYNC  = 16'd10;   
parameter V_BP  = 16'd2;     
parameter HS_POL = 1'b0;
parameter VS_POL = 1'b0;
`endif

//640x480 25.175Mhz
`ifdef  VIDEO_640_480
parameter H_ACTIVE = 16'd640; 
parameter H_FP = 16'd16;      
parameter H_SYNC = 16'd96;    
parameter H_BP = 16'd48;      
parameter V_ACTIVE = 16'd480; 
parameter V_FP  = 16'd10;    
parameter V_SYNC  = 16'd2;    
parameter V_BP  = 16'd33;    
parameter HS_POL = 1'b0;
parameter VS_POL = 1'b0;
`endif

//800x480 33Mhz
`ifdef  VIDEO_800_480
parameter H_ACTIVE = 16'd800; 
parameter H_FP = 16'd40;      
parameter H_SYNC = 16'd128;   
parameter H_BP = 16'd88;      
parameter V_ACTIVE = 16'd480; 
parameter V_FP  = 16'd1;     
parameter V_SYNC  = 16'd3;    
parameter V_BP  = 16'd21;    
parameter HS_POL = 1'b0;
parameter VS_POL = 1'b0;
`endif

//800x600 40Mhz
`ifdef  VIDEO_800_600
parameter H_ACTIVE = 16'd800; 
parameter H_FP = 16'd40;      
parameter H_SYNC = 16'd128;   
parameter H_BP = 16'd88;      
parameter V_ACTIVE = 16'd600; 
parameter V_FP  = 16'd1;     
parameter V_SYNC  = 16'd4;    
parameter V_BP  = 16'd23;    
parameter HS_POL = 1'b1;
parameter VS_POL = 1'b1;
`endif

//1024x768 65Mhz
`ifdef  VIDEO_1024_768
parameter H_ACTIVE = 16'd1024;
parameter H_FP = 16'd24;      
parameter H_SYNC = 16'd136;   
parameter H_BP = 16'd160;     
parameter V_ACTIVE = 16'd768; 
parameter V_FP  = 16'd3;      
parameter V_SYNC  = 16'd6;    
parameter V_BP  = 16'd29;     
parameter HS_POL = 1'b0;
parameter VS_POL = 1'b0;
`endif

//1920x1080 148.5Mhz
`ifdef  VIDEO_1920_1080
parameter H_ACTIVE = 16'd1920;
parameter H_FP = 16'd88;
parameter H_SYNC = 16'd44;
parameter H_BP = 16'd148; 
parameter V_ACTIVE = 16'd1080;
parameter V_FP  = 16'd4;
parameter V_SYNC  = 16'd5;
parameter V_BP  = 16'd36;
parameter HS_POL = 1'b1;
parameter VS_POL = 1'b1;
`endif
parameter H_TOTAL = H_ACTIVE + H_FP + H_SYNC + H_BP;//horizontal total time (pixels)
parameter V_TOTAL = V_ACTIVE + V_FP + V_SYNC + V_BP;//vertical total time (lines)
//define the RGB values for 8 colors
parameter WHITE_R       = 8'hff;
parameter WHITE_G       = 8'hff;
parameter WHITE_B       = 8'hff;
parameter YELLOW_R      = 8'hff;
parameter YELLOW_G      = 8'hff;
parameter YELLOW_B      = 8'h00;                                
parameter CYAN_R        = 8'h00;
parameter CYAN_G        = 8'hff;
parameter CYAN_B        = 8'hff;                                
parameter GREEN_R       = 8'h00;
parameter GREEN_G       = 8'hff;
parameter GREEN_B       = 8'h00;
parameter MAGENTA_R     = 8'hff;
parameter MAGENTA_G     = 8'h00;
parameter MAGENTA_B     = 8'hff;
parameter RED_R         = 8'hff;
parameter RED_G         = 8'h00;
parameter RED_B         = 8'h00;
parameter BLUE_R        = 8'h00;
parameter BLUE_G        = 8'h00;
parameter BLUE_B        = 8'hff;
parameter BLACK_R       = 8'h00;
parameter BLACK_G       = 8'h00;
parameter BLACK_B       = 8'h00;
reg hs_reg;                      //horizontal sync register
reg vs_reg;                      //vertical sync register
reg hs_reg_d0;                   //delay 1 clock of 'hs_reg'
reg vs_reg_d0;                   //delay 1 clock of 'vs_reg'
reg[11:0] h_cnt;                 //horizontal counter
reg[11:0] v_cnt;                 //vertical counter
reg[11:0] active_x;              //video x position 
reg[11:0] active_y;              //video y position 
reg[7:0] rgb_r_reg;              //video red data register
reg[7:0] rgb_g_reg;              //video green data register
reg[7:0] rgb_b_reg;              //video blue data register
reg h_active;                    //horizontal video active
reg v_active;                    //vertical video active
wire video_active;               //video active(horizontal active and vertical active)
reg video_active_d0;             //delay 1 clock of video_active
assign hs = hs_reg_d0;
assign vs = vs_reg_d0;
assign video_active = h_active & v_active;
assign de = video_active_d0;
assign rgb_r = rgb_r_reg;
assign rgb_g = rgb_g_reg;
assign rgb_b = rgb_b_reg;
always@(posedge clk or posedge rst)
begin
	if(rst == 1'b1)
		begin
			hs_reg_d0 <= 1'b0;
			vs_reg_d0 <= 1'b0;
			video_active_d0 <= 1'b0;
		end
	else
		begin
			hs_reg_d0 <= hs_reg;
			vs_reg_d0 <= vs_reg;
			video_active_d0 <= video_active;
		end
end

always@(posedge clk or posedge rst)
begin
	if(rst == 1'b1)
		h_cnt <= 12'd0;
	else if(h_cnt == H_TOTAL - 1)//horizontal counter maximum value
		h_cnt <= 12'd0;
	else
		h_cnt <= h_cnt + 12'd1;
end

always@(posedge clk or posedge rst)
begin
	if(rst == 1'b1)
		active_x <= 12'd0;
	else if(h_cnt >= H_FP + H_SYNC + H_BP - 1)//horizontal video active
		active_x <= h_cnt - (H_FP[11:0] + H_SYNC[11:0] + H_BP[11:0] - 12'd1);
	else
		active_x <= active_x;
end

always@(posedge clk or posedge rst)
begin
	if(rst == 1'b1)
		v_cnt <= 12'd0;
	else if(h_cnt == H_FP  - 1)//horizontal sync time
		if(v_cnt == V_TOTAL - 1)//vertical counter maximum value
			v_cnt <= 12'd0;
		else
			v_cnt <= v_cnt + 12'd1;
	else
		v_cnt <= v_cnt;
end

always@(posedge clk or posedge rst)
begin
	if(rst == 1'b1)
		hs_reg <= 1'b0;
	else if(h_cnt == H_FP - 1)//horizontal sync begin
		hs_reg <= HS_POL;
	else if(h_cnt == H_FP + H_SYNC - 1)//horizontal sync end
		hs_reg <= ~hs_reg;
	else
		hs_reg <= hs_reg;
end

always@(posedge clk or posedge rst)
begin
	if(rst == 1'b1)
		h_active <= 1'b0;
	else if(h_cnt == H_FP + H_SYNC + H_BP - 1)//horizontal active begin
		h_active <= 1'b1;
	else if(h_cnt == H_TOTAL - 1)//horizontal active end
		h_active <= 1'b0;
	else
		h_active <= h_active;
end

always@(posedge clk or posedge rst)
begin
	if(rst == 1'b1)
		vs_reg <= 1'd0;
	else if((v_cnt == V_FP - 1) && (h_cnt == H_FP - 1))//vertical sync begin
		vs_reg <= HS_POL;
	else if((v_cnt == V_FP + V_SYNC - 1) && (h_cnt == H_FP - 1))//vertical sync end
		vs_reg <= ~vs_reg;  
	else
		vs_reg <= vs_reg;
end

always@(posedge clk or posedge rst)
begin
	if(rst == 1'b1)
		v_active <= 1'd0;
	else if((v_cnt == V_FP + V_SYNC + V_BP - 1) && (h_cnt == H_FP - 1))//vertical active begin
		v_active <= 1'b1;
	else if((v_cnt == V_TOTAL - 1) && (h_cnt == H_FP - 1)) //vertical active end
		v_active <= 1'b0;   
	else
		v_active <= v_active;
end

always@(posedge clk or posedge rst)
begin
	if(rst == 1'b1)
		begin
			rgb_r_reg <= 8'h00;
			rgb_g_reg <= 8'h00;
			rgb_b_reg <= 8'h00;
		end
	else if(video_active)
		if(active_x == 12'd0)
			begin
				rgb_r_reg <= WHITE_R;
				rgb_g_reg <= WHITE_G;
				rgb_b_reg <= WHITE_B;
			end
		else if(active_x == (H_ACTIVE/8) * 1)
			begin
				rgb_r_reg <= YELLOW_R;
				rgb_g_reg <= YELLOW_G;
				rgb_b_reg <= YELLOW_B;
			end         
		else if(active_x == (H_ACTIVE/8) * 2)
			begin
				rgb_r_reg <= CYAN_R;
				rgb_g_reg <= CYAN_G;
				rgb_b_reg <= CYAN_B;
			end
		else if(active_x == (H_ACTIVE/8) * 3)
			begin
				rgb_r_reg <= GREEN_R;
				rgb_g_reg <= GREEN_G;
				rgb_b_reg <= GREEN_B;
			end
		else if(active_x == (H_ACTIVE/8) * 4)
			begin
				rgb_r_reg <= MAGENTA_R;
				rgb_g_reg <= MAGENTA_G;
				rgb_b_reg <= MAGENTA_B;
			end
		else if(active_x == (H_ACTIVE/8) * 5)
			begin
				rgb_r_reg <= RED_R;
				rgb_g_reg <= RED_G;
				rgb_b_reg <= RED_B;
			end
		else if(active_x == (H_ACTIVE/8) * 6)
			begin
				rgb_r_reg <= BLUE_R;
				rgb_g_reg <= BLUE_G;
				rgb_b_reg <= BLUE_B;
			end 
		else if(active_x == (H_ACTIVE/8) * 7)
			begin
				rgb_r_reg <= BLACK_R;
				rgb_g_reg <= BLACK_G;
				rgb_b_reg <= BLACK_B;
			end
		else
			begin
				rgb_r_reg <= rgb_r_reg;
				rgb_g_reg <= rgb_g_reg;
				rgb_b_reg <= rgb_b_reg;
			end         
	else
		begin
			rgb_r_reg <= 8'h00;
			rgb_g_reg <= 8'h00;
			rgb_b_reg <= 8'h00;
		end
end

endmodule 

        color_bar.v的内容比较多,但是真正有意义的部分还是在于hs_reg、vs_reg、rgb_r_reg、rgb_g_reg、rgb_b_reg的生成。因为它们和最终输出有关。代码中的一大部分内容属于配置部分,因为我们选用的是1024*768,所以相关参数如下所示。video_define.v也只是添加了一行`define    VIDEO_1024_768而已。

//1024x768 65Mhz
`ifdef  VIDEO_1024_768
parameter H_ACTIVE = 16'd1024;
parameter H_FP = 16'd24;      
parameter H_SYNC = 16'd136;   
parameter H_BP = 16'd160;     
parameter V_ACTIVE = 16'd768; 
parameter V_FP  = 16'd3;      
parameter V_SYNC  = 16'd6;    
parameter V_BP  = 16'd29;     
parameter HS_POL = 1'b0;
parameter VS_POL = 1'b0;
`endif

         有了这几行定义,相当于规定了VGA数据的范围。HS_POL和VS_POL代表了起始值。下面就可以看看其他寄存器的含义了。hs_reg_d0、vs_reg_d0主要是为了延迟一拍,因为rgb_r_reg、rgb_g_reg、rgb_b_reg其实也相当于延迟一拍输出的。h_cnt计算一行的数据总数,active_x计算当前行中有效数据索引,v_cnt计算总的行数,hs_reg输出行同步,h_active输出行数据有效,vs_reg输出场同步,v_active输出场数据有效,rgb_r_reg & rgb_g_reg & rgb_b_reg则输出最终的rgb数据。

        另外在color_bar.v中,有一个信号de。这主要是为了后续bmp、camera做准备的,本次vga测试其实并没有用到。

7、pin脚信号的bind

8、实验

        有了video_define.v、vga_test.v、color_bar.v和pll这几个文件,经过编译、综合之后就可以生成对应的sof文件。烧入到fpga开发板之后,不出意外,就可以看到这样的显示效果了,

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/112579.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux搭建TFTP服务

TFTP是简单文件传输协议,是一个基于UDP协议实现的用在客户及和服务器之间进行简单文件传输的协议,适用于开销不大,不复杂的应用场景。TFTP协议专门为小文件传输而设计,只能从服务器获取文件,或者客户端往服务器写入文件,但是不能进行认证也不能列出目录。 1、安装tftp服…

RV1126笔记十五:吸烟行为检测及部署<三>

若该文为原创文章,转载请注明原文出处。 训练并测试(windows) 一、yolov5安装 1、下载rk优化后的yolov5 git clone https://github.com/airockchip/yolov5.git 下载后,我是放到E:\miniconda3\envs目录下,miniconda3是安装miniconda的目录。可以放到其他地方,后续操作需要…

MySQL提高批量insert的性能

一. 使用批量插入&#xff0c;将多条单独的 insert 合并成一次操作 即&#xff1a;insert into table values (a1, b1, c1), (a2, b2, c2); 解析&#xff1a;将多条 insert 合并后&#xff0c;减少MySQL日志量(即MySQL的 binlog 和 innodb 的事务日志)&#xff0c;降低日志刷…

Python pandas有好几百个库函数,你都用过吗(1)

对Python的 pandas 库所有的内置元类、函数、子模块等全部浏览一遍&#xff0c;然后挑选一些重点学习一下。我安装的库版本号为1.3.5&#xff0c;如下&#xff1a; >>> import pandas as pd >>> pd.__version__ 1.3.5 >>> print(pd.__doc__)pandas…

54三数之和55 56有无重复元素的全排列

54 三数之和 首先想到的就是之前的两数之和&#xff0c;只要在外层遍历一遍&#xff0c;对每个元素用之前的两数之和的哈希做法&#xff0c;就刚好是O(n^2) 但是有坑的地方在于需要去重&#xff0c;并且输出的三元组也是需要顺序的&#xff01;&#xff01;然后我用set去重和重…

c语言复习之预编译(十四)

1.以#开头的行&#xff0c;都称为编译器指令 #define定义宏#if #else #elif #endif条件编译#ifdef #ifndef判断是否定义了某个宏#error错误#program设定状态或指定完成&#xff08;编译器&#xff09;#undef取消宏定义 2.预定义宏 __LINE__行号__FILE__源文件名__DATE__创建…

你以为架构师天天就画图写PPT吗,告诉你其他事儿多了去了~

V-xin&#xff1a;ruyuan0330 获得600页原创精品文章汇总PDF 目录 一、多系统订阅数据回顾二、核心数据的监控系统三、电商库存数据如何监控四、数据计算链路追踪五、百亿流量下的数据链路追踪六、自动化数据链路分析七、下篇预告 上篇文章《为什么我建议线上高并发量的代码&a…

rip综合实验

目录 1.拓扑图 2.要求 3.要求分析 4.主要配置 5.测试 6.实验总结 1.拓扑图 2.要求 R1代表运营商&#xff0c;R1远程登录R2实际登录R9R3访问R7的环回&#xff0c;实际走下面全网可达 3.要求分析 将R2包括右边所有设备理解为一个局域网&#xff0c;在R2的出接口上配置NAT…

BIT.3_Linux进程概念

目录冯诺依曼体系结构操作系统(Operator System)概念设计OS的目的定位如何理解 "管理"总结系统调用和库函数概念进程概念知识点基本概念描述进程-PCBtask_struct-PCB的一种task_ struct内容分类组织进程查看进程通过系统调用获取进程标示符通过系统调用创建进程-fork…

上次面试跪在了Redis上,刷完腾讯云大神亲码的“redis深度笔记”,终面进腾讯!

前言 作为这个时代码代码的秃头人员&#xff0c;对Redis肯定是不陌生的&#xff0c;如果连Redis都没用过&#xff0c;还真不好意思出去面试&#xff0c;指不定被面试官吊打多少次。 毕竟现在互联网公司和一些创业公司都要用到Redis&#xff0c;像亚马逊、谷歌、阿里、腾讯都要使…

使用PicGo+阿里云OSS实现md文档图片上传

使用PicGo阿里云OSS实现md文档图片上传 这次给大家带来的是PicG0阿里云Osstypora的图床环境搭建&#xff0c;帮助大家提高工作效率写博客速度&#xff01; 1.typora安装 给大家一个链接&#xff1a;typora&#xff0c;打开后点击下载就行&#xff0c;正式版收费&#xff0c;…

Qt扫盲-QTextBrowser理论总结

QTextBrowser理论总结1. 简述2. 文档来源和内容3. 导航4. 用途1. 简述 QTextBrowser 顾名思义其实就是一个文本阅读器&#xff0c;但是这个类类扩展了 QTextEdit 的只读模式功能&#xff0c;当然了 QTextEdit 其实也就是QTextBrowser 的父类。添加的功能主要是一些导航 naviga…

对路由的基本理解和使用

一、认识路由 1、生活中的路由器 构造&#xff1a;路由器上有多个网线接口&#xff0c;每一个接口都对应一台设备 功能&#xff1a;多台设备能同时上网 2、编程中的路由和路由器 &#xff08;1&#xff09;后端渲染和后端路由 ①概念 早期的网站开发整个HTML页面是由服务器…

【附源码】如何C语言打印出心形表白?

使用C语言实现打印出心形&#xff0c;初学者的表白神器~ 我们分了4部分&#xff0c;前3行一部分&#xff0c;4-6行一部分&#xff0c;7-13行一部分&#xff0c;最后一行一部分&#xff0c;读者请仔细阅读注释&#xff0c;已经写的很详细了。 前三行输出&#xff0c;为了让初学…

6.1 文本情感倾向性分析

文章目录一、自然语言情感分析1.1 使用深度神经网络完成情感分析任务1.2 处理变长数据1.3 学习句子的语义二、循环神经网络RNN和长短时记忆网络LSTM2.1 RNN和LSTM网络的设计思考2.2 RNN网络结构2.3 LSTM网络结构2.4 使用LSTM完成情感分析任务三、使用飞桨实现基于LSTM的情感分析…

Python pandas有好几百个库函数,你都用过吗(4)

上一篇链接&#xff1a; https://blog.csdn.net/boysoft2002/article/details/128428569 S~W&#xff1a; Function46~56 Types[Function][45:] [set_eng_float_format, show_versions, test, timedelta_range, to_datetime, to_numeric, to_pickle, to_timedelta, unique,…

技术分享 Oracle下启用块跟踪

创建存放块跟踪文件目录 [oraclehost01 ~]$ cd /u01/app [oraclehost01 app]$ mkdir BCT 启用块跟踪 SQL> alter database enable block change tracking using file /u01/app/BCT/rman.bct; 检查块跟踪状态 SQL> col filename for a22 SQL> select filename, status,…

linux中级——libcurl库访问百度

libcurl简介: 在linux底下用c语言做http编程方法&#xff0c;依赖libcurl。 libcurl是一个跨平台的网络协议库&#xff0c;支持http, https, ftp, gopher, telnet, dict, file, 和ldap 协议。libcurl同样支持HTTPS证书授权&#xff0c;HTTP POST, HTTP PUT, FTP 上传, HTTP基…

1549:最大数——线段树

【题目描述】 原题来自&#xff1a;JSOI 2008 给定一个正整数数列 a1,a2,a3,⋯,an &#xff0c;每一个数都在 0∼p–1 之间。可以对这列数进行两种操作&#xff1a; 添加操作&#xff1a;向序列后添加一个数&#xff0c;序列长度变成 n1&#xff1b; 询问操作&#xff1a;询…

数据库系统概论笔记

数据库系统概论(王珊 萨师煊 编著)笔记。 第一章 绪论 1.数据库系统概述 1.1数据库的4个基本概念 数据&#xff1a;描述事物的符号记录称为数据。数据的含义称为数据的语义&#xff0c;数据与其语义是不可分的。数据库&#xff1a;长期存储在计算机内、有组织的、可共享的大…