题意整理
本题要求实现的是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