FPGA程序,跨时钟打拍的原因
📅 2026/7/24 4:04:14
👁️ 阅读次数
📝 编程学习
测试设置:低端信号发生器,输出20K的方波;FPGA工作在100M的时钟下,抓取触发信号上升沿;
FPGA程序为:
assign o_rise_edge = i_ex_trig_3p3v && !r_ex_trig_3p3v;
always @(posedge clk) begin
r_ex_trig_3p3v <= i_ex_trig_3p3v; // 打一拍,保存上一周期值
end
测试现象:o_rise_edge 时有时无。
原因:
解决方案:
reg r_ex_trig_3p3v_sync1, r_ex_trig_3p3v_sync2;
// 第一级同步:打两拍,解决亚稳态
always @(posedge clk) begin
r_ex_trig_3p3v_sync1 <= i_ex_trig_3p3v; // 第一拍
r_ex_trig_3p3v_sync2 <= r_ex_trig_3p3v_sync1; // 第二拍
end
// 然后用同步后的信号做边沿检测
assign o_rise_edge = r_ex_trig_3p3v_sync2 && !r_ex_trig_3p3v_sync1;
// 注意:这里用 sync2 和 sync1 比较,而不是用 r_ex_trig_3p3v
编程学习
技术分享
实战经验