60 秒回答模板

题里说绝对码时,要先说明绝对码是原始输入数据,进入 DPSK 调制前通常先按协议做差分编码,生成相对码或相位状态;后级再用这个状态选择 0/pi 等载波相位。硬件实现可以分几级:符号有效时保存上一相位状态,用当前 bit 按约定决定保持或翻转;再用 NCO/DDS 或查表产生载波,通过取反或地址偏移实现二相相位选择;后面接成形滤波、插值、DAC 或数字接口。工程上要注意复位初始相位、bit 0/1 对应保持还是翻转的协议约定、符号使能、流水线延迟对齐、位宽量化、滤波器资源和软件模型比对。

考点 差分编码
难度 真实面经题
回答目标 能把差分编码、相位选择、载波生成、成形滤波和硬件验证路径讲成可实现结构。

深入解析

01

先区分编码和调制

差分编码把输入数据转换为相邻符号相位变化关系;调制阶段再把相位状态映射到载波波形。硬件实现时这两部分通常分模块,便于验证和替换。

02

差分状态寄存

实现需要保存上一符号状态,在符号有效时根据当前输入比特更新相位状态。二相场景可以用 1 bit 表示相位翻转与否;多相场景则用相位累加或符号映射表。

03

载波和相位选择

数字载波可由 NCO 或查找表产生。二相调制中,相位相差 pi 可以通过波形取反或查表地址加半周期实现;更复杂调制则选择不同相位点。

04

工程实现细节

符号时钟与系统时钟通常通过 clock enable 管理。成形滤波、插值、DAC 接口和位宽截断都要做流水线延迟对齐,测试时用已知比特序列和软件模型比对相位跳变。

verilog

二相差分编码最小骨架

module dbpsk_diff_encoder (
    input  wire clk,
    input  wire rst_n,
    input  wire sym_valid,
    input  wire bit_in,
    output reg  phase_sel
);

always @(posedge clk or negedge rst_n) begin
    if (!rst_n) begin
        phase_sel <= 1'b0;
    end else if (sym_valid) begin
        // Example convention: bit 1 toggles phase, bit 0 keeps phase.
        phase_sel <= phase_sel ^ bit_in;
    end
end

endmodule
  • phase_sel 只表示差分后的相位状态,后级可用它选择 0/pi 相位或控制载波取反。
  • 具体 bit 到相位变化的约定要和协议或收发两端约定一致。

易错点

  • 只说用查表输出波形,不说明差分状态如何更新。
  • 把输入比特直接映射成绝对相位,丢失差分调制含义。
  • 忽略符号时钟和系统时钟关系,导致每拍都更新状态。
  • 没有定义复位初始相位,接收端和发送端约定不一致。

面试官追问

为什么要差分编码?

差分调制让接收端通过相邻符号相位变化恢复信息,降低对绝对载波相位初始值的依赖。

硬件实现怎么验证?

用固定输入序列生成期望差分状态和相位跳变,和软件模型逐符号比对,同时检查复位初值、符号使能和流水线延迟。

实现后你会用哪些检查来避免硬件问题?

我会至少做仿真、lint、综合后资源检查、时序约束和 STA;涉及跨时钟域还要做 CDC 检查,涉及板级接口还要结合时序裕量和实测波形验证。