【HDLbits--Comb组合逻辑】

HDLbits--Comb组合逻辑

    • 1.5 组合逻辑
    • 1.5 Demo

在 Verilog 中,组合逻辑(Combinational Logic)是指输出仅依赖于当前输入的逻辑电路,没有记忆功能(即没有状态存储)。组合逻辑的特点是:

  • 无时钟信号:不依赖于时钟边沿触发。
  • 即时响应:输入变化时,输出立即更新(在仿真中表现为零延迟,实际硬件中有传播延迟)。

1.5 组合逻辑

组合逻辑的实现方式
在 Verilog 中,组合逻辑通常通过以下方式实现:

  1. assign 语句
    用于简单的组合逻辑表达式。
    语法:
assign output_signal = expression;

示例:

wire a, b, c;
assign c = a & b;  // c 是 a 和 b 的按位与
  1. always 块
    用于描述更复杂的组合逻辑。
    必须使用 always @(*) 或 always @(sensitivity_list) 来触发。
    注意:在 always 块中赋值的信号必须声明为 reg 类型。
    示例:
reg c;
always @(*) beginc = a & b;  // c 是 a 和 b 的按位与
end
  1. 条件运算符(三元运算符)
    用于简单的条件逻辑。
    语法:
assign output_signal = condition ? value_if_true : value_if_false;

示例:

wire a, b, sel, c;
assign c = sel ? a : b;  // 如果 sel 为 1,c = a;否则 c = b
  1. case 语句
    用于多路选择逻辑。
    必须在 always 块中使用。
    示例:
reg [1:0] sel;
reg [3:0] out;
always @(*) begincase (sel)2'b00: out = 4'b0001;2'b01: out = 4'b0010;2'b10: out = 4'b0100;2'b11: out = 4'b1000;default: out = 4'b0000;endcase
end
  1. if-else 语句
    用于条件逻辑。
    必须在 always 块中使用。

示例:

reg a, b, sel, c;
always @(*) beginif (sel)c = a;elsec = b;
end

组合逻辑的设计规则
避免锁存器(Latch):
在 always 块中,必须为所有可能的输入条件明确赋值,否则会推断出锁存器。

示例:

always @(*) beginif (sel)c = a;// 缺少 else 分支,会推断出锁存器
end

敏感列表:
在 always 块中,敏感列表必须包含所有影响输出的信号。
使用 always @(*) 可以自动推断敏感列表,避免遗漏。

避免组合逻辑环路:
组合逻辑的输出不能直接或间接反馈到输入,否则会导致环路。

示例:

assign a = a + 1;  // 组合逻辑环路,非法

组合逻辑的示例
以下是一个 4:1 多路选择器的 Verilog 实现:

module mux4to1 (input [3:0] data,  // 4 位输入input [1:0] sel,   // 2 位选择信号output reg out     // 输出
);always @(*) begincase (sel)2'b00: out = data[0];2'b01: out = data[1];2'b10: out = data[2];2'b11: out = data[3];default: out = 1'b0;  // 避免锁存器endcaseend
endmodule

总结

  • 组合逻辑的输出仅依赖于当前输入,没有记忆功能。
  • 可以通过 assign 语句、always 块、条件运算符、case 语句和 if-else 语句实现。
  • 设计时需避免锁存器和组合逻辑环路。
  • 组合逻辑是数字电路设计的基础,广泛应用于多路选择器、加法器、译码器等电路中。

1.5 Demo

组合逻辑电路:主要是包括条件组合、算数运算,卡诺真值表运算;
题目:计算模式

module top_module (input too_cold,input too_hot,input mode,input fan_on,output heater,output aircon,output fan
); assign heater = (mode == 1'b1) && (too_cold==1'b1);assign aircon = (mode == 1'b0) && (too_hot==1'b1);assign fan = (heater || aircon) || (fan_on);
endmodule

题目:计算输入向量中的1数量;

module top_module( input [2:0] in,output [1:0] out );always @(*) begincase(in[2:0])3'b001,3'b010,3'b100: out[1:0] = 1;3'b011,3'b101,3'b110: out[1:0] = 2;3'b111: out[1:0] = 3;default: out[1:0] = 0;endcaseendendmodule

题目:计算向量中的index和他相邻位置的关系


