2025年2月更新,Step to UEFI 文章索引:
WinDBG 做 ACPI Debug 的例子
AML Debugging Examples
Here are examples that illustrate how to get started with AML debugging.
Investigating a Frozen Computer
If the target computer has frozen and you suspect it may be an ACPI problem, begin by using the !amli lc extension to display all the active contexts:
kd> !amli lc
*Ctxt=ffffffff8128d000, ThID=ffffffff81277880, Flgs=—-R—-, pbOp=ffffffff8124206c, Obj=\_SB.PCI0.ISA0.FDC0._CRS
If no contexts are displayed, the error is probably not ACPI-related.
If there are contexts shown, look for the one marked with an asterisk. This is the current context (the one that is being executed by the interpreter at the present moment).
In this example, the target computer is running Windows XP or Windows Server 2003 on a 32-bit processor. Therefore all addresses are cast to 64 bits, producing a gratuitous FFFFFFFF in the high 32 bits. The abbreviation pbOp indicates the instruction pointer (“pointer to binary op codes”). The Obj field gives the full path and name of the method as it appears in the ACPI tables. For a description of the flags, see !amli lc.
You can use the !amli u command to disassemble the _CRS method as follows:
kd> !amli u \_SB.PCI0.ISA0.FDC0._CRS
ffffffff80e4a535 : CreateDWordFieldCRES, 0x76, RAMT)
ffffffff80e4a540 : CreateDWordField(CRES, 0x82, PCIT)
ffffffff80e4a54b : Add(MLEN(), 0x100000, RAMT)
ffffffff80e4a559 : Subtract(0xffe00000, RAMT, PCIT)
ffffffff80e4a567 : Return(CRES)
Breaking Into the AMLI Debugger
The !amli debugger command causes the AML interpreter to break into the AMLI Debugger the next time any AML code is executed.
After the AMLI Debugger prompt appears, you can use any of the AMLI Debugger commands. You can also use !amli extension commands without prefixing them with “!amli”:
kd> !amli debugger
kd> g
AMLI(? for help)-> find _crs
\_SB.LNKA._CRS
\_SB.LNKB._CRS
\_SB.LNKC._CRS
\_SB.LNKD._CRS
\_SB.PCI0._CRS
\_SB.PCI0.LPC.NCP._CRS
\_SB.PCI0.LPC.PIC._CRS
\_SB.PCI0.LPC.TIME._CRS
\_SB.PCI0.LPC.IDMA._CRS
\_SB.PCI0.LPC.RTC._CRS
\_SB.PCI0.LPC.SPKR._CRS
\_SB.PCI0.LPC.FHUB._CRS
\_SB.PCI0.SBD1._CRS
\_SB.PCI0.SBD2._CRS
\_SB.MBRD._CRS
AMLI(? for help)-> u \_SB.PCI0._CRS
ffffffff80e4a535 : CreateDWordFieldCRES, 0x76, RAMT)
ffffffff80e4a540 : CreateDWordField(CRES, 0x82, PCIT)
ffffffff80e4a54b : Add(MLEN(), 0x100000, RAMT)
ffffffff80e4a559 : Subtract(0xffe00000, RAMT, PCIT)
ffffffff80e4a567 : Return(CRES)
Using Breakpoints
In the following example, you will break into the AMLI Debugger before the method _BST is executed.
Even if you have located a _BST object, you should verify that it is indeed a method. You can use the !amli dns extension to do this.
kd> !amli dns /s \_sb.pci0.isa.bat1._bst
ACPI Name Space: \_SB.PCI0.ISA.BAT1._BST (c29c2044)
Method(_BST:Flags=0x0,CodeBuff=c29c20a5,Len=103)
Now you can use the !amli bp command to place the breakpoint:
kd> !amli bp \_sb.pci0.isa.bat1._bst
You may also want to place breakpoints within the method. You could use the !amli u command to disassemble _BST and then place a breakpoint on one of its steps:
kd> !amli u _sb.pci0.isa.bat1._bst
ffffffffc29c20a5: Acquire(\_SB_.PCI0.ISA_.EC0_.MUT1, 0xffff)
ffffffffc29c20c0: Store(“CMBatt – _BST.BAT1”, Debug)
ffffffffc29c20d7: \_SB_.PCI0.ISA_.EC0_.CPOL()
ffffffffc29c20ee: Release(\_SB_.PCI0.ISA_.EC0_.MUT1)
ffffffffc29c2107: Return(PBST)
kd> !amli bp c29c20ee
Responding to a Triggered Breakpoint
In the following example, the method _WAK is running and then encounters a breakpoint:
Running \_WAK method
Hit Breakpoint 0.
Use the !amli ln extension to see the nearest method to the current program counter. The following example is taken from a Windows 2000 system, so the addresses are shown in 32-bit form:
kd> !amli ln
c29accf5: \_WAK
The !amli lc extension displays all the active contexts:
kd> !amli lc
Ctxt=c18b6000, ThID=00000000, Flgs=A-QC-W—-, pbOp=c29bf8fe, Obj=\_SB.PCI0.ISA.EC0._Q09
*Ctxt=c18b4000, ThID=c15a6618, Flgs=—-R—–, pbOp=c29accf5, Obj=\_WAK
This shows that the active contexts are associated with the methods _Q09 and _WAK. The current context is _WAK.
Now you can use the !amli r command to display more details about the current context. From this you can see useful thread and stack information, as well as arguments passed to _WAK and the local data objects.
kd> !amli r
Context=c18b4000*, Queue=00000000, ResList=00000000
ThreadID=c15a6618, Flags=00000010
StackTop=c18b5eec, UsedStackSize=276 bytes, FreeStackSize=7636 bytes
LocalHeap=c18b40c0, CurrentHeap=c18b40c0, UsedHeapSize=88 bytes
Object=\_WAK, Scope=\_WAK, ObjectOwner=c18b4108, SyncLevel=0
AsyncCallBack=ff06b5d0, CallBackData=0, CallBackContext=c99efddc
MethodObject=\_WAK
c18b40e4: Arg0=Integer(:Value=0x00000001[1])
c18b5f3c: Local0=Unknown()
c18b5f54: Local1=Unknown()
c18b5f6c: Local2=Unknown()
c18b5f84: Local3=Unknown()
c18b5f9c: Local4=Unknown()
c18b5fb4: Local5=Unknown()
c18b5fcc: Local6=Unknown()
c18b5fe4: Local7=Unknown()
c18b4040: RetObj=Unknown()
Tracing, Stepping, and Running AML Code
If you want to trace through the code, you can turn on full tracing information by using the !amli set extension as follows:
kd> !amli set spewon verboseon traceon
Now you can step through the AML code, watching the code execute line by line. The p command steps over any function calls. The t command will step into function calls.
AMLI(? for help)-> p
c29bfcb7: Store(\_SB_.PCI0.ISA_.ACAD.CHAC(SEL0=0x10e1)
c29c17b1: {
c29c17b1: | Store(LGreater(And(Arg0=0x10e1,0xf0,)=0xe0,0x80)=0xffffffff,Local0)=0xffffffff
AMLI(? for help)-> p
c29c17bb: | If(LNot(LEqual(Local0=0xffffffff,ACP_=0xffffffff)=0xffffffff)=0x0)
c29c17ce: | {
c29c17ce: | | Return(Zero)
c29c17d0: | }
c29c17d0: },Local1)=0x0
AMLI(? for help)-> t
c29bfcd4: Store(\_SB_.PCI0.ISA_.BAT1.CHBP(SEL0=0x10e1)
c29c293d: {
c29c293d: | Store(“CMBatt – CHBP.BAT1″,Debug)String(:Str=”CMBatt – CHBP.BAT1″)=”CMBatt – CHBP.BAT1”
You may also run methods from within the AMLI Debugger if you choose. For example, you might evaluate the status of the LNKA device by running its control method _STA:
AMLI(? for help)-> run \_sb.lnka._sta
PCI OpRegion Access on region c29b2268 device c29b2120
\_SB.LNKA._STA completed successfully with object data:
Integer(:Value=0x0000000b[11])
来自:https://dbgtech.net/windbghelp/hh/debugger/t11_rpc_acpi_6e1c6b23-391c-426f-a024-3235c5548783.xml.htm
Step to memory 015 DDR3
https://www.bit-tech.net/reviews/tech/memory/the_secrets_of_pc_memory_part_4/1
台式电脑的第三代 DDR 内存模块 (DDR3) 于 2007 年中期首次推出。与 DDR2 一样,台式机 DIMM 使用 240 针连接接口,DDR2 和 DDR3 模块之间唯一明显的外观差异是 DIMM 的 Key-Notch 位置。

几乎所有的台式机 DDR3 模块都采用细间距球栅阵列 (FBGA) 封装,其形状根据制造商不同,有方形的,也有略呈矩形的。FBGA 封装实际上可以容纳比实际所需更多的引脚,因此,一些设计师和工程师长期以来一直期盼的功能,例如异步复位 (RESET),最终获得了 JEDEC 的批准,并成为规范的一部分。
顺便多说一下同步复位和异步复位。步复位就是指复位信号只有在时钟上升沿到来时,才进行复位。相比之下,异步复位是指无论时钟沿是否到来,只要复位信号有效,就对系统进行复位。【参考】:https://www.zhihu.com/question/20280893
二者相比,异步复位比同步复位具有一些关键优势,主要与某些设计环境中的速度和简单性有关。 它们可以立即复位电路,与时钟信号无关,并且不需要专用时钟信号即可使复位生效. 这在需要快速、立即复位的系统中尤其有用,例如上电时或响应错误情况时。
更具体来说:
- 更快的重置响应:
异步复位可以立即置位复位信号,而无需等待下一个时钟周期。 这在需要立即复位的场景(例如上电或错误恢复)中至关重要。
- 无时钟依赖:
异步复位不依赖于时钟信号,这意味着即使时钟未运行或不稳定,它们也可以复位系统。 当系统在初始启动期间可能没有可靠的时钟源,或者时钟被暂时禁用时,这非常有用。
- 在某些情况下更简单的设计:
在即时复位功能至关重要的设计中,异步复位可以简化设计流程。 例如,异步复位可以减少复位信号和时钟之间精确时序同步的需求,从而简化时序分析和设计。
- 无论时钟如何,均保证复位:
异步复位确保系统复位而不管时钟的状态如何,这在启动时非常重要,因为此时时钟可能尚未运行或者时钟不稳定。
总之,与同步复位相比,异步复位提供了更快、更直接的复位能力,并且在复位期间可能无法获得可靠时钟或立即复位至关重要的设计中特别有用。
从上面可以看到,DDR3 使用异步复位应该是为了更容易实现。
虽然许多 DDR3 DRAM 基于 95nm 制造技术,但镁光科技的 78nm 工艺已从其 DDR2 D9 系列转移到 DDR3。镁光科技计算部门高级营销经理 Brett Williams 最近告诉我们,镁光科技的 65nm 工艺已完成测试,并将很快用于 DDR3。虽然该工艺应该在今年上市,但在 DDR3 生命周期结束时,我们应该会看到更精细的、更接近 45nm 水平的制造技术。

据镁光科技 (Micron Technology) 预测,DDR2 到 DDR3 的市场份额将在 2009 年上半年达到 50% 的临界点,而各大 DRAM 制造商的 DDR3 产量大幅提升预计最早也要到 2008 年第三季度,但更有可能是在 2008 年底。
这将导致价格在 2009 年之前维持高位,至少就 DDR2 的密度和成本而言是如此。OCZ、Corsair 和 Super Talent 等高性能模块制造商已经宣布推出性能超过 1.8-2GHz 的 DDR3 模块,远远超过了 JEDEC 1.6GHz 的上限标准。

普通用户务必注意,这些高端模块尚未在各种主板上进行兼容性测试,而且即使只有极少数主板能够支持,也很容易宣称内存产品“能够”达到这种速度。这些只是为了制造营销噱头,让公司品牌出现在新闻和人们的脑海中。DDR3模块的容量可达 16GB 甚至更高。相比之下,DDR2 模块的容量峰值预计为每个模块 4GB,但与 1GB 和 2GB 模块相比,这种容量将格外稀有且价格昂贵。随着 AMD AM3 处理器和英特尔下一代 Nehalem 处理器的推出,DDR3 的普及预计将加快步伐,届时整个处理器市场将采用支持 DDR3 的集成内存控制器。
DDR3 功耗降低
DDR3 的优势包括更低的功耗、更快、更大的容量以及改进的信号完整性管理功能。
每代 DDR 的电压要求都在降低,从 DDR1 的 2.5V、DDR2 的 1.8V 到 DDR3 的 1.5V,然而高频 DDR3 模块可能需要 1.8-2.0V 之间的任何电压才能稳定运行。
尽管默认电压为 1.5V,但我们预计某些 DDR3 模块的功耗要求甚至会更低;镁光科技的 Brett Williams 告诉我们,原始设备制造商 (OEM) 正在推动 DDR3 内存控制器的根本性变革,以允许低于 1.5V 的电压选项。预计将使用的移动设备(如笔记本电脑和超便携式计算机)需要此功能来满足日益严格的功耗和热预算。
一个重要点是,预计便携式设备将采用固态磁盘 (SSD) 和超低电压 DDR3。它们的综合效果令人惊叹,因为它们将显著降低设备的散热和功耗,同时提升潜在性能。因此,我们可以期待运行温度更低的笔记本电脑,以及电池续航时间更长的笔记本电脑。
数据预取
DDR3 采用“8位 预取”技术(8-bit prefetch或8-n prefetchn代表芯片位宽),DRAM 在每个周期将 8 位(1 字节)信息从内部存储芯片组传输到 IO 缓冲区,然后再发送出去。这样的设计能达到令人惊奇的效果,DRAM 核心频率与 DDR1 相比几乎保持不变,而数据吞吐量却提升了 800%!这也充分证明了工程界的创造力。
在设计上保持与前几代产品相同的或更低的核心频率,对 DRAM 的制造良率和成本都有积极的影响:这关乎经济效益。高良率有助于降低 DRAM 的价格,进而影响消费者的响应速度,并促进更快的普及率。

与 DDR2 类似,DDR3 支持可编程的 4 和 8 突发(Burst)长度。然而,根据 8位预存取 规则,当使用 4 Burst长度时,连续读取或写入操作会在Burst之间产生间隙。因此,DDR3 引入了突发斩波命令,允许实时选择突发长度。
Burst 突发传输【参考1】
Burst(突发)是指在同一行中相邻的存储单元连续进行数据传输的方式。
Burst Lengths(突发长度,简称BL)指连续传输所涉及到存储单元(列)的数量就是突发长度。
在DDR3 SDRAM时代,内部配置采用了8n prefetch(预取)来实现高速读写。这也导致了DDR3的Burst Length一般都是8。当然也有Bursth ength为4的设置(BC4),是指另外4笔数据是不被传输的或者被认为无效。
参考:
1. https://zhuanlan.zhihu.com/p/582524766
基于Seeed XIAO ESP32S3 Sense实现手机铃声放大器
这个项目是参加电子森林2025交互标牌 比赛的项目,链接在 https://www.eetree.cn/project-draft/6069
项目介绍
双音多频 DTMF(Dual Tone Multi Frequency),双音多频,由高频群和低频群组成,高低频群各包含4个频率。一个高频信号和一个低频信号叠加组成一个组合信号,代表一个数字。DTMF信号有16个编码。简单的说这是通过一个高频和低频组成一个音频的技术,广泛应用于电话系统中,下图可以帮助容易理解这个概念。

这次的项目就是基于这种技术:通过上述方法合成一段音频,其中包含多个数字,然后将这个音频设置为手机的铃声。当有来电之后,Seeed XIAO ESP32S3 Sense 通过板子上的麦克风获得数据,然后使用Goertzel算法进行识别。识别到指定的数字后,会启动声光报警器。
硬件介绍:
1. 最核心的部件就是 Seeed XIAO ESP32S3 Sense。这款开发板是seeedstudio退出的 Seeed Studio XIAO 系列中的一款,这个系列是迷你型开发板,具有类似的硬件结构,尺寸仅为拇指大小。代码名称 “XIAO” 代表其特点之一“微小”,而另一特点则是“强大”。Seeed Studio XIAO ESP32S3 Sense 集成了摄像头传感器、数字麦克风和支持 SD 卡的功能。这次我们使用的就是它的数字麦克风功能;
2. 外部使用一个声光报警器来告知来电。选择的是4-12V音量可调的报警器。最高音量可达120分贝。

3. 为了更好的让Seeed XIAO ESP32S3 Sense发挥作用,特地设计一个电路板:

板子上带有三个接口:
1.最左侧H2 是一个按钮接口,这里我们放置一个按钮,用于触发后用户可以通过按钮关闭报警;
2.中间U1 是XIAO ESP32S3 的接口,我们可以把板子直接插入使用
3.最右侧的是一个CH217K芯片,这是WCH出品的可调限流门限的 USB 端口电源开关芯片。芯片内部集成了过流保护、过温保护、欠压保护等模块,支持 5V 电压下不超过 2.7A 的可编程电流,在 VOUT 输出端发生短路等情况时可以限制输出电流从而保护供电系统。 我们用作 5V的开关。
电路非常简单,设计出来的PCB 也不复杂:

3D预览如下:


项目工作流程

软件流程和关键代码
软件负责从麦克风获得音频数据,并且识别之。然后判断是否出现指定的序列,如果出现就改变指定 GPIO 的状态驱动报警器。
关键代码解说如下:
1.获得音频数据的关键代码如下, 获得的数据格式是 16K 采样率,16Bits 单声道数据
// 设置 42 PDM 时钟和 41 PDM 数据引脚
I2S.setPinsPdmRx(42, 41);
// 以 16 kHz 和 16 位每样本启动 I2S
if (!I2S.begin(I2S_MODE_PDM_RX, 16000, I2S_DATA_BIT_WIDTH_16BIT, I2S_SLOT_MODE_MONO)) {
Serial.println("初始化 I2S 失败!");
while (1); // 什么都不做
}
2.声音识别算法是Goertzel算法,它一种高效的数字信号处理算法,主要用于检测特定频率成分的信号,相比FFT(快速傅里叶变换)在单频点检测场景中具有显著优势。
核心特点
- 计算效率高
- 仅计算目标频率点的能量,无需计算整个频谱
- 复杂度仅为 O(N)(N为采样点数),远低于FFT的O(N log N)
- 资源占用少
- 只需存储少量中间变量
- 适合嵌入式系统和实时处理
- 实现简单
- 核心为二阶IIR滤波器结构
- 无需复数运算
有兴趣的朋友可以深入研究。
Goertzel算法关键代码如下:
// 修改能量计算阈值(因采样率变化)
void detect_dtmf(float* energy) {
int low_max = 0, high_max = 4;
for (int i = 1; i < 4; i++) if (energy[i] > energy[low_max]) low_max = i;
for (int i = 5; i < 8; i++) if (energy[i] > energy[high_max]) high_max = i;
// 调整阈值(16kHz时能量分布不同)
if (energy[low_max] > 50.0 && energy[high_max] > 50.0) {
char digit = get_dtmf_digit(low_max, high_max);
Serial.print("R["); Serial.print(digit); Serial.print("]");
// 只有当前得到的值和前一个不同才继续检测
// 避免多次识别到同一个数字的误判
if (digit != Previous) {
if (digit == DIGITALPATTEN[Index - 1]) {
Serial.print("I["); Serial.println(Index);
Index++;
Previous=digit;
} else {
if (digit == DIGITALPATTEN[0]) {
Index = 2;
Serial.print("P["); Serial.println(Index);
} else {
Index = 1;
Serial.print("Z["); Serial.println(Index);
}
Previous = 255;
}
if (Index == DIGITALPATTEN.length() + 1) {
Serial.println("Assert!");
digitalWrite(SPEAKCTRL,LOW);
Index = 1;
Previous = 255;
}
}
}
}
void process_samples() {
// 重置Goertzel状态
for (int i = 0; i < NUM_BANDS; i++) {
bands[i].q1 = bands[i].q2 = 0;
}
// 运行Goertzel算法
for (int n = 0; n < SAMPLE_BUFFER_SIZE; n++) {
float sample = samples[n] / 32768.0;
for (int i = 0; i < NUM_BANDS; i++) {
float q0 = bands[i].coeff * bands[i].q1 - bands[i].q2 + sample;
bands[i].q2 = bands[i].q1;
bands[i].q1 = q0;
}
}
// 计算能量
float energy[NUM_BANDS];
for (int i = 0; i < NUM_BANDS; i++) {
energy[i] = bands[i].q1 * bands[i].q1 + bands[i].q2 * bands[i].q2 - bands[i].coeff * bands[i].q1 * bands[i].q2;
}
// 检测DTMF数字
detect_dtmf(energy);
}
3.同样的,触发之后是在上述的 detect_dtmf 函数中处理的,只是一个简单的触发GPIO 为 Low的动作
最终的使用方法是:
- 生成铃声,我这里使用的是https://onlinesound.net/dtmf-generator 提供的功能,生成一个序列号用于识别。需要注意的是:必须是序列不能有连续的同一个数字,比如: 1123 ,这种无法识别。
- 将生成的铃声下载到手机中,可以作为通用铃声,也可以指定用户,这样只有指定人的来电会触发报警。
项目遇到的难点和解决方法
1.经过查找资料,确定了识别DTMF 音频的通用方法是Goertzel算法,代码中的这部分算法是通过AI 生成的,节省了大量时间提升了效率;
2.实践发现,提升单个 DTMF 音频持续时间(默认150ms),能够显著提升音频识别率。
本文项目对应的完整代码:
项目的电路图和 PCB 设计,使用立创EDA:
项目中测试的 wave 文件
谁动了我的快捷键
我一直在使用 NotePad++ 作为简单的编辑工具,之前有遇到过在测试机上安装了这个软件之后在文件中查找的快捷键 Shift+Ctrl+F 失效的问题。这次正好再一次遇到了,于是开启了研究之旅。
- 实验NotePad++中指定 Shift+Ctrl+H 作为快捷键,实践证明这个组合是可以正常工作的。


2.根据网上推荐使用OpenArk 进行检查,无法找到 Shift+Ctrl+F 这个快捷键

根据【参考1】的介绍还可以通过 Spy++ 来进行分析,于是尝试之
1.监视窗口

2.选中最上的面的窗口,Windows的设计消息是一级一级传下去的,最上层收到后如果处理不了会 pass 给下面,我们直接在最上层监听看看谁收了按键没有下发

3.使用菜单上的 “Log Messages”功能

4.勾选 All Windows in System

5.打开之后默认是全选的,我们需要只监视 KeyBoard 消息

改成这样

6.在桌面上按下 Shift+Ctrl+F ,可以看到先按下 Ctrl 后按下 Shift ,最后是 F 键

7. z这个快捷键被 6095A 吃掉了,在上面点右键,查看 Properties

8.看到下面这个界面,点 Windows Handle 给出的参考
.

9.跳到 Process Tab 页面,先点击Synchronize按钮,再点 Process ID

10.跳转到 General Tab 页面 ,这里可以看到是 Explorer

11.接下来在做了一个实验:在任务管理器中干掉了这个进程,然后重新启动了一次 Notepad++, 发现快捷键可以工作了。这就说明不是第三方软件,而是系统设定的快捷键引起的问题。最终经过查找在输入法设置中简体中文和繁体的切换中有如下设置,关掉之后就 OK 了。

再进一步观察, NotePad++ 只有在打开中文输入法的情况下才会出现这个问题。一般情况下,我测试电脑因为使用英文系统(默认没有中文输入法),所以大多数情况下是没有问题的。这就是为什么有时候会遇到问题,有时候不会。
从这次可以得到如下两个经验:
- Windows 拼音输入法默认使用 Ctrl+Shift+F快捷键可能导致冲突;
- OpenArk 有局限性,不能举出系统中的所有快捷键
参考:
1. https://zhuanlan.zhihu.com/p/704643938
[转载]设计人员应了解的 LPDDR5 主要功能
Synopsys 解决方案部门高级技术营销经理 Vadhiraj Sankaranarayanan
选择合适的存储器解决方案是满足目标系统对各种应用(从云计算和人工智能 (AI),再到汽车和移动应用)的功能和性能要求的关键。双数据速率同步动态随机存取存储器 (DDR SDRAM) 或 DRAM 已成为现实的技术,因为它使用电容器作为存储元件来实现高密度和简单架构、低延迟和高性能、几乎无限的存取耐力和低功耗等多种优势。DDR DRAM 可以根据系统要求以不同的形式使用——在双列直插式存储器模块 (DIMM) 上或作为分立 DRAM 解决方案中均可使用。DDR 分为三个主要类别,每个类别都有独特的功能,可帮助设计人员满足其目标片上系统 (SoC) 的功耗、性能和面积要求。图 1 显示了不同的 DDR 类别及其目标应用场景。

图 1:JEDEC 定义了应用广泛的三类 DRAM 标准,以满足各种应用的设计要求
- 标准 DDR 面向服务器、云计算、网络、笔记本电脑、台式机和消费类应用,支持更宽的通道宽度、更高的密度和不同的形状尺寸。DDR4 是这一类别目前最常用的标准,支持高达 3200 Mbps 的数据速率。DDR5 DRAM 的运行速度高达 6400 Mbps,预计将在 2020 年问世。
- 移动 DDR (LPDDR) 适用于对面积和功耗非常敏感的移动和汽车应用。LPDDR 提供更窄的通道宽度和几种低功耗工作状态。LPDDR4 和 LPDDR4X 支持高达 4267 Mbps 的数据速率,是该类别中的常用标准。最大数据速率为 6400 Mbps 的 LPDDR5 DRAM 预计将于 2020 年问世。
- 图形 DDR (GDDR) 面向需要极高吞吐量的数据密集型应用程序,例如图形相关应用程序、数据中心加速和 AI。GDDR 和高带宽存储器 (HBM) 是这一类型的标准。
每个标准都旨在提供高性能和容量,在运行时将功耗降至最低,并通过可靠性、可用性和可维护性 (RAS) 功能以及纠错码 (ECC) 功能来提高通道的稳定性。
本文说明了 LPDDR5 标准的主要功能。DDR5 的主要功能将在后续文章中介绍。
移动 DDR (LPDDR) 概览
LPDDR DRAM 提供了一种功耗显著降低的高性能解决方案,而降低功耗是平板电脑、智能手机和汽车等移动应用的重点要求。此类应用所需的 SoC 倾向于在每个通道上使用更少的存储设备和更短的互连,而 LPDDR DRAM 的运行速度比标准 DDR DRAM 快(例如,LPDDR4/4X DRAM 的运行速度最高为 4267 Mbps,而标准 DDR4 DRAM 的运行速度最高为 3200 Mbps),所以能够提供更高的性能。但 LPDDR DRAM 在此类设备中不使用,处于待机状态时,可以将它们置于低功耗状态,例如深度睡眠状态,或者可以使用动态频率调节 (DFS) 功能在较低频率下运行。因此,当存储通道待机时,存储控制器可以适时地使用这些低功耗功能来降低总功耗。
LPDDR5 DRAM 使用动态电压调节 (DVS) 功能节省更多功耗,此时存储器控制器可以在通道待机期间降低 DRAM 的频率和电压。与普通的标准 DDR DRAM 通道(64 位宽)相比,LPDDR DRAM 通道通常为 16 位或 32 位宽。与其他两个类别的 DRAM 世代一样,后继的每一个 LPDDR 世代(LPDDR5、LPDDR4/4X、LPDDR3、LPDDR2、LPDDR)都比其上一代产品具有更高的性能和更低的功耗。此外,任何两代 LPDDR 都不彼此兼容。
LPDDR5 主要功能
与 LPDDR4/4X DRAM 相比,LPDDR5 DRAM 支持高达 6400 Mbps 的数据速率和在更低的工作电压(VDD 的 1.05/0.9V 和 I/O 的 0.5/0.35V)下支持更大的设备尺寸(每个通道 2Gb 至 32Gb)。表 1 显示了 LPDDR5 和 LPDDR4 DRAM 之间的比较:
| LPDDR5 DRAM | LPDDR4 DRAM | |
| 设备大小 | 2Gb 至 32Gb(每通道)4、8 和 16 bank 设备1k、2k 和 4k 页大小 | 2Gb 至 16Gb(每通道)8 bank 设备2k 页大小 |
| 速度 | 最高 6400 Mbps | 最高 4266 Mbps |
| 电压 | 1.8V DRAM 阵列1.05V / 0.9V 内核0.5V / 0.3 V I/O | 1.8V DRAM 阵列1.1V 内核1.1V / 0.6V I/O |
表格 1:LPDDR5 对比 LPDDR4/4X DRAM
LPDDR5 DRAM 可通过 DVS 支持两种内核和 I/O 电压:在较高频率下运行电压分别为 1.05V 和 0.5V,在较低频率下运行电压分别为 0.9V 和 0.3V。因此,LPDDR5 DRAM 支持内核和 I/O 电压的 DVS。
LPDDR5 的其他关键功能包括用于命令/地址 (C/A) 时钟 (CK) 的新型可扩展时钟架构,以简化 SoC 时序收敛;灵活的 DRAM 存储库架构模式,可根据流量模式实现最佳性能;决策反馈均衡器 (DFE) 以增加 DRAM 上的写入数据的余量,写入 X 功能可以节省功耗,以及链接 ECC 以增强存储器通道 RAS。以下部分将详细说明每个功能
用于简化时序收敛的新型可扩展时钟架构
C/A CK 通常以与所有先前 LPDDR 标准(LPDDR4/4X 及更早的标准)中的数据选通 (DQS) 相同的频率运行。这种时钟方案给 DRAM C/A 通道和 SoC 时序收敛都带来了巨大压力,因为 CK 是存储器通道上 C/A 通道的参考,并且 SoC 中的存储控制器通常以 CK 频率的一半,采用 DFI 1:2 比率模式在 DDR PHY 接口上运行。例如,LPDDR4/4X 的速度为 4267 Mbps,CK 和 DQS 的运行频率为 2133 MHz,而 C/A 的数据速率为 2133 Mbps,控制器时钟的运行频率为 1066 MHz。
这样的时钟方案无法以 LPDDR5 速度扩展。因此,LPDDR5 采用了新的时钟方案,其中 CK 以高于 3200 Mbps 的速度,按照数据选通频率的四分之一运行,而以低于 3200 Mbps 的速度,按照数据选通频率的一半运行。因此,即使在 6400 Mbps 的速率下,该时钟方案也要求 CK 仅以 800 MHz 的频率运行。这样可以降低 C/A 的运行速度(以 1600 Mbps 的速度运行,因为 C/A 可以在 LPDDR5 的 CK 速率的上升端和下降端(例如 DDR 类型)上都进行转换),从而大大提高了 C/A 通道的余量。同样,CK 减速使 SoC 不仅可以更有效地收敛时序,而且还可以提供更高的性能,因为控制器现在可以在 800 MHz 的 DFI 1:1 比率下工作。此外,LPDDR5 不支持传统的双向数据选通架构,而是引入了两个单向数据选通:用于写入操作的写入时钟 (WCK) 和用于读取操作的可选读取时钟 (RDQS)。系统可以选择无选通或单端选通来以较低的速度进行读取,同时节省功耗,当要想达到高速时,就需要采用差分选通 (RDQS/RDQS#)。
保证通道稳定性的单抽头 DFE
判决反馈均衡器 (DFE) 减少了对接收数据的符号间干扰 (ISI),从而提高了接收数据的余量。先前检测到的符号出现在正在检测的当前符号上,就会引发 ISI。LPDDR5 DRAM 将具有单抽头 DFE,以提高写入数据的余量,从而增强存储通道的稳定性。
Write X 降低功耗
Write X 是一种省电功能,允许系统将特定的位模式(例如全零模式)转变成连续的存储器位置,而无需切换通道上的 DQ 位。
用于防止通道噪声引起的错误的 Link ECC
Link ECC 可以恢复通道中发生的单比特传输错误。该数据与 ECC 一起由控制器发送到 LPDDR5 DRAM,并且在接收到数据/ECC 后,DRAM 会生成 ECC 并检查接收到的 ECC 是否相同。在将数据写入存储器阵列之前,任何单比特错误都将得到纠正。因此,Link ECC 是适合高速的强大 RAS 功能,可防止通道噪声引起的错误。
突发长度为 16 或 32 拍的灵活存储库架构
LPDDR5 DRAM 通过支持三种模式(Bank-Group 模式(4 个 Bank,4 Bank-Group),8 Bank 和 16 Bank)而具有灵活的存储库架构,供用户根据其流量模式选择。Bank-Group 模式适用于高于 3200 Mbps 的速度,并允许 16 和 32 拍的突发长度。8 Bank 模式支持突发长度为 32 拍的所有速度,而 16 Bank 模式则支持突发长度为 16 或 32 拍的 3200 Mbps 以下的速度。
用于进一步节约功耗的 3 种 FSP
与支持 C/A 和 DQ 的 2 个频率设定点 (FSP) 的 LPDDR4/4X DRAM 不同,LPDDR5 DRAM 具有用于 C/A 和 DQ 的 3 个 FSP。这使控制器能够以最少的切换时间快速切换三个频率,以实现最佳的功耗节约效果。如前所述,DFS 与 DVS 的结合使 LPDDR5 DRAM 成为对功耗敏感的应用的理想选择。
总结
存储器是用于移动设备、IoT、汽车和云数据中心等应用中的任何电子系统的重要组件。SoC 设计人员必须选择合适的存储器技术,才能提供必要的性能、容量、功率和面积。DDR 已成为现实的存储技术,可用于多种类别,包括标准 DDR 和低功耗 DDR (LPDDR)。最新的标准 LPDDR5 和 DDR5 以更低的功耗提供更高的性能。LPDDR5 的运行速度高达 6400 Mbps,具有许多低功耗和 RAS 功能,包括新颖的时钟架构、可简化时序收敛。数据速率高达 6400 Mbps 的 DDR5 DRAM 支持更高的密度,包括双通道 DIMM 拓扑以提高通道效率和性能。
Synopsys 提供了全面的存储器接口 IP 产品组合,支持 LPDDR 和 DDR 标准,包括最新的 LPDDR5 和 DDR5。DesignWare® DDR IP全套解决方案包括 PHY、控制器和验证 IP,它们都支持最新标准的主要功能。Synopsys 的产品组合还包括硬化选项、信号完整性/电源完整性分析、验证模型、原型设计和仿真支持。
原文在 https://www.synopsys.com/zh-cn/designware-ip/technical-bulletin/key-features-about-lpddr5.html
国产 EC:CH8571
最近申请到了一块 WCH 家的 Ch8571 EC 开发板和芯片。

这是一款国产的Risc-V 的 EC 芯片。主要参数如下:
- 基于青稞 RISC-V2A 核心,频率最高 64Mhz, 最高20K Ram
- 支持 eSPI 接口,符合 eSPI 1.0 规范,支持Peripheral/OOB/Virtual Wire /Flash Access Channel,频率从20MHz-66Mhz
- 支持 LPC 接口,符合 LPC 1.1 规范
- 支持 SMBus 接口,6 Channel, 6 个Master 和 3个Slave
- 支持 18×8 键盘
- 最多提供 89个 GPIO, 内置上下拉电阻可以编程控制,28个支持 1.8V
- 内置支持 Full Speed 的 USB Host和Device
- 比较特别的是带有2个可编程I/O 引脚(PIOC), 这样可以特别定制功能。比如,可以编程直接控制 WS2812 这种LED
- 提供了三种封装:LQFP128/QFN48X7/BGA128X7
支持的接口可以从下图看到

编程方面,直接使用 MounRiver Studio 集成环境,无需担心 license 的问题。顺便说一句:这个开发环境同样可以开发 CH32V205/307等等USB 芯片,配置简单用起来非常方便。

芯片的下载器是 WCH-LinkUtility,同样是WCH 其他芯片的烧写工具。

兴趣的朋友可以关注一下。
Step to memory 014 超频和波形
https://www.bit-tech.net/reviews/tech/memory/the_secrets_of_pc_memory_part_3/11
当用户对计算机内存进行超频时,他们实际上是在压缩数据眼的大小,并通过以更高的频率运行在多个级别上改变波形,从而可以在规定时间内传输更多数据。然而,这会带走预先设定的安全裕度。
这是一门“黑暗艺术”,因为超频者无法观察或想象起作用的多维因素;相反,他们在稳定性、系统的整体“感觉”和传统的反复试验中寻找迹象,因为每个因素都可能并且将会相互作用并影响无数其他因素,最终达到新的波动平衡。
通常,提高 DRAM 电压可以提高内存速度,“但这也取决于芯片的架构”,镁光科技计算部门高级营销经理 Brett Williams 解释说。
如果电压设计为稳压,那么增加外部电压可能对芯片没有任何影响,因为芯片上有一个稳压器,可以将内核保持在特定电压。如果芯片未稳压,那么增加外部电压时,电压会直接进入内核,从而提高内核电压,使器件运行速度更快。作为发烧友,我们常常享受主板BIOS中各种
DRAM调整配置带来的便利。虽然这些配置可能很有用,但普通家庭用户对大多数功能并不十分了解,因此无法建立有效性能改进的基础。
与其他晦涩难懂的BIOS配置术语一样,VREF、时钟偏差和驱动强度值更有可能被研发工程师用来测试主板在各种内存模块下的稳定性,因为他们可以使用其他工程设备来简化工作。
新用户在调整这些BIOS功能时应小心谨慎,因为大多数功能配置错误不会造成严重后果,但电压选项却并非如此。有一个稳定阶段被称为“伪稳定”或“准稳定”——在这个阶段,系统在某些情况下稳定,但在其他情况下不稳定。完美的稳定性是不可能实现的,因为每次 BIOS 更改都会影响许多其他更改。这可能只是因为没有办法校正波形。


华硕 P5E3 Premium BIOS 是我们迄今为止见过的最全面的 BIOS 之一
一次24小时内存压力测试的成功并不能保证在完全相同的系统配置下,第二次测试也能同样成功。这种“伪稳定性”之所以会逐渐增加,根本原因在于信号冗余度的不断减小。冗余度的逐渐减小将使工艺、电压和温度 (PVT) 变化的负面影响呈指数级增长。
事实上,许多运行在 DDR2 800MHz 及更高频率的台式机系统确实会产生错误。我们通常认为的稳定,在 99.99% 的稳定性下也未必完美无缺。虽然 0.01% 的错误率听起来可能不多,但每秒传输的数据比特数却可能迅速增加到相当大的数量。
然而,有些错误可能对系统并非致命的;例如,它可能只会导致像素变色,或在电影播放过程中产生无法察觉的 MP3 噪音。
这也是为什么服务器和工作站会使用更昂贵的带有纠错码 (ECC) 的内存模块,而这些模块的运行速度通常比台式机内存模块慢的原因之一。美光科技的 Brett Williams 认为:“ (为了让内存跟上 CPU 的步伐),架构可能需要做出一些改变。无论它被称为 DDR 还是其他名称,DDR3 之后都会有下一代 DRAM。它会是革命性的还是渐进式的?这还有待观察。事实上,这个问题目前正在研究之中…… ”
基于CH32V305制作串口数据交换器
本文是参加“M-Design设计竞赛”的项目,原文在:https://www.eetree.cn/project-draft/5614
虽然现在的PC上难以见到传统的9芯串口,但是串口仍然存在于各种设备上。比如,串口是单片机必不可少的接口。此外,USB串口可以方便的实现PC对外的接口,因此串口编程仍然是一个通用的PC对外通讯接口。
一些时候,我们设计的外部设备使用USB串口通讯,在编写上位机应用程序的时候我们不可避免的需要串口调试,我们需要得知发送的数据是否符合预期。一种方法是直接使用逻辑分析抓取设备端的串口数据,这种方法优点是非常可靠,缺点是比较麻烦,需要连接线路,此外如果调试目标的是USB 串口是通过单片机内部实现的,那么就无法实现抓取;另外一种方法是通过在主机端安装虚拟串口软件,这种方法的优点是灵活,可以配置出来各种组合,缺点是软件按台计费成本较高,同时因为是驱动实现的,在一些特殊情况下比如操作系统升级还会遇到兼容性问题。

这次的作品是通过 Ch32V305实现的虚拟串口设备(我将这种设备称作“PVD”,Physical Virtual Device,物理虚拟设备,更多设备可以在【参考1】中看到)。设计上非常简单,可以看作是一个 Ch32V305的最小系统。设备通过USB 供电,之后通过TLV1117,将5V转化为3.3V,提供给芯片。芯片外围电路非常简单:一个8Mhz晶振提供信号源,配合2个100nF 电容即可工作。

PCB 设计如下:

焊接之后的实物如下:

对于这样的设计来说,代码是重中之重。这次我们使用CherryUSB 框架配合 FreeRTOS实现了设计目标。
设计上,我们使用了4个端点进行收发:

工作流程如下:

具体关键代码如下:
1.代码入口在 main.c 文件中,这里会对设备进行初始化设定
int main(void)
{
SystemCoreClock = 0;
SystemCoreClockUpdate();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
Delay_Init();
USART_Printf_Init(115200);
printf("SystemClk:%d\r\n", SystemCoreClock);
printf("This is Audio example\r\n");
Com_Init();
xTaskCreate(Led_task, (const char*)"Led", (uint16_t)32, (void*)NULL, (UBaseType_t)5, NULL);
/* Start the scheduler. */
vTaskStartScheduler();
while(1)
{
}
}
2.作为USB设备描述符是重要的部分,具体描述符在cdc_acm_multi.c 中的cdc_descriptor[]结构体中定义,此外,为了方便配置,还模拟除了一个HID 设备,具体的描述符在hid_custom_report_desc 中定义。
3.借由前面提到的 CherryUSB框架,收到的数据会在Com_Data_Recv() 函数中进行处理,根据设定将收到的数据进行转发
// 处理数据接收的函数,只能在中断调用
void Com_Data_Recv(uint8_t DevIndex, uint8_t* DataPtr, uint32_t DataLen)
{
uint8_t ComCfgData = ComConfig[DevIndex];
Com_Data_Queue stQueue;
BaseType_t xHigherPriorityTaskWoken;
stQueue.DataPtr = DataPtr;
stQueue.DataLen = DataLen;
for (uint8_t i = 0; i < ComDevCnt; ++i)
{
if (ComCfgData & 1 << i)
{
// 数据复制一份
stQueue.DataPtr = pvPortMalloc(DataLen);
if (stQueue.DataPtr)
{
memcpy(stQueue.DataPtr, DataPtr, DataLen);
// 将数据放入队列中
xQueueSendFromISR(ComQueue[i], &stQueue, &xHigherPriorityTaskWoken);
// if (xPortIsInsideInterrupt()) {
// xQueueSendFromISR(ComQueue[i], &stQueue, &xHigherPriorityTaskWoken);
// } else {
// xQueueSend(ComQueue[i], &stQueue, portMAX_DELAY);
// }
}
}
}
}
编译后的代码通过 LinkE烧录到设备中之后插入PC中即可使用。因为每次要求配置组合不同,我们还设计了一个上位机程序。程序执行之后会使用USB HID 和设备通讯,将配置信息发送给设备。
感谢贸泽电子与硬禾科技举办的创意设计竞赛。这是我们第一次在 FreeRTOS 上使用CherryUSB 框架。可以看到,这样的方法使得资源调配变得非常容易,使用者可以对任务目标进行聚焦。团队成员一边学习一边实践,相互配合分工协作,在一个又一个周末不断沟通协调,最终完成了目标。
完整的CH32V305固件代码:
项目电路图,使用嘉立创专业版制作完成:
用于配置串口关系的工具,Windows, VC编写
工作的测试视频
DFRobot ESP32 P4 音频框架
ESP32 官方的 USB 框架是 TinyUSB, 这次带来的是使用 TinyUSB 在 IDF 下实现的虚拟USB麦克风。
代码内置了一个正弦波的采样数据,录音机打开之后会送出:
/*
* SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Unlicense OR CC0-1.0
*/
#include <stdio.h>
#include <math.h>
#include "sdkconfig.h"
#include "esp_err.h"
#include "esp_log.h"
#include "driver/uart.h"
#include "usb_device_uac.h"
#include "sine.h"
static const char *TAG = "usb_uac_main";
int audiobuffer=0;
static esp_err_t uac_device_output_cb(uint8_t *buf, size_t len, void *arg)
{
//size_t bytes_written = 0;
//bsp_extra_i2s_write(buf, len, &bytes_written, 0);
ESP_LOGE(TAG, "ocb");
return ESP_OK;
}
static esp_err_t uac_device_input_cb(uint8_t *buf, size_t len, size_t *bytes_read, void *arg)
{
for (int i=0;i<len;i++) {
buf[i]=AudioData[(audiobuffer+i)%AUDIOLEN];
}
audiobuffer=(audiobuffer+len)%AUDIOLEN;
ESP_LOGE(TAG, "icb");
*bytes_read=len;
return ESP_OK;
}
static void uac_device_set_mute_cb(uint32_t mute, void *arg)
{
ESP_LOGI(TAG, "uac_device_set_mute_cb: %"PRIu32"", mute);
//bsp_extra_codec_mute_set(mute);
}
static void uac_device_set_volume_cb(uint32_t volume, void *arg)
{
ESP_LOGI(TAG, "uac_device_set_volume_cb: %"PRIu32"", volume);
//bsp_extra_codec_volume_set(volume, NULL);
}
void app_main(void)
{
uart_config_t uart_config = {
.baud_rate = 2000000,
.data_bits = UART_DATA_8_BITS,
.parity= UART_PARITY_DISABLE,
.stop_bits=UART_STOP_BITS_1
};
uart_param_config(UART_NUM_0,&uart_config);
uac_device_config_t config = {
.output_cb = uac_device_output_cb,
.input_cb = uac_device_input_cb,
.set_mute_cb = uac_device_set_mute_cb,
.set_volume_cb = uac_device_set_volume_cb,
.cb_ctx = NULL,
};
uac_device_init(&config);
}
工作的视频
完整的代码
Step to memory 013利用片上终端 (ODT) 抑制信号噪声
https://www.bit-tech.net/reviews/tech/memory/the_secrets_of_pc_memory_part_3/8
随着主板功能日益丰富,性能不断提升,保持信号完整性也变得越来越困难。当内存速度超过DDR1 之后,DDR1主板采用的电阻式终端方案无法克服信号反射问题。

内存总线频率的提升会降低信号的冗余度。压缩程度越高、电压越低的信号,其本质就越弱。虽然数据选通 (DQS)无法消除所有的抖动,但是这种设计能够减小波形边缘负面影响。

和DDR1相比,DDR2将终端电阻 (ODT)从主板上移入了内存芯片中。这样能够提高信号质量保证完整性。这不仅带来了其他好处,还降低了主板制造商的材料和测试成本。意外信号可能会从有源或无源元件反弹,但只有像 DRAM 这样的有源元件会受到不利影响。ODT 可以消除芯片级读写操作期间总线上信号回波的负面影响。
讽刺的是,如果端接过于有效,当内存时序不准确时,数据信号可能会被吸收——超频有时会导致这种数据截断内存错误。
某些主板的BIOS允许用户手动调整ODT的电阻特性,范围在50、75或150欧姆之间。根据JEDEC规范,在某些平台上,DDR2-667及更高版本的内存必须使用50欧姆。
要确定您的内存模块是否支持50欧姆,可以使用名为SPDTool的程序查看预定义的内存性能值和特性。主板设计人员需要根据各种ODT配置正确模拟和测试读写信号质量,以找到最佳数据眼孔径的要求。
模拟过程可能非常繁琐且耗时,因为它们需要根据主板阻抗和ODT设置的组合,针对不同插槽配置的众多内存模块收集数据眼孔径数据。这也是廉价主板只有两个插槽的部分原因。

片外驱动器 (OCD) 校准
DDR2 使用片外驱动器校准来提高数据和数据选通之间的跟踪精度。OCD 校准电路用于在内存初始化过程中设置 DDR2 驱动器的阻抗和电压电平。它的重要性体现在以下几个方面:
- OCD 通过最小化数据选通 (DQS) 到数据 (DQ) 的偏差来提高信号质量。
- 它通过最大限度地减少过冲和欠冲问题来提高信号质量。
- 它通过 IO 驱动器电压校准吸收来自每个 DRAM 供应商的工艺变化。
OCD 的驱动器阻抗调整引擎使用一种状态机:对此最基本的解释是,状态机是一种在任何给定时间存储组件状态的设备。

为了检测最佳内存设置,系统会根据不同的但预先确定的配置值发送多个测试信号。测试完成后,将使用提供最佳信号质量的值。最佳DQS波形可提供最大的数据眼图区域,同时将抖动、过冲和下冲降至最低。如果经过适当的调整和激活,它可以扩展系统时序裕度,从而有助于改善整体信号特性。JEDEC
的DDR2规范文档指出,如果不使用OCD校准,则在上电和初始化过程中将采用默认参数。一些制造商并不认为这是DDR2的必要功能,并且通常将其保留为默认值以节省设计成本和时间。这可能是导致某些DDR2 800MHz(及更快)内存出现问题的一个因素。
驱动性能/驱动强度和过渡时间 Drive Performance/Drive Strength and Transition Time
驱动器性能与转换时间成正比。驱动器性能越高,内存低电压状态和高电压状态之间的转换时间就越短(或越快)。驱动器性能有时也称为“驱动强度”或“边沿速率”。

上图可以看到:驱动能力越强,信号的斜率越大,越快到达波峰/波谷
只有当电压上升或下降幅度设置在特定水平之间时,信号才能被正确读取。转换时间是指从低电压 (VIL) 变为高电压 (VIH) 状态或从高电压 (VIH) 变为低电压状态所需的时间。因此,转换时间越快,电压上升和下降的速度就越快。

更强的驱动性能会使波形上升部分的电压更快地上升。相反,它会迫使波形下降部分的电压更快地下降。需要注意的是,驱动性能功能应用于许多领域,通常来说,这个概念相当普遍,但不应将其混淆为特定设备或领域中单一因素的代表。
在某些主板中,内存子系统的许多方面都允许用户更改各种驱动强度值。将驱动性能设置过强可能会产生破坏性的过冲和下冲效应,从而与将其设置过低一样危及数据完整性。
想象一下一辆汽车上下坡:你把油门踏板踩得越深,汽车爬坡越快。同样,下坡时踩下踏板会使下坡更快。
这代表着汽车驱动性能的提升。那么,如果你过度增加驱动强度,到达山顶或山脚会发生什么?你会超过顶峰,四个轮子会离开地面,像好莱坞电影里那样飞过空中。这就是所谓的“超调”。
这同样适用于下坡,施加过多的驱动强度会导致惯性使你超调、失去控制并撞车。

数据选通 (DQS) 驱动性能
当数据选通信号DQS和/DQS具有不同的驱动性能时,它们将具有明显不平衡的转换时间。


DDR2 采用差分数据选通信号 (DQS) 设计,使用 DQS 和 /DQS 信号之间的交点作为数据传输的参考。任何偏差都会对时序精度产生不利影响,并可能造成人为的 DQS-DQ 偏差。内存控制器将通过与差分数据选通信号 (DQS) 同步来移动数据 (DQ) 信号,而差分数据选通信号又会跟踪系统时钟。DQ
信号使用与参考电压 (VREF) 的交点作为参考,与 DQS 同步。为了实现最佳数据传输,DQS-/DQS 和 DQ-VREF 之间的两个交点必须对齐。因此,调整 VREF 有时可以提高故障系统的稳定性。然而,对于家庭用户来说,他们无法观察并确切了解正在发生的事情。
DQ-DQS 偏移效应会缩短内存控制器发送和接收数据信号的时间,从而导致数据眼和有效数据窗口减小:成功的信号传输需要足够的建立时间和保持时间裕度。DQ-DQS 偏移通常会对运行频率为 800MHz 或更快的 DDR2 内存模块造成不利影响。

总而言之,驱动器阻抗调整引擎和 OCD 校准电路用于调整 DQ 和 DQS-/DQS 的上拉和下拉驱动强度,以使 DQ-DQS 偏差尽可能小,从而以更大的冗余度扩展数据眼。