使用Verilog HDL语言实现4位超前进位加法器

2023-05-16

一、1位半加器的实现

1.1 原理

半加器由两个一位输入相加,输出一个结果位和进位,没有进位输入的加法器电路。

1.2 真值表

这里写图片描述

1.3 逻辑表达式

S = A ^ B
C = A & B

1.4 Verilog 实现

module half_adder(
input  a,
input b, 
output sum,
output c_out
);

assign sum = a^b;
assign cout = a&b;
endmodule

二、1位全加器的实现

2.1 原理

由两个1位的加数和一个进位作为输入,输出一个结果位和进位,与半加器相比,全加器不只考虑本位计算结果是否有进位,也考虑上一位对本位的进位。

2.2 真值表

这里写图片描述

2.3 逻辑表达式

Si =Ai ^ Bi^ Ci-1
Ci = AiBi + AiCi-1 + BiCi-1 = AiBi + (Ai+Bi)Ci-1

2.4 Verilog 实现

2.4.1 两个半加器和一个或门实现

module full_adder(
input a,
input b,
input c_in,
output sum,
output c_out
);
wire sum1;
wire c_out1,c_out2;

half_adder  half_adder1(.a(a),.b(b),.sum(sum1),.c_out(c_out1));
half_adder  half_adder2(.a(co),.b(sum1),.sum(sum),.c_out(c_out2));
assign c_out =  c_out1|c_out2;
endmodule

2.4.2 若不用半加器实现,通常三种建模方法,用结构化描述举例

这里写图片描述
Si =Ai ^ Bi^ Ci-1
Ci = AiBi + AiCi-1 + BiCi-1 = AiBi + (Ai+Bi)Ci-1

module full_adder (
input a,
input b,
input c_in,
output sum,
output c_out
);
wire S1, T1, T2, T3;

xor x1 (S1, a, b);
xor x2 (Sum, S1, c_in);
and A1 (T3, a, b );
and A2 (T2, b, c_in);
and A3 (T1, a, c_in);
or O1 (c_out, T1, T2, T3 );
endmodule

三、4位串行加法器

3.1 原理

由4个1位全加器串联形成4位加法器,上一全加器的进位输出端作为下一全加器的进位输入端

3.2 原理图

这里写图片描述

3.3 逻辑表达式

S0=A0 ^ B0^ Cin
S1 =A1^ B1^ C0
S2 =A2 ^ B2^ C1
S3 =A3 ^ B3^ C2

C0 = A0B0+ A0Cin + B0Cin
C1 = A1B1 + A1C0 + B1C0
C2 = A2B2+ A2C1 + B2C1
C3= A3B3 + A3C2 + B3C2

3.4 Verilog 实现

3.4.1 例化四个1位全加器实现4位串行加法器

module add_4 ( 
input [3:0]a, 
input [3:0]b, 
input c_in, 
output [3:0] sum, 
output c_out 
); 
wire [3:0] c_tmp; 

full_adder i0 ( a[0], b[0], c_in, sum[0], c_tmp[0]); 
full_adder i1 ( a[1], b[1], c_tmp[0], sum[1], c_tmp[1] );  
full_adder i2 ( a[2], b[2], c_tmp[1], sum[2], c_tmp[2] );  
full_adder i3 ( a[3], b[3], c_tmp[2], sum[3], c_tmp[3] );  
assign c_out = c_tmp[3];
endmodule

3.4.2 行为级建模方式描述4位加法器

module add_4(
    input [3:0] a,
    input [3:0] b,
    input c_in,
    output [3:0] sum,
    output c_out
    );

assign {c_out,sum} = a+b+c_in;

endmodule

使用了拼接运算符——{a,b}

四、4位超前进位加法器的实现

4.1 原理

对普通的全加器进行改良设计的并行加法器,主要针对普通全加器串联互相进位产生延迟而进行改良

Si =Ai ^ Bi^ Ci-1
Ci = AiBi + AiCi-1 + BiCi-1 = AiBi + (Ai+Bi)Ci-1

令 Gi=Ai*Bi ; Pi=Ai+Bi 代入Ci =AiBi + (Ai+Bi)Ci-1
得 Ci=Gi+Gi*Ci-1

C0 = C_in
C1=G0 + P0·C0
C2=G1 + P1·C1 = G1 + P1·G0 + P1·P0 ▪C0
C3=G2 + P2·C2 = G2 + P2·G1 + P2·P1·G0 + P2·P1·P0·C0
C4=G3 + P3·C3 = G3 + P3·G2 + P3·P2·G1 + P3·P2·P1·G0 + P3·P2·P1·P0·C0
C_out=C4

