<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
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
    +關注

    關注

    1604

    文章

    21340

    瀏覽量

    594042
  • matlab
    +關注

    關注

    176

    文章

    2928

    瀏覽量

    228626

原文標題:FPGA加法截位處理

文章出處:【微信號:pdh的FPGA,微信公眾號:pdh的FPGA】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    如何在FPGA中實現高效的compressor加法樹呢?

    大規模的整數加法在數字信號處理和圖像視頻處理領域應用很多,其對資源消耗很多,如何能依據FPGA物理結構特點來有效降低加法樹的資源和改善其時序
    的頭像 發表于 11-08 09:06 ?769次閱讀
    如何在<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 ?1850次閱讀

    Intel 64位處理器,Intel 64位處理器結構原理

    Intel 64位處理器,Intel 64位處理器結構原理 現在人們廣泛使用的是由32位微處理器構成的計算系統,但是32位的計算和操作系統不能支持
    發表于 03-26 15:07 ?3170次閱讀

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

    AMD 32位處理器,AMD 32位處理器有哪些系列? AMD,這個成立于1969年、總部位于美國加利福尼亞州桑尼維爾的處理器廠商,經過多年不懈地
    發表于 03-26 15:14 ?4057次閱讀

    華清遠見FPGA代碼-使用函數實現簡單的八位處理

    華清遠見FPGA代碼-使用函數實現簡單的八位處理
    發表于 10-27 18:07 ?4次下載

    FPGA界最常用也最實用的3種跨時鐘域處理方法

    介紹3種跨時鐘域處理方法,這3種方法可以說是FPGA界最常用也最實用的方法,這三種
    發表于 11-15 20:08 ?1.3w次閱讀

    單片機位處理指令的使用方法

    1.位處理指令的一般性說明 在分類時將位傳送歸入傳送指令類,條件轉移歸入程序控制類。其余位操作歸為位處理指令。 位邏輯運算以C為目標,/ b i t表示?。╞ i t)的非值運算,但不影響原值。
    發表于 04-10 16:22 ?2403次閱讀
    單片機<b class='flag-5'>位處理</b>指令的使用<b class='flag-5'>方法</b>

    揭秘FPGA跨時鐘域處理的三大方法

    跨時鐘域處理方法,這三種方法可以說是 FPGA 界最常用也最實用的方法,這三種方法包含了單 b
    的頭像 發表于 12-05 16:41 ?1386次閱讀

    介紹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 ?973次閱讀
    <b class='flag-5'>fpga</b>實現<b class='flag-5'>加法</b>和減法運算的<b class='flag-5'>方法</b>是什么

    為什么研究浮點加法運算,對FPGA實現方法很有必要?

    ,浮點加法器是現代信號處理系統中最重要的部件之一。FPGA是當前數字電路研究開發的一種重要實現形式,它與全定制ASIC電路相比,具有開發周期短、成本低等優點。 但多數FPGA不支持浮點
    的頭像 發表于 09-22 10:40 ?471次閱讀
    為什么研究浮點<b class='flag-5'>加法</b>運算,對<b class='flag-5'>FPGA</b>實現<b class='flag-5'>方法</b>很有必要?
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>