【HDL系列】从半减器到加减法器:Verilog实现与优化策略

[Verilog]半减器,全减器设计 题目描述:用Verilog语言设计一位半减器,然后在该半减器的基础上利用元件调用的方法设计一位全减器。 1)半减器真值表如表1。 输入被减数(x) 输入减数(y) 减法差值输出(diff) 减法借位标志输出(s_out) 0 0 0 0 1 1 0 0 阅读详情

1. 从半减器开始:理解减法运算的“原子”

大家好,我是老李,在数字电路和芯片设计这块摸爬滚打了十几年。今天咱们不聊那些高大上的复杂架构,就从一个最基础、但也是所有算术运算基石的东西聊起——半减器。很多刚接触Verilog和数字逻辑的朋友,一上来就想搞懂CPU里的ALU(算术逻辑单元),结果往往被底层的门电路和真值表绕晕。我的经验是,把基础打牢,后面的一切都会豁然开朗。半减器,就是理解减法乃至整个有符号数运算的绝佳起点。

那么,半减器到底是什么呢?你可以把它想象成一个只能处理“个位数”减法的超迷你计算单元,而且它只管自己这一位,不考虑别人(也就是低位)有没有向它借过东西。它只有两个输入:被减数的一位(我们叫它 Xi)和减数的一位(Yi)。输出也有两个:这一位的差(Di)和一个“借位”信号(Bo),这个借位信号是告诉它左边更高位的那一位:“喂,我这儿不够减了,你得借我1当10用(在二进制里就是借1当2)”。

咱们直接来看最直观的真值表,我习惯用这种方式来理解逻辑:

Xi (被减数)Yi (减数)Di (差)Bo (输出借位)
0000
0111
1010
1100

我来给你翻译一下这个表。第一行,0减0等于0,当然不用借位。第二行是关键,0减1,这在我们十进制里就是个位不够减要向十位借,在这里也一样,个位(当前位)结果是 1(注意,二进制下 0-1 得到 1 是因为有借位,这个 1 是补码形式的体现,我们先这么理解),同时必须产生一个借位信号 Bo=1 给高位。第三行,1减0等于1,很简单。第四行,1减1等于0,也不用借位。

从真值表,我们可以推导出逻辑表达式。差 Di 什么时候是1呢?看表,当 Xi 和 Yi 不同的时候(一个0一个1),Di 就是1。这正好是异或(XOR) 运算的逻辑!所以 Di = Xi ^ Yi。那借位 Bo 呢?只有当 Xi 是0且 Yi 是1的时候,Bo 才是1。这正好是与(AND) 运算,但需要对 Xi 取反,即 Bo = (~Xi) & Yi。看,是不是很简单?半减器的门电路就是由一个异或门和一个与门(前面加个非门)构成的。

理解了原理,用Verilog实现就是分分钟的事。我们采用数据流描述方式,因为它最贴近逻辑表达式,一目了然:

module half_subtractor (
    input  Xi, Yi,       // 1-bit inputs
    output Di, Bo        // Difference and Borrow-out
);
    assign Di = Xi ^ Yi; // 差等于输入异或
    assign Bo = (~Xi) & Yi; // 借位等于(非Xi)与Yi
endmodule

这个模块就是我们的“乐高积木”最基础的一块。我建议你马上在仿真工具里建个测试文件,把四种输入组合 (0,0), (0,1), (1,0), (1,1) 都跑一遍,看看波形输出是不是和真值表一模一样。动手验证是巩固记忆的最好方式。半减器虽然简单,但它清晰地定义了减法操作中“差”和“借位”这两个核心概念,这是我们构建更复杂电路的基石。

2. 升级到全减器:让计算“顾全大局”

半减器好用,但它有个明显的“缺陷”:它太“自私”了,只关心自己眼前的两个数,完全不管低位是不是已经欠了债(即借位)。在实际的多位数减法中,比如计算 1011 - 0111,每一位的计算都必须考虑来自右边低位的借位。这就需要功能更完整的“全减器”。

