色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

32bit的浮點格式

sanyue7758 ? 來源:處芯積律 ? 2023-07-29 16:42 ? 次閱讀

前言

今天在網上看筆試題發現有個設計浮點累加器的題目,看了下題目說明感覺不太清楚,恰好記得之前做過浮點數的加法運算的設計,索性就改了下題目需求,作為一個小練習在重新設計一遍。具體設計要求如下:

設計需求

設計一個32bit浮點的加法器,out = A + B,假設AB均為無符號位,或者換個說法都為正數。

clk為系統時鐘rst_n為系統復位,低有效;en信號控制數據輸入;busy指示模塊工作狀態,busy拉高時,輸入無效;aIn和bIn是數據輸入,out_vld,指示輸出數據有效。

設計的信號列表如下:

module float_adder(
  input                clk,
  input              rst_n,
  input                 en, 
  input      [31:0]    aIn,
  input      [31:0]    bIn,
  output reg          busy,
  output reg       out_vld,   
  output reg [31:0]    out
);

32bit的浮點格式

EE標準754規定了三種浮點數格式:單精度、雙精度、擴展精度。前兩者正好對應C語言里頭的float、double或者FORTRAN里頭的real、double精度類型。本文設計實現的為單精度。

2adb25a2-2d60-11ee-815d-dac502259ad0.png單精度格式

單精度:N共32位,其中S占1位,E占8位,M占23位。

2af64cec-2d60-11ee-815d-dac502259ad0.png雙精度格式

雙精度:N共64位,其中S占1位,E占11位,M占52位。

浮點數的加法過程

運算過程:對階、尾數求和、規格化、舍入、溢出判斷

對階:

和定點數不相同的是,浮點數的指數量級不一定是一樣的,所以這也就意味著,尾數直接進行加法運算時會存在問題,也就需要首先對階數進行處理。該過程有點像科學計數法的加法處理,把科學計數法的指數化為一致,求出來指數相差多少,然后移位處理后再進行加法減法。所以這里處理也要先求階差。

如果把階碼大的向階碼小的看齊,就要把階碼大的數的尾數部分左移,階碼減小。這個操作有可能在移位過程中把尾數的高位部分移掉,這樣就引發了數據的錯誤,所以,尾數左移在計算機運算中不可取。

如果把階碼小的向階碼大的看齊,在移位過程中如果發生數據丟失,也是最右邊的數據位發生丟失,最右邊的數據位丟失,只會影響數據的精度,不會影響數據的大小。

尾數求和

這里就是常規的補碼加法。

規格化:

右規(尾數的絕對值太大時,右規)尾數右移一位,階碼加1。當尾數溢出( >1 )時,需要右規。是否溢出,可以通過兩位的符號位得出:即尾數出現01.xx…xx或10.xx…xx(兩位符號位不同)

提高浮點數的表示精度,這里設計考慮比較簡單,我只考慮了同號數據相加的情況,所以這里只設計了右規的情況,不考慮符號位。

舍入判斷:

這里直接用截斷處理的方式,針對數據相加上溢的情況,規定了運算后上溢后將數據規定為最大值。

實現代碼

module float_adder(
  input                clk,
  input              rst_n,
  input                 en, 
  input      [31:0]    aIn,
  input      [31:0]    bIn,
  output reg          busy,
  output reg       out_vld,   
  output reg [31:0]    out
);
//運算過程:對階、尾數求和、規格化、舍入、溢出判斷
//分離階數、尾數
wire signal_bit = aIn[31];
wire [7:0] pow_a = aIn[30:23];
wire [7:0] pow_b = bIn[30:23];


wire [22:0] val_a = aIn[22:0];
wire [22:0] val_b = bIn[22:0];


