题意整理

本题要求实现的是MUX同步器,可用于多bit数据同步。

题解主体

实现电路如下。


(1)对单比特的数据有效标志信号在clk_b时钟域打两拍

(2)将同步后的数据有效标志信号作为多路选择器的选通信号,由于data_en的时序等同于 data_in,也就保证了data_in已经对齐

根据电路设计,Verilog代码描述如下:


reg       reg_data_en ;

reg [3:0] reg_data_in ;

always@(posedge clk_a or negedge arstn) begin

    if(!arstn) begin

        reg_data_en <= 1'b0           ;

        reg_data_in <= 4'd0           ;     

    end

    else begin

        reg_data_en <= data_en  ;

        reg_data_in <= data_in  ;

    end

end


//将数据有效标志信号同步到b时钟域,两级同步器

reg   reg_data_en_b_mid;

reg   reg_data_en_b;

always@(posedge clk_b or negedge brstn) begin

    if(!brstn) begin

        reg_data_en_b_mid <= 1'b0   ;

        reg_data_en_b <= 1'b0;

    end

    else begin

        reg_data_en_b_mid <= reg_data_en;

        reg_data_en_b <= reg_data_en_b_mid;

    end

end


always@(posedge clk_b or negedge brstn) begin

    if(!brstn) begin

        dataout <= 4'b0   ;

    end

    else if(reg_data_en_b)begin

        dataout <= reg_data_in;

    end

    else

           dataout <= dataout;

end

参考答案

`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       reg_data_en ;
reg [3:0] reg_data_in ;
always@(posedge clk_a or negedge arstn) begin
    if(!arstn) begin
        reg_data_en <= 1'b0           ;
        reg_data_in <= 4'd0           ;      
    end
    else begin
        reg_data_en <= data_en  ;
        reg_data_in <= data_in  ;
    end
end

//将数据有效标志信号同步到b时钟域,两级同步器
reg   reg_data_en_b_mid;
reg   reg_data_en_b;
always@(posedge clk_b or negedge brstn) begin
    if(!brstn) begin
        reg_data_en_b_mid <= 1'b0   ;
        reg_data_en_b <= 1'b0;
    end
    else begin
        reg_data_en_b_mid <= reg_data_en;
        reg_data_en_b <= reg_data_en_b_mid;
    end
end

always@(posedge clk_b or negedge brstn) begin
    if(!brstn) begin
        dataout <= 4'b0   ;
    end
    else if(reg_data_en_b)begin
        dataout <= reg_data_in;
    end
    else
    	dataout <= dataout;
end
endmodule