0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基本逻辑电路、时序电路、组合电路设计

OpenFPGA 来源:OpenFPGA 作者:OpenFPGA 2022-10-10 15:39 次阅读

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

题目说明

实现如下电路:

e5fe9ba8-4854-11ed-a3b6-dac502259ad0.png
图片来源:HDLBits

模块端口声明

moduletop_module(
inputin,
outputout);

题目解析

这个题目没什么难度,看下面参考代码即可:

moduletop_module(
inputlogicin,
outputlogicout);

assignout=in;
endmodule

e615aae6-4854-11ed-a3b6-dac502259ad0.png

点击Submit,等待一会就能看到下图结果:

e67555fe-4854-11ed-a3b6-dac502259ad0.png

注意图中无波形。

这一题就结束了。

Problem 44-m2014 q4i

题目说明

实现下面电路:

e689496a-4854-11ed-a3b6-dac502259ad0.png
图片来源:HDLBits

模块端口声明

moduletop_module(
outputout);

题目解析

这道题难度不大核心代码只有一行。

简单解答

moduletop_module(
inputlogic[7:0]in,
outputlogicparity
);
assignparity=^in;
endmodule


e6b7d2b2-4854-11ed-a3b6-dac502259ad0.png

点击Submit,等待一会就能看到下图结果:

e6c94d3a-4854-11ed-a3b6-dac502259ad0.png

注意图中的无波形。

这一题就结束了。

Problem 45-m2014_q4e

题目说明

实现以下电路:

e6e50a20-4854-11ed-a3b6-dac502259ad0.png
图片来源:HDLBits

模块端口声明

moduletop_module(
inputin1,
inputin2,
outputout);

题目解析

还是看懂电路即可。

moduletop_module(
inputlogicin1,
inputlogicin2,
outputlogicout
);


assignout=~(in1|in2);

endmodule
e6f5f470-4854-11ed-a3b6-dac502259ad0.png

点击Submit,等待一会就能看到下图结果:

e70b294e-4854-11ed-a3b6-dac502259ad0.png

注意图中无波形。

这一题就结束了。

Problem 46-m2014_q4f

题目说明

实现以下电路

e724dde4-4854-11ed-a3b6-dac502259ad0.png
图片来源:HDLBits

模块端口声明

moduletop_module(
inputin1,
inputin2,
outputout);

题目解析

注意输入端口前的非门。

moduletop_module(
inputlogicin1,
inputlogicin2,
outputlogicout);

assignout=in1&~in2;
endmodule
e746dc8c-4854-11ed-a3b6-dac502259ad0.png

点击Submit,等待一会就能看到下图结果:

e775d686-4854-11ed-a3b6-dac502259ad0.png

注意图中无波形。

这一题就结束了。

Problem 47-m2014_q4g

题目说明

实现以下电路:

e7bf87c2-4854-11ed-a3b6-dac502259ad0.png 图片来源:HDLBits

模块端口声明

moduletop_module(
inputin1,
inputin2,
inputin3,
outputout);

题目解析

还是看懂电路即可。

moduletop_module(
inputlogicin1,
inputlogicin2,
inputlogicin3,
outputlogicout);


assignout=(in1~^in2)^in3;
endmodule
e7d07384-4854-11ed-a3b6-dac502259ad0.png

点击Submit,等待一会就能看到下图结果:

e809e088-4854-11ed-a3b6-dac502259ad0.png

注意图中无波形。

这一题就结束了。

Problem 48-Gates

题目说明

本题希望我们用两输入的组合电路来实现如下功能,该电路共用于7个输出,具体情况如下:

e82b55a6-4854-11ed-a3b6-dac502259ad0.png

模块端口声明

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

e851bda4-4854-11ed-a3b6-dac502259ad0.png

点击Submit,等待一会就能看到下图结果:

e869b56c-4854-11ed-a3b6-dac502259ad0.png

注意图中的Ref是参考波形,Yours是你的代码生成的波形,网站会对比这两个波形,一旦这两者不匹配,仿真结果会变红。

这一题就结束了。

Problem 49-7420

题目说明

7420 chip是拥有两组4输入的与非门芯片,本练习需要构造一个与7420 chip功能一样的电路,拥有8个输入与2个输出。

e89002e4-4854-11ed-a3b6-dac502259ad0.png 图片来源: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

e8a3d8f0-4854-11ed-a3b6-dac502259ad0.png

点击Submit,等待一会就能看到下图结果:

e8e89166-4854-11ed-a3b6-dac502259ad0.png

注意图中的Ref是参考波形,Yours是你的代码生成的波形,网站会对比这两个波形,一旦这两者不匹配,仿真结果会变红。

