题解 | 脉冲同步电路
脉冲同步电路
https://www.nowcoder.com/practice/b7f37e6c55e24478aef4ec2d738bbf07
`timescale 1ns/1ns module pulse_detect( input clk_fast , input clk_slow , input rst_n , input data_in , output dataout ); // //把脉冲信号转化为电平信号 reg data_in_reg; always@(posedge clk_fast or negedge rst_n) if(!rst_n) data_in_reg <= 0; else data_in_reg <= data_in ? ~data_in_reg : data_in_reg; //在慢时钟域打三拍,前两拍消除亚稳态,第二三拍要用来产生dataout信号 reg data_in_reg1,data_in_reg2,data_in_reg3; always@(posedge clk_slow or negedge rst_n) if(!rst_n) begin data_in_reg1 <= 0; data_in_reg2 <= 0; data_in_reg3 <= 0; end else begin data_in_reg1 <= data_in_reg; data_in_reg2 <= data_in_reg1; data_in_reg3 <= data_in_reg2; end //产生慢时钟域脉冲信号 assign dataout = data_in_reg2 ^ data_in_reg3; endmodule
首先明确几个概念:
① 快时钟域:频率高,周期小;所以题目为快时钟域到慢时钟域同步;
②对于某个确定的时钟域,单周期的时钟信号为脉冲,多周期的时钟信号为电平
https://zhuanlan.zhihu.com/p/392864814(知乎上一篇文章写的很好)
具体实现其实比较简单,就三步:脉冲转电平;打两拍同步;输出慢时钟域脉冲
这个题目里面说了A时钟脉冲间隔很大,所以不需要再加一个反馈信号了。