【HDLbits--Comb组合逻辑】

server/2025/2/26 13:44:05/

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.ppmy.cn/server/170756.html

相关文章

2025-02-25 学习记录--C/C++-用C语言实现删除字符串中的子串

用C语言实现删除字符串中的子串 在C语言中&#xff0c;你可以使用strstr函数来查找子串&#xff0c;然后用memmove或strcpy来覆盖或删除找到的子串。 一、举例 &#x1f430; #include <stdio.h> // 包含标准输入输出库&#xff0c;用于使用 printf 函数 #include <s…

【算法】793. 高精度乘法

题目 793. 高精度乘法 思路 把b当作一个整体进行乘法&#xff0c;用A的每一位和b相乘&#xff0c;还要加上判断001的情况&#xff0c;把前面的0删掉。 代码 #include<iostream> #include<vector> using namespace std; vector<int>mul(vector<int>…

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

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

在 compare-form.vue 中添加 compareDate 隐藏字段,并在提交时自动填入当前时间

在 compare-form.vue 中添加 compareDate 隐藏字段&#xff0c;并在提交时自动填入当前时间。 提交表单时存入的对象是FakeRegistration&#xff0c;这个对象里面有compareDate字段&#xff0c;刚好表格查询的对象也是FakeRegistration&#xff0c;所以表格展示的时间就是刚才…

命令行工具开发

文章目录 1.argparse2.subparses3.优化 后续我也会将我在学习过程中写的脚本放出来。 在开发命令行工具时需要对不同类型的参数进行处理。比如下面这种&#xff0c;我们需要处理用户输入的不同参数。 python main.py --help python main.py domain xxxx python main.py cms xx…

《Keras 3 使用 PointNet 进行点云分类》:此文为AI自动翻译

《Keras 3 使用 PointNet 进行点云分类》 作者:David Griffiths 创建日期:2020/05/25 最后修改时间:2024/01/09 描述:实现 PointNet for ModelNet10 分类。 (i) 此示例使用 Keras 3 在 Colab 中查看 GitHub 源 点云分类 介绍 无序 3D 点集(即点云)的分类、检测和分…

《Keras 3 单眼深度估计》:此文为AI自动翻译

《Keras 3 单眼深度估计》 作者:Victor Basu 创建日期:2021/08/30 最后修改时间:2024/08/13 描述:使用卷积网络实现深度估计模型。 (i) 此示例使用 Keras 3 在 Colab 中查看 GitHub 源 介绍 深度估计是从 2D 图像推断场景几何结构的关键步骤。 单眼深度估计的目标是预…

信息系统项目管理师2025年考试关键知识点梳理-第10章 项目进度管理

项目进度管理是为了保证项目按时完成,对项目所需的各个过程进行管理,包括规划进度、定义活动、排列活动顺序、估算活动持续时间、制定项目进度管理计划和控制进度。 1、管理基础 1.1项目进度计划的定义和总要求 项目进度计划提供了项目的详尽计划,说明项目如何以及何时交…