全减器在半减器的基础上,增加了一个关键的输入:来自低位的借位输入(Borrow-in, Bi)。现在,它有三个输入:Xi(被减数位)、Yi(减数位)、Bi(低位借来的)。输出依然是两个:Di(差位)和 Bo(向高位的借位输出)。它的计算逻辑是:Xi - Yi - Bi。因为 Bi 可能是0或1,所以情况比半减器复杂一些。

我们来看全减器的真值表,它包含了所有8种输入组合(2的3次方):

XiYiBiDiBo
00000
00111
01011
01101
10010
10100
11000
11111

这个表怎么读?我举两个典型的例子。第二行:Xi=0, Yi=0, Bi=1。意思是,我这一位本来是0减0,但低位借走了1(Bi=1),所以我相当于 0 - 0 - 1,不够减,结果 Di 应该是1(二进制补码运算下的结果),同时我必须向高位借1,所以 Bo=1。再看第七行:Xi=1, Yi=1, Bi=0,就是 1-1-0=0,不借位。

从真值表推导逻辑表达式稍微麻烦点,但我们可以用卡诺图化简,或者直接观察规律。差 Di 的输出,你会发现当三个输入 Xi, Yi, Bi 中1的个数是奇数个时,Di=1;偶数个时,Di=0。这其实就是三输入异或运算的特性!所以 Di = Xi ^ Yi ^ Bi。这个结论非常优美,它和全加器中“和(Sum)”的表达式形式完全一致。

借位输出 Bo 的逻辑稍微复杂:Bo = (~Xi & (Yi ^ Bi)) | (Yi & Bi)。这个式子可以这样理解:向高位借位发生在两种情况下:第一,Xi 是0,同时 Yi 和 Bi 至少有一个是1(即 Yi 和 Bi 异或结果为1,表示它们不同,但结合 Xi=0 的语境,其实就是 Yi 或 Bi 为1导致不够减);第二,Yi 和 Bi 同时为1,这时无论 Xi 是什么,都肯定需要借位(因为相当于减去了至少2)。这个表达式也可以用基本门电路实现。

Verilog实现全减器,我们可以用行为级描述直接体现其计算逻辑,这样写起来更直观,也便于综合工具优化:

module full_subtractor (
    input  Xi, Yi, Bi,
    output Di, Bo
);
    // 差是三个输入的异或
    assign Di = Xi ^ Yi ^ Bi;
    // 借位输出逻辑
    assign Bo = (~Xi & (Yi ^ Bi)) | (Yi & Bi);
endmodule

当然,你也可以用两个半减器和一个或门来搭建一个全减器,这就像用基础积木拼装复杂模型一样,有助于理解模块间的层次关系。全减器这个模块,就是我们可以用来搭建任意位宽减法器的标准“砖块”了。在实际的芯片设计中,全减器和全加器在逻辑结构上有很强的对称性,理解这一点对后续设计共享的算术单元至关重要。

3. 构建完整的减法器:串行与共享设计

有了全减器这块“砖”,我们就可以盖“房子”——构建多位的减法器了。最直观的方法,就是把N个全减器像链条一样串起来,低位的借位输出(Bo)连接到高位的借位输入(Bi)。这种结构被称为行波借位减法器,它和数字电路里经典的“行波进位加法器”是孪生兄弟。

3.1 行波借位减法器

假设我们要做一个16位的减法器,计算 X[15:0] - Y[15:0]。最低位(第0位)比较特殊,因为没有更低的位,所以它的借位输入 Bi[0] 固定接0。它的全减器计算 X[0] - Y[0] - 0,产生差 D[0] 和借位 Bo[0](即 Bi[1])。然后 Bo[0] 连接到第1位全减器的 Bi[1],第1位计算 X[1] - Y[1] - Bi[1],以此类推,借位信号像波浪一样从最低位逐级传递到最高位。最高位的借位输出 Bo[15] 就是整个减法运算的最终借位,通常它表示结果是否为负(在无符号数减法中)或用于溢出判断。

用Verilog描述一个16位行波借位减法器非常简洁,我们可以实例化16个全减器模块并将它们连接:

