题解 | #多bit MUX同步器#

多bit MUX同步器

https://www.nowcoder.com/practice/30e355a04a454e16811112cb82af591e

`timescale 1ns/1ns

module mux(
	input 				clk_a	, 
	input 				clk_b	,   
	input 				arstn	,
	input				brstn   ,
	input		[3:0]	data_in	,
	input               data_en ,

	output reg  [3:0] 	dataout
);
    
    reg    [3:0]    data_in_reg;
    reg             data_en_a;
    reg             data_en_b1;
    reg             data_en_b2;
    
    //这个题目描述的不够清晰,其意思其实是对输入的信号进行同步,需要将a时钟下的输入信号和使能信号同步到b时钟xia
    //所以首先需要对a时钟下的信号进行打一拍,然后对使能信号在b时钟下进行打两拍操作,因为在输出端没有使能的输出,所以同步操作只需同步使能信号
    //以这个使能信号进行对输入寄存信号的采集,题中也提到了使能为高时,输入保持不变,并且使能至少有三个时钟b,且还对输入进行了打一拍
    //所以不用担心出现输入的变化,如果有问题可以直接对输入进行b时钟的打拍,
    
    
    always@(posedge clk_a or negedge arstn)            //在原时钟a下进行一拍寄存,对于输入进行寄存是很常见的方法,主要是去除毛刺等,做一个本时钟域的同步,
    begin                                              //还可以把输入进行同步,而且输入信号变化慢,有效寄存
        if(!arstn)
            begin
                data_in_reg <= 4'b0;
                data_en_a <= 1'b0;
            end
        else
            begin
                data_in_reg <= data_in;
                data_en_a <= data_en;
            end
    end
    
    
    always@(posedge clk_b or negedge brstn)
    begin
        if(!brstn)
            begin
                data_en_b1 <= 1'b0;
                data_en_b2 <= 1'b0;
            end
        else
            begin
                data_en_b1 <= data_en_a;
                data_en_b2 <= data_en_b1;
            end
    end
    
    
    always@(posedge clk_b or negedge brstn)
    begin
        if(!brstn)
            dataout <= 4'b0;
        else
            begin
                if(data_en_b2)
                    dataout <= data_in_reg;
                else
                    dataout <= dataout;
            end
    end
    
endmodule

全部评论

相关推荐

ps:最寄的一集
投递拼多多等公司10个岗位 >
点赞 评论 收藏
转发
1 收藏 评论
分享
牛客网
牛客企业服务