题解 | 多bit MUX同步器

这题咋在跨时钟FIFO之后。。。

为了保险起见数据和使能都打两拍吧~

`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_reg;
reg 		data_en_reg;

    always @(posedge clk_a or negedge arstn)           
        begin                                        
            if(!arstn)                               
                data_reg <= 4'd0;                                   
            else if (data_en)                             
                data_reg <= data_in;                                                                     
        end


    always @(posedge clk_a or negedge arstn)           
        begin                                        
            if(!arstn)                               
                data_en_reg <= 1'b0;                                   
            else
                data_en_reg <= data_en;                                                                     
        end		


reg 		data_en_pat1,data_en_pat2;
reg [3:0]   data_pat1,data_pat2;
    always @(posedge clk_b or negedge brstn)           
        begin                                        
            if(!brstn) begin
                data_en_pat1 <= 1'b0;
                data_en_pat2 <= 1'b0;       
            end                                             
            else begin
                data_en_pat1 <= data_en_reg;
                data_en_pat2 <= data_en_pat1;      
            end                                                                                                
        end

    always @(posedge clk_b or negedge brstn)           
        begin                                        
            if(!brstn) begin
                data_pat1 <= 1'b0;
                data_pat2 <= 1'b0;     
            end                                             
            else begin
                data_pat1 <= data_reg;
                data_pat2 <= data_pat1;     
            end                                                                                                
        end

    always @(posedge clk_b or negedge brstn)           
        begin                                        
            if(!brstn) begin
                dataout <= 4'd0;       
            end                                             
            else if (data_en_pat2) begin
                dataout <= data_pat2;      
            end                                                                                                
        end
                                              
endmodule

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务