VBP 期间只保留一个 HSYNC 脉冲的实现 vbp期间如果只允许有一个hsync脉冲sv激励中如何实现呢这个脉冲应该靠近vsync还是应该靠近hact一、直接回答应该靠近HACT放在 VBP 的最后一行VBP共29行 |--------------------------------| VSYNC: ‾‾|____|‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ ←VSW→ ← VBP行0~27 → ←VBP行28→ ←VACT第0行→ ___ HSYNC: ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾| |‾‾‾‾‾‾‾‾‾‾‾ ↑ 唯一的HSYNC脉冲 ★靠近HACT ←HBP→ DE: ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾|███████|‾‾‾ ↑ 第一个HACT为什么不能靠近 VSYNC上一个问题我们已经确立了不变式任何 HACT 之前必须是HSYNC → HBP。这个脉冲就是第一个 HACT 的行开始标志功能上是第一行的行同步接收端靠脉冲结束沿 HBP 计数确定行数据起点参考必须是最新的放在 VSYNC 附近 无效脉冲之后隔着 28 行死区接收端无法推算第一个 HACT 的相位等于没发VSYNC 已承担帧同步职责VBP 开头的信息已由 VSYNC 脉冲携带HSYNC 放那里没有增量价值精确定位采用行尾同步约定HACT → HFP → HSYNC → HBP → 下一行HACT脉冲位置 最后一个VBP行内 脉冲结束沿 第一个HACT开始前 HBP 个时钟 脉冲起始沿 脉冲结束沿 - HSW二、SV 实现方式一计数器风格RTL/可综合localparam int HACT800, HFP40, HSW48, HBP40; localparam int HTOTAL HACTHFPHSWHBP; // 928 localparam int VACT480, VFP13, VSW3, VBP29; localparam int VTOTAL VACTVFPVSWVBP; // 525 logic [15:0] hcnt, vcnt; // 行内像素计数 / 帧内行计数 // 行内布局行尾同步约定 // [0,HACT)有效数据 [HACT,HFP)前肩 [HSW)同步脉冲 [HBP)后肩 wire hsync_window (hcnt HACTHFP) (hcnt HACTHFPHSW); // 场区域判断 wire in_vbp (vcnt VSW) (vcnt VSWVBP); wire vbp_last_ln (vcnt VSWVBP-1); // ★ VBP最后一行 // ★ 核心VBP期间屏蔽所有脉冲只放行最后一行的那个 assign hsync (hsync_window (!in_vbp || vbp_last_ln)) ? 1b0 : 1b1;关键就一行逻辑(!in_vbp || vbp_last_ln)—— 非 VBP 区正常出脉冲VBP 区只在最后一行出脉冲。三、SV 实现方式二激励 taskUVM/Testbench 风格task automatic drive_vbp_single_hsync(); // 以VBP起点为0的绝对时钟位置单位pclk // 脉冲结束沿必须落在第一个HACT之前恰好 HBP 处 int pulse_start VBP*HTOTAL - HBP - HSW; // 脉冲拉低起点 int pulse_end VBP*HTOTAL - HBP; // 脉冲拉高终点 for (int i 0; i VBP*HTOTAL; i) begin (posedge vif.pclk); if (i pulse_start i pulse_end) vif.hsync 1b0; // 低有效脉冲 else vif.hsync 1b1; // 其余全部保持空闲电平 vif.de 1b0; vif.data 0; end endtask四、验证自查要点检查项期望值脉冲在帧内的绝对位置vcnt VSWVBP-1hcnt ∈ [HACTHFP, HACTHFPHSW)脉冲结束沿 → 第一个HACT恰好 HBP 个 pclk脉冲宽度恰好 HSW 个 pclkVBP 其余行hsync 全程空闲电平无毛刺第一行之后恢复正常逐行脉冲五、记忆要点★ 唯一的 VBP 脉冲必须放在VBP 最后一行靠近 HACT它是第一行有效数据的行同步基准★ 核心不变式脉冲结束沿 → HBP → HACT 起点这个距离一个时钟都不能错★ 实现核心是一个屏蔽条件脉冲窗口 (非VBP || VBP最后一行)★ 激励写法用绝对位置计算VBP*HTOTAL - HBP - HSW最不容易出错