FPGA中级项目8———UART-RAM-TFT
FPGA中级项目8———UART-RAM-TFT
UART串口我们学过,RAM IP核学过,TFT同样也学过。那如何将它们联合起来呢?
言简意赅:实现从串口写入图像到RAM并且由TFT显示屏输出!
首先第一步,便是要将UART_RX与RAM之间架起桥梁,也就是我们要写一个控制器,其需要的接口如下
需要串口端的数据导入,一个字节的数据导入完成标志;RAM端的写使能信号,写入地址,写入数据。
问题一
特别需要注意的是,在本节内容中,选用的RAM核为16位宽的,同时有16根地址线。
RAM 存储容量:一个 16 位宽的 RAM,意味着它每次读写操作的数据宽度是 16 位(也就是 2 字节)。如果这个 RAM 的地址线有 16 根(因为 (2^16=65536) ),那么它的存储深度就是 65536 个存储单元。每个存储单元可以存放 16 位(2 字节)的数据。所以这个 RAM 的总存储容量是131072 字节 = 128KB 。
像素点与数据关系:一个像素点用 16 位(2 字节)来表示,那么这个 128KB 容量的 RAM 正好可以存放 65536 个像素点的数据。
所以需要设立rx_down信号,来进行计数直到一幅图像数据 65536 完成。
问题二
同时定义rx_data_tmp寄存器是很有必要的,不能直接用ram_wrdata,原因有下:
1. 数据组装需求
UART 串口每次传输一个字节(8 位)的数据,而 RAM 需要以 16 位(两个字节)为单位写入数据,也就是一个像素点的数据。这就需要将两个连续接收到的字节组合成一个 16 位的数据。
rx_data_tmp寄存器起到了临时存储和组装数据的作用。每次接收到一个新的字节rx_data时,它会把之前存储的低 8 位数据和新的rx_data组合起来,形成一个完整的 16 位数据。
2. 信号类型和赋值规则
ram_wrdata是一个wire类型的信号,它是通过assign语句进行赋值的,不能在always块中直接修改其值。assign语句通常用于组合逻辑的赋值,而rx_data_tmp的更新是时序逻辑,需要在always块中完成。如果直接使用ram_wrdata,就无法在always块中对其进行更新,也就无法实现数据的正确组装。
3. 写使能和数据同步
写使能信号ram_wren是在接收到第二个字节时才有效,这意味着只有在两个字节都接收完成后,才会将组合好的 16 位数据写入 RAM。rx_data_tmp在接收到每个字节时都会更新,但只有在写使能有效时,ram_wrdata才会将组合好的数据输出到 RAM。
控制器代码如下所示:
代码展示
//输入输出模块
module img_rx_wr(clk,reset_n,rx_data,//串口的导入数据rx_down,//串口接受到一个字节的标志信号ram_wren,//写使能ram_wraddr,//地址ram_wrdata,//输出给RAM的数据led );input clk;input reset_n;input [7:0]rx_data;input rx_down;output reg ram_wren;output reg [15:0]ram_wraddr;output wire [15:0]ram_wrdata;output reg led;//统计串口接受的计数器计数,看是否达到了128k个数据传输
reg [16:0]data_cnt ;
always@(posedge clk or negedge reset_n)
if(!reset_n)data_cnt <= 0;
else if(rx_down)data_cnt <= data_cnt +1'd1;//定义16位寄存器,用于存放一个像素点也就是两个字节
reg [15:0]rx_data_tmp;
always@(posedge clk or negedge reset_n)
if(!reset_n)rx_data_tmp <= 0;
else if(rx_down) rx_data_tmp <= {rx_data_tmp[7:0],rx_data};//写使能逻辑,利用相与
always@(posedge clk or negedge reset_n)
if(!reset_n)ram_wren <= 0;
else if(rx_down && data_cnt[0])//利用奇数末尾为1,相与为1,表明写使能有效ram_wren <= 1'd1;
elseram_wren <= 0;//将数据位置写入地址,2个数据一个地址,采用舍弃低位方式
always@(posedge clk or negedge reset_n)
if(!reset_n)ram_wraddr <= 0;
else if(rx_down && data_cnt[0])//也就是写使能ram_wraddr <= data_cnt[16:1];assign ram_wrdata = rx_data_tmp;//led灯翻转逻辑,也就是串口传输完完整数据后翻转
always@(posedge clk or negedge reset_n)
if(!reset_n)led <= 0;
else if(data_cnt == 131071 && rx_down)led <= ~led;endmodule
实现了以上控制器逻辑之后,我们便需要来编写顶层模块了,也就是将之前学过的相关模块例化并连接。
问题一
要创建一个MMCN IP核创建33M频率的时钟clk_TFT,来实现各模块的时钟同步。
问题二
要创建RAM IP核实现上述要求
问题三
要对原先的TFT模块进行微微修改,也就是要创建一个TFT数据请求输出data_req,用来输出TFT的数据时间段,也就是将原先的TFT_DE的打拍操作,同时将TFT-TS和TFT-VS打两拍,从而消除亚稳态。
TFT代码展示
//定义输入输出端口
module TFT(clk,reset_n,data_in,//用户输入数据data_req,TFT_HS,//行同步信号TFT_VS,//场同步信号hcount,//行扫描位置vcount,//场扫描位置TFT_DE,//数据输出时间段TFT_CLK,TFT_DATA,TFT_BL);input clk;input reset_n;input [15:0]data_in;output reg data_req;output TFT_HS;output TFT_VS;output reg [11:0]hcount;//行同步的信号最大值为1056output reg [11:0]vcount;output TFT_DE;output TFT_CLK;output reg [15:0]TFT_DATA;output TFT_BL;// 定义不同的分辨率
//`define resolution_480x272 1 // 时钟为9MHz
//`define resolution_640x480 1 // 时钟为25MHz
`define resolution_800x480 1 // 时钟为33MHz
//`define resolution_800x600 1 // 时钟为40MHz
//`define resolution_1024x600 1 // 时钟为51MHz
//`define resolution_1024x768 1 // 时钟为65MHz
//`define resolution_1280x720 1 // 时钟为74.25MHz
//`define resolution_1920x1080 1 // 时钟为148.5MHz`ifdef resolution_480x272`define h_right_border 0`define h_front_porch 2`define h_sync_time 41`define h_back_porch 2`define h_left_border 0`define h_data_time 480`define h_total_time 525`define v_bottom_border 0`define v_front_porch 2`define v_sync_time 10`define v_back_porch 2`define v_top_border 0`define v_data_time 272`define v_total_time 286`elsif resolution_640x480`define h_right_border 0`define h_front_porch 16`define h_sync_time 96`define h_back_porch 48`define h_left_border 0`define h_data_time 640`define h_total_time 800`define v_bottom_border 0`define v_front_porch 10`define v_sync_time 2`define v_back_porch 33`define v_top_border 0`define v_data_time 480`define v_total_time 525`elsif resolution_800x480`define h_right_border 0`define h_front_porch 40`define h_sync_time 128`define h_back_porch 88`define h_left_border 0`define h_data_time 800`define h_total_time 1056`define v_bottom_border 8`define v_front_porch 2`define v_sync_time 2`define v_back_porch 25`define v_top_border 8`define v_data_time 480`define v_total_time 525`elsif resolution_800x600`define h_right_border 0`define h_front_porch 40`define h_sync_time 128`define h_back_porch 88`define h_left_border 0`define h_data_time 800`define h_total_time 1056`define v_bottom_border 0`define v_front_porch 1`define v_sync_time 4`define v_back_porch 23`define v_top_border 0`define v_data_time 600`define v_total_time 628`elsif resolution_1024x600`define h_right_border 0`define h_front_porch 24`define h_sync_time 136`define h_back_porch 160`define h_left_border 0`define h_data_time 1024`define h_total_time 1344`define v_bottom_border 0`define v_front_porch 1`define v_sync_time 3`define v_back_porch 28`define v_top_border 0`define v_data_time 600`define v_total_time 632`elsif resolution_1024x768`define h_right_border 0`define h_front_porch 24`define h_sync_time 136`define h_back_porch 160`define h_left_border 0`define h_data_time 1024`define h_total_time 1344`define v_bottom_border 0`define v_front_porch 3`define v_sync_time 6`define v_back_porch 29`define v_top_border 0`define v_data_time 768`define v_total_time 806`elsif resolution_1280x720`define h_right_border 0`define h_front_porch 110`define h_sync_time 40`define h_back_porch 220`define h_left_border 0`define h_data_time 1280`define h_total_time 1650`define v_bottom_border 0`define v_front_porch 5`define v_sync_time 5`define v_back_porch 36`define v_top_border 0`define v_data_time 720`define v_total_time 750`elsif resolution_1920x1080`define h_right_border 0`define h_front_porch 88`define h_sync_time 44`define h_back_porch 148`define h_left_border 0`define h_data_time 1920`define h_total_time 2200`define v_bottom_border 0`define v_front_porch 4`define v_sync_time 5`define v_back_porch 36`define v_top_border 0`define v_data_time 1080`define v_total_time 1125`endif //定义时序中相关信号 //parameter VGA_HS_end = 11'd127;//parameter hdat_begin = 11'd216;//行数据开始输出位置//parameter hdat_end = 11'd1016;//行数据停止输出位置//parameter hpixel_end = 11'd1055;//行扫描的最大位置处//parameter VGA_VS_end = 11'd1;//parameter vdat_begin = 11'd35;//parameter vdat_end = 11'd515;//parameter vpixel_end = 11'd524; //将上述的parameter定义改为参数定义,便于适配parameter TFT_HS_end = `h_sync_time - 1,hdat_begin = `h_sync_time + `h_back_porch + `h_left_border,hdat_end = `h_sync_time + `h_back_porch + `h_left_border + `h_data_time,hpixel_end = `h_total_time - 1,TFT_VS_end = `v_sync_time - 1,vdat_begin = `v_sync_time + `v_back_porch + `v_top_border,vdat_end = `v_sync_time + `v_back_porch + `v_top_border + `v_data_time,vpixel_end = `v_total_time - 1;//定义计数器,开始行扫描信号,场扫描信号计数 reg [11:0]hcount_r;reg [11:0]vcount_r;
always@(posedge clk or negedge reset_n)
if(!reset_n)hcount_r <= 11'd0;
else if(hcount_r == hpixel_end) hcount_r <= 11'd0;
elsehcount_r <= hcount_r + 1'd1;always@(posedge clk or negedge reset_n)
if(!reset_n) vcount_r <= 11'd0;
else if(hcount_r == hpixel_end) beginif(vcount_r == vpixel_end) vcount_r <= 11'd0;elsevcount_r <= vcount_r + 1'd1;end
elsevcount_r <= vcount_r;assign TFT_CLK = ~clk; always@(posedge clk)data_req <= ((hcount_r >= hdat_begin) &&(hcount_r < hdat_end ) &&(vcount_r >= vdat_begin )&&(vcount_r < vdat_end))?1'b1:1'b0; reg [3:0]TFT_DE_r;//将data_req打两拍
always@(posedge clk)beginTFT_DE_r[0] <= data_req;TFT_DE_r[3:1] <= TFT_DE_r[2:0];endassign TFT_DE = TFT_DE_r[2]; always@(posedge clk)beginhcount <= data_req ? (hcount_r - hdat_begin) :10'd0;vcount <= data_req ? (vcount_r - vdat_begin) :10'd0;
endalways@(posedge clk)beginTFT_DATA <= (data_req)? data_in: 16'h0000;end reg [3:0]TFT_HS_r;//同样打两拍
always@(posedge clk)beginTFT_HS_r[0] = (hcount_r > TFT_HS_end) ?1'b1:1'b0;TFT_HS_r[3:1] <= TFT_HS_r[2:0];endassign TFT_HS = TFT_HS_r[2]; reg [3:0]TFT_VS_r;//同样打两拍
always@(posedge clk)beginTFT_VS_r[0] = (vcount_r > TFT_VS_end) ?1'b1:1'b0;TFT_VS_r[3:1] <= TFT_VS_r[2:0];endassign TFT_VS = TFT_VS_r[2]; //定义相关信号
//assign TFT_HS = (hcount_r > TFT_HS_end) ?1'b1:1'b0;
//assign TFT_VS = (vcount_r > TFT_VS_end) ?1'b1:1'b0;
//assign TFT_DE =((hcount_r >= hdat_begin) &&(hcount_r < hdat_end ) &&(vcount_r >= vdat_begin )&&(vcount_r < vdat_end))?1'b1:1'b0;
//assign hcount = TFT_DE ? (hcount_r - hdat_begin) :10'd0;
//assign vcount = TFT_DE ? (vcount_r - vdat_begin) :10'd0;
//assign data_out = (TFT_DE) ? data_in : 24'h000000;
//assign TFT_CLK = ~clk;
assign TFT_BL = 1; endmodule
顶层模块代码展示
//输入输出模块
module UART_RAM_TFT(clk,reset_n,uart_rx,TFT_RGB,//tft数据输出TFT_HS,//TFT行同步信号TFT_VS,//TFT场同步信号TFT_DE,//TFT数据有效信号TFT_CLK,TFT_BL,//TFT背光led);input clk;input reset_n;input uart_rx;output [15:0]TFT_RGB;output TFT_HS;output TFT_VS;output TFT_DE;output TFT_CLK;output TFT_BL;output led;//定义相关变量wire [7:0]rx_data;wire rx_down;wire ram_wren;//RAM 的写使能信号,高电平有效时允许向 RAM 写入数据。wire [15:0]ram_wraddr;//RAM 的写地址信号,用于指定写入数据的存储位置。wire [15:0]ram_wrdata;//要写入 RAM 的数据reg [15:0]ram_rdaddr;//用于存储从 RAM 中读取数据的地址,是一个寄存器类型,因为它需要在always块中被赋值和更新。wire clk_TFT;//TFT 显示屏的时钟信号,由 MMCM 模块生成。wire [15:0]ram_rddata;//从 RAM 中读取出来的 16 位数据。wire [11:0]hcount,vcount;wire ram_data_en;//用于控制是否从 RAM 中读取数据的使能信号wire [15:0]disp_data;//最终要显示在 TFT 显示屏上的数据,根据ram_data_en信号从 RAM 中读取或赋值为 0。wire locked; //例化相关模块 MMCM MMCM(// Clock out ports.clk_out1(clk_TFT), // output clk_out1// Status and control signals.reset(!reset_n), // input reset.locked(locked), // output locked// Clock in ports.clk_in1(clk)); uart_rx1 uart_rx1(.clk(clk),.reset_n(reset_n),.uart_rx(uart_rx),.rx_data(rx_data),.rx_down(rx_down) );img_rx_wr img_rx_wr(.clk(clk_TFT),.reset_n(reset_n),.rx_data(rx_data),//串口的导入数据.rx_down(rx_down),//串口接受到一个字节的标准信号.ram_wren(ram_wren),//写使能.ram_wraddr(ram_wraddr),//地址.ram_wrdata(ram_wrdata),//输出给RAM的数据.led(led) );RAM RAM (.clka(clk), // input wire clka.ena(1), // input wire ena.wea(ram_wren), // input wire [0 : 0] wea.addra(ram_wraddr), // input wire [15 : 0] addra.dina(ram_wrdata), // input wire [15 : 0] dina.clkb(clk_TFT), // input wire clkb.enb(1), // input wire enb.addrb(ram_rdaddr), // input wire [15 : 0] addrb.doutb(ram_rddata) // output wire [15 : 0] doutb
);//RAM中存储的图像是256*256像素矩阵,取完一个数据地址加一wire data_req;
always@(posedge clk_TFT or negedge reset_n)
if(!reset_n)ram_rdaddr <= 0;
else if(ram_data_en) ram_rdaddr <= ram_rdaddr + 1'd1;assign ram_data_en = data_req && (hcount >= 272 && hcount < 528) &&(vcount >= 112 && vcount <= 368);
assign disp_data = ram_data_en ? ram_rddata : 0; TFT TFT(.clk(clk_TFT),.reset_n(reset_n),.data_in(disp_data),//用户输入数据.data_req(data_req),.TFT_HS(TFT_HS),//行同步信号.TFT_VS(TFT_VS),//场同步信号.hcount(hcount),//行扫描位置.vcount(vcount),//场扫描位置.TFT_DE(TFT_DE),//数据输出时间段.TFT_CLK(TFT_CLK),.TFT_DATA(TFT_RGB),.TFT_BL(TFT_BL)); endmodule
同时需要必须的一些小文件来进行图像输入操作,例如网友创建的COE文件程序“BMP2MIF”可将图像BMP文件转换为COE格式输入到RAM中,从而在TFT屏幕显示。
最后利用UART串口发送工具将图片文件发送即可使用!!!
相关文章:
FPGA中级项目8———UART-RAM-TFT
FPGA中级项目8———UART-RAM-TFT UART串口我们学过,RAM IP核学过,TFT同样也学过。那如何将它们联合起来呢? 言简意赅:实现从串口写入图像到RAM并且由TFT显示屏输出! 首先第一步,便是要将UART_RX与RAM之间…...
Ocelot\Consul\.NetCore的微服务应用案例
案例资料链接:https://download.csdn.net/download/ly1h1/90733765 1.效果 实现两个微服务ServerAPI1和ServerAPI2的负载均衡以及高可用。具体原理,看以下示意图。 2.部署条件 1、腾讯云的轻量化服务器 2、WindowServer2016 3、.NETCore7.0 4、Negut …...
数值求解Eikonal方程的方法及开源实现
Eikonal方程是一类非线性偏微分方程,形式为 ( |\nabla u(x)| f(x) ),常见于波传播、几何光学、最短路径等问题。以下是数值求解Eikonal方程的方法及开源实现参考: 一、数值求解方法 有限差分法(FDM) 快速行进法&#…...
Http详解
🧱 一、从 TCP 三次握手到访问网页:两层过程 🧩 1. TCP 三次握手(网络传输层) 这是 建立连接 的前提,跟 HTTP 无关,但 HTTP 要依赖它。 举例:你打开浏览器访问 https://example.c…...
实验五 完整性
一、引言 本次上机实验的目的主要是让学生掌握数据库完整性的三大类型(实体完整性、参照完整性、用户自定义完整性),并通过实际建库建表和数据操作加深理解。 下面将为分别展示 student、course、sc 三个表的创建语句,并设置对应的…...
《原码、反码与补码:计算机中的数字奥秘》
🚀个人主页:BabyZZの秘密日记 📖收入专栏:C语言 🌍文章目入 一、原码:最直观的表示法1. 正数的原码2. 负数的原码3. 原码的特点 二、反码:原码的“反转”1. 正数的反码2. 负数的反码3. 反码的特…...
论文笔记——QWen2.5 VL
目录 引言架构创新数据整理与训练策略性能与基准测试精细感知能力应用与现实世界影响与现有模型比较结论 引言 视觉理解和自然语言处理的集成一直是人工智能研究的一个重要焦点,促成了日益复杂的视觉语言模型 (VLMs) 的发展。由阿里巴巴集团 Qwen 团队开发的 Qwe…...
前端HTML基础知识
1.HTML介绍 HTML(HyperText Markup Language,超文本标记语言)是构成网页的基本元素,是一种用于创建网页的标准化标记语言。HTML不是一种编程语言,而是一种标记语言,通过标签来描述网页的结构和内容。 超文本:超文本是…...
程序代码篇---ESP32云开发
文章目录 前言 前言 本文简单介绍了实现 ESP32-S3 传感器数据上传至云平台 手机远程控制电机 的完整方案,涵盖推荐的云平台、手机端。 一、推荐云平台及工具 云平台选择 阿里云 IoT 平台 优势:国内稳定、支持大规模设备接入、提供完整设备管理及安全…...
【C语言】文本操作函数fseek、ftell、rewind
一、fseek int fseek ( FILE * stream, long int offset, int origin ); 重新定位文件指针的位置,使其指向以origin为基准、偏移offset字节的位置。 成功返回0,失败返回非零值(通常为-1)。 origin有如下三种:分别是…...
ARM ASM
ARM ASM ARM寄存器集 列出了ARM的16个程序员可见寄存器(r0~r15)以及它的状态寄存器。 ARM共有14个通用寄存器r0~r13。寄存器r13被保留用作栈指针,r14存放子程 序返回地址,r15为程序计数器。 由于r15能够被程序员访问,…...
【五一培训】Day1
注: 1. 本次培训内容的记录将以“Topic”的方式来呈现,用于记录个人对知识点的理解。 2. 由于培训期间,作者受限于一些现实条件,本文的排版及图片等相关优化,需要过一段时间才能完成。 Topic 1:使用DeepS…...
SpringBoot使用分组校验解决同一个实体对象在不同场景下需要不同校验规则的问题
背景 添加分类的接口不需要id字段,但更新分类的接口需要id字段,当在id字段上使用NotNull注解时,会导致使用添加分类接口报id字段不能为空的错误 解决 定义分组 pojo/Category.java // 如果没有指定分组,则默认属于Default分组…...
Hibernate与MybatisPlus的混用问题(Invalid bound statement (not found))
当项目里已经有了Hibernate后: spring:jpa:hibernate:ddl-auto: updateshow-sql: trueproperties:hibernate:format_sql: true 再配置yml文件就会失效: mybatis-plus:mapper-locations: classpath:mapper/*.xml# 全局策略global-config:db-config:# 自…...
【音视频】ffplay数据结构分析
struct VideoState 播放器封装 typedef struct VideoState {SDL_Thread *read_tid; // 读线程句柄AVInputFormat *iformat; // 指向demuxerint abort_request; // 1时请求退出播放int force_refresh; // 1时需要刷新画⾯,请求⽴即刷新画⾯的意思int paused; // 1时…...
PV操作:宣帧闯江湖武林客栈版学习笔记【操作系统】
P,V,S江湖话翻译 P(申请) 江湖侠客拔剑大喊“掌柜的,给我一间上房!”(申请资源,房不够就蹲门口等)-要房令牌 V(释放) 江湖侠客退房时甩出一锭银子,大喊“…...
精品推荐-湖仓一体电商数据分析平台实践教程合集(视频教程+设计文档+完整项目代码)
精品推荐,湖仓一体电商数据分析平台实践教程合集,包含视频教程、设计文档及完整项目代码等资料,供大家学习。 1、项目背景介绍及项目架构 2、项目使用技术版本及组件搭建 3、项目数据种类与采集 4、实时业务统计指标分析一——ODS分层设计与…...
对计网考研中的信道、传输时延、传播时延的理解
对计网考研中的信道、传输时延、传播时延的理解 在学习数据链路层流量控制和可靠传输那一节的三个协议的最大信道利用率时产生的疑惑 情景: 假如A主机和B主机通过集线器连接,A和集线器是光纤连接,B和集线器也是光纤连接,A给B发…...
RAGFlow报错:ESConnection.sql got exception
环境: Ragflowv0.17.2 问题描述: RAGFlow报错:ESConnection.sql got exception _ming_cheng_tks, 浙江, operatorOR;minimum_should_match30%) 2025-04-25 15:55:06,862 INFO 244867 POST http://localhost:1200/_sql?formatjson […...
报错:函数或变量 ‘calcmie‘ 无法识别。
1、具体报错 运行网上一个开源代码,但是运行报如下错: TT_para_gen 函数或变量 calcmie 无法识别。 出错 TT_para_gen>Mie (第 46 行) [S, C, ang,~] calcmie(rad, ns, nm, lambda, nang, ... 出错 TT_para_gen (第 17 行) [~,ang,Miee,C] …...
蓝桥杯获奖后心得体会
文章目录 获奖项备考心得📖 蓝桥杯 Java 研究生组备考心得📌 一、备考规划📌 二、考试技巧📌 三、心理调整📌 四、总结 获奖项 JAVA研究生组省二 备考心得 好!我来给你写一篇蓝桥杯研究生组Java方向的备…...
大鱼吃小鱼开源
因为知道一些学校也有相关C语言课设 所以这里对代码开源(如果没有csdn会员请用夸克) 我用夸克网盘分享了「大鱼吃小鱼-程序.zip」,点击链接即可保存。打开「夸克APP」,无需下载在线播放视频,畅享原画5倍速࿰…...
深度学习框架搭建(Vscode/Anaconda/CUDA/Pytroch)
目录 一 Vscode安装 二、Anaconda安装 三、更新显卡驱动 四、安装CUDA 五、安装Pytorch 六、Vscode配置 七、出现的问题汇总 一 Vscode安装 在 Windows 上安装 访问 VS Code 官网 https://code.visualstudio.com/,点击 "Downl…...
免费实用的图像处理工具箱
提到图像处理,一般会想到Photoshop。的确PS比较专业,但是学习成本比较高。其实,针对具体的应用场景,选些简单的工具软件会更方便。 今天就给大家分享一款“洋芋田图像工具箱”软件。它支持Windows和Mac电脑。 用这款软件&#x…...
范式演进:从ETL到ELT及未来展望
范式演进:从ETL到ELT及未来展望 引言 随着数据规模与实时分析需求的爆发,传统的集中式 ETL(Extract-Transform-Load)已难以为继,ELT(Extract-Load-Transform)凭借云原生仓库的弹性计算与分析工程的兴起逐步成为主流。2025 年,数据团队正加速从“先变换再加载”走向“…...
定义一个3D cube,并计算cube每个顶点的像素坐标
定义一个3D cube,并计算cube每个顶点的像素坐标 scratch a pixel课程:Your Starting Point! 3D场景中物体所有点与坐标系原点的连线,该连线与像素平面canvas的交点就是场景中3D点其投影点的位置 3D场景中的点均由这个坐标系描述 相似三角形ABC和A’B’…...
Python学习笔记(第二部分)
接续 Python.md 文件的第二部分 字典 字典的基本操作 字典是一系列 键—值 对,每一个键都与一个值关联,值可以是数字,字符串,甚至是列表或字典,可以把任何python对象都作为字典中的值 alien {color:green,points:5}键…...
ZYNQB笔记(十六):AXI DMA 环路测试
版本:Vivado2020.2(Vitis) 任务:使用 PL 端的 AXI DMA IP 核实现对 DDR3 中数据的读取与写入,实现数据环回,具体流程为: PS 端产生测试数据并写入到 DDR3 中,然后 PL 端的 AXI DMA I…...
Java学习手册:Spring 数据访问
一、Spring JDBC JdbcTemplate :Spring JDBC 提供了 JdbcTemplate 类,它简化了数据库操作,提供了丰富的 API 来执行数据库访问任务。JdbcTemplate 可以自动处理数据库连接的获取、释放,SQL 语句的执行,结果集的处理等…...
第二章 日志分析-apache日志分析(玄机系列)
简介 账号密码 root apacherizhi ssh rootIP 1、提交当天访问次数最多的IP,即黑客IP: 2、黑客使用的浏览器指纹是什么,提交指纹的md5: 3、查看包含index.php页面被访问的次数,提交次数: 4、查看黑客IP访问了…...
类比分析AI Agent 技术
引言:AI Agent 的本质与范式转变 在人工智能领域,AI Agent(智能体)代表了一种从传统软件系统到自主性实体的深刻范式转变。不同于仅仅执行预设指令或算法的程序,现代 AI Agent 被设计为能够: 感知 (Perce…...
【业务领域】PCIE协议理解
PCIE协议理解 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 PCIE学习理解。 文章目录 PCIE协议理解[TOC](文章目录) 前言零、PCIE掌握点?一、PCIE是什么?二、PCIE协议总结物理层切速 链路层事务层6.2 TLP的路…...
设计模式简述(十四)组合模式
组合模式 描述基本使用所有节点方法一致使用 叶子无实现子节点使用 添加向上查询使用(没变化) 描述 组合模式用于描述部分与整体的关系,将个体对象与组合对象的行为统一,便于维护整个数据集。 基本使用 所有节点方法一致 定义…...
【Tool】vscode
vscode问题集锦 1 全局搜索失效 ctrl shift f 快捷键失效: 原因:可能与输入法快捷键冲突,重定义输入法快捷键即可 其他 看心情和经历补充~...
文件操作--文件包含漏洞
本文主要内容 脚本 ASP、PHP、JSP、ASPX、Python、Javaweb --# 各种包含函数 检测 白盒 代码审计 黑盒 漏扫工具、公开漏洞、手工看参数值及功能点 类型 本地包含 有限制、无限制 远程包含 无限制、有限制…...
数字智慧方案6156丨智慧医联体信息化解决方案(50页PPT)(文末有下载方式)
资料解读:智慧医联体信息化解决方案 详细资料请看本解读文章的最后内容。 在医疗改革不断深化的大背景下,医联体信息化建设成为推动医疗服务高质量发展的关键力量。《智慧医联体信息化解决方案》这份资料,全面且深入地阐述了医联体信息化建…...
华为eNSP:多区域集成IS-IS
一、什么是多区域集成IS-IS? 多区域集成IS-IS是一种基于中间系统到中间系统(IS-IS)协议优化的网络架构设计,通过多区域协同、路径优化和扩展性增强实现高效路由管理,其核心特征如下: 1、分布式架构与多区…...
RAG技术完全指南(一):检索增强生成原理与LLM对比分析
RAG技术完全指南(一):检索增强生成原理与LLM对比分析 文章目录 RAG技术完全指南(一):检索增强生成原理与LLM对比分析1. RAG 简介2. 核心思想3. 工作流程3.1 数据预处理(索引构建)3.2…...
(持续更新)Ubuntu搭建LNMP(Linux + Nginx + MySQL + PHP)环境
LNMP(Linux Nginx MySQL PHP)环境是在Linux操作系统上构建的一个高性能Web服务器环境。M也可以指代其他数据库,P也可以指代Python 1. 准备Linux系统 确保你已经在一台服务器或虚拟机上安装了Linux操作系统。推荐使用Ubuntu、CentOS或Debi…...
机器人手臂控制器:EMC电磁兼容解决(一)
一、机器人手臂控制器行业标准剖析 GB/T 39004—2020《工业机器人电磁兼容设计规范》 GB/T 37283-2019 服务机器人 电磁兼容 通用标准 抗扰度要求和限值 GB/T 39785-2021 服务机器人 机械安全评估与测试方法 GB/T 40014-2021 双臂工业机器人 性能及其试验方法 GB/T 40013-…...
Qt进阶开发:QSS常用的语法介绍和使用
文章目录 一、什么是QSS?二、QSS的基本语法三、QSS 的使用方式3.1 在代码中设置 QSS3.2 加载外部 QSS 文件四、QSS中选择器的介绍和使用4.1 Type Selector(类型选择器)4.2 ID Selector(ID 选择器)4.2.1 仅使用 ID(常见写法)4.2. 2 类型 + ID(更精确匹配)4.3 Class Sel…...
qemu学习笔记:QOM
2.4 QOM介绍 说明:小白学习qemu的一些学习笔记。主要是学习《QEMU&KVM源码解析与应用》这本书。 参考: 《QEMU&KVM源码解析与应用》作者:李强 Qemu - 百问网嵌入式Linux wiki QOM 定义:QEMU Object Model,是 Q…...
Spring AI开发跃迁指南(第二章:急速上手3——Advisor核心原理、源码讲解及使用实例)
1.Advisor简介 Spring AI 中的 Advisor 是一种核心机制,用于拦截和增强 AI 应用程序中的请求与响应流。其设计灵感来源于 Spring AOP(面向切面编程)中的切面(Aspect)概念,但专门针对 AI 交互场景进行了优化…...
51c嵌入式~单片机~合集9
我自己的原文哦~ https://blog.51cto.com/whaosoft/13884964 一、单片机中hex、bin文件的区别 单片机程序编译之后,除了生成hex文件之外还生成了bin文件,实际它们都是单片机的下载文件,下文介绍它们的区别。 Hex Hex文件包含地址信息。…...
linux学习——数据库API创建
一.API操作 1.int sqlite3_open(char *filename,sqlite3 **db) 功能:打开sqlite数据库 参数: filename:数据库文件路径 db:指向sqlite句柄的指针 (splite3* db;) 返回值…...
21.2Linux中的LCD驱动实验(驱动)_csdn
1、修改设备树 1.1、LCD 屏幕使用的 IO 配置 编译: make uImage LOADADDR0XC2000040 -j8 //编译内核复制给内核的镜像路径:1.2、LDTC 接口节点修改 1.3、输出接口的编写 2、在 panel-simple.c 文件里面添加屏幕参数 显示波浪线是因为alientek_desc 保存参…...
Dubbo(89)如何设计一个支持多语言的Dubbo服务?
设计一个支持多语言的Dubbo服务需要考虑以下几个方面: 服务接口设计:确保服务接口的定义可以被不同语言实现。序列化协议:选择一个支持多语言的序列化协议,例如Protobuf、Thrift、gRPC等。服务注册与发现:确保服务注册…...
油气地震资料数据中“照明”的含义
油气地震资料数据中“照明”的含义 在地震勘探中,“照明”(Illumination)是一个比喻性术语,用于描述地下地质构造被地震波能量覆盖的程度。其核心含义包括: 能量覆盖:指地震波(如人工激发的地…...
[FPGA Video IP] Frame Buffer Read and Write
Xilinx Video Frame Buffer Read and Write IP (PG278) 详细介绍 概述 Xilinx LogiCORE™ IP Video Frame Buffer Read(帧缓冲读取)和 Video Frame Buffer Write(帧缓冲写入)核(PG278)是一对专为视频处理…...
新能源行业供应链规划及集成计划报告(95页PPT)(文末有下载方式)
资料解读:《数字化供应链规划及集成计划现状评估报告》 详细资料请看本解读文章的最后内容。 该报告围绕新能源行业 XX 企业供应链展开,全面评估其现状,剖析存在的问题,并提出改进方向和关键举措,旨在提升供应链竞争力…...