在秋招中,经常遇到的问题是用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)beginif(rst_n == 1'b0)beginsignal_a <= 1'b0;endelse if(pulse_ina == 1'b1)beginsignal_a <= 1'b1;endelse 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)beginif(rst_n == 1'b0)beginsignal_b <= 1'b0;endelse beginsignal_b <= signal_a;end
end
//-------------------------------------------------------
//在clkb下生成脉冲信号和输出信号
always @(posedge clkb or negedge rst_n)beginif(rst_n == 1'b0)beginsignal_b_r <= 'b0;signal_b_rr <= 'b0;endelse beginsignal_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)beginif(rst_n == 1'b0)beginsignal_a_r <= 'b0;signal_a_rr <= 'b0;endelse beginsignal_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之道以后各大公司秋招考题,但最重要的是一颗开源分享的心。水平有限,如有误,还请提出,谢谢。

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

  1. 策略模式(封装一系列的功能,使之可以相互替换)

    策略模式和工厂方法模式很类似(感觉策略模式是工厂方法模式的一部分) 策略模式就是将一系列的功能封装起来(用工厂方法模式封装),使之可以相互替换(C++多态调用),从而使功能更加独立,与客户程序的耦合性 ...

  2. VB6.0中,DTPicker日期、时间控件不允许为空时,采用文本框与日期、时间控件相互替换赋值(解决方案)...

    VB6.0中,日期.时间控件不允许为空时,采用文本框与日期.时间控件相互替换赋值,或许是一个不错的选择. 实现效果如下图: 文本框txtStopTime1 时间框DTStopTime1(DTPicke ...

  3. VB6.0中,DTPicker日期、时间控件不允许为空时,采用文本框与日期、时间控件相互替换赋值(解决方案)

    VB6.0中,DTPicker日期.时间控件不允许为空时,采用文本框与日期.时间控件相互替换赋值(解决方案) 参考文章: (1)VB6.0中,DTPicker日期.时间控件不允许为空时,采用文本框与日 ...

  4. 数字电路反相器符号_数字电路器件——门电路——与门电路、或门电路、非门电路及实例...

    门电路是数字电路中最基本的逻辑单元.它可以使输出信号与输入信号之间产生一定的逻辑关系.在数字电路中,信号大都是用电位(电平)高低两种状态表示,利用门电路的逻辑关系可以实现对信号的转换. 最基本的门电路 ...

  5. 数字电路器件——门电路——与门电路、或门电路、非门电路及实例

    门电路是数字电路中最基本的逻辑单元.它可以使输出信号与输入信号之间产生一定的逻辑关系.在数字电路中,信号大都是用电位(电平)高低两种状态表示,利用门电路的逻辑关系可以实现对信号的转换. 最基本的门电路 ...

  6. 如何通过二极管设计一个与门电路

    与门是数字电路中常用的器件,它的电路符号有这两种,大家可以看下,它的真值表如视频中所示,大家可以看到只要输入有低电平,与门的输出就会是低电平. 我们常用的集成与门芯片有74HC08 除了集成的与门芯片 ...

  7. 二极管与门电路及原理分析

    导通压降:二极管开始导通时对应的电压. 正向特性:在二极管外加正向电压时,在正向特性的起始部分,正向电压很小,不足以克服PN结内电场的阻挡作用,正向电流几乎为零.当正向电压大到足以克服PN结电场时,二 ...

  8. 与门非门在电子计算机中的应用,【E电路】数字电路基础:与门电路

    从小巧的电子手表,到复杂的电子计算机,它们的许多元件被制成集成电路的形式,即把几十.几百,甚至成干上万个电子元件制作在一块半导体片或绝缘片上.每种集成电路都有它独特的作用.有一种用得最多的集成电路叫门 ...

  9. FPGA练习:与门电路的实现

    1. 与门的 verilog 实现代码 设计一个与门电路,实现 y = a & b.verilog 代码如下: module addgate(a, b, y);input a;input b; ...

最新文章

  1. Saltstack系列之一——安装篇
  2. 计算机视觉算法与应用清华大学,计算机视觉——算法与应用
  3. linux下开机启动oracle
  4. 从零开始--系统深入学习android(实践-让我们开始写代码-Android框架学习-2.service)...
  5. 我会说我喜欢创业嘛?(每个月总有几天会更新…………标题一定要长)
  6. 自定义idea archetype
  7. js引擎执行代码的基本流程
  8. python 切片步长_python切片步长
  9. uboot主循环main_loop
  10. 如何解决软键盘弹出引起的各种不适
  11. solr 如何实现精确查询
  12. codeforces 735D Taxes(数论)
  13. 汽车CAN总线关闭故障的诊断与恢复
  14. linux I2C驱动实验
  15. 店店融合共振出的价值 才是苏宁的零售杀手锏
  16. Office 添加或删除 skype for business、oneNote、OutLook、oneDrive等功能
  17. java跳转页面_几种方式实现Javaweb页面跳转
  18. 求一元多项式 P(x) = a0 + a1x + a2x^2 + ... + anx^n 的值P(x0)。
  19. 解决安卓apk在其他手机无法安装问题
  20. Android 悬浮窗、悬浮球开发

热门文章

  1. 负荷计算的时候assert失败_负荷计算的入门基础知识,小白入门必备!
  2. php cms帮助文档,phpcms手册
  3. mysql 数据库安装命令_教你MySQL数据库的编译安装以及命令详解(5.7版本)
  4. html动态生成榜单信息,排行榜.html
  5. python交互式绘图库_一个交互式可视化Python库——Bokeh
  6. Java高级特性:clone()方法
  7. bios设置 联想m8000t_联想怎样设置双显卡模式 联想设置双显卡模式方法【详解】...
  8. pads最新版本是多少_电路EDA软件究竟有多少?
  9. android通知栏打开actvity,Android实现点击通知栏后,先启动应用再打开目标Activity...
  10. 织梦同步静态文件到服务器,静态网站添加到织梦