题解 | #多bit MUX同步器#
多bit MUX同步器
https://www.nowcoder.com/practice/30e355a04a454e16811112cb82af591e
主要是异步时钟的同步。
需要使能信号在clk_a下打一拍;在clk_b下再打两拍;
问题一:
这里我一直有一个疑惑:为什么要再alk_a下先打一拍?在异步FIFO种时钟同步的时候也有这一拍。
看到下面这个一个解释。“在原时钟a下进行一拍寄存,对于输入进行寄存是很常见的方法,主要是去除毛刺等,做一个本时钟域的同步,”感觉有道理。
https://blog.nowcoder.net/n/781da206e2114e358eabb1bb301d21ac?f=comment
问题二:
在clk_b下再打两拍;我明白这个是为了同步到clk_b时钟下。但是这个为什么是需要打两拍?(刚开始学习,,只知道这样用,,,但是还不知到具体原理。。。)
`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_a, data_en_b1, data_en_b2; always@(posedge clk_a or negedge arstn)begin if(~arstn)begin data_reg <= 0; data_en_a <= 0; end else begin data_reg <= data_in; data_en_a <= data_en; end end always@(posedge clk_b or negedge brstn)begin if(~brstn)begin data_en_b1 <= 0; data_en_b2 <=0; 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(~arstn) dataout <= 0; else dataout <= data_en_b2 ? data_reg: dataout; end endmodule