题解 | #脉冲同步电路#

脉冲同步电路

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

全部评论

相关推荐

运营3年修炼中接简历辅导:你的科研项目经历里,只写了你的动作,没有写你的思考和成果,不要只写使用什么进行了什么,这等于罗列你的任务,简历是为了突出你的优秀,你在什么样的任务背景下,克服了什么样的困难,针对性地做了哪些事情,最后达成了什么成果(用数据体现你的成果和效率)
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务