0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

FPGA的算法解析1:整数操作与加减法器

FPGA之家 来源:FPGA之家 2023-02-13 15:00 次阅读

一. 整数的概念

整数在 IEEE 的规定上有短整数 short integer , 中整数 integer 和 长整数 long integer ,它们之间的关系如下:

7ecdd8d2-a924-11ed-bfe3-dac502259ad0.jpg

为了方便讨论,下面均以短整数作为例子。

原码:最高为符号位,之后是数值位。

+62 的原码表示为 00111110
-62 的原码表示为 10111110

补码:正数和0的补码与原码相同,负数的补码是将其原码的符号位保持不变,对数值位逐位求反,然后在最低位加一。对补码求补就可以得到原码。

+6 的原码表示为 00000110            +6 的补码表示为 00000110 
-5 的原码表示为 10000101            -5 的补码表示为 11111011

补码的运算规则:在FPGA的底层,有符号数都是按照补码来存储的。补码有一个特别的好处就是可以将减法转换为加法,从而将加减法统一。

7-5:
7 的补码是 00000111,-5 的补码是 11111011 ,7 + (-5) = 00000111 + 11111011 = (1)00000010
由于只有8位,因此将进位舍去得到加和的结果为 00000010,恰好是 2 的补码
3-4:
3 的补码是 00000011,-4 的补码是 11111100 ,3 + (-4) = 00000011 + 11111100 = 11111111
得到加和的结果为 11111111,恰好是 -1 的补码

溢出:两个补码相加时,如果产生的和超出了有效数字位所表示的范围,则计算结果会出错,解决的方法是扩大字长。

二. 简单的加法与减法操作

通过上面的讨论,我们可以很容易的看到,从理论上讲在底层对补码只用加法就可以完成加法与减法的操作,但是由于我们在上层是对行为进行描述,因此也是要用到减法的。

module adder8(sum,ina,inb);
// 定义输入输出变量,这个加法器不考虑进位,只需要对输入数据进行最高位扩展
output [8:0] sum;
input [7:0] ina,inb;
assign sum = {ina[7], ina} + {inb[7],inb};
endmodule

7ee031d0-a924-11ed-bfe3-dac502259ad0.png

module subber8(dif,ina,inb);
        // 定义输入输出变量,这个减法器不考虑借位,只需要对输入数据进行最高位扩展
output [8:0] dif;
input [7:0] ina,inb;
assign dif = {ina[7], ina} - {inb[7],inb};
endmodule

7efef61a-a924-11ed-bfe3-dac502259ad0.png

这是对有符号数设计的加减法器,可以看到上面的加减法都完成的很棒,并没有产生溢出的问题。

三. 采用流水线操作的加法器(耗时角度考虑)

7f1328e2-a924-11ed-bfe3-dac502259ad0.jpg

这是一个四级流水线加法器的框图,上面的加法器采用5级锁存、4级加法的结构。每一个加法器实现2位数据和上一个进位的相加,整个加法器只受2位全加器的工作速度的限制,平均完成一个加法运算只需要一个时钟周期的时间,需要注意的是由于有四级流水线,因此这个加法器在输出第一个计算值的时候有四个时钟周期的延时。这里只给出无符号数的流水线加法器的模型,都写出来太长了(其实我也没有写 )。代码写的比较繁琐,但是逻辑更清楚,主要是当做学习流水线结构的例子,真正在工程中用的话感觉还是调IP核吧。

