VTC视频时序控制器,TPG图像测试数据发生器,LCD驱动——FPGA学习笔记19

news2024/10/7 2:53:25

                                                                                                                        详情可以见LCD篇

LCD彩条显示——FPGA学习笔记10_依次显示红绿蓝三个通道-CSDN博客

一、VTC简介

        Video Timing Controller 缩写 VTC 是我们在所有涉及 FPGA 图像、 FPGA 视频类方案中经常用到的一种用于产生视频时序的控制器。 本课以 VGA 为切入点, 学习视频传输的基本知识和相关概念, 以及视频时序的控制器的相关内容

常见视频接口:

刷新率:

        刷新率(FPS, Frames Per Second) , 单位为 Hz, 即每秒传输图像的帧数(帧数/s) 。 每秒钟帧数 (FPS) 愈多,一帧是静止的图象; 快速连续地显示不同帧便形成了运动的假象, 每秒钟帧数愈多, 所显示的动作就会愈流畅。 例如: 60Hz 的刷新率刷也就是指屏幕一秒内只扫描 60 次, 即 60 帧/秒

像素时钟:

二、VTC控制器系统框图

VTC代码编写: 

`timescale 1ns / 1ps

module VTC#(
parameter H_ActiveSize  =   1980            ,       //视频时间参数,行视频信号,一行有效(需要显示的部分)像素所占的时钟数,一个时钟对应一个有效像素
parameter H_FrameSize   =   1920+88+44+148  ,       //视频时间参数,行视频信号,一行视频信号总计占用的时钟数
parameter H_SyncStart   =   1920+88         ,       //视频时间参数,行同步开始,即多少时钟数后开始产生行同步信号 
parameter H_SyncEnd     =   1920+88+44      ,       //视频时间参数,行同步结束,即多少时钟数后停止产生行同步信号,之后就是行有效数据部分

parameter V_ActiveSize  =   1080            ,       //视频时间参数,场视频信号,一帧图像所占用的有效(需要显示的部分)行数量,通常说的视频分辨率即H_ActiveSize*V_ActiveSize
parameter V_FrameSize   =   1080+4+5+36     ,       //视频时间参数,场视频信号,一帧视频信号总计占用的行数量
parameter V_SyncStart   =   1080+4          ,       //视频时间参数,场同步开始,即多少行数后开始产生场同步信号 
parameter V_SyncEnd     =   1080+4+5                //视频时间参数,场同步结束,即多少场数后停止产生场同步信号,之后就是场有效数据部分
)
(
input           I_vtc_rstn      ,       //系统复位
input			I_vtc_clk       ,       //系统时钟
output			O_vtc_vs        ,       //场同步输出
output          O_vtc_hs        ,       //行同步输出
output          O_vtc_de_valid  ,       //视频数据有效	
output          O_vtc_user      ,       //满足stream时序产生 user 信号,用于帧同步
output          O_vtc_last              //满足stream时序产生 later 信号,用于每行结束
);

reg [11:0]  hcnt     =  12'd0       ;   //视频水平方向,列计数器,寄存器
reg [11:0]  vcnt     =  12'd0       ;   //视频垂直方向,行计数器,寄存器   
reg [2 :0]  rst_cnt  =  3'd0        ;   //复位计数器,寄存器
wire        rst_sync =  rst_cnt[2]  ;   //同步复位

//同步复位
always @(posedge I_vtc_clk or negedge I_vtc_rstn ) begin
    if (!I_vtc_rstn) begin
        rst_cnt <= 3'd0;
    end 
    else if(rst_cnt[2] == 1'b0)begin
        rst_cnt <=  rst_cnt + 1'b1 ;
    end
end

//视频水平方向,列计数器
always @(posedge I_vtc_clk) begin
    if (rst_sync == 1'b0) begin
        hcnt <= 12'd0;
    end 
    else if(hcnt < (H_FrameSize - 1'b1))begin
        hcnt <= hcnt + 1'b1;
    end
    else begin
        hcnt <= 12'd0;
    end
end

//视频锤垂直方向计数器
always @(posedge I_vtc_clk) begin
    if (rst_sync == 1'b0) begin
        vcnt <= 12'd0;
    end 
    else if(hcnt == (H_FrameSize - 1'b1))begin
        if (vcnt == (V_FrameSize - 1'b1)) begin
            vcnt <= 12'd0;
        end 
        else begin
            vcnt <= vcnt + 1'b1;    
        end
    end
end

wire hs_valid  =  hcnt < H_ActiveSize                       ;   //行信号有效像素部分
wire vs_valid  =  vcnt < V_ActiveSize                       ;   //场信号有效像素部分
wire vtc_hs    =  (hcnt >= H_SyncStart && hcnt < H_SyncEnd) ;   //产生hs,行同步信号
wire vtc_vs	   =  (vcnt > V_SyncStart && vcnt <= V_SyncEnd) ;   //产生vs,场同步信号      
wire vtc_de    =  hs_valid && vs_valid                      ;   //只有当视频水平方向,列有效和视频垂直方向,行同时有效,视频数据部分才是有效







//**********************  video stream video rgb  ***************************
//如果是输入RGB时序,那么转为stream时序
reg   vtc_vs_r1                 ;
reg   vtc_hs_r1                 ;
reg   vtc_de_r1                 ;
reg   vtc_user_r1 ,vtc_user_r2  ;
reg   vtc_valid_r1,vtc_valid_r2 ;
reg   vtc_last_r2               ;
reg   vs_start                  ;
 
always @(posedge I_vtc_clk )begin
    if(rst_sync == 1'b0) //复位
        vs_start <= 1'b0;
    else if(vtc_user_r1)//清除VS帧同步
        vs_start <= 1'b0;
    else if(vtc_vs && vtc_vs_r1==1'b0)//当vtc_vs发生上升沿跳变代表一帧开始
        vs_start <= 1'b1;
end  
      
always @(posedge I_vtc_clk  )begin
    vtc_vs_r1       <=  vtc_vs                              ;
    vtc_hs_r1       <=  vtc_hs                              ;
    vtc_user_r1     <=  ~vtc_user_r1 & vs_start & vtc_de    ;   //vtc_user延迟1拍
    vtc_last_r2     <=  ~vtc_de & vtc_valid_r1              ;   //产生stream video last 延迟于数据输入2拍
    vtc_valid_r1    <=  vtc_de                              ;   //vtc_valid延迟1拍
    vtc_valid_r2    <=  vtc_valid_r1                        ;   //vtc_valid对输入信号延迟2拍,以和vtc_last_r2信号配套同步
    vtc_user_r2     <=  vtc_user_r1                         ;   //vtc_user 对输入信号延迟2拍,以和vtc_last_r2信号配套同步    
end    

assign O_vtc_vs         =   vtc_vs_r1      ;
assign O_vtc_hs         =   vtc_hs_r1      ;
assign O_vtc_de_valid   =   vtc_valid_r2   ;
assign O_vtc_user       =   vtc_user_r2    ;
assign O_vtc_last       =   vtc_last_r2    ;

endmodule

三、TPG简介

        TPG(video_test_pattern generator) 视频测试模式发生器用于产生测试数据, 对视频数据通路测试。 本课设计一个图像数据发生器, 该模块能够产生不同颜色和样式的图像数据, 并按顺序将 RGB 图像数据发送到有效显示区域。

1、RGB像素格式

        RGB 是一种颜色标准, 俗称三基色模式, 是通过对红(R)、 绿(G)、 蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的, 是运用最广的颜色系统之一。 像素点就相当于一个 RGB 灯, 通过控制 R、 G、B 这三种颜色的亮度就可以显示出各种各样的色彩。 在显示器发明之后, 从黑白显示器发展到彩色显示器, 人们开始使用发出不同颜色的光的荧光粉(CRT, 等离子体显示器) , 或者不同颜色的滤色片(LCD) , 或者不同颜色的半导体发光器件( OLED 和 LED 大型全彩显示牌) 来形成色彩, 不管采用何种技术, 都以红(R)、 绿(G)、 蓝(B)三个颜色作为基本的发光单元, 通过控制光强度, 组合出了人类视力所能感知的所有颜色。

 (1)索引格式

        索引格式是比较老的格式, 随着越来越高的视觉需求, 索引格式基本不再被使用了, 这里只做简单介绍。 索引格式中 bit 存储的值并非是实际的 R、 G、 B 值, 而是对应点的像素在调色板中的索引, 即在图像文件中划出一个区域存放一个调色板来存储图像中的每一种颜色, 这个像素的颜色对应到调色板的第几号颜色

RGB1: 每个像素用 1 个 bit 表示, 能够表示的索引范围是 0-1, 共 2 种颜色, 即调色板中包含 2 中颜色。
RGB4: 每个像素用 4 个 bit 表示, 能够表示的索引范围是 0-15, 共 16 种颜色, 即调色板中包含 16 中颜色。
RGB8: 每个像素用 8 个 bit 表示, 能够表示的索引范围是 0-255, 共 256 种颜色, 即调色板中包含 256 中颜色。

(2)像素格式

        RGB 像素格式不同于索引格式, 索引格式 bit 存储的是每一个像素的色彩索引, 而像素格式中的 bit 用来存储像素点中 R、 G、 B 三个颜色的值.RGB888: 也叫 RGB24, 一个像素点由 3 个字节组成, 共 8bit*3=24bit。 其中 bit23~bit16 是 RED 通道, 红色对应的值就是 24’ hFF0000; bit15~bit8 是 GREEN 通道, 绿色对应的值就是 24’ h00FF00; bit7~bit0 是 BLUE 通道, 蓝色对应的值为 24’ h0000FF, 使用 RGB888 格式, 理论上可以产生 1670 万种色彩。RGB888 像素格式如下图所示:

 

四、程序设计

        本次实验通过测试视频发生器模块, 产生测试图形, 即彩条、 渐变、 纯色、 棋方格, 将相应测试图形的 RGB数据依次放入有效的显示区域内。 实验包含 3 个模块, VTC 视频时序控制器模块、 TPG 视频测试模式发生器模块、用户控制模块。 以下给出系统框图, 关于 VTC 视频时序控制器驱动的详细描述请看前面的实验, 我们主要学习 TPG视频测试模式发生器驱动。

系统框图: 

I_tpg_ck         :        视频格式的像素时钟
I_tpg_vs         :        视频格式的场同步信号
I_tpg_hs         :        视频格式的行同步信号
I_tpg_de         :        视频格式的有效数据阶段
O_tpg_vs        :        同 I_tpg_vs
O_tpg_hs        :        同 I_tpg_hs
O_tpg_de        :        同 I_tpg_de
O_tpg_data     :        rgb 格式数据输出

TPG 代码编写

`timescale 1ns / 1ps