module ripple_borrow_subtractor_16bit (
    input  [15:0] X, Y, // 16-bit inputs
    output [15:0] D,    // 16-bit difference
    output Bout         // Final borrow out
);
    wire [16:0] borrow; // 内部借位连线,borrow[0]作为最低位输入,borrow[16]作为最终输出

    assign borrow[0] = 1'b0; // 最低位没有借位输入

    // 生成语句,实例化16个全减器
    genvar i;
    generate
        for (i=0; i<16; i=i+1) begin: sub_chain
            full_subtractor u_full_sub (
                .Xi (X[i]),
                .Yi (Y[i]),
                .Bi (borrow[i]),
                .Di (D[i]),
                .Bo (borrow[i+1])
            );
        end
    endgenerate

    assign Bout = borrow[16]; // 最终借位输出
endmodule

这种方法的优点是结构清晰,直接反映了减法原理,非常适合教学和理解。但它的缺点也和行波进位加法器一样:速度慢。因为借位信号必须从最低位一步一步传到最高位,如果位宽很大(比如64位),这条链路的延迟就会成为性能瓶颈。在实际的高性能处理器中,我们很少直接用这种串行结构。

3.2 更巧妙的思路:加减法器共享结构

在真实的CPU设计里,面积和速度都是黄金。如果能为加法和减法设计一个共用的硬件单元,那就能节省大量的逻辑资源。幸运的是,利用二进制补码的特性,我们可以非常优雅地实现这一点。

这里的关键公式是:X - Y = X + (~Y) + 1。其中 ~Y 表示对Y的每一位取反。这个公式告诉我们,减法可以转化为加法来做:先把减数Y按位取反,然后和被减数X相加,最后再加1。

基于这个原理,我们可以改造一个加法器(比如一个行波进位加法器),让它既能做加法又能做减法。我们引入一个控制信号,通常叫 sub(减法)或者 add_sub。当 sub=0 时,执行加法 X+Y;当 sub=1 时,执行减法 X-Y。

具体电路怎么做呢?我们让这个控制信号同时控制两件事:

  1. 控制Y输入的数据:当 sub=1(做减法)时,将Y的每一位与 sub 信号进行异或。因为 sub 是1,异或的结果就是 Y^1 = ~Y(取反)。当 sub=0(做加法)时,Y^0 = Y,数据不变。
  2. 控制最低位的进位输入:加法器本身有一个进位输入 Cin。我们让 Cin 直接等于控制信号 sub。这样,做加法时 Cin=0;做减法时 Cin=1,正好对应了公式里“+1”的那一步。

于是,这个单元的运算就变成了:Result = X + (Y ^ {sub, sub, ...}) + sub。完美地将加法和减法统一到了一个电路中。这种设计在处理器算术逻辑单元(ALU)中极为常见。我们来看一个简单的Verilog实现:

module add_sub_16bit (
    input  [15:0] A, B,     // 两个操作数
    input         sub,       // 控制信号:0=加法,1=减法
    output [15:0] Result,
    output        Cout       // 进位/借位输出
);
    wire [15:0] B_modified;
    wire        Cin;

    // 关键操作:通过异或实现B的原码/反码选择
    assign B_modified = B ^ {16{sub}}; // 如果sub=1,则B每一位与1异或,即取反
    assign Cin = sub;                  // 进位输入等于控制信号

    // 调用一个标准的16位加法器(可以是行波进位,也可以是更快的结构)
    ripple_carry_adder_16bit u_adder (
        .A   (A),
        .B   (B_modified),
        .Cin (Cin),
        .Sum (Result),
        .Cout(Cout)
    );
    // 注意:对于减法,Cout的含义需要结合溢出判断来理解,有时需要取反。
endmodule

这里我调用了另一个模块 ripple_carry_adder_16bit,就是一个普通的16位加法器。你看,我们并没有重新设计减法逻辑,只是通过一个巧妙的控制信号,在加法器的基础上“免费”获得了减法功能。这就是数字电路设计的魅力:用最少的资源,实现最多的功能。

4. Verilog实现实战与关键优化策略

