本文主要是介绍[HDLBits做题]Combinational Logic --- Basic Gates,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1. Combinational Logic 组合逻辑电路
1.1 Basic Gates 基本门电路
1.1.1 wire [Exams/m2014 q4h]
问题描述:
执行下图电路:
提交代码:
assign out = in;
很简单的连线
1.1.2 GND [Exams/m2014 q4i]
问题描述:
执行下图电路:
assign out = 1'b0;
输出引脚直接接地
Warning (13024): Output pins are stuck at VCC or GND
1.1.3 NOR [Exams/m2014 q4e]
问题描述:
执行下图电路:
assign out = ~ (in1 | in2);
或非门
1.1.4 Another gate [Exams/m2014 q4f]
问题描述
执行下图电路:
assign out = in1 & ~in2;
单目运算符优先级高于双目运算符。
1.1.5 Two gates [Exams/m2014 q4g]
问题描述
执行下图电路:
assign out = (~ (in1 ^ in2)) ^ in3;
异或门和异或非门,也可以额外声明线类型作为异或非门的输出和异或门的输入。
1.1.6 More logic gates [Gates]
问题描述
让我们尝试同时构建几个逻辑门电路。构建一个拥有a、b两个输入和七个有逻辑门驱动输出的组合电路,输出定义如下。
输出引脚 | 输出逻辑式 |
---|---|
out_and | a&b |
out_or | a|b |
out_xor | a^b |
out_nand | ~(a&b) |
out_nor | ~(a|b) |
out_xnor | ~(a^b) |
out_anotb | a&~b |
assign out_and = a & b;assign out_or = a | b;assign out_xor = a ^ b;assign out_nand = ~ (a & b);assign out_nor = ~ (a | b);assign out_xnor = ~ (a ^ b);assign out_anotb = a&~b;
按照要求写就行。
1.1.7 7420 chip [7420]
问题描述
7400系列技能电路是每个芯片都有几个门的一系列数字芯片,该7420芯片包含两个四输入与非门。创建一个与7420芯片具有相同功能的模块。它有8个输入与2个输出引脚。
assign p1y = ~(p1a & p1b & p1c & p1d);assign p2y = ~(p2a & p2b & p2c & p2d);
1.1.8 Truth tables [truthrable1]
问题描述
在前面的练习中,我们使用简单逻辑门和多个逻辑门的组合。这些电路是组合逻辑电路的示例。组合意味着电路的输出仅是其输入(在数学含义中)的函数,这意味着对于任意给出的输入值仅有一个可能的输出值。因此描述组合函数行为的一种方法是列出每个输入对应可能的输出,这就是真值表。
对于N个输入的情况,有2N个可能得输入组合,每一行输入对应一个输出,因此真值表也总是2N行。输出列表示了对应每种输入情况下的输出值。
ROW | Inputs | Outputs | ||
---|---|---|---|---|
number | | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
上述真值表有三列输入一列输出,对应8个可能得输入组合。
创建一个实现上述真值表的组合电路。
assign f = (x1&x3|x2&~x3);
化简了一下真值表得到了
f = x 1 x 3 + x 2 x 3 ′ f=x_1 x_3 + x_2 x_3' f=x1x3+x2x3′
也可以直接按照真值表写
assign f = (~x3&x2&~x1|~x3&x2&x1|x3&~x2&x1|x3&x2&x1);
1.1.9 Two-bit equality [Mt2015 eq2]
问题描述
创建具有两个两位输入A[1:0]和B[1:0]的电路,并产生输出z,实现当A=B时z的值为1,否则为0
assign z = (A == B);
· ==为逻辑相等,比较数值中没有x或z时相同输出1,不同输出0;有x或z时若其余位相同则输出x,不同输出0
· ===为逻辑全等,保证比较的两个值完全一致(x和z也参与比较)。
1.1.10 Simple circuit A [Mt2015 q4a]
问题描述
假设模块A实现函数z=(x^y)&x,实现该模块
assign z = (x ^ y) & x;
表达式给了,直接写。
1.1.11 Simple circuit B [Mt2015 q4b]
问题描述
电路B可以通过以下仿真波形来描述,实现该电路
assign z = ~ (x ^ y);
列真值表,得同或关系。
1.1.12 Combine circuits A and B
问题描述
使用前两题q4a、q4b子模块,设计如下图所示电路:
wire iaz,ibz;q4a IA(.x(x),.y(y),.z(iaz));q4b IB(.x(x),.y(y),.z(ibz));assign z = (iaz|ibz)^(iaz&ibz);
把前两题模块结合起来完成即可。
1.1.13 Ring or vibrate [Ringer]
问题描述
假设正在设计一个控制手机振铃与振动马达的电路。当电话需要从来电中(输入ring)需要振铃时,电路必须打开振铃器(ringer=1)或电机(motor=1),但不能同时打开。如果手机处于振动模式(vibrate_mode=1),打开马达。否则,打开振铃器。
尝试只使用赋值语句,看看是否可以将问题描述转换为逻辑门集合。
预期代码长度在两行内完成
assign ringer = ring & ~vibrate_mode;assign motor = ring & vibrate_mode;
题目主要是希望设计思路由软件设计思路向硬件设计思路转变。
根据要求可列如下真值表
ring | vibrate_mode | ringer | motor |
---|---|---|---|
0 | 0 | 0 | 0 |
0 | 1 | 0 | 0 |
1 | 0 | 1 | 0 |
1 | 1 | 0 | 1 |
题目所给出的提示是考虑当ringer或motor启动的时候ring和vibrate_mode应该是什么状态。
1.1.14 Thermostat [Thermostat]
问题描述
加热/冷却恒温器控制制热(在冬季)和空调(在夏季)。设计一个电路,以按照需求打开和关闭加热器、空调以及鼓风机风扇。
恒温器可处于以下两种模式之一:加热(mode=1)和制冷(mode=0)。在加热模式下,当温度过低时(too_cold=1),打开加热器但不使用空调。在制冷模式下,当温度过高时(too_hot=1)时打开空调,但不打开加热器。当暖风或空调打开时,也要打开风扇使空气循环。此外,即使加热器与空调关闭的情况下,用户也可以请求风扇启动(fan_on=1)。
尝试只使用assign语句,看看能否将问题转换成逻辑门集合。
预期代码长度在三行内完成
assign heater = mode & too_cold;assign aircon = ~mode & too_hot;assign fan = heater | aircon | fan_on;
按照题目要求可知
- heater=1时应满足mode=1、too_cold=1;
- aircon=1时应满足mode=0、too_hot=1;
- fan=1时则是heater=1或者aircon=1或者fan_on=1。
1.1.15 3-bit population count [Popcount3]
问题描述
对一个3bit输入向量中包含的"1"进行计数。
assign out[0] = (~in[2]&~in[1]&in[0])|(~in[2]&in[1]&~in[0])|(in[2]&~in[1]&~in[0])|(&in);assign out[1] = (in[2]&in[1])|(in[2]&in[0])|(in[1]&in[0]);
针对输出,out[0]为1时分为1个1和3个1两种情况,out[1]为1时分为2个1和3个1两种情况。
通过学习其他人的思路,可以考虑使用for循环或者直接使用加法。
1.1.16 Gates and vectors [Gatesv]
问题描述
你被提供一个4bit输入向量in[3:0],我们想知道各比特和它的邻居之间的一些关系。
- out_both:该输出向量的每个比特应该指示对应输入比特及其左边邻居(较高索引)是否都是"1"。例如out_both[2]应该指示in[2]和in[3]是否都是1。由于in[3]左侧没有邻居,显而易见不需要知道out_both[3]。
- out_any:该输出向量的每个比特应该指示对应输入比特及其右边邻居(较高索引)任意一个是否是"1"。例如out_any[2]应该指示in[2]和in[1]是否都是1。由于in[0]右侧没有邻居,显而易见不需要知道out_any[0]。
- out_different:该输出向量的每个比特应当指示对应的输入比特是否与其左侧的比特不同。例如out_different[2]应该指示in[2]是否不同于in[3]。对于该部分,将向量视为环状,因此in[3]左边的邻居是in[0]。
在提示中提到可以使用AND,OR,XOR运算用三个assign实现。
assign out_both = in[2:0]&in[3:1];assign out_any = in[3:1]|in[2:0];assign out_different = in[3:0] ^ {in[0],in[3:1]};
按照题意,借助向量的拼接进行按位运算。
1.1.17 Even longer vectors [Gatesv100]
问题描述
你被提供一个100bit输入向量in[99:0],我们想知道各比特和它的邻居之间的一些关系。
后面内容略,与上一题类似,代码也类似。
assign out_both = in[98:0]&in[99:1];assign out_any = in[99:1]|in[98:0];assign out_different = in[99:0] ^ {in[0],in[99:1]};
这个系列主要是记录一下自己的学习过程和简单思考过程,也参考了许多其他人的思路,题目均为HDLBits上的原题,借助翻译器和自己的理解简单组织了一下语言,如有问题欢迎批评指正。
这篇关于[HDLBits做题]Combinational Logic --- Basic Gates的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!