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

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

3天内不再提示

FPGA加法截位处理方法介绍

pdh的FPGA 来源:pdh的FPGA 2024-04-18 16:53 次阅读

本模块实现输入与输出位宽相同数据加法,并对结果进行四舍五入截位,对标matlab round函数。

`timescale 1ns/1ns


module data_in_width_out_width_add_round #
(
    parameter DATA_WIDTH   = 16                             
)
(
    // 系统接口
    input                               i_clk_sys       ,
    input                               i_rst           ,
        
    // 数据输入
    input  signed   [DATA_WIDTH-1:0]    i_din_a         ,
    input                               i_din_a_vld     ,
    input  signed   [DATA_WIDTH-1:0]    i_din_b         ,
    input                               i_din_b_vld     ,
    
    // 数据输出
    output signed   [DATA_WIDTH-1:0]    o_dout          ,
    output                              o_dout_vld  
);


/****************************************************************************/
/*  parameter
/****************************************************************************/


/****************************************************************************/
/*  signal
/****************************************************************************/
logic signed    [DATA_WIDTH-1+1:0]  din_add_result          ;
logic                               din_add_result_vld      ;
logic signed    [DATA_WIDTH-1+2:0]  din_add_result_round    ;
logic signed    [DATA_WIDTH-1:0]    din_add_result_truncate ;        
logic                               din_add_result_vld_1dly ;
logic                               din_add_result_vld_2dly ;        
   
/****************************************************************************/
/*  process
/****************************************************************************/
always @(posedge i_clk_sys or posedge i_rst)                    // 数据加法
begin 
    if (i_rst)
    begin 
        din_add_result <= {{DATA_WIDTH+1}{1'b0}};
    end
    else 
    begin 
        din_add_result <= i_din_a + i_din_b;
    end
end


always @(posedge i_clk_sys)                
begin 
    din_add_result_vld <= i_din_a_vld && i_din_b_vld;
end


always @(posedge i_clk_sys)                                     // 数据四舍五入,根据要舍弃的位宽加不同的值
begin 
    if (din_add_result[DATA_WIDTH] == 1'b0)                     // 每次加法先扩充一个符号位,再对小数点位置进行 加减 0.5
    begin 
        din_add_result_round <= {din_add_result[DATA_WIDTH],din_add_result + 1'b1}; 
    end 
    else                                                        // 4'b1000}; +4bit 1是为了modelsim仿真,modelsim仿真规定小数至少3位
    begin 
        din_add_result_round <= {din_add_result[DATA_WIDTH],din_add_result - 1'b1};  
    end
end


always @(posedge i_clk_sys or posedge i_rst)                    // 数据截位
begin 
    if (i_rst)
    begin 
        din_add_result_truncate <= {DATA_WIDTH{1'b0}};
    end
    else if (din_add_result_round[DATA_WIDTH+1] == din_add_result_round[DATA_WIDTH])
    begin                                                       // 如果数据没有溢出,舍弃最后一位,赋值; 先补充符号位,再取表示起始bit为1,包含bit1并往上升DATA_WIDTH-1位
        din_add_result_truncate <= {din_add_result_round[DATA_WIDTH+1],din_add_result_round[1+ :(DATA_WIDTH-1)]};
    end
    else if (din_add_result_round[DATA_WIDTH+1] == 1'b0 && din_add_result_round[DATA_WIDTH] == 1'b1)
    begin                                                       // 如果正数溢出了,就给一个设置的位宽bit正数最大值,'h7fff 
        din_add_result_truncate <= {1'b0,{(DATA_WIDTH-1){1'b1}}};
    end
    else if (din_add_result_round[DATA_WIDTH+1] == 1'b1 && din_add_result_round[DATA_WIDTH] == 1'b0)
    begin                                                       // 如果负数溢出了,就给一个设置的位宽bit负数最大值,'h8000
        din_add_result_truncate <= {1'b1,{(DATA_WIDTH-1){1'b0}}};
    end    
end


always @(posedge i_clk_sys)                                     // 数据有效流水打拍
begin 
    din_add_result_vld_1dly <= din_add_result_vld;
    din_add_result_vld_2dly <= din_add_result_vld_1dly;


    o_dout                  <= din_add_result_truncate;
    o_dout_vld              <= din_add_result_vld_2dly;
end


endmodule

代码中如果直接截位,数据的输出将会产生直流,所以需要对数据的符号位进行判断,并进行处理。简单的思路如下:

1.数据先进行加法。

2.对加法后的结果,进行判断,正数+0.5,负数-0.5,此操作用于去除直流。

3.再对去除直流后的结果,进行需要的截位取值,例如16bit+16bit=17bit,而最终的输出结果,如果要16bit,那就去掉末位,也可以只要15bit,去掉末2bit,只要bit15-bit2。

上述代码是简单的例子处理,输入进来的两种数据同位宽,输出也用同位宽输出。后续可以改进。



审核编辑:刘清

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

    关注

    1603

    文章

    21331

    浏览量

    593336
  • matlab
    +关注

    关注

    175

    文章

    2924

    浏览量

    228470

原文标题:FPGA加法截位处理

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

收藏 人收藏

    评论

    相关推荐

    如何在FPGA中实现高效的compressor加法树呢?

    大规模的整数加法在数字信号处理和图像视频处理领域应用很多,其对资源消耗很多,如何能依据FPGA物理结构特点来有效降低加法树的资源和改善其时序
    的头像 发表于 11-08 09:06 733次阅读
    如何在<b class='flag-5'>FPGA</b>中实现高效的compressor<b class='flag-5'>加法</b>树呢?

    为什么研究浮点加法运算,对FPGA实现方法很有必要?

    处理等方面受到了限制,由于FPGA中关于浮点数的运算只能自行设计,因此,研究浮点加法运算的FPGA实现方法很有必要。
    发表于 07-05 06:21

    如何利用FPGA实现高速流水线浮点加法器研究?

    处理等方面受到了限制,为什么研究浮点加法运算的FPGA实现方法很有必要? 因为FPGA中关于浮点数的运算只能自行设计 。
    发表于 08-15 08:00

    32位处理器的开发与8位处理器的开发有哪些明显的不同?

    32位处理器的开发与8位处理器的开发有哪些明显的不同?开发一个32位的嵌入式系统需要哪些工具和环境呢?32位嵌入式系统的开发过程中存在哪些技术难点?有什么方法去应对呢?
    发表于 04-19 08:11

    求一种在FPGA上实现单精度浮点加法运算的方法

    介绍一种在FPGA上实现的单精度浮点加法运算器,运算器算法的实现考虑了FPGA器件本身的特点,算法处理流程的拆分和模块的拆分,便于流水设计的
    发表于 04-29 06:27

    Intel 32位处理器 ,Intel 32位处理器结构原理

    Intel 32位处理器 ,Intel 32位处理器结构原理是什么? 微型计算机中的运算器和控制器合起来称为CPU,因CPU通常集成在一块大规模集成电路
    发表于 03-26 15:05 1846次阅读

    Intel 64位处理器,Intel 64位处理器结构原理

    Intel 64位处理器,Intel 64位处理器结构原理 现在人们广泛使用的是由32位微处理器构成的计算系统,但是32位的计算和操作系统不能支持
    发表于 03-26 15:07 3166次阅读

    AMD 32位处理器,AMD 32位处理器有哪些系列?

    AMD 32位处理器,AMD 32位处理器有哪些系列? AMD,这个成立于1969年、总部位于美国加利福尼亚州桑尼维尔的处理器厂商,经过多年不懈地
    发表于 03-26 15:14 4052次阅读

    华清远见FPGA代码-使用函数实现简单的八位处理

    华清远见FPGA代码-使用函数实现简单的八位处理
    发表于 10-27 18:07 4次下载

    FPGA界最常用也最实用的3种跨时钟域处理方法

    介绍3种跨时钟域处理方法,这3种方法可以说是FPGA界最常用也最实用的方法,这三种
    发表于 11-15 20:08 1.3w次阅读

    单片机位处理指令的使用方法

    1.位处理指令的一般性说明 在分类时将位传送归入传送指令类,条件转移归入程序控制类。其余位操作归为位处理指令。 位逻辑运算以C为目标,/ b i t表示取(b i t)的非值运算,但不影响原值。
    发表于 04-10 16:22 2386次阅读
    单片机<b class='flag-5'>位处理</b>指令的使用<b class='flag-5'>方法</b>

    揭秘FPGA跨时钟域处理的三大方法

    跨时钟域处理方法,这三种方法可以说是 FPGA 界最常用也最实用的方法,这三种方法包含了单 b
    的头像 发表于 12-05 16:41 1367次阅读

    介绍3种方法跨时钟域处理方法

    介绍3种跨时钟域处理方法,这3种方法可以说是FPGA界最常用也最实用的方法,这三种
    的头像 发表于 09-18 11:33 2.2w次阅读
    <b class='flag-5'>介绍</b>3种<b class='flag-5'>方法</b>跨时钟域<b class='flag-5'>处理</b><b class='flag-5'>方法</b>

    fpga实现加法和减法运算的方法是什么

    FPGA实现加法和减法运算非常简单,实现乘法和除法可以用IP,那实现对数和指数运算该用什么呢?
    发表于 08-05 09:37 933次阅读
    <b class='flag-5'>fpga</b>实现<b class='flag-5'>加法</b>和减法运算的<b class='flag-5'>方法</b>是什么

    为什么研究浮点加法运算,对FPGA实现方法很有必要?

    ,浮点加法器是现代信号处理系统中最重要的部件之一。FPGA是当前数字电路研究开发的一种重要实现形式,它与全定制ASIC电路相比,具有开发周期短、成本低等优点。 但多数FPGA不支持浮点
    的头像 发表于 09-22 10:40 444次阅读
    为什么研究浮点<b class='flag-5'>加法</b>运算,对<b class='flag-5'>FPGA</b>实现<b class='flag-5'>方法</b>很有必要?