module TPG(
input           I_tpg_clk   ,   //视频格式的像素时钟
input           I_tpg_rstn  ,   //系统复位
input           I_tpg_vs    ,   //视频格式的场同步信号
input           I_tpg_hs    ,   //视频格式的行同步信号
input           I_tpg_de    ,   //视频格式的有效数据阶段
output          O_tpg_vs    ,   //同 I_tpg_vs
output          O_tpg_hs    ,   //同 I_tpg_hs
output          O_tpg_de    ,   //同 I_tpg_de
output [23:0]   O_tpg_data      //rgb 格式数据输出

);

reg         tpg_vs_r    =   1'b0    ;   //对vs信号寄存
reg         tpg_hs_r    =   1'b0    ;   //对hs信号寄存
reg [7 :0]  grid_data   =   8'd0    ;   //grid棋方格寄存器
reg [23:0]  color_bar   =   24'd0   ;   //RGB 彩条寄存器
reg [10:0]  dis_mode    =   11'd0   ;   //显示模式寄存器
reg [7 :0]  r_reg       =   8'd0    ;   //红寄存器
reg [7 :0]  g_reg       =   8'd0    ;   //绿寄存器
reg [7 :0]  b_reg       =   8'd0    ;   //蓝寄存器


always @(posedge I_tpg_clk)begin
    tpg_vs_r <= I_tpg_vs; //对vs信号寄存一次
    tpg_hs_r <= I_tpg_hs; //对hs信号寄存一次
