当前位置: 首页 > news >正文

[米联客-安路飞龙DR1-FPSOC] FPGA基础篇连载-22 TPG图像测试数据发生器设计

软件版本:Anlogic -TD5.9.1-DR1_ES1.1

操作系统:WIN10 64bit

硬件平台:适用安路(Anlogic)FPGA

实验平台:米联客-MLK-L1-CZ06-DR1M90G开发板

板卡获取平台:https://milianke.tmall.com/

登录“米联客”FPGA社区 http://www.uisrc.com 视频课程、答疑解惑!

目录

1 概述

1.1 RGB像素格式

2 程序设计

2.1 系统框图

2.2 TPG源码

3 RTL仿真

3.1 仿真激励文件

3.2 仿真结果


1 概述

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

1.1 RGB像素格式

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

常见RGB像素格式:

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像素格式如下图所示:

RGB888 数据格式

RGB565:只需要两个字节,可以降低成本,RGB分量分别使用5bit、6bit、5bit,但在色彩鲜艳度上较差一些。

RGB555:只需要两个字节,RGB分量都使用5bit(最高位不用)。

RGB1555:只需要两个字节,RGB分量都使用5bit,1bit用于表示透明度(0完全透明,1完全不透明)。

我们可以通过电脑的“画图”工具,使用调色板即可获取到想要的颜色对应的数值。

2 程序设计

2.1 系统框图

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

TPG视频测试模式发生器

视频数据的有效区域如下图所示:视频数据在H_AcitiveSize和V_AcitiveSize同时有效时候有效

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格式数据输出

计数器模块:

h_cnt计数器模块:I_tpg_de为高电平时,表示有效显示区域阶段,此时h_cnt列计数器开始计数,计数为H_ActiveSize的值。

v_cnt计数器模块:I_tpg_vs拉高表示一帧有效图像数据传输完成,v_cnt置0,否则,I_tpg_hs拉高表示传输完一行有效数据,v_cnt加1。

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

测试图像产生模块:

使用状态机将我们要显示的所有样式的图形数据列举出来,通过不断累加的dis_mode,为了减慢显示变换图形样式的速度,取dis_mode高位值进行判断该显示何种图形。

黑白格:h_cnt[4]和v_cnt[4]进行“异或”运算,即相同为0,不同为1,再进行条件判断,0显示全黑,1显示全白。

RGB彩条:使用列计数器h_cnt,将有效显示区域划分为9块,分别显示不同的RGB数据。

