这一篇在干嘛?
这是”寄存器手册:PH2A HXT(UG1121)“系列第 1 篇。寄存器手册不是教程,而是一本字典:它把 HXT 高速收发器内部所有寄存器逐个列出。本篇先教你这本字典的结构和查法(下一篇再讲 TX/ETH/DFX 分区),然后拆解前两章——Common 公共寄存器和 RX 接收寄存器——里最值得认识的模块。
这本手册是什么、何时需要翻它
UG1121 全名《安路科技 SALPHOENIX®2A 系列 FPGA HXT 高速串行收发器寄存器说明》(v1.0,2024 年 8 月首次发布)。SALPHOENIX 2A 是安路的新一代 FPGA 系列,其 HXT(High-speed Transceiver)是片内的高速串行收发器硬核,用来跑 PCIe、以太网这一类 Gbps 级别的串行协议。
你在 TD 软件里例化一个收发器 IP 时,向导会把参数翻译成一组寄存器初值写进比特流;运行时,IP 的校准状态机、电源管理状态机又会动态地读写这些寄存器。也就是说:99% 的情况下你不需要直接碰这些寄存器。那这本手册什么时候有用?
- 调试疑难杂症:链路起不来、误码率异常时,读状态寄存器(如校准结果、PPM 锁定状态)能定位问题出在模拟前端还是数字后端。
- 看懂 IP 配置到底改了什么:向导里勾一个选项,对应到哪些寄存器位翻转,手册是唯一的对照表。
- 深度调试/性能压榨:手册里有一大类
ovrd(override,寄存器接管)寄存器,可以在系统调试时绕过状态机、直接手控收发器内部信号——这是芯片厂商留给高级用户的”后门”。 - 写驱动/固件:如果 SoftCore 或外部 MCU 要通过接口访问收发器寄存器空间,手册就是地址映射表。
常见坑:把寄存器手册当配置指南用
手册开头对每个分区只给一句”base address of 0x…”,没有操作流程、没有推荐配置。不要试图从这本手册里学”怎么把收发器配成 PCIe Gen2”——那是 UG 系列其他手册(IP 用户指南)的任务。寄存器手册只回答”某个寄存器在哪个地址、每个位是什么意思”。
手册结构:五个分区与基地址
手册正文共 5 章,每章对应收发器地址空间里一个连续的分区。每个分区有自己的基地址,寄存器的真实地址 = 分区基地址 + 表中给出的 Offset:
| 章 | 分区 | 基地址 | 管什么 |
|---|---|---|---|
| 1 | Common Register Fields | 0x00000000 | 整个收发器 Quad 共用的资源:公共 PLL(LCPLL)、公共时钟发生器、各路校准状态机、电源/复位控制、PVT 测量 |
| 2 | RX Register Fields | 0x02000000 | 每条 lane 的接收方向:RX 端接、AGC/CTLE 均衡、DFE、CDR、RX 校准状态机、EQ 参数存储 |
| 3 | TX Register Fields | 0x02001000 | 每条 lane 的发送方向:TX 端接、驱动器 FIR(预加重/摆幅)、TX 分频器、TX 复位/掉电控制 |
| 4 | ETH Register Fields | 0x02002000 | 以太网自协商(AN)与链路训练(LT,合称 ANLT)的协议层寄存器 |
| 5 | DFX Register Fields | 0x02003000 | Design-for-Debug:调试总线(tbus)、SOC 侧接口的 override/观测寄存器、环回控制 |
每章内部结构完全一样,先来一节 x.1 Overview:一张三列表格(Register Name / Offset / Description),把本章所有寄存器一口气列完——这是全书最有用的一节,先看 Overview 再决定往哪翻。然后是 x.2 Field Descriptions:逐个寄存器给出位级明细表。
常见坑:Offset 不等于真实地址
Overview 表里写的是分区内的偏移量。比如 RX 分区里
rx_agc_adapt_ctrl的 Offset 是 0xd8,它相对整个收发器地址空间的地址要加上 RX 基地址 0x02000000。跨分区对比”两个寄存器地址近不近”时,一定要先加各自的基地址。
寄存器表格怎么读:字段、读写属性与命名后缀
每个寄存器的描述都是一张五行表,以第 1 章的 afe_cmn_clkgen_reg1(公共时钟发生器配置,Offset 0xc)为例:
| Bit | Field Name | R/W | Default Value | Function and Description |
|---|---|---|---|---|
| 0xc[21:18] | dcoreg_nt | read write | 0xe | Common clock gen DCO regulator set point。1111 - 950mV nominal,0000 - 650mV nominal |
| 0xc[17] | dcoreg_bleed_ena_a | read write | 0x0 | dcoreg bleed enable control |
| 0xc[16] | dcoreg_scbypass_nt | read write | 0x0 | 0 - Normal operation,1 - Bypass the switched capacitor voltage boost |
| 0xc[15] | fbdivfrac_ovr_ena_nt | read write | 0x0 | 使能基于 DBE 小数合成器的反馈路径 PI 控制信号 override |
| 0xc[10:8] | hsrefdiv_nt | read write | 0x2 | 把公共时钟发生器 10.5GHz 输出分频出 HSREF 时钟。默认 div3:010 - div5,001 - div4,000 - div3 |
| 0xc[6:0] | vcodiv_nt | read write | 0xc | LC VCO 时钟的整数后分频比,7bit 表示 8~127 的分频值 |
五列的含义:
- Bit:位的位置,写成
Offset[高位:低位]。例如0xc[6:0]是 Offset 0xc 这个 32bit 寄存器的第 6~0 位。 - Field Name:位段名。名字本身就是最好的分类线索,见下面的后缀规则。
- R/W:
read-write可读可写;read-only只读(状态/观测寄存器,写无效)。 - Default Value:复位后的默认值。手册里大量寄存器默认值就是芯片出厂调好的推荐值——默认值通常别乱动。
- Function and Description:位段功能,常带枚举值说明。
字段名的后缀有一套内部约定,认出来能少走很多弯路:
| 后缀 | 含义 | 例子 |
|---|---|---|
_nt | 芯片原生(native)控制信号,通常状态机正常托管 | vcodiv_nt、dcoreg_nt |
_a | AFE(模拟前端)信号的寄存器 override 使能/值 | bypass_ena_a |
_ba | DBE(数字后端)信号的 reset/power override | p2s_ba、driver_ba |
ovrd / ovr_en | override 类:寄存器接管原本由引脚或状态机驱动的信号 | lane_txstate_ovrd_en_a |
_rdreg | read-only 观测寄存器,回读内部测量/校准结果 | afe_cmn_idco_adapt_rdreg |
reg1/reg2/... | 同一功能块的多组连续寄存器 | afe_cmn_lcpll_fracdiv_reg1~6 |
另一个通用模式是几乎所有功能块都有的 bypass_ena(或 ovr_en)+ 值域 配对:先把使能位置 1,寄存器值才会接管被状态机控制的信号;使能为 0 时写值域完全无效。调试时”想手动控制某个模拟量”,动作永远是两步:写值 → 打开 bypass。
常见坑:名称里下划线被 OCR 打乱
解析版手册里章节号和字段名偶有空格错位(如
1. 2. 4、cmnatest),检索寄存器名时把下划线去掉再搜更稳。
Common 公共寄存器:时钟、校准与电源(第 1 章)
第 1 章约 107 个寄存器,管的是整个收发器 Quad 公用的”基础设施”。按功能可以归成四堆:
① 公共时钟发生器(LCPLL / clock gen):afe_cmn_lcpll_fracdiv_reg1~6(环路滤波器与 Fractional-N 小数分频配置)、afe_cmn_lcpll_osc_reg1~6、以及上面示例的 afe_cmn_clkgen_reg1/reg2。其中 afe_cmn_clkgen_reg2(0x10)负责 SRIS 与公共合成器输出分频:
| Bit | Field Name | R/W | Default | 说明 |
|---|---|---|---|---|
| 0x10[23] | cmn_sris_ena_nt | rw | 0x0 | 使能 CMN 中的 SRIS 时钟生成 |
| 0x10[22:16] | fbdivint | rw | 0x19 | 反馈路径整数分频(LC VCO 时钟 /4),支持 8~127 |
| 0x10[10] | pclkdiv_ready_a | rw | 0x0 | 上升沿把 pclkdiv 总线锁存进本地 AFE 时钟域 |
| 0x10[9:1] | pclkdiv_a | rw | 0x0 | 公共合成器输出分频(输出给 DBE 的时钟),7.2 位小数表示,支持 10~127 |
| 0x10[0] | ck_osc_sel_nt | rw | 0x0 | 测试模式:用低速参考时钟驱动公共 DCO |
注意 pclkdiv_ready_a 和 pclkdiv_a 是一对”值 + ready 锁存”信号——改分频比必须配合 ready 上升沿才生效,这是寄存器手册里反复出现的握手套路。
② 校准状态机(adapt 系列):IDCO 校准、VCO 自适应、端接校准(termcal)等。以 IDCO 校准为例,配置在 afe_cmn_idco_adapt_reg1/reg2(0x18/0x1c),结果回读在 afe_cmn_idco_adapt_rdreg(0x14):
| Bit | Field Name | R/W | Default | 说明(rdreg,全部 read-only) |
|---|---|---|---|---|
| 0x14[7] | ack | ro | 0x0 | idco 校准应答 |
| 0x14[6] | idco_error_a | ro | 0x0 | 校准错误标志 |
| 0x14[5] | idco_sample | ro | 0x0 | 校准采样标志 |
| 0x14[4] | idco_ready | ro | 0x0 | 校准就绪 |
| 0x14[3:0] | idco | ro | 0x0 | 校准得到的 idco 值 |
校准启动类寄存器的固定三件套在 afe_cmn_idco_adapt_reg2 里看得最清楚:req_a(校准启动请求,写 1 启动)、load_only_nt(只装载起始值不做校准)、max_iter_nt(最大迭代次数,跑满即报 done)。这是全手册所有 adapt 块的通用骨架。
③ 电源/复位/序列控制:afe_cmn_power_cntrl、pd_afe_cmn(掉电)、rst_afe_cmn / rst_dbe_cmn(复位 override)、seq_cntrl_cmn、cmnmfsm 系列(电源主状态机的指针、速率、状态寄存器)。这些默认全部由硬件状态机托管,调试时才会改成寄存器接管。
④ 测量与杂项:afe_cmn_atest(模拟测试 ADC:选被测对象 pmonsel、分频、端接类型、启动捕获)+ afe_cmn_atest_rdreg(回读 12bit ADC 结果);pvt_measure(工艺/电压/温度测量);ppm_lock_detect_reg1~3(参考时钟 PPM 检测);refdet_reg1/2(参考时钟检测);cmn_csr_ctrl、cmn_info 等控制信息寄存器。
RX 接收寄存器:接收链路核心模块(第 2 章)
第 2 章是全书最大的一章(Base 0x02000000,Overview 表就有 20+ 页),管每条 lane 的接收方向。同样按数据流顺序归堆:
① 模拟前端入口:afe_octerm_rx(0x0)配置 RX 端接模式:
| Bit | Field Name | R/W | Default | 说明 |
|---|---|---|---|---|
| 0x0[6:4] | acc_term_mode_nt | rw | 0x1 | 端接模式:111 保留 / 110 浮空端接 DC 耦合 / 101 端接到 vss DC 耦合 / 010 片上 AC 耦合浮空端接 / 001 片上 AC 耦合端接到 vss / 000 高阻 |
| 0x0[3:1] | acc_term_cal_nt | rw | 0x0 | 端接校准码(来自公共端接校准块) |
| 0x0[0] | bypass_ena_a | rw | 0x0 | 1 - 使能寄存器 override |
② 均衡与增益自适应(AGC/CTLE):rx_agc_adapt_* 一大家子。rx_agc_adapt_ctrl(0xd8)是启停开关:
| Bit | Field Name | R/W | Default | 说明 |
|---|---|---|---|---|
| 0xd8[2] | foreground_ena_a | rw | 0x0 | 1 - 配置为细调增益自适应 |
| 0xd8[1] | background_ena_a | rw | 0x0 | 1 - 配置为粗调增益自适应 |
| 0xd8[0] | start_a | rw | 0x0 | 写 1 启动 AGC 粗调/细调自适应;锁定后重新触发要先清 0 再置 1 |
配套的 rx_agc_adapt_lms(0xe0)用 min/max 字段限制粗调/细调增益的收敛范围(超界裁剪),rx_agc_adapt_reg1~10 则是一张静态查找表(LUT),把自适应出的 coarse 档位映射到内部 vga_coarse1/vga_coarse2 两级实际控制值。旁边还有 rx_adapt_vga_offset_* 系列(VGA 偏移的后台/旁路/LMS 配置)。
③ 数字均衡与参数存储:rxeqstore0/1_* 系列(tap、slicer、thres、phase、offset 等 EQ 参数的存取),dbe_rx_dbg_sample_* 系列(把 FFE、量化器错误 qzd_err、量化区域 qzd_rgn 等内部采样值导出到调试总线)。这两个前缀 0/1 对应链路上的两个 EQ 参数槽位,链路训练时可以在两组参数间切换比较。
④ 乒乓缓冲与观测:compute_alu_* 是自适应算法共用的一个小 ALU(乘法器/除法器/累加器 + 阈值比较 GTE/LTE),compute_alu_rdreg1~4 回读比较结果——这是均衡算法硬件化的算力单元,应用层一般只看它的只读输出。
⑤ ANLT 监控与 RX 状态机:anlt_mon(0x4)选择并使能捕获 ANLT 帧(Clause 72/92 或 136/162 的 RX/TX 帧),anlt_mon_rdreg 回读缓冲满标志;rxmfsm_* 系列是 RX 主状态机的速率/上下电指针寄存器;rx_ppm_lock_detect_*、rx_refdcd_*、rx_vco_adapt_* 则把第 1 章同类功能搬到了每条 lane 的 RX 侧。
通关标准:
- 能不翻书说出 5 个分区各自的基地址(0x0 / 0x02000000 / 0x02001000 / 0x02002000 / 0x02003000)。
- 看到
_rdreg后缀能反应过来”这是只读观测寄存器”,看到bypass_ena/ovr_en能反应过来”先写值再开旁路”。- 能说出 IDCO/AGC 这类校准块的三件套:
req启动、max_iter迭代上限、rdreg回读结果。
自测:RX 分区的基地址是多少?
rx_agc_adapt_ctrl的 Offset 是 0xd8,它在分区内的哪些位是启动开关?RX 分区基地址 0x02000000。
rx_agc_adapt_ctrl(0xd8)中:bit2foreground_ena_a选细调、bit1background_ena_a选粗调、bit0start_a写 1 启动;已锁定后要重新触发,必须先把 start 清 0 再重新置 1。
自测:为什么手册里很多寄存器的 Default Value 就是"推荐值",改动前要三思?
这些默认值由状态机在复位/校准流程中动态托管,芯片出厂时已按工艺角调好。绕过状态机直接改(尤其电源
pd_*、复位rst_*、时钟分频类)可能导致收发器掉出锁定甚至违反上电时序,需要调试时才应有针对性地 override。
自测:
afe_octerm_rx的端接模式里,DC 耦合和片上 AC 耦合怎么选?对应编码分别是什么?看对端信号的直流偏置是否已被隔直:对端带隔直电容(AC 耦合链路,如多数 PCIe/以太网)用片上 AC 耦合端接——010(浮空端接 AC 耦合)或 001(端接到 vss AC 耦合);短距直流直连可用 DC 耦合——110(浮空端接)或 101(端接到 vss)。111/100/011 为保留值。
自测:手册 Overview 表里的 Offset 直接就是总线上要访问的地址吗?
不是。真实地址 = 分区基地址 + Offset。例如
rx_agc_adapt_ctrl实际位于 0x02000000 + 0xd8。跨分区比较地址时必须先加各自的基地址,否则会把不同分区里 Offset 相同的寄存器搞混。