理论说了一大堆,是时候动手写代码了。在这一部分,我会带你实现两个版本的16位减法器,并深入探讨几个在实现和优化中你必须知道的“坑”和技巧。

4.1 两种实现方案的代码对比

首先,我们把前面提到的两种方法用完整的、可综合的Verilog代码实现出来。

方案一:基于全减器的行波借位减法器 这个方案需要我们先写好全减器模块,然后顶层例化。代码结构清晰,是学习的好材料。

// 全减器模块(复用之前的代码)
module full_subtractor (
    input  Xi, Yi, Bi,
    output Di, Bo
);
    assign Di = Xi ^ Yi ^ Bi;
    assign Bo = (~Xi & (Yi ^ Bi)) | (Yi & Bi);
endmodule

// 顶层:16位行波借位减法器
module subtractor_ripple_16bit (
    input  [15:0] a, b,
    output [15:0] diff,
    output borrow_out
);
    wire [16:0] borrow_wire; // 17位借位连线

    assign borrow_wire[0] = 1'b0; // 最低位借位输入为0

    // 使用generate循环例化16个全减器
    genvar i;
    generate
        for (i = 0; i < 16; i = i + 1) begin: sub_block
            full_subtractor u_sub (
                .Xi (a[i]),
                .Yi (b[i]),
                .Bi (borrow_wire[i]),
                .Di (diff[i]),
                .Bo (borrow_wire[i+1])
            );
        end
    endgenerate

    assign borrow_out = borrow_wire[16];
endmodule

方案二:基于加法器改造的共享加减法器 这个方案更贴近实际应用。我们需要一个加法器核心,这里为了简单,我们先写一个行波进位加法器,然后再包装成加减法器。

// 首先,实现一个16位行波进位加法器
module adder_rc_16bit (
    input  [15:0] A, B,
    input         Cin,
    output [15:0] Sum,
    output        Cout
);
    wire [16:0] carry;
    assign carry[0] = Cin;

    genvar j;
    generate
        for (j = 0; j < 16; j = j + 1) begin: add_block
            // 一位全加器逻辑:Sum = A^B^Cin, Cout = A&B | (A^B)&Cin
            assign Sum[j] = A[j] ^ B[j] ^ carry[j];
            assign carry[j+1] = (A[j] & B[j]) | ((A[j] ^ B[j]) & carry[j]);
        end
    endgenerate
    assign Cout = carry[16];
endmodule

// 然后,构建加减法器
module add_sub_unit_16bit (
    input  [15:0] op1, op2,
    input         mode, // 0: add, 1: sub
    output [15:0] result,
    output        overflow // 溢出标志,简化处理
);
    wire [15:0] op2_modified;
    wire        cin;
    wire        cout;

    // 核心转换逻辑
    assign op2_modified = op2 ^ {16{mode}}; // mode=1时取反
    assign cin = mode;                      // mode=1时Cin=1

    // 调用加法器
    adder_rc_16bit u_core_adder (
        .A   (op1),
        .B   (op2_modified),
        .Cin (cin),
        .Sum (result),
        .Cout(cout)
    );

    // 溢出判断(对于有符号数):当两个正数相加得负,或两个负数相加得正时溢出
    // 简化版:检查最高位的进位输入和进位输出是否不同
    assign overflow = (op1[15] == op2_modified[15]) && (result[15] != op1[15]);
endmodule

4.2 仿真测试与结果分析

代码写好了,不仿真就是纸上谈兵。我们必须写一个全面的测试平台(Testbench)来验证功能。测试要覆盖边界情况,比如全0、全1、最大值减最小值等。

