资讯动态

3.1 HDLBits —— 组合逻辑电路之基本门电路

发布时间:2026/8/12 17:41:03 来源:尧图企业网站定制
wire搭建下述电路输出 等于 输入参考答案// synthesis verilog_input_version verilog_2001// 模块功能单比特直通缓冲器输入信号无逻辑改动直接传递至输出// 电路本质纯导线连线不产生额外逻辑门、无运算延迟用于信号转接/层级对接moduletop_module(input in,// 1位输入端口未显式标注类型时Verilog默认隐式声明为wire连线型output out// 1位输出端口assign连续赋值驱动默认隐式wire类型);// 连续持续赋值数据流组合逻辑写法// 规则输入in电平发生任意变化输出out立刻同步跟随变化二者电平永久一致assign outin;endmodule输出结果GND搭建下述电路参考答案// synthesis verilog_input_version verilog_2001// 模块功能固定输出恒定逻辑低电平0常用于接地信号、默认无效电平配置// 电路综合结果输出端口直接接逻辑地无额外组合逻辑门moduletop_module(output out// 1位输出端口未显式指定类型Verilog默认隐式wire连线型);// 连续赋值语句持续驱动out为单比特常量0电平永久固定、不受外部信号影响assign out1b0;endmodule输出结果NOR搭建下述电路参考答案// synthesis verilog_input_version verilog_2001// 模块功能实现标准2输入或非门(NOR)组合逻辑电路// 逻辑关系式out ~(in1 | in2)先做按位或运算、整体结果再按位取反// 真值规律任意一路输入为高电平1输出固定为0仅两路同时为0输出才为1moduletop_module(input in1,// 第1路单比特输入信号默认隐式wire类型input in2,// 第2路单比特输入信号默认隐式wire类型output out// 逻辑运算结果输出端口默认隐式wire类型适配assign连续赋值);// assign持续并行赋值输入电平变化即时触发运算更新纯组合逻辑无时钟延迟// 运算符拆解| 按位或~ 整体按位取反括号限定先或后取反的运算顺序assign out~(in1|in2);endmodule输出结果Another gate搭建下述电路参考答案// synthesis verilog_input_version verilog_2001// 模块功能实现组合逻辑运算 out in1 (~in2)// 逻辑含义仅in1为高电平、in2为低电平时输出1其余所有输入组合输出0// 电路结构先对in2做按位取反再和in1做按位与运算两级纯组合逻辑门链路moduletop_module(input in1,// 第1路单比特输入隐式wire线网类型input in2,// 第2路单比特输入隐式wire线网类型output out// 运算结果输出适配assign连续赋值隐式wire类型);// assign并行持续赋值输入电平变化即时刷新结果无时钟、无存储延迟// 运算符说明~ 按位取反优先级最高 按位与括号强化可读性匹配运算顺序assign outin1(~in2);endmodule输出结果Two gates搭建下述电路参考答案// synthesis verilog_input_version verilog_2001// 模块功能三级组合逻辑运算先对in1、in2做同或运算结果再和in3做异或运算// 总逻辑式out (in1 ⊙ in2) ^ in3 ⊙代表同或^代表异或// 运算拆解w1 ~(in1 ^ in2)同或两输入相同输出1、不同输出0out w1 ^ in3moduletop_module(input in1,in2,in3,// 三路单比特输入隐式wire连线类型output out// 最终运算结果输出适配assign连续赋值隐式wire类型);// 中间临时线网保存in1、in2同或的运算结果wire w1;// 第一步实现同或逻辑异或取反等价同或Verilog也可直接用~^运算符简写assign w1~(in1^in2);// 同或规则in1in2时w11in1!in2时w10// 第二步同或结果w1与第三路输入in3做异或得到最终输出assign outw1^in3;// 异或规则两路信号电平不同输出1、电平相同输出0endmodule输出结果More logic gates好的我们来同时搭建多个逻辑门。搭建一个拥有两个输入信号a、b的组合逻辑电路电路包含7路输出每一路输出分别由一种逻辑门驱动与输出a与b或输出a或b异或输出a异或b与非输出a与b的非或非输出a或b的非同或输出a同或ba与非b输出a且非b参考答案// synthesis verilog_input_version verilog_2001// 模块功能并行实现7种常用二输入组合逻辑运算一次性输出所有门电路结果// 输入a、b两路单比特信号输出分别对应与/或/异或/与非/或非/同或/a选通非b共7路逻辑结果moduletop_module(input a,b,// 两路单比特输入隐式wire连线类型output out_and,// 二输入与门运算结果输出output out_or,// 二输入或门运算结果输出output out_xor,// 二输入异或门运算结果输出output out_nand,// 二输入与非门运算结果输出output out_nor,// 二输入或非门运算结果输出output out_xnor,// 二输入同或门运算结果输出output out_anotb// 限定逻辑仅a1、b0时输出高电平);// 1.与门两路输入同时为1输出才为1assign out_andab;// 2.或门任意一路输入为1输出即为1assign out_ora|b;// 3.异或门两路输入电平不一致时输出1电平一致输出0assign out_xora^b;// 4.与非门先做与运算整体取反和与门输出逻辑相反assign out_nand~(ab);// 5.或非门先做或运算整体取反和或门输出逻辑相反assign out_nor~(a|b);// 6.同或门异或结果取反两路输入电平一致输出1是异或的反向逻辑assign out_xnor~(a^b);// 7.选通逻辑b先取反再和a做与运算仅满足a1、b0条件输出1assign out_anotba(~b);endmodule输出结果7420 chip7400 系列是由多个逻辑门组成的数字集成电路。7420 芯片内部包含两个 4 输入与非门。 编写一个模块实现 7420 芯片功能共 8 路输入、2 路输出。参考答案// synthesis verilog_input_version verilog_2001// 模块功能并行实现两组独立4输入与非门逻辑// 逻辑规则4个输入全部为高电平1时输出0只要任意1个输入为0输出就为1moduletop_module(// 第1路4输入与非门端口定义input p1a,p1b,p1c,p1d,// 第1组与非门4路独立输入信号output p1y,// 第1组与非门运算结果输出// 第2路4输入与非门端口定义input p2a,p2b,p2c,p2d,// 第2组与非门4路独立输入信号output p2y// 第2组与非门运算结果输出);// 第一组逻辑先对4路输入连续按位与运算整体结果取反实现4输入与非assign p1y~(p1ap1bp1cp1d);// 第二组逻辑独立运算输入、输出和第一组完全隔离互不影响assign p2y~(p2ap2bp2cp2d);endmodule输出结果真值表在前面的练习中我们用到了基础逻辑门以及多组逻辑门组合而成的电路这类电路都属于组合逻辑电路。 “组合逻辑” 的含义是电路的输出仅仅由输入唯一决定数学意义上的函数关系。也就是说给定一组确定的输入只会对应唯一的输出结果。因此描述组合逻辑函数行为的一种方式就是把每一组输入对应的输出全部罗列出来这种表格就叫做真值表。对于一个拥有 N 个输入的布尔函数总共有2N2^N2N种不同的输入组合。真值表每一行代表一组输入组合所以真值表固定有2N2^N2N行表格的输出列则标明该组输入对应的输出电平。上面这份真值表对应一个三输入、单输出逻辑函数。总共有 8 行分别对应全部 8 种输入组合附带一列输出。其中 4 组输入会让输出为 1另外 4 组输入输出为 0。根据真值表搭建电路假设我们要实现上述电路且只能使用标准逻辑门该如何搭建任意由真值表描述的逻辑函数一种简单实现方法是把逻辑函数写成与或式积之和形式Sum-of-Products。 “积” 代表与运算“和” 代表或运算真值表里每一行配置一个 N 输入与门用来检测输入是否和该行取值完全匹配再用一个或门把所有输出结果为 1 的行对应的与门输出做或运算。以本例说明 当输入匹配第 2 行、第 3 行、第 5 行或第 7 行时输出为 1因此后端用一个4 输入或门汇总这四路信号。 以第 2 行为例输入满足 x30、x21、x10这一路用一个3 输入与门识别该输入组合。 综上该真值表的标准规范实现方式为4 个三输入与门输出接到同一个四输入或门。练习设计一个组合逻辑电路实现上面这张真值表对应的逻辑功能。参考答案// synthesis verilog_input_version verilog_2001// 模块功能实现三变量组合逻辑 f (~x3 x2) | (x3 x1)典型多路选择型与或逻辑// 逻辑含义x30时输出跟随x2x31时输出跟随x1等价二选一多路选择器功能moduletop_module(input x3,// 高位控制/输入变量input x2,// 分支输入变量1x3低电平有效通路input x1,// 分支输入变量2x3高电平有效通路output f// 最终逻辑运算结果输出);// 运算拆解// 项1~x3 x2 x3取反后和x2相与x30、x21时该项成立// 项2x3 x1 x3直接和x1相与x31、x11时该项成立// 两项做或运算任意一项满足条件输出即为1assign f((~x3)x2)|(x3x1);endmodule输出结果两位相等比较器取自 2015 年期中试卷第 1k 题 搭建电路两路 2 位向量输入 A[1:0]、B[1:0]输出单比特 z。 当 A 与 B 数值完全相等时 z1否则 z0。参考答案// synthesis verilog_input_version verilog_2001// 模块功能2位向量相等比较器两路输入数值完全一致输出高电平1不一致输出低电平0moduletop_module(input[1:0]A,// 2位输入向量A[1]高位、A[0]低位input[1:0]B,// 2位输入向量B[1]高位、B[0]低位output z// 比较结果输出AB则z1反之z0);// 三元运算符格式条件表达式 ? 条件成立取值 : 条件不成立取值// 按位全等比较运算符逐位对比A、B所有比特是否全部相同assign z(AB)?1:0;endmodule输出结果简单电路A出自 2015 年期中试卷第 4 题 模块功能实现逻辑z(x⊕y)⋅xz (x \oplus y) \cdot xz(x⊕y)⋅x参考答案// synthesis verilog_input_version verilog_2001// 模块功能实现组合逻辑 z (x ^ y) x// 运算顺序先对x、y做异或运算结果再和x执行按位与运算moduletop_module(input x,// 单比特输入信号x默认隐式wire类型input y,// 单比特输入信号y默认隐式wire类型output z// 逻辑运算结果输出适配assign连续赋值);// 运算符说明^ 异或两信号不同输出1、相同输出0 按位与// 括号固定运算优先级优先完成异或再执行与运算assign z(x^y)x;endmodule输出结果简单电路B出自 2015 年期中试卷第 4 题 电路 B 的功能由下方仿真波形描述参考答案// synthesis verilog_input_version verilog_2001// 模块功能实现二输入同或门组合逻辑运算// 逻辑规则两路输入电平完全相同输出1电平不同输出0// 数学表达式z ~(x ^ y)异或结果整体取反等价同或运算moduletop_module(input x,// 单比特输入信号x默认隐式wire连线类型input y,// 单比特输入信号y默认隐式wire连线类型output z// 同或运算结果输出适配assign连续并行赋值);// 运算拆解^ 异或x、y不一致输出1~ 整体按位取反得到同或结果// 括号不可省略必须先完成异或运算再对最终结果取反assign z~(x^y);endmodule输出结果组合电路A和电路B本题选自 2015 年期中试卷第 4 题。 本设计会用到子模块 mt2015_q4a子电路 A与 mt2015_q4b子电路 B请先查看这两个子模块的定义。 顶层电路结构如下图所示分别例化2 个子电路 A、2 个子电路 B。A模块逻辑 z (x^y) xB模块逻辑z ~(x^y)参考答案// synthesis verilog_input_version verilog_2001//// 子模块 m_a基础组合逻辑单元// 逻辑公式z (x ^ y) x// 逻辑简化等价z x ~y仅x1、y0时输出高电平//modulem_a(input x,// 单比特输入xinput y,// 单比特输入youtput z// 运算结果输出);// 先异或、再按位与括号明确运算先后顺序assign z(x^y)x;endmodule//// 子模块 m_b二输入同或门单元// 逻辑公式z ~(x ^ y)// 逻辑规则x、y电平完全相同输出1电平不同输出0//modulem_b(input x,// 单比特输入xinput y,// 单比特输入youtput z// 同或结果输出);// 异或整体取反实现同或括号不可省略避免仅x单独取反assign z~(x^y);endmodule//// 顶层模块 top_module多层级模块化组合逻辑电路// 整体运算链路// 1.两路m_a、两路m_b并行接收全局x/y得到4组中间结果// 2.z_n[0]、z_n[1]做或运算z_n[2]、z_n[3]做与运算// 3.两组中间结果异或得到最终输出z//moduletop_module(input x,// 全局公共输入信号x供给所有子模块input y,// 全局公共输入信号y供给所有子模块output z// 电路最终运算结果输出);// 6位内部中间总线缓存各级模块运算结果位宽0~5依次存储分步结果wire[5:0]z_n;// 实例化第1个A子模块输入全局x/y结果存入z_n最低位z_n[0]m_aia1(.x(x),.y(y),.z(z_n[0]));// 实例化第1个B子模块输入全局x/y结果存入z_n[1]m_bib1(.x(x),.y(y),.z(z_n[1]));// 实例化第2个A子模块复用全局输入独立运算结果存入z_n[2]m_aia2(.x(x),.y(y),.z(z_n[2]));// 实例化第2个B子模块复用全局输入独立运算结果存入z_n[3]m_bib2(.x(x),.y(y),.z(z_n[3]));// 第一级组合运算前两组子模块结果做按位或assign z_n[4]z_n[0]|z_n[1];// 第一级组合运算后两组子模块结果做按位与assign z_n[5]z_n[2]z_n[3];// 最终运算两组一级运算结果做异或输出全局最终信号assign zz_n[4]^z_n[5];endmodule输出结果响铃或震动假设你要设计一个电路用于控制手机的铃声和震动马达。 当有来电需要响铃时输入信号 ring1电路必须只开启铃声输出 ringer1或只开启马达输出 motor1二者不能同时打开。 如果手机处于震动模式输入 vibrate_mode1则开启马达否则开启铃声。请仅使用 assign 连续赋值语句完成设计练习将文字需求转化为逻辑门电路。设计思路提示设计硬件电路时常常需要逆向推导从输出的约束条件出发反向推导输入逻辑这和顺序式编程思维完全相反。软件顺序、指令式思维习惯先看输入再判断输出行为 句式如果输入满足XX则执行XX输出硬件组合逻辑思维习惯先明确输出何时为 1再写等式 句式输出1 的充要条件是输入满足XX本题需求是软件式的指令描述如果来电就执行对应动作你需要把它转换成硬件可用的声明式赋值 assign ringer 逻辑表达式;。 熟练切换、翻译这两种思维模式是硬件设计最重要的核心能力之一。参考答案// synthesis verilog_input_version verilog_2001// 模块功能手机来电提示模式控制逻辑根据震动模式开关切换响铃/震动两种提示方式// 逻辑规则来电信号ring为高电平时生效vibrate_mode0开启铃声、vibrate_mode1开启震动二者互斥moduletop_module(input ring,// 来电触发输入高电平有来电低电平无来电input vibrate_mode,// 模式选择输入1震动模式0响铃模式output ringer,// 铃声驱动输出1播放铃声0关闭铃声output motor// 马达驱动输出1启动震动0关闭震动);// 铃声开启条件存在来电 未开启震动模式两个条件同时满足才响铃assign ringerring~vibrate_mode;// 震动开启条件存在来电 开启震动模式两个条件同时满足才启动马达assign motorringvibrate_mode;endmodule输出结果恒温器一款冷暖恒温器可分别控制冬季加热器与夏季空调。请设计电路合理控制加热器、空调与送风风扇的启停。恒温器分为两种工作模式制热模式mode 1、制冷模式mode 0。制热模式下当环境温度过低too_cold 1时开启加热器空调保持关闭制冷模式下当环境温度过高too_hot 1时开启空调加热器保持关闭只要加热器或空调任意一台设备开启风扇必须同步启动以循环空气额外功能即便加热器、空调全部关闭用户也可手动强制开启风扇fan_on 1。要求仅使用assign连续赋值语句完成设计练习将文字需求转化为逻辑门电路。参考答案// synthesis verilog_input_version verilog_2001//-----------------------------------------------------------------------------// 模块名称top_module// 功能概述空调系统温控联动控制模块依据温度检测、工作模式启停加热/制冷设备// 风扇支持设备联动开启用户手动强制开启两种触发方式// 设计特性加热、制冷互斥运行风扇多条件并行触发纯组合逻辑实时响应//-----------------------------------------------------------------------------moduletop_module(input too_cold,// 温度检测输入1-环境温度过低需制热0-温度正常input too_hot,// 温度检测输入1-环境温度过高需制冷0-温度正常input mode,// 运行模式选择1-制热模式0-制冷模式input fan_on,// 风扇手动控制1-用户强制开风扇0-跟随温控自动控制output heater,// 加热器控制输出1-启动加热0-关闭加热output aircon,// 制冷空调控制输出1-启动制冷0-关闭制冷output fan// 循环风扇控制输出1-风扇运转0-风扇停机);// 制热逻辑约束仅制热模式低温触发开启加热器assign heatermodetoo_cold;// 制冷逻辑约束仅制冷模式高温触发开启空调mode取反筛选制冷档位assign aircon~modetoo_hot;// 风扇触发规则加热运行 / 制冷运行 / 手动强制开启任一条件满足即运转assign fanheater|aircon|fan_on;endmodule输出结果位统计电路位统计电路popcount” 用于统计输入向量中逻辑 1 的总位数请设计一个 3 位输入的位统计电路参考答案// synthesis verilog_input_version verilog_2001//-----------------------------------------------------------------------------// 模块名称top_module// 功能概述3bit输入向量内高电平1计数模块统计输入3位中逻辑1的总数量用2bit输出结果// 设计特性纯组合逻辑逐位累加计数最大计数值32位输出可完整覆盖0~3范围//-----------------------------------------------------------------------------moduletop_module(input[2:0]in,// 3位输入向量in[2]高位、in[0]低位待统计1的个数output[1:0]out// 2位计数输出取值范围0~3对应输入里逻辑1的总数量);// 计数逻辑单比特信号参与算术运算电平1数值为1、电平0数值为0逐位相加得到总数assign outin[0]in[1]in[2];endmodule输出结果逻辑门与位向量给定一个 4 位输入向量 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]。参考答案// synthesis verilog_input_version verilog_2001//-----------------------------------------------------------------------------// 模块名称top_module// 功能概述4bit向量邻位并行判断模块分三类逻辑输出// 1.out_both逐位对比本位左侧相邻位两位同时为1则标记1最高位无左邻舍弃// 2.out_any逐位对比本位右侧相邻位任意一位为1则标记1最低位无右邻舍弃// 3.out_different环形首尾衔接对比本位左邻电平不一致则标记1完整4位输出// 设计特性纯组合逻辑错位位运算并行高效完成邻位判断//-----------------------------------------------------------------------------moduletop_module(input[3:0]in,// 4位输入向量位序高位in[3]~低位in[0]output[2:0]out_both,// 3bit输出in[2:0]分别和左邻in[3:1]按位与结果output[3:1]out_any,// 3bit输出in[3:1]分别和右邻in[2:0]按位或结果output[3:0]out_different// 4bit环形异或输出本位与环形左邻不同则置1);// 逻辑本位 左侧相邻位仅两位全1输出1高位对齐截取低3位舍弃无左邻的in[3]assign out_bothinin[3:1];// 逻辑本位 | 右侧相邻位任意一位为1输出1低位对齐截取高3位舍弃无右邻的in[0]assign out_anyin[3:1]|in;// 逻辑环形错位拼接{in[0],in[3:1]} 实现首尾衔接左移一位异或判断相邻电平是否不一致assign out_differentin^{in[0],in[3:1]};endmodule输出结果更长位宽向量给定一个 100 位输入向量 in[99:0]需要求出每一位与其相邻比特的三种逻辑关系输出out_both 输出向量每一位标记本位输入比特 和 它左侧相邻比特下标更大的高位是否同时为 1。 举例out_both[98] 判断 in[98] 和左侧邻居 in[99] 是否全 1。in[99] 左侧没有比特因此无需定义 / 计算 out_both[99]。out_any 输出向量每一位标记本位输入比特 和 它右侧相邻比特下标更小的低位是否至少有一个为 1。 举例out_any[2] 判断 in[2]、右邻 in[1] 是否至少有一个为 1。in[0] 右侧无比特无需定义 / 计算 out_any[0]。out_different 输出向量每一位标记本位比特 和 左侧邻居比特取值是否不相等。 举例out_different[98] 判断 in[98] 与左邻 in[99] 是否相异。 本组向量为环形首尾相连in[99] 的左邻居是最低位 in[0]。参考答案// synthesis verilog_input_version verilog_2001//-----------------------------------------------------------------------------// 模块名称top_module// 对应习题Even longer vectors更长位宽向量邻位检测// 功能概述100bit超宽输入向量做三类邻位并行逻辑判断// 1. out_both本位与左侧相邻位同时为1则输出1舍弃最高位in[99]无左邻输出位宽99bit// 2. out_any本位与右侧相邻位任意一个为1则输出1舍弃最低位in[0]无右邻输出位宽99bit// 3. out_different首尾环形衔接本位与环形左邻电平不一致输出1完整保留100bit输出// 设计特性纯组合错位位运算逻辑可直接平移复用至任意位宽向量//-----------------------------------------------------------------------------moduletop_module(input[99:0]in,// 100位输入总线高位in[99] ~ 低位in[0]output[98:0]out_both,// 邻位全1标记out_both[i]in[i]in[i1], i∈[0,98]output[99:1]out_any,// 邻位至少1个1标记out_any[i]in[i]|in[i-1], i∈[1,99]output[99:0]out_different// 环形邻位差异标记本位和循环左移一位相邻位不同置1);// 错位按位与in[98:0]逐位和左邻in[99:1]相与高位自动截断匹配99bit输出assign out_bothinin[99:1];// 错位按位或in[99:1]逐位和右邻in[98:0]相或低位自动截断匹配[99:1]输出范围assign out_anyin[99:1]|in;// 位拼接构造循环左移1位向量最低位in[0]补到最高位剩余高位整体右移一位// 异或运算检测相邻电平差异两值不等输出1实现首尾闭环环形对比assign out_differentin^{in[0],in[99:1]};endmodule输出结果

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价