//找到輸入指數階數較大,和階數差
//對階:在計算機中,采用小階向大階看齊的方法,實現對階。即右移
reg [22:0] pow_max ;
reg [23:0] pow_dif ;
reg [22:0] val_max ;
reg [22:0] val_min ;
reg en_dly0;
always @(posedge clk or negedge rst_n) begin
  if(rst_n==0)begin
    pow_max <= 'd0;
    val_max <= 'd0;
    val_min <= 'd0;
    pow_dif <= 'd0;
    en_dly0 <= 'd0;
  end
  else if( en == 1 && busy == 0)begin
    if(pow_a >= pow_b)begin
      pow_max <= pow_a;
      val_max <= val_a;
      val_min <= val_b;
      en_dly0 <= 'd1;
      if ( pow_a - pow_b > 'd23) begin
        pow_dif <= 'd23;
      end 
      else begin
        pow_dif <= pow_a - pow_b;
      end
    end
    else begin
      pow_max <= pow_b;
      val_max <= val_b;
      val_min <= val_a;
      en_dly0 <= 'd1;
      if ( pow_b - pow_a > 'd23) begin
        pow_dif <= 'd23;
      end 
      else begin
        pow_dif <= pow_b - pow_a;
      end
    end
  end
  else begin
    pow_max <= pow_max;
    val_max <= val_max;
    val_min <= val_min;
    pow_dif <= pow_dif;
    en_dly0 <= 'd0;
  end
end


//移位忙指示信號
reg shift_busy;
reg [4:0] shift_cnt;
always @(posedge clk or negedge rst_n) begin
  if (rst_n==0) begin
    shift_busy<='d0;
  end
  else if(en_dly0 == 1 )begin
    shift_busy <='d1;
  end
  else if(shift_cnt == pow_dif)begin
    shift_busy <=  0;
  end
end


//移位計數


always @(posedge clk or negedge rst_n) begin
  if(rst_n == 0)begin
    shift_cnt <= 'd0;
  end
  else if (shift_busy ==1) begin
    if (shift_cnt == pow_dif) begin
      shift_cnt <= shift_cnt;
    end
    else begin
      shift_cnt <= shift_cnt + 1'b1;
    end
  end
  else begin
    shift_cnt <= 'd0;
  end
end
reg [22:0] val_shift;
always @(posedge clk or negedge rst_n) begin
  if(rst_n == 0)begin
    val_shift <= 'd0;
  end
  else if (en_dly0==1'b1) begin
    val_shift <= val_min;
  end
  else if (shift_busy == 1) begin
    val_shift <= {1'b0,val_shift[22:1]};
  end
  else begin
    val_shift <= val_shift;
  end
end


//尾數求和
wire val_add_flag = (shift_cnt == pow_dif)&&(shift_busy ==1);
reg [23:0] val_sum;
reg val_sum_vld;
always @(posedge clk or negedge rst_n) begin
  if (rst_n==0) begin
    val_sum<='d0;
    val_sum_vld<='d0;
  end
  else if(val_add_flag == 1)begin
    val_sum <= val_max + val_shift;
    val_sum_vld<='d1;
  end
  else begin
    val_sum <= val_sum;
    val_sum_vld<='d0;
  end
end


//規范
always @(posedge clk or negedge rst_n) begin
  if (rst_n==0) begin
    out<='d0;
    out_vld<='d0;
  end
  else if(val_sum_vld == 1)begin
    //尾數求和有溢出
    out_vld<='d1;
    out[31]<= signal_bit;
    if(val_sum[23] == 1 && out[30:23] == 8'hFF)begin
      out[30:23]<= 8'hFF;
      out[22:0] <= 23'h7F_FFFF;
    end
    else if(val_sum[23] == 1)begin
      out[30:23]<= pow_max + 1;
      out[22:0] <= val_sum[23:1];
    end
    else begin
      out[30:23]<= pow_max;
      out[22:0] <= val_sum[22:0];
  end 
  end
  else begin
    out <= out;
    out_vld<='d0;
  end
end


//運算忙指示
always @(posedge clk or negedge rst_n) begin
  if (rst_n==0) begin
    busy<='d0;
  end
  else if(en == 1 && busy == 0)begin
    busy<='d1;
  end
  else if(out_vld == 1 )begin
    busy<='d0;
  end
  else begin
    busy <= busy;
  end
end


endmodule

仿真代碼

這里簡單測試了下代碼的功能,模擬了連續輸入多個數據,核查是否數據會影響正常計算過程。

`timescale 1ns/1ps
module float_adder_tb;


  // Parameters


  // Ports
  reg clk = 1;
  reg rst_n = 0;
  reg en = 0;
  reg [31:0] aIn;
  reg [31:0] bIn;
  wire busy;
  wire out_vld;
  wire [31:0] out;


  float_adder float_adder_dut (
    .clk (clk ),
    .rst_n (rst_n ),
    .en (en ),
    .aIn (aIn ),
    .bIn (bIn ),
    .busy (busy ),
    .out_vld (out_vld ),
    .out  ( out)
  );
  always
    #5  clk = ! clk ;
  initial begin
    rst_n = 0;
    #100;
    rst_n = 1;
    #100;
    aIn = {1'b0,8'd2,23'd7};
    bIn = {1'b0,8'd2,23'd8};
    en  = 1 ;
    #10;
    aIn = {1'b0,8'd0,23'd7};
    bIn = {1'b0,8'd2,23'd8};
    en  = 1 ;
    #1000;
    $finish;
  end


endmodule

仿真測試

從仿真測試中可以看出,當輸入信號連續輸入兩個浮點數時,在busy拉高狀態下,第二次輸入的數據無效,數據使能信號常為1,也不會影響正常模塊運算過程,只有在該次運算完成busy拉低后數據可重新加載。

2b09ab0c-2d60-11ee-815d-dac502259ad0.png仿真截圖

小結

本文的設計方法對于對階移位的操作需要循環操作,也即當階數相差較小時,結果輸出延遲較小,在極端情況下,比如階數差大于10,輸出延時會比階數差為0時,多10個周期,上限為23。如在實際使用時,對延時要求較小的情況,可針對移位操作部分,使用更多的資源來換取性能的提升。可使用case語句對具體情況進行遍歷。

針對原始題目中的累加操作,可將任意一個輸入和輸出相接,即可實現累加操作。此外,如果要實現異號加法情況,則需要仔細考慮對階,規格化等情況進行進一步設計。


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 模塊
    +關注

    關注

    7

    文章

    2695

    瀏覽量

    47431
  • 數據
    +關注

    關注

    8

    文章

    7002

    瀏覽量

    88942
  • 加法器
    +關注

    關注

    6

    文章

    183

    瀏覽量

    30114

原文標題:小結

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

收藏 人收藏

    評論

    相關推薦

    小弟新人一枚 求一份32bit浮點乘法器設計源代碼 謝謝各位大哥大姐

    小弟新人一枚 求一份32bit浮點乘法器設計verilog源代碼 謝謝各位大哥大姐
    發表于 09-14 15:40

    McASP采集這樣的時序,是按照16bit采集,還是32bit采集?從Linux用戶空間看,采集進來的數據是16bit還是32bit

    32bit采集?2. 配置McASP的寄存器:XFMT的SLOT為32,WORD為16,RROT為4,MASK為0000FFFF是否正確?3. 從Linux用戶空間看,采集進來的數據是16bit還是32bit
    發表于 05-28 10:22

    32bit MCU與16bit MCU的區別是什么

    bit 為一組。結論:不管是16-bit 還是 32-bit 的MCU,地址對應的最小單元都是1個byte,它們的區別在于一次訪問的最大內存是 32bit 還是 16
    發表于 11-01 07:12

    nFoece4 芯片組驅動32bit

    nFoece4 芯片組驅動32bit版.exe
    發表于 01-29 16:54 ?0次下載

    SIS 芯片組IDE驅動 32bit

    SIS 芯片組IDE驅動 32bit
    發表于 04-07 15:31 ?0次下載

    功能:浮點BCD碼轉換成格式浮點

    功能:浮點BCD碼轉換成格式浮點數 入口條件:浮點BCD碼操作數在[R0]中。出口信息:轉換成的格式
    發表于 01-19 22:51 ?2305次閱讀

    華邦針對SiP市場推出32bit SDR/DDR利基型內存

    華邦電子針對系統級封裝(SiP)市場,推出最新65奈米制程32bit帶寬 32M / 64Mb SDR / DDR 利基型內存
    發表于 04-07 10:50 ?1530次閱讀

    淘汰32bit不只iOS 11 明年開始擴展至Mac 32bit應用程序

    在WWDC上,蘋果正式發布了iOS 11,這個全新的iOS系統在發布后被發現全面淘汰了32bit應用程序,亦意味了iPhone 5或以前的裝置將無法使用新系統,而新系統之下還未升級及64bit
    發表于 06-07 16:34 ?977次閱讀

    32bit MCU 與 16bit MCU 的 區別

    bit 為一組。結論:不管是16-bit 還是 32-bit 的MCU,地址對應的最小單元都是1個byte,它們的區別在于一次訪問的最大內存是 32bit 還是 16
    發表于 10-25 16:36 ?11次下載
    <b class='flag-5'>32bit</b> MCU 與 16<b class='flag-5'>bit</b> MCU 的 區別

    單片機里面“”32bit地址“”與所指向的“8bit數據“的關系

    單片機里面“”地址“”與所指向的"數據"的關系單片機里面“”地址“”與所指向的"數據"的關系對于32bit單片機每一個32bit地址 指向 一個8bit的數據
    發表于 11-18 20:06 ?10次下載
    單片機里面“”<b class='flag-5'>32bit</b>地址“”與所指向的“8<b class='flag-5'>bit</b>數據“的關系

    8bit 8051/32bit Cortex-M0 Flash單片機產品選型手冊

    8bit 8051/32bit Cortex-M0 Flash單片機產品選型手冊免費下載。
    發表于 07-01 09:07 ?1次下載
    8<b class='flag-5'>bit</b> 8051/<b class='flag-5'>32bit</b> Cortex-M0 Flash單片機產品選型手冊

    RABPS 32bit by 3dmaniack 3dtoday (ARM BluePill Shield)已修復

    電子發燒友網站提供《RABPS 32bit by 3dmaniack 3dtoday (ARM BluePill Shield)已修復.zip》資料免費下載
    發表于 08-19 09:20 ?0次下載
    RABPS <b class='flag-5'>32bit</b> by 3dmaniack 3dtoday (ARM BluePill Shield)已修復

    怎么設計一個32bit浮點的加法器呢?

    設計一個32bit浮點的加法器,out = A + B,假設AB均為無符號位,或者換個說法都為正數。
    的頭像 發表于 06-02 16:13 ?1283次閱讀
    怎么設計一個<b class='flag-5'>32bit</b><b class='flag-5'>浮點</b>的加法器呢?

    使用STM32C0輕松實現從8bit32bit的平臺升級

    電子發燒友網站提供《使用STM32C0輕松實現從8bit32bit的平臺升級.pdf》資料免費下載
    發表于 07-29 11:27 ?0次下載
    使用STM32C0輕松實現從8<b class='flag-5'>bit</b>到<b class='flag-5'>32bit</b>的平臺升級

    毫米波雷達半精度浮點存儲格式分析

    本文介紹了TC3xx單片機雷達信號處理單元SPU支持的半精度浮點格式,將其和32bit整型數格式進行比較,分析了兩者的動態范圍及實際處理誤差,發現半精度
    的頭像 發表于 02-20 08:26 ?372次閱讀
    毫米波雷達半精度<b class='flag-5'>浮點</b>存儲<b class='flag-5'>格式</b>分析
    主站蜘蛛池模板: 在线观看视频亚洲| 亚洲精品午夜aaa级久久久久| 欧美日韩永久久一区二区三区| 暖暖视频免费观看高清完整版 | 久久久久久人精品免费费看| 久久精品国产在热亚洲完整版| 老师湿乎乎两半嫩| 欧美大片xxxxbbbb| 视频成人永久免费看| 亚洲欧洲日韩视频在钱| 69精品人妻一区二区三区蜜桃| 爱很烂qvod| 国产精品一区二区三区四区五区| 黄桃AV无码免费一区二区三区| 麻豆XXXX乱女少妇精品| 日本高清无卡码一区二区久久 | 日本高清免费观看| 午夜一级视频| 中文字幕s级优女区| proburn中文破解版下载| 国产精品色午夜视频免费看| 久久99这里只有精品| 泡妞高手在都市免费观看| 亚洲AV蜜桃永久无码精品无码网| 中文成人在线视频| 俄罗斯12x13x处| 久久精品伊人| 色老99九久精品偷偷鲁| 医生含着我的奶边摸边做| 成人国产精品玖玖热色欲| 精品视频免费在线观看| 人妻夜夜爽99麻豆AV| 亚洲色偷偷偷网站色偷一区人人藻 | 东京热百度影音| 精品九九视频| 人妖干美女| 一本道高清到手机在线| 处88XXX| 久久视热频国产这里只有精品23| 日本午夜精品久久久无码| 亚洲一在线|