`timescale 1ns/1ps
module tb_add_sub();

    reg  [15:0] a, b;
    reg         mode;
    wire [15:0] result;
    wire        overflow;

    // 实例化被测单元
    add_sub_unit_16bit uut (
        .op1      (a),
        .op2      (b),
        .mode     (mode),
        .result   (result),
        .overflow (overflow)
    );

    initial begin
        // 初始化
        a = 0; b = 0; mode = 0;
        #10;

        // 测试加法
        $display("=== Testing Addition (mode=0) ===");
        mode = 0;
        a = 16'h0005; b = 16'h0003; #10; $display("5 + 3 = %h, overflow=%b", result, overflow);
        a = 16'h7FFF; b = 16'h0001; #10; $display("32767 + 1 = %h (overflow expected)", result, overflow);

        // 测试减法
        $display("\n=== Testing Subtraction (mode=1) ===");
        mode = 1;
        a = 16'h0005; b = 16'h0003; #10; $display("5 - 3 = %h", result);
        a = 16'h0003; b = 16'h0005; #10; $display("3 - 5 = %h (negative result in two's complement)", result);
        a = 16'h8000; b = 16'h0001; #10; $display("-32768 - 1 = %h (overflow expected)", result, overflow);

        // 测试补码边界
        a = 16'hFFFF; b = 16'hFFFF; #10; $display("-1 - (-1) = %h", result);

        $finish;
    end
endmodule

运行这个测试,在波形查看器里,你可以清晰地看到当 mode 切换时,op2_modified 信号的变化(取反或不取反),以及 cin 的变化。同时,观察 result 和 overflow 标志,确保它们符合预期。特别是对于减法,要理解结果是二进制补码形式,对于 3-5 这样的负数结果,result 会显示为 0xFFFE(即-2的16位补码)。

4.3 性能优化与高级设计考量

如果你以为到这里就结束了,那在实际项目中可能会吃亏。行波进位/借位结构只是入门,它的延迟是O(N),N是位宽。对于高性能设计,我们必须考虑优化。

策略一:超前进位(Lookahead Carry) 这是最经典的加速方法。其思想是提前计算出每一位的进位(或借位),而不是等待前一位算完。通过逻辑公式直接根据所有输入位计算高位的进位。例如,对于一个4位块,我们可以直接写出 C4 关于 A[3:0], B[3:0] 和 C0 的逻辑表达式。这样,无论位宽多大,进位链的延迟被压缩到几级门延迟。我们可以用多个小型的超前进位加法器(如4位CLA)组合成更大的加法器,构成树形结构,这就是超前进位加法器(CLA)。将其中的加法核心换成我们之前的加减法转换逻辑,就得到了超前进位加减法器,速度极大提升。

策略二:选择进位加法器(Carry-Select Adder) 另一种思路是“预计算”。例如,将16位加法器分成4个4位小组。对每个小组,我们同时计算两套结果:一套假设来自低组的进位是0,另一套假设是1。当低组的真实进位产生后,我们只需要用一个多路选择器(MUX)快速选择正确的那套结果即可。这种方法通过增加面积(约一倍)来换取速度,是一种典型的面积换速度策略。在减法器中同样适用。

策略三:关注综合结果与面积权衡 当你把Verilog代码交给综合工具(如Design Compiler)时,工具会根据你指定的时序和面积约束进行优化。有时候,你手写的行波结构可能被工具自动优化成更并行的结构。关键在于给你的设计加上正确的约束。例如,如果你在代码中明确写出了 if (mode) result = a - b; else result = a + b; 这样的行为级描述,优秀的综合工具可能会识别出这是加减法操作,并自动调用工艺库中高度优化的加减法器IP核,其性能远超我们手写的代码。所以,在行为级描述清晰和结构级描述可控之间,需要根据设计阶段做权衡。

一个容易忽略的坑:溢出与借位标志的处理 对于加法,进位输出 Cout 在无符号数运算中表示溢出。对于减法,情况更复杂。当我们用 X + ~Y + 1 做减法时,最终加法器产生的 Cout 并不直接等于减法需要的“借位”。实际上,对于无符号数减法,真正的借位 Bout 应该是 ~Cout(即加法器进位输出取反)。而对于有符号数,我们更关心的是“溢出”标志,它判断结果是否超出了有符号数的表示范围。在上面的示例代码中,我给出了一个简化的溢出判断逻辑。在实际的ALU设计中,溢出和借位标志位的生成电路需要精心设计,它与数据表示(补码、原码)和操作类型紧密相关,是验证的重点之一。

从我多年的流片经验来看,初学者往往在功能仿真阶段就止步了,但真正的挑战在于后仿真、时序验证和物理实现。一个能在1GHz频率下稳定工作的32位ALU,其进位链的设计绝非简单的行波结构。你需要考虑时钟偏差、信号完整性、以及功耗。现代处理器通常使用更复杂的结构,如并行前缀加法器(如Kogge-Stone、Brent-Kung),它们能以对数级延迟完成N位加法,是高性能计算核心的标配。理解从半减器、全减器到行波借位减法器这条路径,是为了打下坚实的理论基础,让你在未来面对这些复杂优化时,能清楚地知道它们到底在优化什么,以及为什么要这样优化。

从逻辑门到ALU:揭秘加法器设计如何构建计算机的运算核心 本文深入解析了从基础逻辑门到算术逻辑单元(ALU)的设计演进,重点探讨了加法器作为计算机运算核心的关键技术。通过全加器、补码运算和标志位系统等核心组件,揭示了计算机如何高效执行算术运算,并分享了硬件设计中的速度与面积优化策略。文章特别强调了补码在简化电路设计中的魔法般作用,以及现代ALU如何集成多种运算功能。 阅读详情

相关推荐

从全加器到ALU:八位串行可控加减法器设计与计算机运算核心原理

运算器是计算机中央处理器(CPU)的核心部件,负责执行算术与逻辑运算。其基础原理建立在二进制运算和布尔代数之上,通过逻辑门电路实现。算术逻辑单元(ALU)作为运算器的关键模块,其设计核心在于高效、准确地完成加减乘除等基本运算。在硬件实现层面,补码表示法使得减法可以统一为加法操作,极大地简化了电路设计。串行运算器虽然速度不及并行方案,但其结构规整、时序清晰,是理解数据通路、控制器协同以及时钟同步机制的绝佳教学模型。通过设计并实现一个八位串行可控加减法器,可以深入掌握从全加器、移位寄存器到简单状态机的完整数字系

weixin_29184371的博客 303

Verilog 半减器和全减器

数字逻辑基础知识整理

weixin_62651190的博客 1万+

【HDL系列】半减器、全减器和减法器原理和设计

目录 一、半减器 二、全减器 三、减法器 四、Verilog设计 减法器可由基础的半减器和全减器模块组成,或者基于加法器和控制信号搭建。 定义N比特被减数X,减数Y,差为D(difference); 来自低比特借位Bi,向高比特借位Bi+1,i为比特序号; 所以,有以下结论: 一、半减器 半减器用于计算两比特Xi和Yi的减法,输出结果Di和向高位的借位Bo(Borrow o...

纸上谈芯的专栏 5万+

Verilog基础之三、减法器实现

设计2个4位数的减法器,包括全减器和半减器,同时分别采用always和assign语句来实现。对比加法器和半加器综合图,可见二者使用的资源一致,差异点为LUT的INIT值不同。对于N位的减法,可以通过定义一个参数N,需要修改位数时,只需修改N的值即可。​减法器的实现与加法器类似,根据是否考虑借位分为半减器和全减器。

zyp626的博客 3154

Verilog 加法器和减法器(7)

在计算机中浮点数 表示通常采用IEEE754规定的格式,具体参考以下文章。https://www.cnblogs.com/mikewolf2002/p/10095995.html下面我们在Verilog中用状态机实现单精度浮点数的加减法功能。这个实现是多周期的单精度浮点加法。浮点加法分为以下几个步骤:1.初始化阶段,分离指数和尾数以及符号位。判断加数和被加数是否是规约浮点数,不是话,直接置over...

weixin_33785972的博客 1885

设计FPGA半减法器:原理、代码和实现

在 Quartus Prime 中,选中编写好的 Verilog HDL 文件,右键单击并选择“Create Simulation File”,然后根据需要选择仿真波形设置,最后单击“Create”按钮即可生成仿真文件。在数字电路中,减法器是一个常见的模块,用于计算两个二进制数之间的差值。总结起来,在 FPGA 中,实现半减法器的原理是通过使用Verilog HDL来描述其逻辑关系,并使用Quartus Prime进行仿真验证。半减法器需要两个输入和两个输出,其中输入 A 和 B 是被减数和减数;

与其临渊羡鱼,不如退而结网 1093

华中科技大学-32位ALU实验

华中科技大学-32位ALU实验设计

qq_46037206的博客 9093

【FPGA】Verilog 实践:半加器与全加器 | 半减器与全减器 | Code Converter

本章主要理解加法器和减法器的概念,并了解 Code converter 的概念。使用 Verilog 实现多种加法器、减法器和代码转换器,通过 FPGA 验证 Verilog 实现的电路的行为。

有道无术, 术尚可求。有术无道, 止于术。 5518

第二章 数据的表示和运算

以上问题是结合现实中的乘法实现的总结出来的关键点,因为在运算过程中,被乘数X乘数中时,可以根据乘数中的一位来决定最后在相加时加上被乘数的几倍。并且最后的乘积结果的长度有可能会是原来数的2倍,这个在二进制乘法中又该如何实现?在十进制手算中,最后的结果几个数相加得出来的,这个在机器乘法中难道要把数据保存下来再去相加得出结果吗?

qq_44419734的博客 973

Vivado仿真网表输出高阻态

1.1 Vivado仿真网表输出高阻态 1.1.1 本节目录 1)本节目录; 2)本节引言; 3)FPGA简介; 4)Vivado仿真网表输出高阻态; 5)结束语。 1.1.2 本节引言 “不积跬步,无以至千里;不积小流,无以成江海。就是说:不积累一步半步的行程,就没有办法达到千里之远;不积累细小的流水,就没有办法汇成江河大海。 1.1.3 FPGA简介 FPGA(Field Programmable Gate Array)是在PAL、GAL等可编程器件的基础上进一步发展的产物。它是作为

m0_46498597的博客 4598

智能汽车域控制器FOTA升级方案探讨

上文提到的Entry属性,包括Active 属性, Bootable 属性, Successful 属性, Retrycnt 属性 ,Active 属性用于标志槽的优先级,bootloader优先选择Active 属性=1的槽启动,Bootable 属性标志槽可否可启动,Successful 属性标志槽是否成功启动过,Retrycnt 属性标志槽可尝试启动的次数。芯片启动后,首先进入Bootloader阶段,此阶段将读取存储系统的分区属性,根据属性值进行逻辑判断,并确定进入哪个分区,详见流程图。

huibian1234的博客 1570

二、数据的表示和运算(四)基本运算部件与运算电路

ALU是一种功能较强的组合逻辑电路。它能进行多种算术运算、逻辑运算和辅助功能如移位运算。 ALU的核心是带标志位加法器。

24考研人晴落的博客 2899

免Root抓包神器Packet Capture:安卓App数据捕获全攻略

本文详细介绍了免Root安卓抓包神器Packet Capture的安装与使用全攻略。通过利用安卓系统的VPN Service API,该工具无需Root权限即可捕获并解密App的HTTP/HTTPS网络流量。文章从核心原理、证书安装、实战抓包步骤到结果分析与常见问题排查,提供了完整指南,是移动端开发、安全测试和数据分析的实用利器。

weixin_29232507的博客 1083

verilog全加器、全减器和乘法器及溢出判断

全加器 转自:https://www.cnblogs.com/SYoong/p/5917296.html 先以一位全加器为例:Xi、Yi代表两个加数,Cin是地位进位信号,Cout是向高位的进位信号。列表有:   Xi     Yi    Cin Sum Cout 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 1 1 0 1 1 0 0 1 0 1 0 1 0 1 1 1 0

我的blog屋 6754

OpenClaw 预置技能完全指南

OpenClaw 技能(Skills)是扩展 AI 助手能力的插件系统。🔐 管理密码和敏感信息(1Password)📝 操作 Apple Notes 和 Reminders🔍 实时搜索互联网(Brave Search)🎨 生成和编辑图片(Nano Banana Pro)📧 收发邮件(Himalaya)🏠 控制智能家居(OpenHue、Eight Sleep)💬 发送消息(iMessage、WhatsApp、Slack)🎵 控制音乐播放(Spotify、Sonos)

Maynor的博客 1704

Ubuntu24.04安装搜狗输入法详细教程

本章教程,介绍如何在Ubuntu24.04版本操作系统上安装搜狗输入法。

猿小白的博客 1万+

半加器的简述(Verilog描述)

EDA半加器简述

weixin_42100337的博客 5116

Qt垂直滚动条QVerticalScrollBar详解:从基础到实战的控件开发指南

本文系统解析Qt中QVerticalScrollBar的用法,从基础概念到进阶技巧。主要内容包括:1)基础认知:介绍其继承关系、作用及典型应用场景;2)核心用法:创建方法、关键属性配置和信号槽连接;3)进阶技巧:自定义样式表美化外观,以及与自定义内容区域的联动实现;4)实战注意事项,如避免循环触发和高DPI适配等。文章强调掌握QVerticalScrollBar对提升Qt滚动类功能开发效率的重要性,并建议通过自定义文本编辑器实践巩固知识点。

专注现代C++实战,从核心语法到高性能编程,助力开发者深入掌握系统级编程精髓。 759

Verilog——半加器详解

半加器:用于计算两个一位二进制相加,不考虑低位进位。 (1) 我们现在假设一下:a和b都是输入信号,cout是输出信号,sum是求和 (2) 那么它们的真值表可以表示为: ~~~~ 加数a 加数b 进位cout 和数sum 根据真值表,可以快速的得到输入输出关系(逻辑结构)是: cout = a^b(表示a异或b)也就是(a&(b)+b&(a)) sum = a&b(...

weixin_43862765的博客 3万+

无人机威胁检测(Hostile Drone Detection)——基于YOLOv10与UI界面的实现

Anti-UAV数据集由多种场景下的无人机视频与图片组成,包含无人机目标的多样化姿态、背景、光照变化,专门用于反无人机检测研究。YOLO(You Only Look Once)系列是当前流行的实时目标检测算法,具有速度快、精度高的特点。网络结构优化:更深更轻的主干网络,提升特征提取能力。检测头改进:多尺度特征融合,更好检测小型目标如无人机。训练技巧:使用自动混合精度训练(AMP)、数据增强、标签平滑等技术。

YOLO 231

腾讯音乐 QQ音乐商业化客户端开发工程师:岗位深度解析与面试攻略

腾讯音乐QQ音乐商业化客户端开发工程师岗位要求3年以上Android开发经验,熟练掌握Kotlin/Java及跨端开发技术。核心职责包括QQ音乐客户端功能开发、架构优化、性能提升及技术攻关。岗位要求计算机相关本科以上学历,具备完整项目开发经验,熟悉TCP/IP等网络协议,能独立解决复杂技术问题。面试重点考察项目经验、架构设计、性能优化及新技术研究能力,建议候选人准备具体案例,量化成果,并熟悉Flutter等跨端技术。该职位强调技术深度与产品思维的结合,需展现扎实的编程基础、问题解决能力和团队协作精神。

郑伟强dev的专栏 368

Verilog实现减法器

verilog实现减法器

qq_43483403的博客 2万+

【图像分类】卷积神经网络之VGGNet网络模型实现花卉图像识别(附代码和数据集,PyTorch框架)

卷积神经网络之VGGNet网络模型实现花卉图像识别(附代码和数据集,PyTorch框架)

学无止境、积少成多、厚积薄发 2431

verilog实现半加器和全加器

//描述:用verilog实现半加器,再用半加器实现全加器 //==================================<半加器>========================================================== module half_adder( input a, input b, output sum,

weixin_45912567的博客 6483

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

上一篇: CRMEB电商系统安装避坑大全:从环境配置到伪静态设置的完整流程
下一篇: Vivado18.2 PCIE IP核配置避坑指南:从BAR设置到中断优化的实战经验
普通网友
博客等级 码龄27年 205粉丝 1502原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值