推荐答案
测试一下
题目
一个系统有两个时钟域的电路,其时钟频率分别为fClka=60MHz和fClkb=20MHz。Clka时钟域驱动一个脉冲信号pulsea(位宽1bit),传输到Clkb时钟域的电路中,用于触发b模块的某些动作。电路模型和关键时序如下图。请写…
参考答案与知识点
参考答案
RTL代码(Verilog)如下:
module a2b (
input wire clka,
input wire rst_n_a,
input wire pulsea,
input wire clkb,
input wire rst_n_b,
output wire pulseb
);
reg toggle_a;
wire sync_pulse;
reg sync1, sync2, sync3;
// Clka域:将脉冲转换为电平翻转
always @(posedge clka or negedge rst_n_a) begin
if (!rst_n_a)
toggle_a <= 1'b0;
else if (pulsea)
toggle_a <= ~toggle_a;
end
// Clkb域:两级同步
always @(posedge clkb or negedge rst_n_b) begin
if (!rst_n_b) begin
sync1 <= 1'b0;
sync2 <= 1'b0;
sync3 <= 1'b0;
end else begin
sync1 <= toggle_a;
sync2 <= sync1;
sync3 <= sync2;
end
end
// 边沿检测,还原为脉冲
assign pulseb = sync2 ^ sync3;
endmodule
寄存器数量评估:Clka域使用1个寄存器(toggle_a),Clkb域使用3个寄存器(sync1, sync2, sync3),总计4个。
解析:
- 由于Clka频率(60MHz)是Clkb(20MHz)的3倍,pulsea宽度仅为Clka的一个周期(约16.67ns),小于Clkb周期(50ns)。直接两级同步会导致脉冲漏采,因此必须采用脉冲同步器结构。
- 本设计使用“脉冲转电平”+“两级同步”+“边沿检测”标准方法:在Clka域将脉冲转换为电平信号(每次脉冲翻转一次),保证电平宽度至少为Clka的一个周期;该电平信号跨越时钟域后,在Clkb域用两级触发器同步消除亚稳态;最后通过异或当前同步值与前一个同步值,检测上升沿或下降沿,生成单周期脉冲(宽度为Clkb的一个周期)。
- 寄存器数量:Clka域1个(toggle_a),Clkb域3个(sync1/sync2/sync3),共4个。若只考虑同步器本身,可简化为2个同步寄存器+1个边沿检测寄存器,故仍为3个;加上Clka域总共4个。
- 易错点:不能只用两级同步器采样脉冲,因为脉冲宽度可能不满足建立保持时间或无法被采样到;必须展宽。
涉及知识点
- 跨时钟域同步(快时钟到慢时钟)
- 脉冲同步器(脉冲转电平 + 边沿检测)
- 两级触发器消除亚稳态
- 寄存器资源评估