DDR4时序标准规范(一)

news2024/11/19 3:40:37

DDR4时序标准规范

  • 引脚描述
  • DDR4 SDRAM寻址
  • DDR4架构的模块描述
  • 功能描述
    • 简化状态机
    • 基本功能
  • 复位和初始化程序
    • 上电和初始化顺序
    • 电压稳定后的复位初始化顺序
    • 无控制的下电顺序

引脚描述

标志类型功能
CK_t, CK_c输入Clock: CK_t和CK_c是差分时钟输入。所有的地址和控制输入信号在CK_t的正边缘和CK_c的负边缘的交叉处采样。
CKE, (CKE1)输入时钟使能:CKE为高时使能,为低时停用时钟信号和输出驱动程序。拉低CKE信号提供预充电关闭和自刷新操作(所有Bank空闲状态),或者预充电关闭(行激励在某一Bank),CKE信号与自刷新同步退出是同步的,CKE信号在整个读写访问过程中保持为高。
CS_n, (CS1_n)输入片选信号,当CS_n为高时,所有命令被掩码屏蔽。CS_n在具有多个Rank的系统上提供外部Rank选择
C0,C1,C2输入Chip ID:该信号仅用于3DS中2/4/8高的堆叠,通过TSV选择堆叠组件的每个Chip
ODT , (ODT1)输入当ODT信号为高时启用内部SDRAM的终端电阻。当启用时,ODT只应用于x8配置的每个DQ、DQS_t, DQS_c和DM_n/DBI_n/TDQS_t, NU/TDQS_c信号(当TDQS信号通过模式寄存器MR1中启用时,即A11=1),对于x16配置,ODT应用于每个DQ、DQSU_t、DQSU_c、DQSL_t、DQSL_c、DMU_n和DML_n信号。如果MR1被编程为禁用RTT_NOM,那么ODT引脚将被忽略
ACT_n输入激活命令输入:ACT_n定义为与CS_n一起输入的激活命令。RAS_n/A16. CAS_n/
A15. WE_n/A14上的输入信号被认为是行地址A16、A15、A14
RAS_n/A16,CAS_n/A15,WE_n/A14输入命令输入:RAS_n/A16, CAS_n/A15和WE_n/A14(以及CS_n)定义所输入的命令。这些引脚具备复用的功能,例如对于ACT_n为低电平时的激活命令,它们是A16,A15和A14的寻址,但对于ACT_n高的非激活命令,它们是读,写和命令真值表中定义的其他命令的命令引脚
DM_n/DBI_n/TDQS_t, (DMU_n/DBIU_n), (DML_n/DBIL_n)输入/输出输入数据掩码和数据总线反转:DM_n是写数据的输入掩码信号。当DM_n在写访问期间采样为LOW时,输入数据将被屏蔽。DM_n在DQS的两边采样。DM与DBI功能通过模式寄存器MR5(A10,A11,A12)进行混接。对于x8设备,通过在模式寄存器MR1(A11)使能DM或TDQS功能。DBI_n是一个输入/输出,标识是存储/输出真实数据还是反转数据。如果DBI_n为LOW,则数据将在DDR4 SDRAM内进行反转后存储/输出,如果DBI_n为HIGH则不进行反转。TDQS仅在X8中支持
BG0 - BG1输入Bank Group输入:BG0 - BG1定义激活、读、写或预充命令应用到哪个Bank Group。BG0还确定在MRS(Mode Register Set)周期中要访问哪种模式寄存器。X4/8有BG0和BG1, X16只有BG0
BA0 - BA1输入Bank Address输入:BA0 - BA1定义了激活、读、写或预充电命令被应用到哪个Bank。Bank Address还决定了在MRS(Mode Register Set)周期中要访问哪个模式寄存器。
A0 - A17输入地址输入:为激活命令提供行地址,为读/写命令提供列地址,以便从各自Bank的内存数组中选择一个位置。(A10/AP, A12/BC_n, RAS_n/A16, CAS_n/A15和WE_n/A14有别的复用功能,参见其他行。地址输入还提供MRS期间的操作代码。A17只针对x4配置定义。
A10 / AP输入自动预充电:在读/写命令时采样A10,以确定在读/写操作后是否对所访问的Bank进行自动预充电。(信号为高时:自动预充电;为低时:无自动预充电)。在预充电命令中对A10进行抽样,以确定预充电是适用于一个Bank(A10 LOW)还是适用于所有Bank(A10 HIGH)。如果只有一个Bank要预充电,则根据Bank Address选择该Bank。
A12 / BC_n输入Burst Chop:在读和写命令期间对A12 / BC_n进行采样,以确定是否将执行Burst Chop。详细信息请参见命令真值表。
RESET_n输入异步复位信号:当RESET_n为Low时复位是激活的,当RESET_n为HIGH时复位是不激活的。RESET_n在正常操作期间必须为HIGH。
DQ输入/输出数据输入/输出:双向数据总线。如果通过模式寄存器启用CRC,则在数据突发的末尾添加CRC代码。DQ0~DQ3之间的任何DQ都可以在测试过程中通过模式寄存器设置MR4 A4=高指示内部Vref级别。参考供应商特定的数据表,以确定使用哪种DQ
DQS_t, DQS_c, DQSU_t, DQSU_c, DQSL_t, DQSL_c输入/输出数据选通信号:读数据时输出,与读数据边沿对齐,写数据时输入,与写数据中心对齐;对于x16, DQSL对应于DQL0-DQL7上的数据;DQSU对应DQU0-DQU7上的数据。数据选通信号DQS_t、DQSL_t和DQSU_t分别与差分信号DQS_c、DQSL_c和DQSU_c配对,在系统读写时向系统提供差分对信号。DDR4 SDRAM只支持差分数据选通,不支持单端。
TDQS_t, TDQS_c输出终端数据选通:TDQS_t/TDQS_c仅应用于x8 DRAM配置,当通过模式寄存器MR1(A11 = 1)使能,DRAM将在TDQS_t/TDQS_c上启用应用于DQS_t/DQS_c的相同终端电阻功能。当在MR1中通过模式寄存器A11 = 0禁用时,DM/DBI/TDQS将根据MR5提供数据掩码功能或数据总线反转;x4/x16 dram必须在MR1中通过模式寄存器A11 = 0禁用TDQS功能
PAR输入命令和地址奇偶校验输入:DDR4支持在有MRS的dram中进行偶校验。一旦它通过MR5中的寄存器启用,那么DRAM将会进行ACT_n,RAS_n/A16,CAS_n/A15,WE_n/A14,BG0-BG1,BA0-BA1,A17-A0的奇偶校验。
ALERT_n输入/输出警报:它有多种功能,如CRC错误标志,命令和地址奇偶校验错误标志作为输出信号。如果CRC中有错误,那么Alert_n在周期时间间隔内变为LOW并返回HIGH。如果在命令地址奇偶校验中有错误,那么Alert_n将在较长时间内处于LOW状态,直到正在进行的DRAM内部恢复事务完成。在连接测试模式下,该引脚作为输入。是否使用这个信号取决于系统。如果没有作为信号连接,ALERT_n引脚必须绑定到板上的VDD。
TEN输入连通性测试模式启用:X16设备必选,x4/x8设备可选,密度≥8Gb。该引脚的HIGH将与其他引脚一起启用连接测试模式操作。这是一个CMOS轨对轨信号,交流高和低在80%和20%的VDD。是否使用这个信号取决于系统。这个引脚可能是DRAM内部拉低通过一个弱下拉电阻到VSS。
NC没有连接:没有内部电气连接
VDDQ供电DQ供电:1.2V +/- 0.06V
VSSQ供电DQ接地
VDD供电电源:1.2V +/- 0.06V
VSS供电接地
VPP供电DRAM 激活电源: 2.5V ( 最小2.375V , 最大2.75V )
VREFCA供电CA参考电压
ZQ供电ZQ校准参考引脚
备注:只有输入引脚(BG0-BG1,BA0-BA1, A0-A17, ACT_n, RAS_n/A16, CAS_n/A15, WE_n/A14, CS_n, CKE, ODT和RESET_n)不提供终端。

DDR4 SDRAM寻址

在这里插入图片描述
  假设我现在在上表中选择了8Gb(512Mb x16)容量的DDR芯片,注意单位是Gb不是GB,那么这8Gb是怎么计算的呢,由表可知:BG位宽为1,BA位宽为2,行地址位宽为16,列地址位宽为10,DDR容量=地址空间x数据位宽,即2^1 x 2^2x 2^16 x 2^10x16=8Gb。

DDR4架构的模块描述

下图显示的是1Gb x16型号的DDR芯片模块架构,我们在上面计算地址空间的时候列地址是直接当作10位来计算的,但是从这张图里可以看到列地址的7位是直接作为地址寻址使用,但是还有3位没有“用到”,其实并不是没用到,而是在后面的READ FIFO and data MUX模块中用到。
在这里插入图片描述

功能描述

简化状态机

在这里插入图片描述
  关于状态机中的许多模块都是缩写的形式,具体功能展示如下:
在这里插入图片描述
  注意:这个简化的状态图旨在提供可能的状态转换和控制它们的命令的概述。特别是,涉及多个bank的情况、终端电阻的启用或禁用以及其他一些事件都没有完全详细地捕获。

基本功能

  DDR4 SDRAM是一种高速动态随机存取存储器,对于x4/x8,内部配置为16个Bank,4个Bank Group,每个Bank Group有4个Bank,对于x16,内部配置为8个Bank,2个Bank Group,每个Bank Group有4个Bank。
  DDR4 SDRAM采用8n预取架构,预取就是先将数据放到缓冲区里,实现高速运行。8n预取架构与一个接口相结合,设计用于在I/O引脚上每个时钟周期传输两个数据字。DDR4 SDRAM的单个读或写操作包括一个8n位宽的、在内部DRAM核心的四个时钟数据传输和八个相应的n位宽的、在I/O引脚的一个半时钟周期数据传输。
  对DDR4 SDRAM的读和写操作是面向突发的,从选定的位置开始,并在编程序列中持续8个突发长度或4个“切碎”突发。什么叫做“切碎”突发呢?首先我们需要知道模式BL8是什么意思,BL8指的是突发长度为8个数据,但是为了兼容以前的老款DDR,老款DDR的突发长度为4,所以想出了一个办法,就是在BL8的基础上,将一半的数据掩码,在我的数据总线上显示的就是4个数的突发传输,这就叫做“切碎”突发,操作从注册激活命令开始,然后是读或写命令。与激活命令同时注册的地址位用于选择要激活的Bank和Row(x4/8中的BG0- BG1和x16中的BG0选择Bank Group;BA0-BA1选择Bank;A0-A17选择Row。与读或写命令同时注册的地址位用于为突发操作选择起始列位置,确定是否要发出自动预充电命令(通过A10),并在模式寄存器中启用时选择BC4或BL8模式“动态”(通过A12)。
  在正常工作之前,DDR4 SDRAM必须按预定义的方式上电和初始化。

复位和初始化程序

  为了确保正确的设备功能,以下模式寄存器(MR)设置的开机和重置初始化默认值定义为:

  • Gear-down mode (MR3 A[3]): 0 = 1/2 rate
  • Per-DRAM addressability (MR3 A[4]): 0 = disable
  • Maximum power-saving mode (MR4 A[1]): 0 = disable
  • CS to command/address latency (MR4 A[8:6]): 000 = disable
  • CA parity latency mode (MR5 A[2:0]): 000 = disable
  • Hard post package repair mode (MR4 A[13]): 0 = disable
  • Soft post package repair mode (MR4 A[5]): 0 = disable

上电和初始化顺序

  下面的时序要求在上电和初始化中需要注意:
  1、上电是一个从0到电压稳定的过程,在电压达到稳定电压之前,RESET_n和TEN应保持在0.2xVDD以下,所有其他输入可能是未定义的,当供电增加到有效的稳定水平时,RESET_n必须保持在0.2 × VDD以下,至少保持tPW_RESET_L时间,TEN必须保持在0.2 × VDD以下,至少保持在700μs。在RESET_n被解除使能也就是拉高之前,CKE随时被拉低(RESET_n被拉高的时刻与CKE信号被拉低的时刻最少间隔10ns)。电源电压从300mV上升到允许的VDD的最小值所消耗的时间不得大于200ms,电压上升期间VDD必须大于等于VDDQ且(VDD - VDDQ) 的差值< 0.3V。VPP必须与VDD同时或在VDD之前最多10分钟开始上升,并且VPP必须始终等于或高于VDD。VPP通电和VDD不通电的累计时间之和不超过360小时。在VDD上升并达到稳定水平后,RESET_n必须在10分钟内上升。RESET_n设置为高后,必须在3秒内启动初始化序列。为了调试目的,10分钟和3秒的延迟限制可以分别延长到60分钟,只要DRAM在这种调试模式下运行的累计时间不超过360小时。
  2、在RESET_n解除使能之后,至少等待500us,但不超过3秒,然后允许CKE在时钟边缘Td拉高。在此期间,设备将开始内部状态初始化;这将独立于外部时钟完成。在设计中进行了合理的尝试,以以下默认MR设置通电:减速模式(MR3 A[3]): 0 = 1/2速率;每dram寻址能力(MR3 A[4]): 0 =禁用;maximum power-down (MR4 A[1]): 0 = disable;CS到命令/地址延迟(MR4 A[8:6]): 000 = disable;CA校验延迟模式(MR5 A[2:0]): 000 = disable。然而,应该假设通电时MR设置未定义,并应按如下所示进行编程。
  3、时钟(CK_t, CK_c)需要启动并稳定至少10ns或5倍的tCK(以较大者为准),然后CKE在时钟边缘Td处被拉高。因为CKE是一个同步信号,所以必须满足相应的建立时间到时钟(tIS)。同样,一个DESELECT命令必须在时钟边缘Td注册(tIS建立时间到时钟)。RESET后CKE被拉高后,CKE需要继续拉高直到初始化序列结束,包括tDLLK和tZQinit。
  4、只要使能RESET_n,设备就会将ODT保持在High-Z状态。此外,在RESET_n被拉高之后,SDRAM将其ODT保持在HIGH - z状态,直到CKE被拉高。在CKE被拉高之前,ODT输入信号可能在tIS(建立时间)之前处于未定义状态。当CKE被拉高时,ODT输入信号可以被静态保持为LOW或HIGH。如果在MR1中启用RTT(NOM),则ODT输入信号必须静态保持为LOW。在所有情况下,ODT输入信号保持静态,直到上电初始化序列完成,包括tDLLK和tZQinit。
  5、在CKE被拉高之后,在发出第一个MRS命令到加载模式寄存器之前,等待最少的RESET CKE退出时间,tXPR。(tXPR = MAX (tXS, 5 × tCK)
  6、发出MRS命令加载带有所有应用程序设置的MR3,需要等待tMRD。
  7、发出MRS命令加载带有所有应用程序设置的MR6,需要等待tMRD。
  8、发出MRS命令加载带有所有应用程序设置的MR5,需要等待tMRD。
  9、发出MRS命令加载带有所有应用程序设置的MR4,需要等待tMRD。
  10、发出MRS命令加载带有所有应用程序设置的MR2,需要等待tMRD。
  11、发出MRS命令加载带有所有应用程序设置的MR1,需要等待tMRD。
  12、发出MRS命令加载带有所有应用程序设置的MR0,需要等待tMRD。
  13、发出ZQCL命令开始ZQ校准。
  14、等待tDLLK和tZQinit完成。
  15、设备将准备好正常运行。一旦DRAM被初始化,如果DRAM处于IDLE状态超过960ms,那么(a) REF命令必须在tREFI约束下发出(允许发布的规范)或(b) CKE或CS_n必须在每960ms空闲时间间隔内切换一次。出于调试目的,960ms的延迟限制可能会扩展到60分钟,前提是DRAM在这种调试模式下运行的累计时间不超过360小时。
在这里插入图片描述
  关于时序图,有几点需要注意:
  1、从Td到Tk, MRS和ZQCL命令之间必须加一条DES命令。
  2、MRS命令必须发出到所有已定义设置的模式寄存器。
  3、通常,设置MRS位置没有特定的顺序(除了相关或相关的特性,例如MR1中的ENABLE DLL先于MR0中的RESET DLL)。
  4、TEN没有显示出来,它被假设为拉低。

电压稳定后的复位初始化顺序

  参照上面的时序图即可。

无控制的下电顺序

  在不受控制地降低VPP供电的情况下,在满足以下条件的情况下,允许VPP小于VDD:
条件A: VPP和VDD/VDDQ从正常运行水平下降(作为关闭的一部分)。
条件B: VPP小于VDD/VDDQ的值小于或等于500mV。
条件C: VPP小于VDD/VDDQ的时间小于等于10ms,并且在此状态下的累计时间小于等于100ms。
条件D:关闭时VPP小于2.0V,高于VSS的时间小于等于15ms,并且在此状态下的累计时间小于等于150ms。
  参考链接:
  ASIC.ddr.ddr3.常用操作
  DRAM时序
  DDR3命令状态(二)
  DDR 学习时间 (Part B - 1):DRAM 刷新
  DDR中寄存器的问题
  DDR模式寄存器
  DDR的工作时序及原理
  DDR扫盲
  DDR4 SDRAM数据手册
  DDR4_JESD79_标准规范

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

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

相关文章

主成分分析(PCA)原理及R语言实现及分析实例

主成分分析&#xff08;PCA&#xff09;是一种数据降维技巧&#xff0c;它能将大量相关变量转化为一组很少的不相关变量&#xff0c;这些无关变量称为主成分。最近我们被客户要求撰写关于主成分分析&#xff08;PCA&#xff09;的研究报告&#xff0c;包括一些图形和统计输出。…

Vagrant搭建Centos

1.下载安装vagrant 01访问Vagrant官网 ​ https://www.vagrantup.com/ 02 点击Download ​ Windows&#xff0c;MacOS&#xff0c;Linux等 03 选择对应的版本 04 傻瓜式安装 05 命令行输入vagrant&#xff0c;测试是否安装成功,显示如下&#xff1a; 2.下载安装virtua…

半解析快速傅里叶变换

我们提出了一种处理傅里叶变换的方法&#xff0c;其并不需要二次多项式相位项的抽样&#xff0c;而是用解析的方法处理。我们提出该理论的同时也给出了几个例子证明其潜力。 1.简介 物理光学建模需要频繁地从空间转换到角频域&#xff0c;反之亦然。这可以由电场和磁场分…

网络编程(用于不同电脑之间的信息交互):UDP、TCP

网络编程&#xff1a; 在网络通信写一下&#xff0c;不同计算机运行的程序&#xff0c;可以进行数据传输 IP地址&#xff1a;设备&#xff08;手机、电脑等&#xff09;在网络中的地址&#xff0c;是唯一的标识 端口&#xff1a;应用程序在设备中唯一的表示 协议&#xff1a…

数据结构学习——表、查找

定义 设记录表L(R1 R2…其中Ri(L<i<n)为记录&#xff0c; 对给定的某个值k&#xff0c; 在表L中确定key k的记录的过程&#xff0c;称为查找。若表Lz中存在记录Ri de key k,记为Ri.key,则查找成功&#xff0c;返回该记录在表L中的序号i&#xff08;或Ri的地址&#xff…

优秀的 Verilog/FPGA开源项目介绍(二十)- 张量处理单元(TPU)

介绍张量处理单元( Tensor Processing Unit, TPU ) 是谷歌专门为神经网络机器学习开发的人工智能加速器 专用集成电路(ASIC) &#xff0c;特别是使用谷歌自己的TensorFlow软件。谷歌于 2015 年开始在内部使用 TPU&#xff0c;并于 2018 年将它们作为其云基础设施的一部分并通过…

Zabbix6.0使用教程 (三)—zabbix6.0的安装要求

接上篇&#xff0c;我们继续为大家详细介绍zabbix6.0的使用教程之zabbix6.0的安装部署。接下来我们将从zabbix部署要求到四种不同的安装方式逐一详细的为大家介绍。本篇讲的是部署zabbix6.0的要求。 zabbix6.0安装要求 硬件&#xff1a;内存和磁盘 Zabbix6.0安装 运行需要物…

算法精品讲解(2)——DP问题入门(适合零基础者,一看就会)

目录 前言 DP问题它是什么&#xff08;了解&#xff09; 从中学的例题谈起 再来说一下&#xff0c;DP问题的核心思想&#xff08;理解&#xff09; DP问题的解决方法 先说方法论&#xff1a; 再说具体的例子 例一&#xff1a; 例二&#xff1a; 例三&#xff1a; DP和…

kotlin之range范围表达式

Kotlin 中的 Range 有 CharRange、LongRange、IntRange range 范围 CharRange、LongRange、IntRange 范围区间 var a:IntRange 50..100for (i in a){ //遍历50~100的分数分别在什么位置print("成绩&#xff1a;$i")if(i in 1..59){ //1~59 范围println("…

Leica Infinity三维映射环境数据

Leica Infinity三维映射环境数据 Leica Infinity是软件工程师和该领域专家的名字&#xff0c;以及您的工作计划信息。该软件被设计和呈现为一个强大的产品&#xff0c;并且来自六边形组。Leica Infinity产品的居民试图用新的眼光创造新的数据处理。使用此软件&#xff0c;您可以…

和ChatGPT 比一比谁更懂Kubernetes?

有时&#xff0c;很难得到关于云原生世界中棘手话题的明确答案。哪个是最好的服务网格&#xff1f;平台工程只是devops的另一个标签吗&#xff1f;多云是一种风险吗&#xff1f; 如果你无法从一个人那里得到直截了当的答案——为什么不问一台机器呢&#xff1f; 因此&#xf…

net6自动注册到Consul 代码实例

简单理解: 服务多的时候&#xff0c;服务地址都是写固定&#xff0c;增加一个地址&#xff0c;配置一次&#xff0c;配置nginx或者其他配置&#xff0c;麻烦 有了这个就可以通过应用服务上报服务名servicename和访问地址&#xff0c;同一个服务名servicename可以有多个节点&a…

【教学类-15-05】20221207《八款字体的描字帖-2*4格》(中班大班)

成品样式&#xff1a; 80号字&#xff08;适应2-3个名字的大小&#xff09; 68号字&#xff08;适应4个名字大小&#xff08;2-3个名字也可以用&#xff0c;字会很小&#xff09;&#xff09; 打印样式&#xff1a; 背景需求&#xff1a; 前期进行多次的Python学具教学活动&a…

能跟CAD、BIM软件联合使用的地图神器,比奥维谷歌地图还方便!

是的&#xff0c;今天王工推荐的跟之前的地图工具不一样&#xff0c;百度、谷歌、MAPBOX那些称之为地图工具&#xff0c;这个简直就是地图的浏览器&#xff01;而且它还可以与CAD、BIM软件联合使用&#xff01; 实在是比奥维地图“香”。 海量图源任意浏览 ▲ 任意切换各种地…

OpUtils的网络扫描

什么是网络扫描程序 网络扫描程序只需扫描整个网络基础架构&#xff0c;即可获取和记录网络资源的可用性、性能和利用率指标。它执行 Ping 扫描和 SNMP 扫描&#xff0c;以识别网络中运行的实时主机和服务。网络扫描程序可以执行网络扫描以显示详细信息&#xff0c;例如当前登…

第十四届蓝桥杯集训——JavaC组首篇——环境搭建(win11)

还有9天就截止报名了&#xff0c;我们也算正式开始培训了&#xff0c;今年希望能取得更好的成绩。 今年的蓝桥杯从环境开始——本博客为win10电脑的Java_JDK环境搭建&#xff1a; 学生机环境-Java编程环境&#xff08;第十四届大赛&#xff09; 链接: https://pan.baidu.com…

Servlet 目录(pom.xml内容) 和 打包的两种方法

目录 一、webApp目录结构 web.xml里的内容 代码放置位置 后端代码&#xff1a;放到 src/main/java目录下 前端代码&#xff1a;放到webapp目录下 二、打包程序 一、webApp目录结构 web.xml里的内容 <!DOCTYPE web-app PUBLIC"-//Sun Microsystems, Inc.//DTD Web…

TI Lab_SRR学习_1 硬件基础 AWR1642和AWR1642EVM

首先需要对AWR1642芯片有一定的了解,包括天线设计,收发芯片的主要参数等。同时需要区分AWR1642和EVM板之间的区别。 可参考文档 awr1642 datasheetAWR1642 Evaluation Module (AWR1642BOOST) Single-Chip mmWave Sensing Solution 主要的Features(想了解各个子系统,请参考…

如何使用Spring Boot,Thymeleaf和Bootstrap上传多个文件

在本教程中&#xff0c;我将向您展示如何使用Spring Boot&#xff0c;Thymeleaf和Bootstrap上传多个文件。我们还使用 Spring Web MultipartFile界面来处理 HTTP 多部分请求并显示上传文件的列表。 春季启动多文件上传与百里香叶概述 我们的 Spring Boot Thymeleaf 多文件上…

如何通过“推送文案的千人千面”有效提升用户转化和留存

随着互联网用户红利消失和获客成本不断飙升、互联网正从“增量时代”迈向“存量时代”。 通过精细化运营激活存量用户&#xff0c;从而带动企业的第二增长曲线发力&#xff0c;已经成为行业共识。 在此趋势下&#xff0c;企业纷纷开始搭建私域流量池&#xff08;如会员体系、…