HDLBits-Circuits学习小结(三)各种姿势的加法器实现

标签: Verilog  verilog

Half adder

创建一个半加法器。半加器将两个输入(不带低位的进位)相加产生和和向高位的进位。

solution:

module top_module( 
    input a, b,
    output cout, sum );
    
    assign sum = a ^ b;
    assign cout = a & b;
    
endmodule

better solution:

module top_module( 
    input a, b, cin,
    output cout, sum );
	//assign sum  = a ^ b ^ cin;
    //assign cout = a & b | a & cin | b & cin;
    assign {cout,sum} = a + b + cin;
    
endmodule

Full adder

创建一个全加法器。一个全加法器将三个位(包括进位)相加,并产生一个总和与一个进位。

solution:

module top_module( 
    input a, b, cin,
    output cout, sum );
    
    assign sum = a^b^cin;
    assign cout = a&b | a&cin | b&cin;

endmodule

better solution:

module top_module( 
    input a, b, cin,
    output cout, sum );
    
    assign {cout,sum} = a+b+cin;

endmodule

3-bit binary adder

实例化3次一位全加器来创建一个3位二进制行波进位加法器。该加法器有两个3位输入和一个低位的进位,产生一个3位的和和一个输出。
为了验证这里确实实例化了全加器,行波进位加法器也输出每个一位全加器进位的输出。
cout[2]是最后一个一位全加器的进位输出,也是我们通常看到的进位输出。

什么是行波进位加法器?

HDLBits-Verilog学习小结(四)Module中有介绍。
ripple-carry adder

solution:

module top_module( 
    input [2:0] a, b,
    input cin,
    output [2:0] cout,
    output [2:0] sum );
    
    full_adder f0 (a[0],b[0],cin,cout[0],sum[0]);
    full_adder f1 (a[1],b[1],cout[0],cout[1],sum[1]);
    full_adder f2 (a[2],b[2],cout[1],cout[2],sum[2]);

endmodule

module full_adder( 
    input a, b, cin,
    output cout, sum );
    
    assign {cout,sum} = a+b+cin;

endmodule

Adder

实现以下电路((“ FA”是全加法器)):
Adder

solution:

module top_module (
    input [3:0] x,
    input [3:0] y, 
    output [4:0] sum);
    
    reg [2:0] cout;
    wire cin;
    assign cin = 0;
    full_adder f0 (x[0],y[0],cin,cout[0],sum[0]);
    full_adder f1 (x[1],y[1],cout[0],cout[1],sum[1]);
    full_adder f2 (x[2],y[2],cout[1],cout[2],sum[2]);
    full_adder f3 (x[3],y[3],cout[2],sum[4],sum[3]);

endmodule

module full_adder( 
    input a, b, cin,
    output cout, sum );
    
    assign {cout,sum} = a+b+cin;

endmodule

official solution(️):

module top_module (
	input [3:0] x,
	input [3:0] y,
	output [4:0] sum
);

	// This circuit is a 4-bit ripple-carry adder with carry-out.
	assign sum = x+y;	// Verilog addition automatically produces the carry-out bit.

	// Verilog quirk: Even though the value of (x+y) includes the carry-out, (x+y) is still considered to be a 4-bit number (The max width of the two operands).
	// This is correct:
	// assign sum = (x+y);
	// But this is incorrect:
	// assign sum = {x+y};	// Concatenation operator: This discards the carry-out
endmodule

Signed addition overflow

假设有2个8位二进制数a[7:0]和b[7:0]。他们相加得到s[7:0]。判断是否发生了(有符号的)溢出。

参考二进制有符号数运算及溢出判别这篇文章,可以知道:

溢出的判别
例子
补码加法运算溢出判断的方法:

  • [方法一]
    Xf、Yf分别两个数的符号位,Zf为运算结果符号位。
    当Xf =Yf =0(两数同为正),而Zf=1(结果为负)时,负溢出;
    当出现Xf =Yf =1(两数同为负),而Zf=0(结果为正),正溢出.
  • [方法二]
    Cs表示符号位的进位,Cp表示最高数值位进位,⊕表示异或。
    若 Cs⊕Cp =0 ,无溢出;
    若 Cs⊕Cp =1 ,有溢出。

solution:

module top_module (
    input [7:0] a,
    input [7:0] b,
    output [7:0] s,
    output overflow
); //
 
    wire s_1;
    assign {s_1,s} = a + b;
    always @(*) begin
        if (a[7]^b[7])//一正一负必然是不溢出的
            overflow = 0;
        else if (a[7]==0 & b[7]==0 & s[7]==0)//这个容易被忽略。要考虑最高数值位的进位不是s[7]的情况
            overflow = 0;
        else if (s_1^s[7]==0) //同方法二
            overflow = 0;
        else
            overflow = 1;
    end

endmodule

better solution:

module top_module (
    input [7:0] a,
    input [7:0] b,
    output [7:0] s,
    output overflow
); //

    assign s = a + b;
    assign overflow = (a[7] & b[7] & ~s[7]) | (~a[7] & ~b[7] & s[7]); //同方法一
    
endmodule

100-bit binary adder

创建一个100位二进制加法器。加法器将两个100位数字和一个进位相加,以产生100位和。

提示:要实例化的完整加法器太多,但是行为代码在这里效果很好。另请参阅Adder解决方案。

solution:

module top_module( 
    input [99:0] a, b,
    input cin,
    output cout,
    output [99:0] sum );
    
    assign {cout,sum} = a + b + cin;

endmodule

4-digit BCD adder

这里提供了一个名为bcd_fadd的BCD(二进制编码的十进制)一位数字加法器,该加法器将两个BCD数字和进位相加,并产生总和和进位。

