题解 | #多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