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

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
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 尼尔森(Nilsson)是一个常见的瑞典姓氏,源自瑞典北部和南部地区。它起源于北欧文化中的尼尔家族,被认为是一个古老而充满历史的姓氏。 尼尔森这个姓氏在瑞典历史上非常常见,许多著名的瑞典人都拥有这个姓氏,如瑞典足球传奇运动员弗雷迪·尼尔森(Freddy Nilsson)和知名作曲家利特罗尔·尼尔森(Litorol Nilsson)。 尼尔森这个姓氏在其他国家也很常见,尤其是在瑞典人移民的国家,如美国、加拿大、澳大利亚等。在这些国家,许多姓氏为Nilsson的人注重传承瑞典文化和家族价值观,保持着对祖先的敬意。 总的来说,尼尔森是一个具有瑞典瑞典文化和历史背景的常见姓氏,代表着家族和传统的重要价值。尼尔森家族在各个领域都有杰出的人物,他们的成就为尼尔森这个姓氏增添了光彩,同时也让人们对这个姓氏有了更多的认识。 ### 回答2: 尼尔森(Nillson)是一个常见的瑞典姓氏,也可以是一个人名。作为一个姓氏,它在瑞典和其他北欧国家非常常见。像其他姓氏一样,尼尔森在使用中可能有不同的拼写和变体。 作为一个人名,尼尔森通常指的是一个男性,尤其是在北欧国家。 尼尔森可能是一个家族姓氏,也可能是给予某人的名字。尼尔森是一个非常常见的名字,特别在瑞典和丹麦。 尼尔森这个名字的起源可以追溯到瑞典和丹麦的传统和文化。 在瑞典,尼尔森很可能是尼尔的儿子或后代的意思。在丹麦,尼尔森可能是尼尔的儿子后代的意思。 虽然尼尔森可能是一个普通的名字,但它并没有特定的象征意义。 它只是一个家族姓氏或被给予的名字,没有传递特定的信息或意义,而是代表某个人或家族的身份。 就像其他姓氏和名字一样,尼尔森的使用是为了代码某个人或家族的身份和传统。 ### 回答3: 尼尔森(Nilsson),一般指的是瑞典流行巨星哈里·尼尔森(Harry Nilsson)。 哈里·尼尔森是20世纪60年代和70年代最富盛名的瑞典流行歌手之一。他以其独特的嗓音和多才多艺的音乐才能而闻名,他的音乐作品涵盖了多种风格,包括摇滚、流行、乡村和爵士等。他的代表作品包括《Without You》、《Everybody's Talkin'》和《Coconut》等。 尼尔森以其独特的音域和深情的演唱风格而受到广泛赞誉。他擅长创作动情的歌曲,并通过他的音乐传达了许多情感和体验。他的歌曲经常描绘人们在爱情、友谊和人生各个方面的复杂情感,深受听众喜爱。 尼尔森的音乐成就令人瞩目,他的专辑《Nilsson Schmilsson》获得了格莱美奖,并获得了多次金唱片认证。他的音乐影响了许多后来的音乐人,包括披头士乐队的成员以及其他许多著名艺人。 尼尔森在音乐创作方面的突出才能与他的问题生活和不幸的命运并存。他的生活中充满了酗酒、药物滥用和人际关系问题,这些困扰最终对他的音乐事业产生了重大影响。尽管他在这些问题上经历了艰难的时期,但他的音乐天赋和创造力使他成为一个不可忽视的艺人。 总的来说,哈里·尼尔森是一个备受尊敬的艺术家,他以他独特的音乐才能和感人的歌曲在乐坛中留下了难以磨灭的印记。尽管他的一生经历了许多挑战和困难,但他的音乐将继续让我们回忆和怀念。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值