4.2 原理图

这里写图片描述

4.3 Verilog 实现4位超前加法器

module fastadd_4(
  input[3:0] a,
  input[3:0] b,
  input c_in,
  output[3:0] sum,
  output c_out
  );
  wire[4:0] g,p,c;
    assign c[0]=c_in;
    assign p=a^b;
    assign g=a&b;
    assign c[1]=g[0]|(p[0]&c[0]);
    assign c[2]=g[1]|(p[1]&(g[0]|(p[0]&c[0])));
    assign c[3]=g[2]|(p[2]&(g[1]|(p[1]&(g[0]|(p[0]&c[0])))));
    assign c[4]=g[3]|(p[3]&(g[2]|(p[2]&(g[1]|(p[1]&(g[0]|(p[0]&c[0])))))));
    assign sum=p^c[3:0];
    assign c_out=c[4];
endmodule

仿真测试代码:

`timescale 1ns/1ps
module add_top;
reg [3:0] a,b;
reg c_in;
wire [3:0] sum;
wire c_out;
fastadd_4 x(.a(a),.b(b),.c_in(c_in),.sum(sum),.c_out(c_out));
initial begin
  a=4'b0000;
  b=4'b0000;
  c_in=0;
end
always #5 c_in=c_in+1;
always #10 a=a+1;
always #160 b=b+1;
endmodule
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用Verilog HDL语言实现4位超前进位加法器 的相关文章

  • 为什么我的输出没有被赋值?

    我正在为一个更大项目的一部分开发解码器 我有两个计数器充当该模块的输入 其中一个计数器计数 0 15 另一个计数器在第一个计数器达到 15 时递增一次 根据计数器的值 解码器输出不同的值 通常它是 0 1 或 1 但有时它必须是 0 707
  • Quartus Prime 中的“多个常量驱动程序”Verilog 错误

    我正在致力于用 Verilog 设计一个有限状态机来表示堆栈 该模块如下 module state machine s Enable Clock Resetn c OF Err UF Err input 2 0 s input Enable
  • 使用多路复用器进行双向移位

    编辑 仅通过屏幕截图 http prntscr com lv3uqw http prntscr com lv3yhf 和我下面的代码 您仍然可以在这里理解我的目标 以防万一您不想阅读文本 我正在尝试为通用移位寄存器编写 Verilog 代码
  • |变量在verilog中是什么意思?

    我想知道什么assign hd trs detected hd trs match Verilog 中的意思 我最感兴趣的是 hd trs match部分 我知道 表示按位或 但不确定如何解释它之前没有值 它是可理解的 1 还是 0 如果它
  • 简单赋值时不输出期望值

    当我将一些值分配给具有四位的变量时 当我简单地输出该值时 我会得到意想不到的结果 我以前从未见过这个 想知道我是否在语法上做错了什么 module main reg 3 0 x initial begin monitor b x x 001
  • 「Verilog学习笔记」 Johnson Counter

    专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点 刷题网站用的是牛客网 timescale 1ns 1ns module JC counter input clk input rst n output reg 3 0
  • 信号连接到以下多个驱动器

    我尝试运行以下命令并收到此错误 这是 Verilog 代码 module needle input referrence input penalty output index 7 0 inout input itemsets input r
  • 如何生成异步复位verilog总是阻塞凿子

    Chisel 始终生成敏感度列表中仅包含时钟的块 always posedge clk begin end 是否可以将模块配置为使用异步重置并生成这样的始终块 always posedge clk or posedge reset begi
  • 如何在RTL中使用时钟门控?

    我正在对一些时钟进行门控latch以及我设计中的逻辑 我在综合和布局布线方面没有太多经验 在 RTL 中实现时钟门控的正确方法是什么 示例1 always comb begin gated clk clk latch update en e
  • Verilog:添加寄存器的各个位(组合逻辑,寄存器宽度可参数化)

    我正在尝试想出一种方法来添加寄存器的各个位 例如 if regA 111000 then regB 3 位的总和regA 1 Verilog或SystemVerilog中是否有可以直接使用的可综合函数 运算符来执行此操作 如果不是 那么问题
  • 将枚举转换为逻辑

    考虑以下模块声明 module DFF d q CLK RESET parameter W 2 input W 1 0 d input CLK input RESET output logic W 1 0 q endmodule 当 d 和
  • if 语句导致 Verilog 中的锁存推断?

    我正在编写用于合成算法的 Verilog 代码 我对哪些情况可能导致推断锁存器有点困惑 下面是这样的一段代码 虽然它在模拟中工作得很好 但我担心它可能会导致硬件问题 always b1 or b2 b1 map b2 map m1 map
  • 如何将时钟门映射到技术库单元

    我的设计中有以下时钟门 module my clkgate clko clki ena Clock gating latch triggered on the rising clki edge input clki input ena ou
  • Verilog 中的“net”代表什么?

    我刚刚开始学习Verilog 据我了解 Verilog有net数据类型 什么是net代表 网络就是这样一种数据类型 您不使用它来存储值 它们代表物理连接 您可以将线路视为一种网络数据类型 你可以去网上看看更多here http www ee
  • 对象 <名称> 未声明

    这是我的代码 据我所知 LEDs被定义为 module sevenseg LEDs in output reg 6 0 LEDs input 3 0 in always in begin case in 0 LEDs 7 b1000000
  • Verilog 中的 If 语句和分配连线

    我试图弄清楚基于组合逻辑分配电线的基础知识 I have wire val wire x wire a wire b always begin if val 00 I want to assign x a if val 01 I want
  • 具有内部赋值延迟的阻塞和非阻塞语句之间的区别

    以下 2 个 verilog 代码片段有什么区别 1 always in out 5 in AND 2 always in out lt 5 in 考虑到always块中不存在其他行 输出会有什么不同吗 问题参考幻灯片 16 参见 o5 和
  • Verilog 双向握手示例

    我正在完成一个项目 要求是处理器内部功能单元之间的双向握手 我知道它是什么 但是有没有任何 标准 或一个简单的例子 我唯一能想到的就是两个单元之间 当它们之间有一条数据线并且当 X 发送到 Y 时 会给出一个单独的 发送 信号 当 Y 接收
  • 如何在 icarus verilog 中包含文件?

    我知道基本的 include filename v 命令 但是 我试图包含另一个文件夹中的模块 现在 该模块还包括同一文件夹中存在的其他模块 但是 当我尝试在最顶层运行该模块时 出现错误 C Users Dell Desktop MIPS
  • 学习 Verilog 的资源 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我是 Verilog 新手 有人可以推荐学习资源 书籍 视频 博客或任何他们有良好个人经验并帮助他们更

随机推荐

  • 输入rostopic echo /scan 报错:Segmentation fault (core dumped)[gazebo-2] process has died

    问题背景 xff1a 在gazebo中用rplidar实现gampping算法时 xff0c 一旦输入rostopic echo scan xff0c 就会报错 xff0c 错误 xff1a Segmentation fault core
  • C# 注释详解

    一 二 三 是智能注释也称xml注释 xff0c 会在被编译 xff0c 并生成xml文件在可执行文件中 会影响编译速度 xff0c 但不会影响代码执行速度 一级注释 xff1a 1 lt remarks gt 对类型进行描述 xff0c
  • STM32控制HC-05蓝牙模块进行通信

    一 HC 05蓝牙模块 1 简介 HC 05主从一体蓝牙串口模块采用英国CSR公司BlueCore4系列的芯片 xff0c 符合符合蓝牙2 0 43 EDR规范 xff0c 可以同带同种蓝牙功能的电脑 蓝牙主机和手机等智能终端配对 2 主要
  • 51单片机PWM的控制(呼吸灯)

    一 PWM Pulse Width Modulation脉冲宽度调制 xff0c 简称PWM PWM 脉冲宽度调制 对模拟信号电平进行数字编码的方法 xff0c 计算机只能输出0或5V的数字电压值而不能输出模拟电压 xff0c 而我们如果想
  • STM32用SPI方式控制OLED模块

    一 OLED 1 OLED模块的外观 2 OLED模块的电路图 3 OLED模块参数 项目说明接口特性3 3V 串电阻后 xff0c 可与 5V 系统连接 通信接口4 线 SPI屏幕分辨率128 64屏幕尺寸0 96 寸工作温度 40 70
  • STM32上使用UCOSII--消息队列和信号量集

    有关UCOS任务的介绍 xff1a STM32上使用UCOSII 任务 有关UCOS信号量和邮箱的介绍 xff1a STM32上使用UCOSII 信号量和邮箱 一 消息队列 使用消息队列可以在任务之间传递多条消息 消息队列由三个部分组成 x
  • PID控制算法+倒立摆控制应用

    一 位式控制算法 传统的控制算法采用位式控制算法 特点 位式控制算法输出信号只有H L两种状态算法输出信号OUT的依据 xff1a span class hljs comment 二位式 span span class hljs comme
  • 调整 mysql policy requirements

    Error xff1a mysql gt CREATE USER 39 tester 39 64 39 39 IDENTIFIED BY 39 password 39 ERROR 1819 HY000 Your password does
  • FreeRTOS简介与源码下载

    RTOS系统 实时操作系统 RTOS全称 Real Time OS 实时操作系统 xff0c 强调实时性 实时操作系统分为硬实时和软实时 硬实时要求在规定的时间内必须完成操作 xff0c 不允许超时 xff1b 软实时则没有那么严格 xff
  • FreeRTOS在STM32F4上移植

    本文是 ALIENTEK STM32F429 FreeRTOS 开发教程 第二章学习笔记 第一章笔记 FreeRTOS简介与源码下载 一 移植 1 准备工程文件 MCU用的是STM32F429的CORE xff0c 用keli创建一个基础工
  • FreeRTOS系统配置

    本文是 ALIENTEK STM32F429 FreeRTOS 开发教程 第三章学习笔记 第一章笔记 FreeRTOS简介与源码下载 第二章笔记 FreeRTOS在STM32F4上移植 FreeRTOSConfig h FreeRTOS的配
  • FreeRTOS中断分析

    本文是 ALIENTEK STM32F429 FreeRTOS 开发教程 第四章学习笔记 第一章笔记 FreeRTOS简介与源码下载 第二章笔记 FreeRTOS在STM32F4上移植 第三章笔记 FreeRTOS系统配置 一 Cortex
  • FreeRTOS临界段代码

    本文是 ALIENTEK STM32F429 FreeRTOS 开发教程 第四章学习笔记的补充 第一章笔记 FreeRTOS简介与源码下载 第二章笔记 FreeRTOS在STM32F4上移植 第三章笔记 FreeRTOS系统配置 第四章笔记
  • FreeRTOS任务基础

    本文是 ALIENTEK STM32F429 FreeRTOS 开发教程 第五章学习笔记 第一章笔记 FreeRTOS简介与源码下载 第二章笔记 FreeRTOS在STM32F4上移植 第三章笔记 FreeRTOS系统配置 第四章笔记 Fr
  • FreeRTOS任务API函数的使用

    这篇文章最后的demo工程可以在网盘中自行下载 xff1a 链接 xff1a https pan baidu com s 1o1U niMKu0RuDAFio1nKMA 密码 xff1a ysev 本文是 ALIENTEK STM32F42
  • FreeRTOS列表和列表项

    本文是 ALIENTEK STM32F429 FreeRTOS 开发教程 第七章学习笔记 第一章笔记 FreeRTOS简介与源码下载 第二章笔记 FreeRTOS在STM32F4上移植 第三章笔记 FreeRTOS系统配置 第四章笔记 Fr
  • FreeRTOS任务创建

    本文是 ALIENTEK STM32F429 FreeRTOS 开发教程 第八章学习笔记 1 第一章笔记 FreeRTOS简介与源码下载 第二章笔记 FreeRTOS在STM32F4上移植 第三章笔记 FreeRTOS系统配置 第四章笔记
  • FreeRTOS任务调度器开启

    本文是 ALIENTEK STM32F429 FreeRTOS 开发教程 第八章学习笔记 2 第一章笔记 FreeRTOS简介与源码下载 第二章笔记 FreeRTOS在STM32F4上移植 第三章笔记 FreeRTOS系统配置 第四章笔记
  • css样式缓存

    1 问题 css样式变更之后 xff0c 必须手动清缓存才能生效 2 百度 在实际项目开发过过程中 xff0c 页面是上传到服务器上的 而为了减少服务器的压力 xff0c 让用户少加载 xff0c 浏览器会将图片 css js缓存到本地中
  • 使用Verilog HDL语言实现4位超前进位加法器

    一 1位半加器的实现 1 1 原理 半加器由两个一位输入相加 xff0c 输出一个结果位和进位 xff0c 没有进位输入的加法器电路 1 2 真值表 1 3 逻辑表达式 S 61 A B C 61 A amp B 1 4 Verilog 实