HDLBits: 在线学习 SystemVerilog(十)-Problem 43-59
HDLBits 是一组小型电路设计习题集,使用 Verilog/SystemVerilog 硬件描述语言 (HDL) 练习数字硬件设计~
网址如下:
https://hdlbits.01xz.net/
缩略词索引:
SV:SystemVerilog
从今天开始新的一章-Circuits,包括基本逻辑电路、时序电路、组合电路等。
今天更新整个Basic Gates一小节题目(Problem 43-59)。
Problem 43-m2014_q4h
题目说明
实现如下电路:
图片来源:HDLBits
模块端口声明
moduletop_module( inputin, outputout);
题目解析
这个题目没什么难度,看下面参考代码即可:
moduletop_module( inputlogicin, outputlogicout); assignout=in; endmodule
点击Submit,等待一会就能看到下图结果:
注意图中无波形。
这一题就结束了。
Problem 44-m2014 q4i
题目说明
实现下面电路:
图片来源:HDLBits
模块端口声明
moduletop_module( outputout);
题目解析
这道题难度不大核心代码只有一行。
简单解答
moduletop_module( inputlogic[7:0]in, outputlogicparity ); assignparity=^in; endmodule
点击Submit,等待一会就能看到下图结果:
注意图中的无波形。
这一题就结束了。
Problem 45-m2014_q4e
题目说明
实现以下电路:
图片来源:HDLBits
模块端口声明
moduletop_module( inputin1, inputin2, outputout);
题目解析
还是看懂电路即可。
moduletop_module( inputlogicin1, inputlogicin2, outputlogicout ); assignout=~(in1|in2); endmodule
点击Submit,等待一会就能看到下图结果:
注意图中无波形。
这一题就结束了。
Problem 46-m2014_q4f
题目说明
实现以下电路
图片来源:HDLBits
模块端口声明
moduletop_module( inputin1, inputin2, outputout);
题目解析
注意输入端口前的非门。
moduletop_module( inputlogicin1, inputlogicin2, outputlogicout); assignout=in1&~in2; endmodule
点击Submit,等待一会就能看到下图结果:
注意图中无波形。
这一题就结束了。
Problem 47-m2014_q4g
题目说明
实现以下电路:
图片来源:HDLBits
模块端口声明
moduletop_module( inputin1, inputin2, inputin3, outputout);
题目解析
还是看懂电路即可。
moduletop_module( inputlogicin1, inputlogicin2, inputlogicin3, outputlogicout); assignout=(in1~^in2)^in3; endmodule
点击Submit,等待一会就能看到下图结果:
注意图中无波形。
这一题就结束了。
Problem 48-Gates
题目说明
本题希望我们用两输入的组合电路来实现如下功能,该电路共用于7个输出,具体情况如下:
模块端口声明
moduletop_module( inputa,b, outputout_and, outputout_or, outputout_xor, outputout_nand, outputout_nor, outputout_xnor, outputout_anotb );
题目解析
多种组合逻辑的实现。
moduletop_module( inputlogica,b, outputlogicout_and, outputlogicout_or, outputlogicout_xor, outputlogicout_nand, outputlogicout_nor, outputlogicout_xnor, outputlogicout_anotb ); assignout_and=a&b; assignout_or=a|b; assignout_xor=a^b; assignout_nand=~(a&b); assignout_nor=~(a|b); assignout_xnor=a~^b; assignout_anotb=a&~b; endmodule
点击Submit,等待一会就能看到下图结果:
注意图中的Ref是参考波形,Yours是你的代码生成的波形,网站会对比这两个波形,一旦这两者不匹配,仿真结果会变红。
这一题就结束了。
Problem 49-7420
题目说明
7420 chip是拥有两组4输入的与非门芯片,本练习需要构造一个与7420 chip功能一样的电路,拥有8个输入与2个输出。
图片来源:HDLBits
模块端口声明
moduletop_module( inputp1a,p1b,p1c,p1d, outputp1y, inputp2a,p2b,p2c,p2d, outputp2y);
题目解析
这个题目无需理解7420是干什么的,只需要按照图中电路图实现逻辑即可。
moduletop_module( inputlogicp1a,p1b,p1c,p1d, outputlogicp1y, inputlogicp2a,p2b,p2c,p2d, outputlogicp2y); assignp1y=~(p1a&p1b&p1c&p1d); assignp2y=~(p2a&p2b&p2c&p2d); endmodule
点击Submit,等待一会就能看到下图结果:
注意图中的Ref是参考波形,Yours是你的代码生成的波形,网站会对比这两个波形,一旦这两者不匹配,仿真结果会变红。
这一题就结束了。
Problem 50-Truthtable1
开始练习真值表了,网站上有些实例讲解,我就不翻译了,学过数电的应该难度都不大。
题目说明
创建一个实现下述真值表的组合电路:
真值表如下:
图片来源:HDLBits
最终实现的硬件框图如下:
图片来源:HDLBits
TIPS:约一行代码解决问题
模块端口声明
moduletop_module( inputx3, inputx2, inputx1,//threeinputs outputf//oneoutput );
题目解析
这个题目重点是真值表化简,将上面的真值表化简成最小项表达式即可。具体可以看下数电书很容易得到结果。
moduletop_module( inputlogicx3, inputlogicx2, inputlogicx1,//threeinputs outputlogicf//oneoutput ); assignf=x3&x1|x2&x1|~x3&x2; endmodule
点击Submit,等待一会就能看到下图结果:
注意图中的Ref是参考波形,Yours是你的代码生成的波形,网站会对比这两个波形,一旦这两者不匹配,仿真结果会变红。
这一题就结束了。
Problem 51-Mt2015_eq2
题目说明
创建一个具有两个 2 位输入A[1:0]和B[1:0]的电路,并产生一个输出z。如果A = B ,则z的值应为 1 ,否则z应为 0。
模块端口声明
moduletop_module(input[1:0]A,input[1:0]B,outputz);
题目解析
这个题目重点是灵活使用三元运算符,因为这个语法比较简单,所以大家注意一下使用方式即可~
moduletop_module(inputlogic[1:0]A, inputlogic[1:0]B, outputlogicz); assignz=(A==B)?1'b1:1'b0; endmodule
点击Submit,等待一会就能看到下图结果:
注意图中无波形。
这一题就结束了。
Problem 52-Mt2015_q4a
题目说明
实现模块 A ,该模块实现函数z = (x^y) & x。
模块端口声明
moduletop_module(inputx,inputy,outputz);
题目解析
moduletop_module(inputlogicx, inputlogicy, outputlogicz); assignz=(x^y)&x; endmodule
点击Submit,等待一会就能看到下图结果:
注意图中无波形。
这一题就结束了。
Problem 53-Mt2015_q4b
题目说明
电路B可以用下面的仿真波形来描述:
图片来源:HDLBits
模块端口声明
moduletop_module(inputx,inputy,outputz);
题目解析
这个题目可以使用采点的方式,选择几个特殊点,制作成真值表,然后化简即可。
或者从波形上看特点:根据观察所得输出 z 为 x 与 y 的同或输出,即相同为1, 不同为0;故实现代码如下:
moduletop_module(inputlogicx, inputlogicy, outputlogicz); assignz=x~^y; endmodule
点击Submit,等待一会就能看到下图结果:
注意图中的Ref是参考波形,Yours是你的代码生成的波形,网站会对比这两个波形,一旦这两者不匹配,仿真结果会变红。
这一题就结束了。
Problem 54-Mt2015_q4
题目说明
根据子模块Problem 52 与 53 来实现如下电路:
图片来源:HDLBits
模块端口声明
moduletop_module(inputx,inputy,outputz);
题目解析
这个题目重点知道题目中A、B代表什么,其实这两个就是上面两道题目实现的子模块,然后在将这两个模块的输出进行逻辑操作即可。
moduletop_module(inputlogicx, inputlogicy, outputlogicz); wirelogicza; wirelogiczb; assignza=(x^y)&x; assignzb=x~^y; assignz=(za|zb)^(za&zb); endmodule
点击Submit,等待一会就能看到下图结果:
注意图中无波形。
这一题就结束了。
Problem 55-Ringer
题目说明
假设您正在设计一个手机的振铃器和振动电机控制电路。每当电话需要从来电中振铃 (input ring) 时,您的电路必须打开振铃器 (output motor = 1 ) 或电机 (output ringer = 1),但不能同时打开这两个。如果手机处于振动模式 (input vibrate = 1),请打开电机( output motor = 1 )。否则,打开铃声。
我们尝试仅适用assign语句来实现该组合电路。
设计提示:在设计电路时,人们经常不得不“倒退”地考虑问题,从输出开始,然后再向输入倒退,这是属于软件编程思想。硬件电路的编程与软件的编程是存在差异的,一般进行软件编程时,我们是先关注输入( if (input are _)),再关注输出( then (output are ))。而在硬件编程时,我们需要转变思维方式,在确保输出是正确的情况下,再思考输入。( The (output should be _) when (inputs are __))。
上面的问题描述是用适合软件编程的命令式写成的(if ring then do this),所以你必须把它转换成更适合硬件实现的声明式(assign ringer = ___)。能够在两种风格之间进行思考和转换是硬件设计所需的最重要技能之一。
图片来源:HDLBits
模块端口声明
moduletop_module( inputring, inputvibrate_mode, outputringer,//Makesound outputmotor//Vibrate );
题目解析
题目难度不大,重点是根据输出的两个信号,裁决输入逻辑。
moduletop_module( inputlogicring, inputlogicvibrate_mode, outputlogicringer,//Makesound outputlogicmotor//Vibrate ); assignringer=~vibrate_mode˚ assignmotor=vibrate_mode˚ endmodule
点击Submit,等待一会就能看到下图结果:
注意图中的Ref是参考波形,Yours是你的代码生成的波形,网站会对比这两个波形,一旦这两者不匹配,仿真结果会变红。
这一题就结束了。
Problem 56-Thermostat
题目说明
一个冷/热恒温控制器可以同时在冬季和夏季对温度进行调节。实现一个可以根据需要打开和关闭加热器、空调和鼓风机的电路。
恒温器可以处于以下两种模式之一:加热 ( mode = 1) 和冷却 ( mode = 0)。在制热模式下,当天气太冷时打开加热器(too_cold = 1),但不要使用空调。在制冷模式下,空调过热时打开空调(too_hot = 1),但不要打开加热器。当加热器或空调打开时,还要打开风扇以循环空气。此外,即使加热器和空调关闭,用户也可以请求将风扇打开(fan_on = 1)。
尝试仅使用assign语句,看看是否可以将问题描述转换为逻辑电路。
模块端口声明
moduletop_module( inputtoo_cold, inputtoo_hot, inputmode, inputfan_on, outputheater, outputaircon, outputfan );
题目解析
这个题目解决方式参考上一题。
moduletop_module( inputlogictoo_cold, inputlogictoo_hot, inputlogicmode, inputlogicfan_on, outputlogicheater, outputlogicaircon, outputlogicfan ); assignheater=too_cold&mode; assignaircon=too_hot&~mode; assignfan=fan_on|heater|aircon; endmodule
点击Submit,等待一会就能看到下图结果:
注意图中的Ref是参考波形,Yours是你的代码生成的波形,网站会对比这两个波形,一旦这两者不匹配,仿真结果会变红。
这一题就结束了。
Problem 57-Conditional
题目说明
又是一道计“1”电路。
模块端口声明
moduletop_module( input[2:0]in, output[1:0]out);
题目解析
有很多种方式,我们使用组合电路实现,也可以使用for循环。
moduletop_module( inputlogic[2:0]in, outputlogic[1:0]out); always_combbegin uniquecase(in) 3'b000:out=2'd0; 3'b001:out=2'd1; 3'b010:out=2'd1; 3'b011:out=2'd2; 3'b100:out=2'd1; 3'b101:out=2'd2; 3'b110:out=2'd2; 3'b111:out=2'd3; default:out=2'd0; endcase end endmodule
点击Submit,等待一会就能看到下图结果:
注意图中的Ref是参考波形,Yours是你的代码生成的波形,网站会对比这两个波形,一旦这两者不匹配,仿真结果会变红。
PS:FOR循环
moduletop_module( input[2:0]in, output[1:0]out); always@(*) begin out=2'b00; for(integeri=0;i<3; i++) begin if(in[i] == 1'b1) out = out + 1'b1; end end endmodule
这一题就结束了。
Problem 58-Gatesv
题目说明
在给定一个四位输入向量[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_diff[2]指示in[2]是否与in[3]不同。对于这部分,将向量视为环绕,因此in[3]左侧的邻居是in[0]。
模块端口声明
moduletop_module( input[3:0]in, output[2:0]out_both, output[3:1]out_any, output[3:0]out_different);
题目解析
这个题目重点理解这个相同或者不同之间的逻辑关系(就是与或非这三种关系,仔细思考,就没什么问题了)。
moduletop_module( inputlogic[3:0]in, outputlogic[2:0]out_both, outputlogic[3:1]out_any, outputlogic[3:0]out_different); assignout_both[0]=in[1]&in[0]; assignout_both[1]=in[2]&in[1]; assignout_both[2]=in[3]&in[2]; assignout_any[1]=in[1]|in[0]; assignout_any[2]=in[2]|in[1]; assignout_any[3]=in[3]|in[2]; assignout_different[0]=in[1]^in[0]; assignout_different[1]=in[2]^in[1]; assignout_different[2]=in[3]^in[2]; assignout_different[3]=in[0]^in[3]; endmodule
点击Submit,等待一会就能看到下图结果:
注意图中的Ref是参考波形,Yours是你的代码生成的波形,网站会对比这两个波形,一旦这两者不匹配,仿真结果会变红。
这一题就结束了。
Problem 59-Gatesv100
题目说明
这一条道题和上一题完全相同,只不过输入向量变成了[99:0],其他说明没变。
模块端口声明
moduletop_module( input[99:0]in, output[98:0]out_both, output[99:1]out_any, output[99:0]out_different);
题目解析
这个题目的解决方式,就不能使用上面那种罗列所有可能情况的解决方式了(太多了),所以我们需要观察上面那一题的规律来解决问题,这一题最简单的方式不会超过三行语句,但是难度还是不大。
moduletop_module( inputlogic[99:0]in, outputlogic[98:0]out_both, outputlogic[99:1]out_any, outputlogic[99:0]out_different); assignout_both=in[99:1]&in[98:0]; assignout_any=in[99:1]|in[98:0]; assignout_different={in[0],in[99:1]}^in; endmodule
点击Submit,等待一会就能看到下图结果:
注意图中无波形。
这一题就结束了。
总结
今天的几道题就结束了,整体是从需求设计组合逻辑电路,再从波形图设计,还有两道从实际使用角度设计,对于组合电路的设计理解非常有帮助。
最后我这边做题的代码也是个人理解使用,有错误欢迎大家批评指正,祝大家学习愉快~
代码链接:
https://github.com/suisuisi/SystemVerilog/tree/main/SystemVerilogHDLBits
审核编辑:汤梓红
-
逻辑电路
+关注
关注
13文章
494浏览量
42609 -
组合电器
+关注
关注
0文章
4浏览量
5936 -
Verilog
+关注
关注
28文章
1351浏览量
110074
原文标题:HDLBits: 在线学习 SystemVerilog(十)-Problem 43-59
文章出处:【微信号:Open_FPGA,微信公众号:OpenFPGA】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论