题解 | #脉冲同步电路#

脉冲同步电路

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
牛!
点赞 回复 分享
发布于 2022-03-11 08: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

相关推荐

菜鸡29号:根据已有信息能初步得出以下几点: 1、硕士排了大本和大专 2、要求会多语言要么是招人很挑剔要么就是干的活杂 3、给出校招薪资范围过于巨大,说明里面的薪资制度(包括涨薪)可能有大坑
点赞 评论 收藏
分享
02-16 00:16
已编辑
湖北大学 Java
Java抽象带篮子:java简历怎么写可以看看我发的帖子,很详细的
点赞 评论 收藏
分享
评论
6
2
分享

创作者周榜

更多
牛客网
牛客企业服务