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

在秋招中,经常遇到的问题是用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描述:

wire F; 
assign F = sel ? B : A;


//或者
reg F;
always@(*)
    if(sel) F = B;
    else F = A;

借用FPGA之道的描述:

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

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

也可以用三态门实现:

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

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

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

这里分步骤分析下:

module Sync_Pulse(
    input           clka,
    input           clkb,
    input           rst_n,
    input           pulse_ina,
    output          pulse_outb
);
//
endmodule

先给出输入输出,如上:

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

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

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

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

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

见下图:

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

(宿舍随便借了个笔,画的难看请见谅)

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

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


//在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;

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

//在clka下采集signal_b_rr,生成signal_a_rr用于反馈拉低signal_a
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

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

具体题目:

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

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

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

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

如下图:

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

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


这个例子也许举的并不合适,因为搞复杂了,clk2与clk2_r直接进行一个上升沿检测即可,也就是~clk2_r & clk2 即可得到最终的波形。

那最终的电路就可以为:


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

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

最后,本博文参考:

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

 

 

 

  • 11
    点赞
  • 81
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李锐博恩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值