module bcd_fadd {
    input [3:0] a,
    input [3:0] b,
    input     cin,
    output   cout,
    output [3:0] sum );

实例化bcd_fadd的4个副本以创建一个4位数的BCD脉动进位加法器。待设计的加法器应将两个4位的BCD编号(打包为16位向量)相加,并加上一个进位以产生4位的总和并执行。

提示:

  • 5位十进制数字12345的BCD表示为20’h12345。这与14’d12345(即14’h3039)不同。
  • 该电路的结构类似于二进制纹波加法器,只是加法器的基数为10,而不是基数2。

solution:

module top_module( 
    input [15:0] a, b,
    input cin,
    output cout,
    output [15:0] sum );
    
    reg [2:0] temp;
    
    bcd_fadd f0 (a[3:0],b[3:0],cin,temp[0],sum[3:0]);
    bcd_fadd f1 (a[7:4],b[7:4],temp[0],temp[1],sum[7:4]);
    bcd_fadd f2 (a[11:8],b[11:8],temp[1],temp[2],sum[11:8]);
    bcd_fadd f3 (a[15:12],b[15:12],temp[2],cout,sum[15:12]);

endmodule
版权声明:本文为Adidas112233原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Adidas112233/article/details/108861917

智能推荐

加法器的verilog实现(串行进位、并联、超前进位、流水线)

加法器的verilog实现(串行进位、并联、超前进位、流水线)   总结: 从下面的Timing summary来看,流水线的频率最高、并行加法器次之,串行进位加法器再次,超前进位加法器最慢。 按理论,超前进位加法器应该比串行进位加法器快,此处为何出现这种情况,原因未知。 并行加法器因为使用加法符号实现的,从RTL图上也可以看到,具体是用加法器实现的,这个加法器是经过优化的,因此速度比较...

Android 炫酷的横向和环形进度条的实例

一、概述 最近需要用进度条,秉着不重复造轮子的原则,上github上搜索了一番,看了几个觉得比较好看的ProgressBar,比如:daimajia的等。简单看了下代码,基本都是继承自View,彻彻底底的自定义了一个进度条。盯着那绚丽滚动条,忽然觉得,为什么要通过View去写一个滚动条,系统已经提供了ProgressBar以及属于它的特性,我们没必要重新去构建一个,但是系统的又比较丑,不同版本变现...

pcap包结构&SNI字段的解析

    pcap文件格式是常用的数据报存储格式,包括wireshark在内的主流抓包软件都可以生成这种格式的数据包。     文件格式:     Pcap文件头(24字节)+数据包头(wireshark增加的)+数据包(网络中抓取的)+…… 1.pcap文件头结构 各字段说明: Magic:4B:0×...

MC9S12XEP100的IIC模块(IICV3)

最近在写DS3231时钟芯片的驱动,这个芯片使用IIC进行通讯,以前没有用过IIC模块,照着教材和示例程序写程序后发现各种问题。没办法,还是官方数据手册靠谱,遂把相应部分又翻译了一遍。果然发现示例程序纯粹就是个玩具,一点用都没有。。。 第15章 集成电路总线(IICV3) 译者注:译者博客(http://blog.csdn.net/lin_strong),转载请保留这条。此为 MC9S12XEP1...

Eureka服务注册与发现

文章目录 二、SpringCLoud中遇到的技术 (一)、Eureka 1、功能: 2、什么是服务治理. 3、什么是服务注册与发现 4、Eureka包含两个组件: Eureka Server和Eureka Client 5、单机Eureka构建步骤 5.1 建model:cloud-eureka-server7001 5.2 写pom 5.3 写yml 5.4 主启动类 5.5 测试 5.6 将消...

猜你喜欢

Hard Problem【HDU-3551】【一般图最大匹配 带花树】

题目链接   题意:有N个点,M条边,给出每个点的度限制,问能不能用M条边中的几条达成这个目的?   很明显的就是一个建图的问题,很明显的,少于等于度为1的,是可以直接连的,不用限制增广,而大于度为1的,需要限制增广,就可以用这样的限流的方法:  ...

idea 打包 报错maven-shade-plugin:2.4.3:shade (default) on project xxx : Error creating shaded jar: null

idea 打包 报错maven-shade-plugin:2.4.3:shade (default) on project xxx : Error creating shaded jar: null 文章目录 idea 打包 报错maven-shade-plugin:2.4.3:shade (default) on project xxx : Error creating shaded jar: ...

015_swiftui_刘海屏适配

swiftUi创建的视图是默认在刘海屏幕的安全区域以内的。 之前我们设置图片也用到了这个个属性。 现在我们再来使用下吧 下面就是图片了。 ...

大数据入门:Spark+Kudu的广告业务项目实战笔记(一)

1.简介 这是PK老师在Spark-SQL课程中的项目实战笔记 2.项目需求 数据ETL:原始文件为JSON格式数据,需原始文件与IP库中数据进行解析 统计各省市的地域分布情况 统计广告投放的地域分布情况 统计广告投放APP分布情况 3.项目架构 4.日志字段 5.IP规则库解析 本项目利用IP规则库进行解析,在生产中应该需要专门的公司提供的IP服务。IP规则库中的一条如下: 其中第三列是该段ip...

springBoot子项目中排除掉定义在Parent中的插件(Disable a Maven plugin defined in a parent POM)

最近在和别的项目集成,需要在我们的pom中添加上对方的parent,打包的时候就遇到了问题,对方在parent中添加了一个插件,干啥的就不说了, 反正人家是用到了, 我们是用不到,但是还给我们打包带来了一些问题。 这时候就必须排除掉对方这个插件了 1,第一种方法是 有的插件提供了不加载配置,例如: 如果不想用这个插件,就把skip标签配置成true,这样在构建的时候就不会使用这个插件了。 可是有的...