//显示模式切换
always @(posedge I_tpg_clk)if(I_tpg_rstn==1'b0)dis_mode <= 0;else dis_mode <= ((!tpg_vs_r)&&I_tpg_vs) ? dis_mode + 1'b1 : dis_mode;//grid_data发生器  
always @(posedge I_tpg_clk)begingrid_data <= ((v_cnt[4]==1'b1) ^ (h_cnt[4]==1'b1)) ? 8'h00 : 8'hff; //方格大小16*16,黑白交替
end//RGB彩条发生器
always @(posedge I_tpg_clk)
beginif(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;//黑elsecolor_bar   <=  color_bar;
end//测试图形输出
always @(posedge I_tpg_clk)begincase(dis_mode[10:7])//截取高位,控制切换显示速度4'd0:beginr_reg <= 0; b_reg <= 0;g_reg <= 0;end4'd1:beginr_reg <= 8'b11111111;               //白g_reg <= 8'b11111111;b_reg <= 8'b11111111;end4'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;end4'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];end4'd10,4'd11:begin //连续两个状态输出相同图形r_reg <= v_cnt[7:0];                 //垂直渐变g_reg <= v_cnt[7:0];b_reg <= v_cnt[7:0];end4'd12:begin     r_reg <= v_cnt[7:0];                 //红垂直渐变g_reg <= 0;b_reg <= 0;end4'd13:begin     r_reg <= 0;                          //绿垂直渐变g_reg <= h_cnt[7:0];b_reg <= 0;end4'd14:begin     r_reg <= 0;                          //蓝垂直渐变g_reg <= 0;b_reg <= h_cnt[7:0];            end4'd15:begin     r_reg <= color_bar[23:16];           //彩条g_reg <= color_bar[15:8];b_reg <= color_bar[7:0];            end               endcase
end

2.2 TPG源码

/*******************************MILIANKE*******************************
*Company : MiLianKe Electronic Technology Co., Ltd.
*WebSite:https://www.milianke.com
*TechWeb:https://www.uisrc.com
*tmall-shop:https://milianke.tmall.com
*jd-shop:https://milianke.jd.com
*taobao-shop1: https://milianke.taobao.com
*Create Date: 2019/12/17
*Module Name:rgb_to_hdmi
*File Name:rgb_to_hdmi.v
*Description: 
*The reference demo provided by Milianke is only used for learning. 
*We cannot ensure that the demo itself is free of bugs, so users 
*should be responsible for the technical problems and consequences
*caused by the use of their own products.
*Copyright: Copyright (c) MiLianKe
*All rights reserved.
*Revision: 1.1
*Signal description
*1) I_ input
*2) O_ output
*3) IO_ input output
*3) S_ system internal signal
*3) _n activ low
*4) _dg debug signal 
*5) _r delay or register
*6) _s state mechine
*********************************************************************//*********uitpg(video test Pattern Generator)测试视频发生器***********
--版本号1.1
--以下是米联客设计的uitpg(video test Pattern Generator)测试视频发生器
--1.代码简洁,占用极少逻辑资源,代码结构清晰,逻辑设计严谨
--2.该测试视频发生器通过产生彩条、渐变、纯色、棋方格,产生测试图形
*********************************************************************/`timescale 1ns / 1ns//仿真时间刻度/精度module uitpg
(
input           I_tpg_clk, //系统时钟
input           I_tpg_rstn,//系统复位
input           I_tpg_vs,  //场同步输入
input           I_tpg_hs,  //行同步输入
input           I_tpg_de,  //视频数据有效输入   
output          O_tpg_vs,  //场同步输出
output          O_tpg_hs,  //行同步输出
output          O_tpg_de,  //视频数据有效输出    
output [23:0]   O_tpg_data //有效测试数据
);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)begintpg_vs_r <= I_tpg_vs; //对vs信号寄存一次tpg_hs_r <= I_tpg_hs; //对hs信号寄存一次
endreg [11:0]v_cnt = 12'd0; //视频垂直方向,行计数器
reg [11:0]h_cnt = 12'd0; //视频水平方向,列计数器//h_cnt计数器模块
always @(posedge I_tpg_clk)h_cnt <= I_tpg_de ? h_cnt + 1'b1 : 12'd0; //计数行有效像素,当de无效,重置 h_cnt=0//v_cnt计数器模块
always @(posedge I_tpg_clk)if(I_tpg_vs) //通过vs产生同步复位v_cnt <= 12'd0; //重置v_cnt=0else v_cnt <= ((!tpg_hs_r)&&I_tpg_hs) ? v_cnt + 1'b1 : v_cnt; //hs信号的上升沿,v_cnt计数,这种方式可以不管hs有效是高电平还是低电平的情况,v_cnt 视频垂直方向,行计数器,计数行数量//显示模式切换
always @(posedge I_tpg_clk)if(I_tpg_rstn==1'b0)dis_mode <= 0;else dis_mode <= ((!tpg_vs_r)&&I_tpg_vs) ? dis_mode + 1'b1 : dis_mode;//grid_data发生器  
always @(posedge I_tpg_clk)begingrid_data <= ((v_cnt[4]==1'b1) ^ (h_cnt[4]==1'b1)) ? 8'h00 : 8'hff; //方格大小16*16,黑白交替
end//RGB彩条发生器
always @(posedge I_tpg_clk)
beginif(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;//黑elsecolor_bar   <=  color_bar;
end//测试图形输出
always @(posedge I_tpg_clk)begincase(dis_mode[10:7])//截取高位,控制切换显示速度4'd0:beginr_reg <= 0; b_reg <= 0;g_reg <= 0;end4'd1:beginr_reg <= 8'b11111111;               //白g_reg <= 8'b11111111;b_reg <= 8'b11111111;end4'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;end4'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];end4'd10,4'd11:begin //连续两个状态输出相同图形r_reg <= v_cnt[7:0];                 //垂直渐变g_reg <= v_cnt[7:0];b_reg <= v_cnt[7:0];end4'd12:begin     r_reg <= v_cnt[7:0];                 //红垂直渐变g_reg <= 0;b_reg <= 0;end4'd13:begin     r_reg <= 0;                          //绿垂直渐变g_reg <= h_cnt[7:0];b_reg <= 0;end4'd14:begin     r_reg <= 0;                          //蓝垂直渐变g_reg <= 0;b_reg <= h_cnt[7:0];            end4'd15:begin     r_reg <= color_bar[23:16];           //彩条g_reg <= color_bar[15:8];b_reg <= color_bar[7:0];            end               endcase
endassign 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

3 RTL仿真

3.1 仿真激励文件

`timescale 1ns / 1ns//仿真时间刻度/精度module video_test_tb;localparam SYS_TIME = 20;//系统时钟周期10nsreg I_vid_rstn,I_vid_clk;
wire O_vid_vs,O_vid_hs,O_vid_de;
wire [7:0]O_rgb_r,O_rgb_g,O_rgb_b;//例化video_test
video_test video_test_inst
(
.I_vid_clk(I_vid_clk),
.I_vid_rstn(I_vid_rstn),
.O_vid_vs(O_vid_vs),
.O_vid_hs(O_vid_hs),
.O_vid_de(O_vid_de),
.O_rgb_r(O_rgb_r),
.O_rgb_g(O_rgb_g),
.O_rgb_b(O_rgb_b)
);//初始化
initial beginI_vid_clk  = 1'b0;I_vid_rstn = 1'b0;#100;//产生100ns的系统复位I_vid_rstn = 1'b1;//复位完成
end
//产生仿真时钟
always #(SYS_TIME/2) I_vid_clk= ~I_vid_clk;endmodule

为简化仿真,这里模拟的视频格式为320*5 即一行的有效数据为350个像素,一帧数据有5行像素数据。

.H_ActiveSize(320),         //视频时间参数,行视频信号,一行有效(需要显示的部分)像素所占的时钟数,一个时钟对应一个有效像素,设置320个像素
.H_FrameSize(320+88+44+239),//视频时间参数,行视频信号,一行视频信号总计占用的时钟数 
.H_SyncStart(320+88),       //视频时间参数,行同步开始,即多少时钟数后开始产生行同步信号
.H_SyncEnd(320+88+44),      //视频时间参数,行同步结束,即多少时钟数后停止产生行同步信号,之后就是行数据有效数据部分
.V_ActiveSize(5),           //视频时间参数,场视频信号,一帧图像所占用的有效(需要显示的部分)行数量,通常说的视频分辨率即H_ActiveSize*V_ActiveSize
.V_FrameSize(5+4+5+28),     //视频时间参数,场视频信号,一帧视频信号总计占用的行数量
.V_SyncStart(5+4),          //视频时间参数,场同步开始,即多少行数后开始产生场同步信号 
.V_SyncEnd (5+4+5)          //视频时间参数,场同步结束,即多少行数后停止产生场同步信号,之后就是场有效数据部分

3.2 仿真结果

相关文章:

[米联客-安路飞龙DR1-FPSOC] FPGA基础篇连载-22 TPG图像测试数据发生器设计

软件版本&#xff1a;Anlogic -TD5.9.1-DR1_ES1.1 操作系统&#xff1a;WIN10 64bit 硬件平台&#xff1a;适用安路(Anlogic)FPGA 实验平台&#xff1a;米联客-MLK-L1-CZ06-DR1M90G开发板 板卡获取平台&#xff1a;https://milianke.tmall.com/ 登录“米联客”FPGA社区 ht…...

如何通过企业微信会话存档保护企业利益?

赵总: 张经理&#xff0c;最近行业内频发数据泄露事件&#xff0c;我们的客户资料和内部沟通记录安全吗&#xff1f; 张经理: 赵总&#xff0c;我们已经采取了一系列措施来加强数据安全。特别是针对企业微信的沟通记录&#xff0c;我们最近引入了安企神软件&#xff0c;它能很…...

git修改提交姓名

git config --global user.name “新用户名” git config --global user.email “新邮箱地址” 修改提交的用户名 git config --global user.name “yu***”...

5、在共享内存无指针编程:句柄HANDLE转换为指针

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 共享内存里面不能用指针&#…...

hive动态分区导致xceivercount超限,hdfs无法创建新连接

目录 一、事件复盘&#xff1a; 二、解决方案&#xff1a; 三、讨论 一、事件复盘&#xff1a; hdfs无法创建新的文件&#xff0c;xceivercount超过最大设置&#xff0c;平时每个datanode只有100个左右的连接&#xff0c;突然达到8000以上。 事故原因&#xff0c;跨多天的…...

如何识别Android init 中的缓慢操作

Android 14 开机时间优化措施汇总-CSDN博客 Android 14 开机时间优化措施-CSDN博客根据systrace报告优化系统时需要关注的指标和优化策略-CSDN博客Android系统上常见的性能优化工具-CSDN博客Android上如何使用perfetto分析systrace-CSDN博客Android系统设置kernel log level的…...

JVM:常用工具总结

文章目录 一、jstat工具 一、jstat工具 Jstat工具是JDK自带的一款监控工具&#xff0c;可以提供各种垃圾回收、类加载、编译信息等不同的数据。使用方法为&#xff1a;jstat -gc进程ID每次统计的时间间隔&#xff08;毫秒&#xff09;统计次数。 C代表Capacity容量&#xff0c…...

二染色,CF 1594D - The Number of Imposters

目录 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 1594D - The Number of Imposters 二、解题报告 1、思路分析 并查集&…...

Go语言并发编程-Channel通信_2

Channel通信 Channel概述 不要通过共享内存的方式进行通信&#xff0c;而是应该通过通信的方式共享内存 这是Go语言最核心的设计模式之一。 在很多主流的编程语言中&#xff0c;多个线程传递数据的方式一般都是共享内存&#xff0c;而Go语言中多Goroutine通信的主要方案是Cha…...

Richteck立锜科技电源管理芯片简介及器件选择指南

一、电源管理简介 电源管理组件的选择和应用本身的电源输入和输出条件是高度关联的。 输入电源是交流或直流&#xff1f;需求的输出电压比输入电压高或是低&#xff1f;负载电流多大&#xff1f;系统是否对噪讯非常敏感&#xff1f;也许系统需要的是恒流而不是稳压 (例如 LED…...

Socket 简介与 Java Socket 编程示例

Socket&#xff08;套接字&#xff09;是网络通信中的一个关键概念&#xff0c;它是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。 一、定义与概念 基本概念&#xff1a;Socket可以被视为网络环境中进程间通信的API&#xff08;应用程序编程接口&#xff09;&…...

跟着操作,解决iPhone怎么清理内存难题

在如今智能手机功能日益强大的时代&#xff0c;我们使用手机拍照、录制视频、下载应用、存储文件等操作都会占用手机内存。当内存空间不足时&#xff0c;手机运行会变得缓慢&#xff0c;甚至出现卡顿、闪退等现象。因此&#xff0c;定期清理iPhone内存是非常必要的。那么&#…...

React、Vue的password输入框组件,如何关闭自动填充?

有时候我们的表单使用了一个password组件&#xff0c;这时候每次打开新建&#xff0c;都会自动获取浏览器缓存的密码&#xff0c;但是它的上一个input输入框并不是用户名&#xff0c;这时候我们希望我们的表单&#xff0c;每次点开的时候密码是空的&#xff0c;让用户自动输入&…...

HTML+JS+CSS计算练习

可填 题目数量 数字范围 计算符号 题目做完后会弹窗提示正确率、用时 效果图 源代码在图片后面 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevic…...

设计模式使用场景实现示例及优缺点(行为型模式——责任链模式)

在一个遥远的森林深处&#xff0c;有一个和谐的动物王国。这个王国里的动物们都有各自的职责&#xff0c;大家相互合作&#xff0c;共同维护着森林的和平与繁荣。 一天&#xff0c;森林里来了一只迷路的小兔子&#xff0c;她焦急地四处张望&#xff0c;不知道该怎么办。于是&am…...

CSS-1_0 CSS和文档流

文章目录 CSS和文档流如何证明这个流的存在呢&#xff1f;流和display番外&#xff1a;inline-block 碎碎念 CSS和文档流 首先什么叫流呢&#xff1f; 通常来说&#xff0c;我们最终看到的网页是HTML文档中定义的各个元素挨个输出的结果&#xff0c;这种一个接一个输出的方式…...

小程序图片下载保存方法,图片源文件保存!

引言 现在很多时候我们在观看到小程序中的图片的时候&#xff0c;想保存图片的原文件格式的话&#xff0c;很多小程序是禁止保存的&#xff0c;即使是让保存的话&#xff0c;很多小程序也会限制不让保存原文件&#xff0c;只让保存一些分辨率很低的&#xff0c;非常模糊的图片…...

新书速览|深入理解Hive:从基础到高阶:视频教学版

《深入理解Hive&#xff1a;从基础到高阶&#xff1a;视频教学版》 本书内容 《深入理解Hive:从基础到高阶:视频教学版》采用“理论实战”的形式编写&#xff0c;通过大量的实例&#xff0c;结合作者多年一线开发实战经验&#xff0c;全面地介绍Hive的使用方法。《深入理解Hiv…...

钡铼Profinet、EtherCAT、Modbus、MQTT、Ethernet/IP、OPC UA分布式IO系统BL20X系列耦合器

BL20X系列耦合器是钡铼技术开发的一款用于分布式I/O系统的设备&#xff0c;专为工业环境下的高速数据传输和远程设备控制而设计&#xff0c;支持多种工业以太网协议&#xff0c;包括Profinet、EtherCAT、Modbus、MQTT、Ethernet/IP和OPC UA等。如果您正在考虑部署BL20X系列耦合…...

Git分支合并以及分支部分合并 提交记录合并

Git分支合并,以及分支部分合并,提交记录合并 最近工作中用到git分支合并的场景,记录一下. 分支整体合并,合并所有记录 仅合并分支部分代码...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接&#xff1a;3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码&#xff0c;专为学校招生场景量身打造&#xff0c;功能实用且操作便捷。 从技术架构来看&#xff0c;ThinkPHP提供稳定可靠的后台服务&#xff0c;FastAdmin加速开发流程&#xff0c;UniApp则保障小程序在多端有良好的兼…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具

文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)

一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解&#xff0c;适合用作学习或写简历项目背景说明。 &#x1f9e0; 一、概念简介&#xff1a;Solidity 合约开发 Solidity 是一种专门为 以太坊&#xff08;Ethereum&#xff09;平台编写智能合约的高级编…...

今日科技热点速览

&#x1f525; 今日科技热点速览 &#x1f3ae; 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售&#xff0c;主打更强图形性能与沉浸式体验&#xff0c;支持多模态交互&#xff0c;受到全球玩家热捧 。 &#x1f916; 人工智能持续突破 DeepSeek-R1&…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)

本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...