谈谈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)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与门电路的相互替换(包含实例分析)相关推荐
- 策略模式(封装一系列的功能,使之可以相互替换)
策略模式和工厂方法模式很类似(感觉策略模式是工厂方法模式的一部分) 策略模式就是将一系列的功能封装起来(用工厂方法模式封装),使之可以相互替换(C++多态调用),从而使功能更加独立,与客户程序的耦合性 ...
- VB6.0中,DTPicker日期、时间控件不允许为空时,采用文本框与日期、时间控件相互替换赋值(解决方案)...
VB6.0中,日期.时间控件不允许为空时,采用文本框与日期.时间控件相互替换赋值,或许是一个不错的选择. 实现效果如下图: 文本框txtStopTime1 时间框DTStopTime1(DTPicke ...
- VB6.0中,DTPicker日期、时间控件不允许为空时,采用文本框与日期、时间控件相互替换赋值(解决方案)
VB6.0中,DTPicker日期.时间控件不允许为空时,采用文本框与日期.时间控件相互替换赋值(解决方案) 参考文章: (1)VB6.0中,DTPicker日期.时间控件不允许为空时,采用文本框与日 ...
- 数字电路反相器符号_数字电路器件——门电路——与门电路、或门电路、非门电路及实例...
门电路是数字电路中最基本的逻辑单元.它可以使输出信号与输入信号之间产生一定的逻辑关系.在数字电路中,信号大都是用电位(电平)高低两种状态表示,利用门电路的逻辑关系可以实现对信号的转换. 最基本的门电路 ...
- 数字电路器件——门电路——与门电路、或门电路、非门电路及实例
门电路是数字电路中最基本的逻辑单元.它可以使输出信号与输入信号之间产生一定的逻辑关系.在数字电路中,信号大都是用电位(电平)高低两种状态表示,利用门电路的逻辑关系可以实现对信号的转换. 最基本的门电路 ...
- 如何通过二极管设计一个与门电路
与门是数字电路中常用的器件,它的电路符号有这两种,大家可以看下,它的真值表如视频中所示,大家可以看到只要输入有低电平,与门的输出就会是低电平. 我们常用的集成与门芯片有74HC08 除了集成的与门芯片 ...
- 二极管与门电路及原理分析
导通压降:二极管开始导通时对应的电压. 正向特性:在二极管外加正向电压时,在正向特性的起始部分,正向电压很小,不足以克服PN结内电场的阻挡作用,正向电流几乎为零.当正向电压大到足以克服PN结电场时,二 ...
- 与门非门在电子计算机中的应用,【E电路】数字电路基础:与门电路
从小巧的电子手表,到复杂的电子计算机,它们的许多元件被制成集成电路的形式,即把几十.几百,甚至成干上万个电子元件制作在一块半导体片或绝缘片上.每种集成电路都有它独特的作用.有一种用得最多的集成电路叫门 ...
- FPGA练习:与门电路的实现
1. 与门的 verilog 实现代码 设计一个与门电路,实现 y = a & b.verilog 代码如下: module addgate(a, b, y);input a;input b; ...
最新文章
- Saltstack系列之一——安装篇
- 计算机视觉算法与应用清华大学,计算机视觉——算法与应用
- linux下开机启动oracle
- 从零开始--系统深入学习android(实践-让我们开始写代码-Android框架学习-2.service)...
- 我会说我喜欢创业嘛?(每个月总有几天会更新…………标题一定要长)
- 自定义idea archetype
- js引擎执行代码的基本流程
- python 切片步长_python切片步长
- uboot主循环main_loop
- 如何解决软键盘弹出引起的各种不适
- solr 如何实现精确查询
- codeforces 735D Taxes(数论)
- 汽车CAN总线关闭故障的诊断与恢复
- linux I2C驱动实验
- 店店融合共振出的价值 才是苏宁的零售杀手锏
- Office 添加或删除 skype for business、oneNote、OutLook、oneDrive等功能
- java跳转页面_几种方式实现Javaweb页面跳转
- 求一元多项式 P(x) = a0 + a1x + a2x^2 + ... + anx^n 的值P(x0)。
- 解决安卓apk在其他手机无法安装问题
- Android 悬浮窗、悬浮球开发
热门文章
- 负荷计算的时候assert失败_负荷计算的入门基础知识,小白入门必备!
- php cms帮助文档,phpcms手册
- mysql 数据库安装命令_教你MySQL数据库的编译安装以及命令详解(5.7版本)
- html动态生成榜单信息,排行榜.html
- python交互式绘图库_一个交互式可视化Python库——Bokeh
- Java高级特性:clone()方法
- bios设置 联想m8000t_联想怎样设置双显卡模式 联想设置双显卡模式方法【详解】...
- pads最新版本是多少_电路EDA软件究竟有多少?
- android通知栏打开actvity,Android实现点击通知栏后,先启动应用再打开目标Activity...
- 织梦同步静态文件到服务器,静态网站添加到织梦