赞
踩
wire线型的基本描述已在笔记整理(1)中给出了。
题目:实现输入与输出的连接。
答案:
module top_module (
input in,
output out);
assign out = in;
endmodule
题目:实现将输出接地。
答案:
module top_module (
input in,
output out);
assign out = in;
endmodule
题目:实现逻辑或非门。
答案:
module top_module (
input in1,
input in2,
output out);
assign out = ~(in1|in2);
endmodule
题目:实现下图逻辑操作。
答案:根据所给逻辑图,两输入进行与操作,然后in2取反输入。
module top_module (
input in1,
input in2,
output out);
assign out = in1 & (~in2);
endmodule
题目:实现下图逻辑操作。
答案:in1,in2,in3三输入,out一输出,两个异或门,需要添加一中间线型。
module top_module (
input in1,
input in2,
input in3,
output out);
wire out1;
assign out1 = ~ (in1^in2);
assign out = out1^in3;
endmodule
题目:让我们尝试同时构建几个逻辑门。建立一个有两个输入a和b的组合电路。
共有7个输出,每个输出都有一个逻辑门驱动:
out_and: a and b
out_or: a or b
out_xor: a xor b
out_nand: a nand b
out_nor: a nor b
out_xnor: a xnor b
out_anotb: a and-not b
答案:即对每个输出进行对应的逻辑门操作
在这里插入代码片
module top_module( input a, b, output out_and, output out_or, output out_xor, output out_nand, output out_nor, output out_xnor, output out_anotb ); 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); endmodule
题目:7400系列集成电路是一系列数字芯片,每个都由几个基本的逻辑门构成。7420是一个芯片,有两个4输入的NAND(与非)门。
创建一个功能与7420芯片相同的模块。它有8个输入和2个输出。
答案:7420芯片内部就是两个与非门的实现
module top_module (
input p1a, p1b, p1c, p1d,
output p1y,
input p2a, p2b, p2c, p2d,
output p2y);
assign p1y = ~(p1a & p1b & p1c & p1d);
assign p2y = ~(p2a & p2b & p2c & p2d);
endmodule
在前面的练习中,我们使用了简单的逻辑门和几个逻辑门的组合。这些电路是组合电路的例子。组合意味着电路的输出仅仅是其输入的函数(在数学意义上)。这意味着对于任何给定的输入值,只有一个可能的输出值。因此,描述组合函数行为的一种方法是明确列出输入的每个可能值的输出。这是真值表。
对一个有N个输入的布尔函数而言,有2的N次方种可能的输入组合。真值表的每一行都列出了一个输入组合,因此总有2的N次方行。output列显示了每个输入值对应的输出。
假设我们想构建上述电路,但我们仅限于使用一组标准逻辑门。如何构建任意逻辑函数(表示为真值表)?
创建实现真值表函数的电路的一个简单方法是以乘积和形式表示函数。求和即为或操作,乘积即为与操作。先使用一个N-输入的与门来决定是否输入的向量与真值表匹配,然后再用一个或门来选择满足匹配条件的结果进行输出。
题目:创建一个实现上述真值表的组合电路。
答案:
module top_module(
input x3,
input x2,
input x1, // three inputs
output f // one output
);
assign f = ((~x3)&x2&(~x1))|((~x3)&x2&x1)|(x3&(~x2)&x1)|(x3&x2&x1);
endmodule
题目:创建一个具有两个2位输入a[1:0]和B[1:0]的电路,并生成一个输出z。如果A=B,z的值应为1,否则z应为0。
答案:相当于条件判断
module top_module ( input [1:0] A, input [1:0] B, output z );
assign z=(A==B)?1'b1:1'b0;
endmodule
题目:模块A应该实现函数z=(x^y)& x
。
答案:简单的assign赋值语句
module top_module (input x, input y, output z);
assign z=(x^y)&x;
endmodule
题目:电路B可以用以下仿真波形来描述:
答案:由波形图分析可知,x,y相同时z取1,不同取0。即是在x、y的异或运算的基础上取反。
module top_module ( input x, input y, output z );
assign z=~(x^y);
endmodule
题目:顶层设计由两个子电路A和B的每个实例组成,如下所示。
答案:
module top_module (input x, input y, output z);
wire z1;
wire z2;
assign z1 = (x ^ y) & x;
assign z2 = ~(x ^ y);
assign z = (z1 | z2) ^ (z1 & z2);
endmodule
在设计电路时,人们常常不得不“向后”思考这个问题,从输出开始,然后朝着输入反向工作。这通常与人们思考(顺序的,命令式的)编程问题的方式相反,在这种情况下,人们首先会查看输入,然后决定一个操作(或输出)。对于顺序程序,人们通常会认为“如果(输入是∗∗)那么(输出应该是∗∗)”。另一方面,硬件设计者通常认为“当(输入为**)时(输出应为**)”。
尝试只使用assign语句,看看是否可以将问题描述转换为逻辑门集合。
题目:设计一种电路来控制手机的铃声和振动马达。当有来电输入信号时(input ring),电路必须打开铃声(output ringer= 1)或电机(output motor= 1),但不能同时打开。如果手机处于振动模式(input vibrate_mode = 1),打开电机。否则打开铃声。
答案:题目要求不能同时打开,便是对两输入进行逻辑与操作。
vibrate_mode = 1时打开手机对应motor,则vibrate_mode = 0时响铃对应ringer。
module top_module (
input ring,
input vibrate_mode,
output ringer, // Make sound
output motor // Vibrate
);
assign ringer = ring & (~vibrate_mode);
assign motor = ring & vibrate_mode;
endmodule
题目:加热/冷却恒温器控制加热器(冬季)和空调(夏季)。安装一个电路,根据需要打开和关闭加热器、空调和鼓风机风扇。
恒温器可以处于两种模式之一:加热(模式=1)和冷却(模式=0)。在加热模式下,当加热器太冷(太冷=1)时打开加热器,但不要使用空调。在制冷模式下,当空调太热(太热=1)时打开空调,但不要打开加热器。当加热器或空调打开时,也打开风扇使空气循环。此外,即使加热器和空调关闭,用户也可以请求打开风扇(风扇开=1)。
尝试只使用assign语句,看看是否可以将问题描述转换为逻辑门集合。
答案:
module top_module (
input too_cold,
input too_hot,
input mode,
input fan_on,
output heater,
output aircon,
output fan
);
assign heater = mode & too_cold;
assign aircon = (~mode) & too_hot;
assign fan = (mode & too_cold) | ((~mode) & too_hot) | fan_on;
endmodule
题目:“人口计数”电路计算输入向量中“1”的数目。为3位输入向量构建一个总体计数电路。
答案:计数功能采用for循环遍历的形式会更简单。
module top_module(
input [2:0] in,
output [1:0] out );
integer i;
always @(*)
begin
out = 2'b0;
for(i=0;i<3;i++)
begin
out = out + in[i];
end
end
endmodule
题目:在[3:0]中给出了一个四位输入向量。我们想知道每个比特和它的邻居之间的一些关系:
1)out_both:这个输出向量的每一位都应该指出相应的输入位和它左边的相邻位(较高的索引)是否都是“1”。例如,out_both[2]应该指出in[2]和in[3]是否都是1。因为in[3]没有左边的邻居,所以答案很明显,所以我们不需要知道out_both[3]。
2)out_any:这个输出向量的每一位都应该指出相应的输入位和它右边的相邻位是否为“1”。例如,out_any[2]应该指明in[2]或in[1]是1。因为in[0]没有右边的邻居,所以答案很明显,所以我们不需要知道out_any[0]。
3)out_different:这个输出向量的每一位都应该指出相应的输入位是否与其左边的相邻位不同。例如,out_different[2]应指示in[2]是否与in[3]不同。对于这部分,将向量视为环绕,因此in[3]左侧的邻居在[0]中。
答案:由题目分析得三输出分别进行与、或、异或运算。
module top_module( input [3:0] in, output [2:0] out_both, output [3:1] out_any, output [3:0] out_different); integer i; always @(*) begin for(i=0;i<3;i++) begin out_both[i] = in[i] & in[i+1]; out_any[i+1] = in[i+1] | in[i]; out_different[i] = in[i] ^ in[i+1]; end out_different[3] = in[0] ^ in[3];//遍历漏下的,需要补上 end endmodule
题目:和上一题相同。只是输入向量由4位变成了100位。
答案:解题思路一样
module top_module( input [99:0] in, output [98:0] out_both, output [99:1] out_any, output [99:0] out_different); integer i; always @(*) begin for(i=0;i<99;i++) begin out_both[i] = in[i] & in[i+1]; out_any[i+1] = in[i+1] | in[i]; out_different[i] = in[i] ^ in[i+1]; end out_different[99] = in[0] ^ in[99]; end endmodule
以上是HDLBits Verilog语言刷题网站中的Circuits-Basic Gates部分,后续部分会继续更新。对一些基础性知识点进行归纳总结,有错误请指正。仅供学习参考,谢谢!!!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。