end

reg [11:0]v_cnt = 12'd0; //视频垂直方向,行计数器
reg [11:0]h_cnt = 12'd0; //视频水平方向,列计数器

//h_cnt计数器模块
always @(posedge I_tpg_clk)begin
	h_cnt <= I_tpg_de ? h_cnt + 1'b1 : 12'd0; //计数行有效像素,当de无效,重置 h_cnt=0
end

//v_cnt计数器模块
always @(posedge I_tpg_clk)begin
    if(I_tpg_vs) begin//通过vs产生同步复位
    	v_cnt <= 12'd0; //重置v_cnt=0
    end
    else begin 
    	v_cnt <= ((!tpg_hs_r)&&I_tpg_hs) ? v_cnt + 1'b1 : v_cnt; //hs信号的上升沿,v_cnt计数,这种方式可以不管hs有效是高电平还是低电平的情况,v_cnt 视频垂直方向,行计数器,计数行数量
    end
end

//显示模式切换
always @(posedge I_tpg_clk)begin
    if(I_tpg_rstn==1'b0)
	    dis_mode <= 0;
    else begin 
     dis_mode <= ((!tpg_vs_r)&&I_tpg_vs) ? dis_mode + 1'b1 : dis_mode;
    end
end

//grid_data发生器	
always @(posedge I_tpg_clk)begin
	grid_data <= ((v_cnt[4]==1'b1) ^ (h_cnt[4]==1'b1)) ? 8'h00 : 8'hff; //方格大小16*16,黑白交替
end

//RGB彩条发生器
always @(posedge I_tpg_clk)
begin
	if(h_cnt==260)
	color_bar	<=	24'hff0000;//红
	else if(h_cnt==420)
	color_bar	<=	24'h00ff00;//绿
	else if(h_cnt==580)
	color_bar	<=	24'h0000ff;//蓝
	else if(h_cnt==740)
	color_bar	<=	24'hff00ff;//紫
	else if(h_cnt==900)
	color_bar	<=	24'hffff00;//黄
	else if(h_cnt==1060)
	color_bar	<=	24'h00ffff;//青蓝
	else if(h_cnt==1220)
	color_bar	<=	24'hffffff;//白
	else if(h_cnt==1380)
	color_bar	<=	24'h000000;//黑
	else
	color_bar	<=	color_bar;
end

//测试图形输出
always @(posedge I_tpg_clk)begin
    case(dis_mode[10:7])//截取高位,控制切换显示速度
        4'd0:begin
			r_reg <= 0; 
			b_reg <= 0;
			g_reg <= 0;
		end
        4'd1:begin
			r_reg <= 8'b11111111;               //白
            g_reg <= 8'b11111111;
            b_reg <= 8'b11111111;
		end
        4'd2,4'd3:begin//连续两个状态输出相同图形
			r_reg <= 8'b11111111;              //红
            g_reg <= 0;
            b_reg <= 0;  
		end			  
        4'd4,4'd5:begin//连续两个状态输出相同图形
			r_reg <= 0;                         //绿
            g_reg <= 8'b11111111;
            b_reg <= 0; 
		end					  
        4'd6:begin     
			r_reg <= 0;                         //蓝
            g_reg <= 0;
            b_reg <= 8'b11111111;
		end
        4'd7,4'd8:begin  //连续两个状态输出相同图形   
			r_reg <= grid_data;                 //方格
            g_reg <= grid_data;
            b_reg <= grid_data;
		end					  
        4'd9:begin    
			r_reg <= h_cnt[7:0];                //水平渐变
            g_reg <= h_cnt[7:0];
            b_reg <= h_cnt[7:0];
		end
        4'd10,4'd11:begin //连续两个状态输出相同图形
			r_reg <= v_cnt[7:0];                 //垂直渐变
            g_reg <= v_cnt[7:0];
            b_reg <= v_cnt[7:0];
		end
        4'd12:begin     
			r_reg <= v_cnt[7:0];                 //红垂直渐变
            g_reg <= 0;
            b_reg <= 0;
		end
        4'd13:begin     
			r_reg <= 0;                          //绿垂直渐变
            g_reg <= h_cnt[7:0];
            b_reg <= 0;
		end
        4'd14:begin     
			r_reg <= 0;                          //蓝垂直渐变
            g_reg <= 0;
            b_reg <= h_cnt[7:0];			
		end
        4'd15:begin     
			r_reg <= color_bar[23:16];           //彩条
            g_reg <= color_bar[15:8];
            b_reg <= color_bar[7:0];			
		end				  
        endcase
end

assign O_tpg_data   = {r_reg,g_reg,b_reg}   ;   //测试图形RGB数据输出
assign O_tpg_vs     = I_tpg_vs  ;  //VS同步信号
assign O_tpg_hs     = I_tpg_hs  ;  //HS同步信号
assign O_tpg_de     = I_tpg_de  ;  //DE数据有效信号


endmodule

五、LCD驱动编写

`timescale 1ns / 1ps

module LCD(
    input           I_sysclk    ,
    input           I_rst_n     ,
    output          lcd_clk     ,
    output          lcd_hs      ,
    output          lcd_vs      ,
    output          lcd_bl      ,
    output          lcd_de      ,
    output          lcd_rst     ,
    inout  [23:0]   lcd_rgb
);

wire    [7:0]   O_rgb_r     ;
wire    [7:0]   O_rgb_g     ;
wire    [7:0]   O_rgb_b     ;

assign  lcd_rgb = ( lcd_de == 1'b1 ) ? {{O_rgb_r[7:0],O_rgb_g[7:0],O_rgb_b[7:0]}} : {24{1'bz}}  ;
assign  lcd_bl  = 1'b1  ;
assign  lcd_rst = 1'b1  ;
assign  lcd_clk = clk_33M3  ;

//LCD驱动时钟
clk_wiz_0 instance_name
(
    .clk_25M    (clk_25M    )   ,     
    .clk_33M3   (clk_33M3   )   ,     
    .clk_in1    (I_sysclk   )
);      

video_lcd u_video_lcd(
    .I_vid_clk   (clk_33M3  )   ,   //系统时钟
    .I_vid_rstn  (I_rst_n   )   ,   //系统复位输入
    .O_vid_hs    (lcd_hs    )   ,   //hs信号
    .O_vid_vs    (lcd_vs    )   ,   //vs信号
    .O_vid_de    (lcd_de    )   ,   //视频数据有效信号
    .O_rgb_r     (O_rgb_r   )   ,   // RGB-红
    .O_rgb_g     (O_rgb_g   )   ,   // RGB-绿
    .O_rgb_b     (O_rgb_b   )       // RGB-蓝
);



endmodule

六、仿真与下载验证 

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

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

相关文章

【颜色平衡树 / E】

题目 思路 DFS暴力 60分 代码 #include <bits/stdc.h> using namespace std; const int N 5010; const int M 5010; int h[N], e[M], ne[M], idx; int c[N], f; int ans; void add(int a, int b) // 添加一条边a->b {e[idx] b, ne[idx] h[a], h[a] idx ; } …

C++ 观察者模式

观察者模式&#xff08;Observer Pattern&#xff09;是一种行为设计模式&#xff0c;用于在对象之间建立一对多的依赖关系&#xff0c;当一个对象的状态发生变化时&#xff0c;它的所有依赖对象都会得到通知并自动更新。 在观察者模式中&#xff0c;主题和观察者之间是松耦合…

Vue - 路由用法

前端路由就是URL中的hash与组件之间的对应关系。Vue Router是Vue的官方路由。 组成&#xff1a; VueRouter&#xff1a;路由器类&#xff0c;根据路由请求在路由视图中动态渲染选中的组件。<router-link>&#xff1a;请求链接组件&#xff0c;浏览器会解析成<a>。…

S7-200 SMART Modbus RTU常见问题

1.S7-200 SMART 是否支持 Modbus ASCII 通信模式&#xff1f; STEP 7-Micro/WIN SMART 软件未提供Modbus ASCII 通信模式指令库。S7-200 SMART CPU若用于Modbus ASCII 通信时&#xff0c;则需要用户使用自由口通信模式进行编程。 2.S7-200 SMART CPU 集成的RS485 端口&#xf…

毕设 基于大数据情感分析的网络舆情分析系统(源码+论文)

简介 今天学长向大家介绍一个大数据毕设项目 毕设分享 基于大数据情感分析的网络舆情分析系统(源码论文) &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;4分创新点&#xff1a;4分 &#x1f9ff; 项目分享:见文末! 实…

Linux下网络转发功能

1、背景介绍 项目中使用上位机电脑&#xff0c;需要通过网络访问一个Linux主机&#xff0c;但是该Linux主机没有网络直接与上位机相连&#xff0c;只能通过插箱内另外一个Linux主机转发才能访问&#xff0c;示意图如下&#xff1a; 2、网络转发配置 Linux网络中转主机需要进行…

Java体系中的异常

1. 异常 1.1 异常的概念 在Java中&#xff0c;我们将程序执行过程中发生的不正常行为称为异常。异常是在程序运行过程中发生的错误或意外情况&#xff0c;它打破了程序的正常执行流程。在Java中通过面向对象的编程思想&#xff0c;我们也将这些扰乱程序正常执行的行为用类组织…

三菱FX3UPLC定位模式介绍

运行模式的比较 *1用相对定位指令代替。 *2使用相对/绝对定位指令。 *3使用直线插补指令的连续路径功能。 *4使用直线插补指令的连续路径功能。 可单轴运行。 *5.使用表格运行(连续运行功能)。 *6.使用中断定位指令。 *7只支持FX3UFX3UC可编程控制器&#xff0c;使用可变速脉…

设计模式之装饰器模式(Decorator)

一、装饰器模式介绍 装饰模式(decorator pattern) 的原始定义是&#xff1a;动态的给一个对象添加一些额外的职责。 就扩展功能而言&#xff0c;装饰器模式提供了一种比使用子类更加灵活的替代方案。 在软件设计中&#xff0c;装饰器模式是一种用于替代继承的技术&#xff0c;它…

Java语法之异常

1.异常的概念以及体系结构 1.1 异常的概念 在生活中人会生病,比如咳嗽流鼻涕,头晕等,程序也一样,比如:数据格式不匹配,网络不通畅,内存报警等.在Java中,我们把程序执行的不正常行为称为异常. 比如: 1. 算数异常 System.out.println(10 / 0); // 执行结果 Exception in thread &…

python导出requirements.txt的几种方法

整理了python导出requirements.txt的几种方法和流程 Condapippipreqs 最近又碰到整理requirements.txt的问题&#xff0c;有好几种命令可以做到这一点&#xff0c;但是之前整理的时候会输出一堆乱七八糟的包&#xff0c;这次挨个试了所有方法&#xff0c;特此记录。我的平台是a…

【本地缓存】Java 中的 4 种本地缓存

目录 1、手写一个简单的本地缓存1.1、封装缓存实体类1.2、创建缓存工具类1.3、测试 2、Guava Cache2.1、Guava Cache 简介2.2、入门案例2.2.1、引入 POM 依赖2.2.2、创建 LoadingCache 缓存 2.3、Guava Cache 的优劣势和适用场景 3、Caffeine3.1、Caffeine 简介3.2、对比 Guava…

elasticsearch ES DBA常用语句

一、 查看集群状态 curl -uelastic 连接串:端口/_cluster/health?pretty 集群健康有三种状态&#xff1a;green,yellow,red green&#xff1a;所有主要分片、复制分片都可用yellow&#xff1a;所有主要分片可用&#xff0c;但不是所有复制分片都可用red&#xff1a;不是所有…

基于SSM的学生信息管理系统【附源码】

​基于SSM的学生信息管理系统&#xff08;源码L文说明文档&#xff09; 目录 4 系统设计 4.1界面设计原则 4.2功能结构设计 4.3数据库设计 4.3.1数据库概念设计 4.3.2 数据库物理设计 第5章 系统实现 5.1管理员功能实现 5.1.1班级和课程关…

基于企业现状定制化的数字化转型路径和战略性架构规划

如何从企业现状出发规划数字化转型 随着技术的迅猛发展&#xff0c;全球企业都在加速推进数字化转型&#xff0c;以增强市场竞争力并提升运营效率。数字化转型并不是一个统一的模板&#xff0c;它要求企业结合自身的业务现状、行业环境和技术基础&#xff0c;制定个性化的转型…

通信工程学习:什么是B/S浏览器服务器模式

B/S&#xff1a;浏览器服务器模式 B/S&#xff08;Browser/Server&#xff0c;浏览器/服务器&#xff09;模式&#xff0c;又称B/S结构&#xff0c;是Web兴起后的一种网络结构模式。在这种模式中&#xff0c;Web浏览器是客户端最主要的应用软件&#xff0c;系统功能实现的核心部…

分享一个基于.net的学生信息管理系统 C#高校教务管理系统(源码、调试、LW、开题、PPT)

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人 八年开发经验&#xff0c;擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等&#xff0c;大家有这一块的问题可以一起交流&…

计算机毕业设计 智慧物业服务系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

初学Vue(2)

文章目录 监视属性 watch深度监视computed 和 watch 之间的区别 绑定样式&#xff08;class style&#xff09;条件渲染列表渲染基本列表key的原理列表过滤列表排序收集表单中的数据 v-model过滤器&#xff08;Vue3已移除&#xff09; 监视属性 watch 当被监视的属性变化时&am…

使用frp将树莓派穿透到外网

引言 frp官网 最近买了一块树莓派 zero 2w&#xff0c;想要它可以进行远程访问&#xff0c;所以想到了frp这个方案进行穿透&#xff0c;后期会使用树莓派搭建音乐服务器&#xff0c;本人手机内存有点小&#xff0c;xxxx云音乐太占空间&#xff0c;有兴趣的话可以关注后续。 …