module top_module( input [3:0] in,output [2:0] out_both,output [3:1] out_any,output [3:0] out_different );assign out_both[2:0] = {{in[3] & in[2]},{in[2] & in[1]}, {in[1] & in[0]}};assign out_any[3:1] = {{in[3] | in[2]}, {in[2] | in[1]}, {in[1] | in[0]}};assign out_different[3:0] = {{in[3] ^ in[0]}, {in[3] ^ in[2]}, {in[2] ^ in[1]}, {in[1] ^ in[0]}};endmodule

题目:全加器–多位全加器例化低全加器


module top_module( input [2:0] a, b,input cin,output [2:0] cout,output [2:0] sum );fadd u0_fadd(a[0],b[0],cin,cout[0],sum[0]);fadd u1_fadd(a[1],b[1],cout[0],cout[1],sum[1]);fadd u2_fadd(a[2],b[2],cout[1],cout[2],sum[2]);endmodulemodule fadd( input a, b, cin,output cout, sum );assign cout = a&b|a&cin|b&cin;assign sum = a^b^cin;
endmodule//==变式
module top_module (input [3:0] x,input [3:0] y, output [4:0] sum);wire [2:0] cout;wire cin;assign cin = 1'b0;fadd fadd0 (x[0],y[0],cin,cout[0],sum[0]);fadd fadd1 (x[1],y[1],cout[0],cout[1],sum[1]);fadd fadd2 (x[2],y[2],cout[1],cout[2],sum[2]);fadd fadd3 (x[3],y[3],cout[2],sum[4],sum[3]);
endmodulemodule fadd( input a, b, cin,output cout, sum );assign cout = a&b|a&cin|b&cin;assign sum = a^b^cin;
endmodule

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/71868.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ARM Cortex-M3 技术解析:核寄存器R1-R15介绍及使用

ARM Cortex-M3 技术解析:核寄存器R1-R15介绍及使用 作为嵌入式开发领域的经典处理器内核,ARM Cortex-M3(CM3)凭借其高效能、低功耗和丰富特性,在工业控制、物联网、消费电子等领域广泛应用。而内核寄存器是我们调试代…

python unzip file

要在 Python 中解压文件并显示进度,我们需要在解压过程中跟踪文件的提取进度。由于 zipfile 模块本身不直接支持进度显示,我们可以通过手动计算并使用 tqdm 库来显示进度条。 安装 tqdm 首先,确保你已经安装了 tqdm 库,用于显示…

DeepSeek+Kimi生成高质量PPT

DeepSeek与Kimi生成PPT全流程解析 一、工具分工原理 DeepSeek核心作用:生成结构化PPT大纲(擅长逻辑构建与内容优化)Kimi核心作用:将文本转换为视觉化PPT(提供模板库与排版引擎) 二、操作步骤详解 1. 通…

一文掌握python中正则表达式的各种使用

文章目录 1. 正则表达式基础1.1 常用元字符1.2 基本用法 2. 正则表达式高级功能2.1 分组捕获2.2 命名分组2.3 非贪婪匹配2.4 零宽断言2.5 编译正则表达式2.6 转义字符 3. 常见应用场景3.1 验证邮箱格式3.2 提取 URL3.3 提取日期3.4 提取HTML中的链接3.5 提取HTML中的图片链接3.…

TCP,http,WebSocket

TCP(Transmission Control Protocol,传输控制协议)和HTTP(HyperText Transfer Protocol,超文本传输协议)都是网络通信中的重要协议,但它们在网络协议栈的不同层次上工作,各自负责不同…

Redis|持久化

文章目录 总体介绍RDB(Redis DataBase)官网介绍案例演示优势劣势如何检查修复 dump.rdb 文件哪些情况下会触发 RDB 快照如何禁用快照RDB 优化配置项详解小总结 AOF(Append Only File)官网介绍是什么能干嘛AOF 持久化工作流程AOF 缓…

Docker小游戏 | 使用Docker部署star-battle太空飞船射击小游戏

Docker小游戏 | 使用Docker部署star-battle太空飞船射击小游戏 前言项目介绍项目简介项目预览二、系统要求环境要求环境检查Docker版本检查检查操作系统版本三、部署star-battle网页小游戏下载镜像创建容器检查容器状态检查服务端口安全设置四、访问star-battle网页小游戏五、总…

巨控科技的GRM550元出魔抗实现PLC远程下载与维护方案:工业自动化的高效解决方案

