题解 | #脉冲同步电路#
脉冲同步电路
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; reg data_in_temp1,data_in_temp2,data_in_temp3; always @(posedge clk_fast or negedge rst_n)begin if(~rst_n) data_in_reg <= 1'b0; else if(data_in) data_in_reg <= ~data_in_reg ; //这里一直没搞太懂,不懂那个电路原理图是怎么来的、 //现在懂了,快时钟脉冲时间很短,慢时钟还来不及接收脉冲就没了,所以需要先将脉冲转为电平,data_in_reg<=data_in?(~data_in_reg):data_in_reg //这个表达式表示当data_in为1时,即产生了脉冲,则data_in_reg相反并且一直保持下去直至产生下一个脉冲 end //跨时钟域信号处理一般至少都要打两拍,减少亚稳态现象 always @(posedge clk_slow or negedge rst_n)begin if(~rst_n)begin data_in_temp1 <= 1'b0; data_in_temp2 <= 1'b0; data_in_temp3 <= 1'b0; end else begin data_in_temp1 <= data_in_reg; data_in_temp2 <= data_in_temp1; data_in_temp3 <= data_in_temp2; end end //这一步将第二拍和前一个信号异或,异或时只有信号变化时会产生高位, //这就是为什么前面脉冲转为电平时不需要考虑电平高低,只需要考虑有上升沿或者下降沿(只要有沿就会这里的data_out就会产生1) assign dataout = data_in_temp2 ^ data_in_temp3; endmodule