前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >谈谈Mux与门电路的相互替换(包含实例分析)

谈谈Mux与门电路的相互替换(包含实例分析)

作者头像
Reborn Lee
发布2020-06-29 11:54:34
1.8K0
发布2020-06-29 11:54:34
举报
文章被收录于专栏:用户7494468的专栏

今天开始正式尝试使用微信公众号同步博客文章,个人博客地址为:https://blog.csdn.net/Reborn_Lee

在秋招中,经常遇到的问题是用Mux替换门电路,例如与门,或门,非门,缓冲器,异或,甚至一位全加器,之前写过与此相关的博客如:

【Verilog HDL 训练】第 04 天(竞争、冒险、译码等):

4. 如果一个标准单元库只有三个cell:2输入mux(o = s ?a :b;),TIEH(输出常数1),TIEL(输出常数0),如何实现以下功能? 4.1 反相器inv 4.2 缓冲器buffer 4.3 两输入与门and2 4.4 两输入或门or2 4.5 四输入的mux mux4 4.6 一位全加器 fa

IC/FPGA大疆笔试题分析(预分析):

1 如果只使用2选1mux完成异或逻辑,至少需要几个mux?

这几个问题,都是让用Mux来替换门电路的问题。

但今天讨论的重点是如何用门电路来替换Mux,这个问题,在秋招提前批的时候也是遇到过的,也许并不是单独来考你,但是可以通过嵌入到某个专题里面来考察,例如可以用在跨时钟域的脉冲同步问题,从快时钟域到慢时钟域的脉冲同步问题,我们需要进行电平展宽,这里展宽的always块就会综合成Mux,但是如果人家指定要门电路实现,你就得懂得如何用门电路替换Mux。

单比特信号的跨时钟域处理

考题(某发科)重现:

有两个时钟域A和B,脉冲a在时钟域A中保持一个时钟周期,现要把脉冲A同步到时钟域B中,试用D触发器、与门、或门、非门以及异或门画出电路图实现这个功能。(某发科IC现场笔试题)

这里只提出这些问题,解决的话在各自具体的博文里面,这篇博文我边写边构思,大概率只出现mux与门电路的替换而已。


Mux如下:

用Verilog描述:

代码语言:javascript
复制
wire F;
assign F = sel ? B : A;


//或者
reg F;
always@(*)
    if(sel) F = B;
    else F = A;
代码语言:javascript
复制

借用FPGA之道的描述:

多路复用器,也称多路选择器,通常简称为MUX,它有一组控制输入端口和两个以上的数据输入端口,但仅有一个输出端口。多路复用器的功能简单来说就是完成数据通道的复用,以节省数据通道的个数,即根据控制输入端口的情况,选择多个数据输入端口中的一个和输出端口进行连接,请注意,同一个时刻仅有一个数据输入端口能够连接到输出端口,因此多路复用器是时分复用数据通道的。其中,控制输入端口的数量和数据输入端口的数量是存在相互制约关系的,即,若控制端口的数量为N,那么输入端口的数量必须小于等于2的N次幂且大于2的N-1次幂,反之亦然。 例如,若仅有两个数据输入端口,那么只需要一个控制端口即可;若有3或4个数据输入端口,那么则需要两个控制端口;等等。

多路复用器属于小规模集成组合逻辑单元,它的实现方式很多,以MUX2IN1为例,可以利用与、或、非门实现如下:

也可以用三态门实现:

可见,还是很简单的,那就放到具体的实例中尝试一下吧,以单周期脉冲的跨时钟域传输来说,我们用一种通用的方法(适用于从快到慢时钟域的方法,肯定也适用于从慢到快);

有两个时钟域A和B,脉冲a在时钟域A中保持一个时钟周期,现要把脉冲A同步到时钟域B中,试用D触发器、与门、或门、非门以及异或门画出电路图实现这个功能。(某发科IC现场笔试题)

我们之前的博客用Verilog描述出来了这个过程:

这里分步骤分析下:

代码语言:javascript
复制
module Sync_Pulse(
    input           clka,
    input           clkb,
    input           rst_n,
    input           pulse_ina,
    output          pulse_outb
);
//
endmodule
代码语言:javascript
复制

先给出输入输出,如上:

其中,pulse_ina是a时钟域内的单周期脉冲信号,现在同步到b时钟域;我们处理的步骤是:

第一步,需要将pulse_ina在时钟域clka内展宽:

代码语言:javascript
复制
module Sync_Pulse(
    input           clka,
    input           clkb,
    input           rst_n,
    input           pulse_ina,
    output          pulse_outb,
    output          signal_outb
);
//-------------------------------------------------------
reg             signal_a;
reg             signal_b;
reg             signal_b_r;
reg             signal_b_rr;
reg             signal_a_r;
reg             signal_a_rr;
//-------------------------------------------------------
//在clka下,生成展宽信号signal_a
always @(posedge clka or negedge rst_n)begin
    if(rst_n == 1'b0)begin
        signal_a <= 1'b0;
    end
    else if(pulse_ina == 1'b1)begin
        signal_a <= 1'b1;
    end
    else if(signal_a_rr == 1'b1)
        signal_a <= 1'b0;
    else
        signal_a <= signal_a;
end
//...
endmodule
代码语言:javascript
复制

注意,signal_a_rr是反馈信号,为高时将展宽信号拉低,表示信号展宽结束。

这段代码用MUX如何去画出RTL原理图呢?

见下图:

用上面的与门和或门改写这个图为:

之后,就和本次博文没有什么大关系了,为了内容完整性,我还是简单补全吧。

脉冲展宽后,我们就用clkb来采样展宽信号,并用边沿检测来生成clkb时钟域内的单周期脉冲,表示同步到了。

代码语言:javascript
复制

代码语言:javascript
复制
//在clkb下同步signal_a
always @(posedge clkb or negedge rst_n)begin
    if(rst_n == 1'b0)begin
        signal_b <= 1'b0;
    end
    else begin
        signal_b <= signal_a;
    end
end
//-------------------------------------------------------
//在clkb下生成脉冲信号和输出信号
always @(posedge clkb or negedge rst_n)begin
    if(rst_n == 1'b0)begin
        signal_b_r <= 'b0;
        signal_b_rr <= 'b0;
    end
    else begin
        signal_b_rr <= signal_b_r;
        signal_b_r <= signal_b;
    end
end
assign    pulse_outb = ~signal_b_rr & signal_b_r;
assign    signal_outb = signal_b_rr;
代码语言:javascript
复制


最后就是生成反馈信号了:

代码语言:javascript
复制
//在clka下采集signal_b_rr,生成signal_a_rr用于反馈拉低signal_a
代码语言:javascript
复制
always @(posedge clka or negedge rst_n)begin
    if(rst_n == 1'b0)begin
        signal_a_r <= 'b0;
        signal_a_rr <= 'b0;
    end
    else begin
        signal_a_rr <= signal_a_r;
        signal_a_r <= signal_b_rr;
    end
end
代码语言:javascript
复制



当然,除了这个题目可以用到门电路来搭建MUX,昆山的某个公司(lanqi)中某个题目 ,用MUX也很方便,可是要求用门电路,那我们只需用门电路转换为Mux即可。

具体题目:

画图的方式有很多种,可以根据代码画出电路图,可以根据波形图画出电路,有了电路,Verilog描述肯定没有任何问题。

所谓,用Verilog做设计时,要心中有电路,这是和C的一个区别。

这种波形产生题目,只给一个输入时钟,让你画出输出波形,有的题目还会这些出,给你一个时钟,和一个输入输出,让你设计电路实现,大同小异。

既然条件很少,我们能做的也很少,就本体而言,无非就是对时钟进行二分频,然后用下降沿采样,最后(通过逻辑运算)构成一个占空比为1/4的二分频输出。

如下图:

clk_2是占空比为50%的二分频信号,clk_2r是用clk的下降沿采样后的信号,二者进行(clk-2为1,clk_2r为0时,输出为1,其他为零);

可以画出使用mux的第二个电路图,然后我们把mux改为门电路,即可得到最后的结果,请自行将剩下部分加上。

举了两个例子,本博文大概可以告一段落了。

提示:用Mux表示门电路的可以参看上面给出的超链接。

最后,本博文参考:

FPGA之道以后各大公司秋招考题,但最重要的是一颗开源分享的心。水平有限,如有误,还请提出,谢谢。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-09-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FPGA LAB 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档