巨控科技PLC远程下载与维护方案:工业自动化的高效解决方案 在工业自动化领域,设备的高效维护与快速调试是保障生产连续性的关键。巨控科技推出的PLC远程下载与维护方案,凭借其先进的技术和广泛兼容性,成为企业实现设备远程管理的…

ChatGLM2-6B如何从输入到输出-代码解析(二)

出发点 上一篇解析了Chatglm2-6b的模型架构,并和Chatglm-6b进行对比,但是留下了几个问题(哭)这一篇的目的是讲明白attention和rotaryEmbedding,解决问题,并实现整体目标,完全替代modeling_chat…

Sublime Text4安装、汉化

-------------2025-02-22可用---------------------- 官方网址下载:https://www.sublimetext.com 打开https://hexed.it 点击打开文件找到软件安装目录下的 ctrlf 查找 8079 0500 0f94 c2右边启用替换替换为:c641 0501 b200 90点击替换按钮 替换完成后 另存为本地…

汽车开放系统架构(AUTOSAR)中运行时环境(RTE)生成过程剖析

一、引言 在当今高度智能化的汽车电子领域,软件系统的复杂性呈指数级增长。为了应对这一挑战,汽车开放系统架构(AUTOSAR)应运而生,它为汽车电子软件开发提供了标准化的分层架构和开发方法。其中,运行时环境…

基于MATLAB的OFDM通信系统仿真设计

下面将为你详细介绍基于MATLAB的OFDM通信系统仿真设计的步骤和示例代码。 1. OFDM系统原理概述 正交频分复用(OFDM)是一种多载波调制技术,它将高速数据流通过串并转换,分配到多个正交的子载波上进行传输,这样可以有效…

stm32仿真 74hc238流水灯 数码管动态数字显示

f103c6t6a_hex文件 #include "main.h"![请添加图片描述](https://i-blog.csdnimg.cn/direct/8c0d44b121134cf08f5186df316ea07f.gif)#include "stdlib.h"void SystemClock_Config(void); static void MX_GPIO_Init(void); // 自定义abc引脚 #define A_PIN…

结构型模式 - 代理模式 (Proxy Pattern)

结构型模式 - 代理模式 (Proxy Pattern) 代理模式是一种结构型设计模式,它允许通过代理对象来控制对另一个对象(目标对象)的访问。代理对象充当目标对象的接口,客户端通过代理对象间接访问目标对象。 分为两大类 静态代理&#…

网络层(IP)

基本概念 子网和局域网是一个概念主机: 配有 IP 地址, 也能进行路由控制的设备;路由器: 即配有 IP 地址, 又能进行路由控制;节点: 路由器和主机的统称。 背景 两主机并不是直接连接的,路径选择问题?为什么? 由网络层&#xff08…

JMeter性能问题

性能测试中TPS上不去的几种原因 性能测试中TPS上不去的几种原因_tps一直上不去-CSDN博客 网络带宽 连接池 垃圾回收机制 压测脚本 通信连接机制 数据库配置 硬件资源 压测机 业务逻辑 系统架构 CPU过高什么原因 性能问题分析-CPU偏高 - 西瓜汁拌面 - 博客园 US C…

创建型模式 - 建造者模式 (Builder Pattern)

创建型模式 - 建造者模式 (Builder Pattern) 建造者模式是一种创建型设计模式,它将一个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示。 需求描述 在游戏开发中,创建一个复杂的游戏角色,角色具有多种属性&…

代码随想录第二十天|二叉树part08--669.修建二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树

刷题小记: 上期学习了二叉搜索树的插入和删除操作,这次学习如何按区间修剪二叉搜索树。还有两题,关于借助二叉搜索树的有序特性进行转换。 669.修剪二叉搜索树(669.修剪二叉搜索树) 题目分析: 给定一个…

Fisher信息矩阵(Fisher Information Matrix,简称FIM)

Fisher信息矩阵简介 Fisher信息矩阵(Fisher Information Matrix,简称FIM)是统计学和信息理论中的一个重要概念,广泛应用于参数估计、统计推断和机器学习领域。它以统计学家罗纳德费希尔(Ronald Fisher)的名…

【初阶数据结构】链表的柔光之美

目录 一、为什么需要链表? 二、链表与数组的对比 三、链表节点定义 四、链表基本操作 1. 创建链表 2. 插入节点 头插法(时间复杂度O(1)) 尾插法(时间复杂度O(n)) 3. 删除节点 4. 遍历链表 五、进阶操作 1. 反…