这一题就结束了。

Problem 50-Truthtable1

开始练习真值表了,网站上有些实例讲解,我就不翻译了,学过数电的应该难度都不大。

题目说明

创建一个实现下述真值表的组合电路:

真值表如下:

e9ce5656-4854-11ed-a3b6-dac502259ad0.png 图片来源:HDLBits

最终实现的硬件框图如下:

ea03a63a-4854-11ed-a3b6-dac502259ad0.png 图片来源: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
ea21ae1e-4854-11ed-a3b6-dac502259ad0.png

点击Submit,等待一会就能看到下图结果:

ea51651e-4854-11ed-a3b6-dac502259ad0.png

注意图中的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

ea8505f4-4854-11ed-a3b6-dac502259ad0.png

点击Submit,等待一会就能看到下图结果:

eaa73336-4854-11ed-a3b6-dac502259ad0.png

注意图中无波形。

这一题就结束了。

Problem 52-Mt2015_q4a

题目说明

实现模块 A ,该模块实现函数z = (x^y) & x。

模块端口声明

moduletop_module(inputx,inputy,outputz);

题目解析

moduletop_module(inputlogicx,
inputlogicy,
outputlogicz);

assignz=(x^y)&x;
endmodule
ead8b410-4854-11ed-a3b6-dac502259ad0.png

点击Submit,等待一会就能看到下图结果:

eaf2196e-4854-11ed-a3b6-dac502259ad0.png

注意图中无波形。

这一题就结束了。

Problem 53-Mt2015_q4b

题目说明

电路B可以用下面的仿真波形来描述:

eb19538a-4854-11ed-a3b6-dac502259ad0.png 图片来源:HDLBits

模块端口声明

moduletop_module(inputx,inputy,outputz);

题目解析

这个题目可以使用采点的方式,选择几个特殊点,制作成真值表,然后化简即可。

或者从波形上看特点:根据观察所得输出 z 为 x 与 y 的同或输出,即相同为1, 不同为0;故实现代码如下:

moduletop_module(inputlogicx,
inputlogicy,
outputlogicz);


assignz=x~^y;
endmodule
eb6101bc-4854-11ed-a3b6-dac502259ad0.png

点击Submit,等待一会就能看到下图结果:

eba25c02-4854-11ed-a3b6-dac502259ad0.png

注意图中的Ref是参考波形,Yours是你的代码生成的波形,网站会对比这两个波形,一旦这两者不匹配,仿真结果会变红。

这一题就结束了。

Problem 54-Mt2015_q4

题目说明

根据子模块Problem 52 与 53 来实现如下电路:

ebe3afcc-4854-11ed-a3b6-dac502259ad0.png 图片来源: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

ec08a55c-4854-11ed-a3b6-dac502259ad0.png

点击Submit,等待一会就能看到下图结果:

ec7e522a-4854-11ed-a3b6-dac502259ad0.png

注意图中无波形。

这一题就结束了。

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 = ___)。能够在两种风格之间进行思考和转换是硬件设计所需的最重要技能之一。

ece7d060-4854-11ed-a3b6-dac502259ad0.png 图片来源: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

ecfa5226-4854-11ed-a3b6-dac502259ad0.png

点击Submit,等待一会就能看到下图结果:

ed39cef6-4854-11ed-a3b6-dac502259ad0.png

注意图中的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
ed6a18d6-4854-11ed-a3b6-dac502259ad0.png

点击Submit,等待一会就能看到下图结果:

ed829de8-4854-11ed-a3b6-dac502259ad0.png

注意图中的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

edb04eb4-4854-11ed-a3b6-dac502259ad0.png

点击Submit,等待一会就能看到下图结果:

edc5387e-4854-11ed-a3b6-dac502259ad0.png

注意图中的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



edf2e92c-4854-11ed-a3b6-dac502259ad0.png

点击Submit,等待一会就能看到下图结果:

ee7247ee-4854-11ed-a3b6-dac502259ad0.png

注意图中的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

eef36266-4854-11ed-a3b6-dac502259ad0.png

点击Submit,等待一会就能看到下图结果:

ef4b91fc-4854-11ed-a3b6-dac502259ad0.png

注意图中无波形。

这一题就结束了。

总结

今天的几道题就结束了,整体是从需求设计组合逻辑电路,再从波形图设计,还有两道从实际使用角度设计,对于组合电路的设计理解非常有帮助。

最后我这边做题的代码也是个人理解使用,有错误欢迎大家批评指正,祝大家学习愉快~

代码链接:

https://github.com/suisuisi/SystemVerilog/tree/main/SystemVerilogHDLBits

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 逻辑电路
    +关注

    关注

    13

    文章

    469

    浏览量

    42212
  • 组合电器
    +关注

    关注

    0

    文章

    3

    浏览量

    5892
  • Verilog
    +关注

    关注

    28

    文章

    1326

    浏览量

    109302

原文标题:HDLBits: 在线学习 SystemVerilog(十)-Problem 43-59

文章出处:【微信号:Open_FPGA,微信公众号:OpenFPGA】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    时序电路与普通逻辑电路有什么区别呢

    什么是中断?为什么CPU要用时序电路时序电路与普通逻辑电路有什么区别呢?
    发表于 10-29 07:03

    时序逻辑电路设计

    时序逻辑电路的输出不但和当前输入有关,还与系统的原先状态有关,即时序电路的当前输出由输入变量与电路原先的状态共同决定。为达到这一目的,时序
    发表于 03-18 22:13 71次下载

    组合逻辑电路课件

    组合逻辑电路(简称组合电路)任意时刻的输出信号仅取决于该时刻的输入信号,与信号作用前电路原来的状态无关
    发表于 07-15 18:45 0次下载

    组合逻辑电路设计基础

    讲述组合逻辑电路设计基础
    发表于 05-06 10:29 0次下载

    时序逻辑电路

    数字逻辑电路逻辑功能和电路组成的特点可分为组合逻辑电路时序
    发表于 08-10 11:51 39次下载

    CMOS逻辑电路高级技术与时序电路

    本章内容:q 镜像电路q 准nMOS电路q 三态电路q 钟控CMOS电路q 动态CMOS电路q 双轨逻辑
    发表于 08-13 14:44 0次下载

    时序逻辑电路引论

    数字电路分为组合逻辑电路(简称组合电路)和时序逻辑电路
    发表于 08-13 15:23 24次下载

    组合逻辑电路的特点详解

    数字电路根据逻辑功能的不同特点,可以分成两大类,一类叫组合逻辑电路(简称组合电路),另一类叫做
    发表于 01-30 16:24 3.8w次阅读
    <b class='flag-5'>组合</b><b class='flag-5'>逻辑电路</b>的特点详解

    组合逻辑电路时序逻辑电路比较_组合逻辑电路时序逻辑电路有什么区别

    组合逻辑电路时序逻辑电路都是数字电路组合逻辑电路
    发表于 01-30 17:26 9.2w次阅读
    <b class='flag-5'>组合</b><b class='flag-5'>逻辑电路</b>和<b class='flag-5'>时序</b><b class='flag-5'>逻辑电路</b>比较_<b class='flag-5'>组合</b><b class='flag-5'>逻辑电路</b>和<b class='flag-5'>时序</b><b class='flag-5'>逻辑电路</b>有什么区别

    什么是时序逻辑电路

    数字电路根据逻辑功能的不同特点,可以分成两大类,一类叫组合逻辑电路(简称组合电路),另一类叫做
    的头像 发表于 02-26 15:22 3.1w次阅读

    时序逻辑电路设计

    数字电路根据逻辑功能的不同特点,可以分成两大类,一类叫组合逻辑电路(简称组合电路),另一类叫做
    发表于 05-16 18:32 7756次阅读
    <b class='flag-5'>时序</b><b class='flag-5'>逻辑电路设计</b>

    组合逻辑电路时序逻辑电路的区别和联系

    数字电路根据逻辑功能的不同特点,可以分成两大类,一类叫组合逻辑电路(简称组合电路),另一类叫做
    的头像 发表于 03-14 17:06 5141次阅读
    <b class='flag-5'>组合</b><b class='flag-5'>逻辑电路</b>和<b class='flag-5'>时序</b><b class='flag-5'>逻辑电路</b>的区别和联系

    时序逻辑电路设计之同步计数器

    时序电路的考察主要涉及分析与设计两个部分,上文介绍了时序逻辑电路的一些分析方法,重点介绍了同步时序电路分析的步骤与注意事项。 本文就时序
    的头像 发表于 05-22 17:01 2035次阅读
    <b class='flag-5'>时序</b><b class='flag-5'>逻辑电路设计</b>之同步计数器

    时序逻辑电路有哪些 时序逻辑电路组合逻辑电路区别

    时序逻辑电路是一种能够存储信息并根据时钟信号按照特定顺序执行操作的电路。它是计算机硬件中非常重要的一部分,用于实现存储器、时序控制器等功能。与之相对的是
    的头像 发表于 02-06 11:18 1036次阅读

    什么是组合逻辑电路时序逻辑电路?它们之间的区别是什么

    什么是组合逻辑电路时序逻辑电路时序逻辑电路组合
    的头像 发表于 03-26 16:12 374次阅读