module pipeadder8(cout,sum,ina,inb,cin,clk,rst_n);
// 定义输入输出变量
output [7:0] sum;
output cout;
input [7:0] ina,inb;
input cin,clk,rst_n;
reg [7:0] tmpa,tmpb,sum;
reg cout;
reg tmpci,firstco,secondco,thirdco;
reg[1:0] firsts;
reg[5:0] firsta,firstb;
reg[3:0] seconds;
reg[3:0] seconda,secondb;
reg[5:0] thirds;
reg[1:0] thirda, thirdb;
// 这里进行第0级数据缓存
always@(posedge clk or negedge rst_n) begin
if(!rst_n) {tmpa,tmpb,tmpci} <= {8'd0,8'd0,1'b0};
else {tmpa,tmpb,tmpci} <= {ina,inb,cin};
end
// 这里进行第1级数据缓存,并且完成最低两位以及进位位的加法
always@(posedge clk or negedge rst_n) begin
if(!rst_n) {firstco,firsts,firsta,firstb} = {1'b0,2'd0,6'd0,6'd0};
else begin
{firstco,firsts} <= tmpa[1:0] + tmpb[1:0] + tmpci;
firsta <= tmpa[7:2];
firstb <= tmpb[7:2];
end
end
// 这里进行第2级数据缓存,并且完成次低两位以及进位位的加法
always@(posedge clk or negedge rst_n) begin
if(!rst_n) {secondco,seconds,seconda,secondb} = {1'b0,4'd0,4'd0,4'd0};
else begin
{secondco,seconds} <= {{1'b0,firsta[1:0]} + {1'b0,firstb[1:0]} + firstco, firsts};
seconda <= firsta[5:2];
secondb <= firstb[5:2];
end
end
// 这里进行第3级数据缓存,并且完成次次低两位以及进位位的加法
always@(posedge clk or negedge rst_n) begin
if(!rst_n) {thirdco,thirds,thirda,thirdb} = {1'b0,6'd0,2'd0,2'd0};
else begin
{thirdco,thirds} <= {{1'b0,seconda[1:0]} + {1'b0,secondb[1:0]} + secondco, seconds};
thirda <= seconda[3:2];
thirdb <= secondb[3:2];
end
end
// 这里进行第4级数据缓存,并且完成次次次低两位以及进位位的加法
always@(posedge clk or negedge rst_n) begin
if(!rst_n) {cout,sum} = {1'b0,8'd0};
else {cout,sum} <= {{1'b0,thirda[1:0]} + {1'b0,thirdb[1:0]} + thirdco, thirds};
end


endmodule

7f23b1f8-a924-11ed-bfe3-dac502259ad0.png

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1628

    文章

    21720

    浏览量

    602859
  • 加法器
    +关注

    关注

    6

    文章

    183

    浏览量

    30110
  • 减法器
    +关注

    关注

    1

    文章

    26

    浏览量

    16837

原文标题:FPGA的算法解析1:整数操作与加减法器

文章出处:【微信号:zhuyandz,微信公众号:FPGA之家】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    数字电路中加法器减法器逻辑图分析

    多位二进制减法器,是由加法电路构成的;在加法电路的基础上,减法与加法采用同一套电路,实现加减法共用。
    发表于 09-01 16:02 2.3w次阅读
    数字电路中加<b class='flag-5'>法器</b>和<b class='flag-5'>减法器</b>逻辑图分析

    减法器电路与原理 减法器电路图分享

    减法器是一种电路,它可以实现二进制数字的减法运算。减法器的工作原理基于位运算和进位/借位机制。
    的头像 发表于 02-19 09:36 8029次阅读
    <b class='flag-5'>减法器</b>电路与原理 <b class='flag-5'>减法器</b>电路图分享

    如何设计一个16比特的减法器呢?

    减法电路是基本集成运放电路的一种,算术运算电路主要包括数字**加法器电路、数字减法器电路、数字乘法器电路和数字除法器电路。
    的头像 发表于 02-19 10:00 865次阅读
    如何设计一个16比特的<b class='flag-5'>减法器</b>呢?

    超长数加减法运算器及相关指令设计,实现精确计算

    8位单片机能够实现超长数计算吗?我说:"只要存储器够大,按照下面的方法设计的加减法运算器及指令,就能够编写程序完成。"1。用全加器搭建一个8位加法器;2。将最低下进位前连接一个1位寄存
    发表于 09-22 03:09

    减法器设计异常

    如图用op07做的减法器,不管正向输入端和反向输入端如何输入,输出都不满足减法器的理论值,求大神指导下谢谢!!!
    发表于 02-14 15:09

    哪一个是减法器?负反馈在减法器电路中的原理?

    https://bbs.elecfans.com/forum.ph ... 1&extra=#pid6113991我的问题是减法器电路中,需要负反馈吗?
    发表于 08-31 19:46

    基于单片机如何去实现20以内整数加减法训练呢

    基于单片机如何去实现20以内整数加减法训练呢?有哪些具体要求以及操作步骤呢?
    发表于 11-02 07:00

    本的二进制加法/减法器,本的二进制加法/减法器原理

    本的二进制加法/减法器,本的二进制加法/减法器原理   两个二进制数字Ai,Bi和一个进位输入Ci相加,产生一个和输出Si,以及一个进位输
    发表于 04-13 11:11 5271次阅读

    加减法电路

    加减法电路 利用一个差动输入的运放就可同时实现加减法运算,这种运算电路如图5.4-3所示。
    发表于 04-22 17:50 1.1w次阅读
    <b class='flag-5'>加减法</b>电路

    减法器电路

    减法器电路 一个通常的应用就是用于去除立体声磁带中的原唱而留下伴音(在录制时两通道中的原唱电平是一样的,但是伴音是略有不同的)。
    发表于 04-24 10:45 9796次阅读
    <b class='flag-5'>减法器</b>电路

    带输入缓冲的减法器电路

    带输入缓冲的减法器电路
    发表于 09-04 21:32 2905次阅读
    带输入缓冲的<b class='flag-5'>减法器</b>电路

    8位加法器减法器设计实习报告

    8位加法器减法器设计实习报告
    发表于 09-04 14:53 134次下载

    C语言教程之整数加减法练习

    C语言教程之整数加减法练习,很好的C语言资料,快来学习吧。
    发表于 04-22 17:45 0次下载

    基于OP07的减法器设计

    基于OP07的减法器设计
    发表于 05-15 09:17 13次下载

    FPGA常用运算模块-加减法器和乘法器

    本文是本系列的第二篇,本文主要介绍FPGA常用运算模块-加减法器和乘法器,xilinx提供了相关的IP以便于用户进行开发使用。
    的头像 发表于 05-22 16:13 4760次阅读
    <b class='flag-5'>FPGA</b>常用运算模块-<b class='flag-5'>加减法器</b>和乘<b class='flag-5'>法器</b>