题解 | #脉冲同步电路#

脉冲同步电路

http://www.nowcoder.com/practice/b7f37e6c55e24478aef4ec2d738bbf07

  1. 第一种方法,经典握手。
`timescale 1ns/1ns

module pulse_detect(
	input 				clk_fast	, 
	input 				clk_slow	,   
	input 				rst_n		,
	input				data_in		,

	output  		 	dataout
);
    //defination
    reg signal_a_ex;
    reg signal_b_r;
    reg signal_b_rr;
    reg signal_b_rrr;
    reg signal_a_r;
    reg signal_a_rr;
    reg signal_a_rrr;
    wire signal_a_pos;
    
    //output
    always@(posedge clk_fast or negedge rst_n)begin
        if(!rst_n) signal_a_ex <= 'd0;
        else if(data_in) signal_a_ex <= 1'b1;
        else if(signal_a_pos) signal_a_ex <= 1'b0;
    end
    
    always@(posedge clk_slow or negedge rst_n)begin
        if(!rst_n) {signal_b_rrr, signal_b_rr, signal_b_r} <= 'd0;
        else {signal_b_rrr, signal_b_rr, signal_b_r} <= {signal_b_rr, signal_b_r, signal_a_ex}; 
    end

    assign dataout = ~signal_b_rrr && signal_b_rr;
    
    always@(posedge clk_fast or negedge rst_n)begin
        if(!rst_n) {signal_a_rrr, signal_a_rr, signal_a_r} <= 'd0;
        else {signal_a_rrr, signal_a_rr, signal_a_r} <= {signal_a_rr, signal_a_r, signal_b_rr}; 
    end
    
    assign signal_a_pos = ~signal_a_rrr && signal_a_rr;
endmodule
  1. 第二种方法是新学的,扩展信号检测到data_in就翻转,慢时钟域直接进行边沿检测就行了,第一种方法是默认上升沿检测的,面积和功耗相比之下还是太大了。
`timescale 1ns/1ns

module pulse_detect(
	input 				clk_fast	, 
	input 				clk_slow	,   
	input 				rst_n		,
	input				data_in		,

	output  		 	dataout
);
    //defination
    reg signal_a_ex;
    reg signal_b_r;
    reg signal_b_rr;
    reg signal_b_rrr;
    
    //output
    always@(posedge clk_fast or negedge rst_n)begin
        if(!rst_n) signal_a_ex <= 'd0;
        else if(data_in) signal_a_ex <= ~signal_a_ex;
    end
    
    always@(posedge clk_slow or negedge rst_n)begin
        if(!rst_n) {signal_b_rrr, signal_b_rr, signal_b_r} <= 'd0;
        else {signal_b_rrr, signal_b_rr, signal_b_r} <= {signal_b_rr, signal_b_r, signal_a_ex}; 
    end

    assign dataout = signal_b_rrr ^ signal_b_rr;
endmodule
全部评论
请问为什么要最后两拍异或呢 这个地方不是很懂
1 回复 分享
发布于 2022-03-20 20:59
方法二 中else if(data_in) signal_a_ex <= ~signal_a_ex 应该改为else signal_a_ex <= data_in ^ signal_a_ex 吧
点赞 回复 分享
发布于 2022-03-26 19:21
牛!
点赞 回复 分享
发布于 2022-03-11 08:59

相关推荐

天乐敲代码呀:9咋了,多投投优越感就没了
点赞 评论 收藏
分享
评论
6
2
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务