【牛客网刷题系列 之 Verilog进阶挑战】~ 多bit MUX同步器

0. 前言

有几天没更新牛客刷题的博客了,最近有事在忙,只能尽量做到每天一更了!!!一边刷题,一边做点小demo,不断学习。
今天这个题主要是一个跨时钟域的多位数据传输,也是比较常见的一种题型,挺有用的,关于跨时钟域怎么处理,可以移步到我之前写的一篇博客,传送门

1. VL48 多bit MUX同步器

1.1 题目描述

在data_en为高期间,data_in将保持不变,data_en为高至少保持3个B时钟周期。表明,当data_en为高时,可将数据进行同步。

本题中data_in端数据变化频率很低,相邻两个数据间的变化,至少间隔10个B时钟周期。

1.1.1 信号示意图

在这里插入图片描述
在这里插入图片描述

1.1.2 波形示意图

1.1.3 输入描述

input                 clk_a    , 
input                 clk_b    ,   
input                 arstn    ,
input                brstn   ,
input        [3:0]    data_in    ,
input               data_en 

1.1.4 输出描述

output reg [3:0] dataout

1.2 解题思路

我们根据题意大概框架如下:
在这里插入图片描述
其中,红色框框表示的是数据暂存 以及 使能暂存;蓝色框框表示跨时钟域处理,采用打两拍的形完成;绿色框框表示MUX选择以及暂存的结果输出。

1.3 代码实现

`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
);
    
    //暂存data_en
    reg data_en_reg;
    always @ (posedge clk_a or negedge arstn) begin
        if(!arstn) begin
            data_en_reg <= 1'b0;
        end
        else begin
            data_en_reg <= data_en;
        end
    end
    
    //data_in
    reg [3:0] data_in_reg;
    always @ (posedge clk_a or negedge arstn) begin
        if(!arstn) begin
            data_in_reg <= 4'd0;
        end
        else begin
            data_in_reg <= data_in;
        end
    end
    
    //打两拍,跨时钟域过渡
    reg data_en_ab1, data_en_ab2;
    always @ (posedge clk_b or negedge brstn) begin
        if(!brstn) begin
            data_en_ab1 <= 1'b0;
            data_en_ab2 <= 1'b0;
        end
        else begin
            data_en_ab1 <= data_en_reg;
            data_en_ab2 <= data_en_ab1;
        end
    end
    // MUX
    always @ (posedge clk_b or negedge brstn) begin
        if(!brstn) begin
            dataout <= 4'd0;
        end
        else begin
            dataout <= data_en_ab2 ? data_in_reg : dataout;
        end
    end
endmodule

1.4 测试文件

待更新。。。

1.5 仿真波形

待更新。。。

声明

本人所有系列的文章,仅供学习,不可商用,如有侵权,请告知,立删!!!

本人主要是记录学习过程,以供自己回头复习,再就是提供给后人参考,不喜勿喷!!!

如果觉得对你有用的话,记得收藏+评论!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值