基于FPGA的數字信號處理(15)--定點數的舍入模式(6)向0取整fix

前言

????????在之前的文章介紹了定點數為什么需要舍入和幾種常見的舍入模式。今天我們再來看看另外一種舍入模式:向上取整fix。

10進制數的fix

????????fix:也叫 向0取整。它的舍入方式是數據往0的方向,舍入到最近的整數,比如1.75 fix到2,-0.25 fix到0等。以-2到1.75之間的16個數據(步長0.25)為例,它們的 fix 結果是這樣的:

% 打印數據

????????從上圖可以看到:

  • 正數的fix,就是把小數部分(或者約定精度外的部分)丟掉。例如1.5 >> 1,0.5 >> 0,1 >> 1 等

  • 負數的fix,也是把小數部分(或者約定精度外的部分)丟掉。例如-1.5 >> -1,-0.5 >> 0,-1 >> -1 等

  • 0的fix,同樣是直接丟掉小數部分

2進制數的fix

????????2進制數的fix和10進制的fix類似,但是對于負數部分的處理是不同的。以Q4.2格式的定點數(字長4位,小數2位的有符號數)為例,對于負數的小數部分的處理:

  • -2(d) = 10_00(b) fix后的值為 -2,等價于 10,即舍棄小數部分的值(10)

  • -1.75(d) = 10_01(b) fix后的值為 -1,等價于 11,即舍棄小數部分的值(10)后再加1

  • -1.5(d) = 10_10(b) fix后的值為 -1,等價于 11,即舍棄小數部分的值(10)后再加1

  • -1.25(d) = 10_11(b) fix后的值為 -1,等價于 11,即舍棄小數部分的值(10)后再加1

  • -1(d) = 11_00(b) fix后的值為 -1,等價于 11,即舍棄小數部分

  • -0.75(d) = 11_01(b) fix后的值為 0,等價于 00,即舍棄小數部分的值(10)后再加1

  • -0.5(d) = 11_10(b) fix后的值為 0,等價于 00,即舍棄小數部分的值(10)后再加1

  • -0.25(d) = 11_11(b) fix后的值為 0,等價于 00,即舍棄小數部分的值(10)后再加1

????????總結一下,就是:

  • 小數部分不為0時就是把小數部分(或者約定精度外的部分)丟掉再加1。

  • 小數部分為0時就是把小數部分(或者約定精度外的部分)丟掉。

????????對于正數和0的處理和10進制的方式相同,都是:

直接把小數部分(或者約定精度外的部分)丟掉,例如1.25即01_01 fix的結果是1即01,0.75即00_11 fix的結果是0即00

????????從上面可以看出來,fix對于正數來說相當于向下取整floor,對于負數來說相當于向上取整ceil。因此,fix的實現可以簡化為:

首先舍去小數部分,然后剩余整數部分加上一個進位。當該數是為負的非整數時,進位為1;否則進位為0。

image-20240421154458400

????????下面以 用fix的方式來實現Q4.2格式定點數轉Q2.0格式定點數為例,Verilog代碼如下:

module test(input   [3:0]   data_4Q2,       //有符號數,符號1位,字長4位,小數2位   output  [1:0]   data_2Q0        //有符號數,符號1位,字長2位,小數0位   
);
?
wire    carry;
?
assign  carry = data_4Q2[3] && (|data_4Q2[1:0]);    //是負數且非整數時進位為1,其他進位為0
assign  data_2Q0 = data_4Q2[3:2] + carry;           //舍棄低位(即整個小數部分)后再加進位
?
endmodule

????????因為一共只有16個數,所以我們可以用窮舉的方式來測試,TB如下:

`timescale 1ns/1ns
module test_tb();
?
reg  [3:0]  data_4Q2;           //有符號數,符號1位,整數2位,小數2位   
wire [1:0]  data_2Q0;           //有符號數,符號1位,整數2位,小數0位   integer i;                      //循環變量
?
initial begindata_4Q2 = 0;               //輸入賦初值 for(i=0;i<16;i=i+1)begin    //遍歷所有的輸入,共16個  data_4Q2 = i;                       #5; $display("data_4Q2:%h       data_2Q0:%h",data_4Q2,data_2Q0);end#20 $stop();                //結束仿真
end
?
//例化被測試模塊
test    test_inst(.data_4Q2   (data_4Q2), .data_2Q0   (data_2Q0)
);
?
endmodule

????????同時,我們也用matlab來實現同樣的功能,觀察兩者的輸出是否一致:

%--------------------------------------------------
% 關閉無關內容
clear;
close all;
clc;
?
%--------------------------------------------------
% 生成數據并做fix處理
x = -2:0.25:1.75;
F = fimath('RoundingMethod','Zero'); ? ? ? ?% 設定舍入模式為fix
data_4Q2 = fi(x,1,4,2,F); ? ? ? ? ? ? ? ? ? % 生成Q4.2格式的定點數
data_2Q0 = fi(data_4Q2,1,2,0,F); ? ? ? ? ? ?% 從Q4.2格式轉換成Q2.0格式
?
% 打印數據
for i=1:length(data_4Q2)fprintf('data_4Q2:%s ?  data_2Q0:%s\n',hex(data_4Q2(i)),hex(data_2Q0(i)))
end

????????下圖是2者分別輸出的數據(16進制),可以看到數據的輸出是一致的,證明RTL代碼無誤。

image-20240421002442688

????????這幾個數的輸入分別是0101/0110/0111,即10進制數1.25/1.5/1.75,它們fix結果應該是2。從上圖來看,好像是matlab錯了,而RTL對了,但實際情況恰恰相反。現在想想結果是什么格式的?Q2.0!它能表示的最大的數是多少?是10進制的1!所以結果溢出了!

????????那為什么RTL的結果又 ”對“ 了呢?這純屬是烏龍。因為打印結果是16進制的,并不表示10進制數值,結合結果的2位位寬,可知 ”2“,實際上就是10,它是01的溢出產生的,這個數在Q2.0格式的定點數中并不表示 ”數字2“,而是數字 ”-1“。

????????matlab是有溢出處理機制的(saturate),它把溢出值把都飽和在了最大值即01(10進制的1)。為了防止這種情況的發生,我們也要設計對應的溢出處理機制。因為是向上取整,所以結果只會是正向的溢出,那么就只要限定最大值即可,把Verilog代碼改一下:

module test(input   [3:0]   data_4Q2,               //有符號數,符號1位,字長4位,小數2位   output  [1:0]   data_2Q0                //有符號數,符號1位,字長2位,小數0位   
);
?
wire            carry;
wire    [2:0]   data_temp;                  //擴展1bit,防止溢出
?
assign  carry = |data_4Q2[1:0];                                         //是整數時進位為0,非整數進位為1
assign  data_temp = {data_4Q2[3],data_4Q2[3:2]} + {2'b00,carry};        //中間變量,舍棄低位(即整個小數部分)后再加進位
assign  data_2Q0 = (data_temp[2:1]==2'b01) ? 2'b01 : data_temp[1:0];    //data_2Q0的高2位為01說明產生了正向的進位,即溢出
?
endmodule

????????非整數的ceil,相當于先丟小數部分,然后把剩余的整數部分+1

image-20240420165316917

????????定點數從Q4.2格式轉Q2.0格式是一個比較特殊的例子,因為它相當于把小數部分全部舍棄掉了,如果舍入要求不是全部小數位,而是部分小數位,那么處理方式是一樣的嗎?

????????是一樣的。對于其他情況則只需要把精度要求外的小數部分舍棄即可。例如Q5.3格式的定點數轉Q3.1格式,則只需要把最后兩位小數舍棄即可,例如:

00.111 是0.875,fix到向0方向即向下方向距離它最近的Q3.1格式的數是0.5即00.1,即00.111 >> 00.1。操作上相當于上面說的舍棄掉多余的小數位

10.111 是-1.125,fix到向0方向即向上方向距離它最近的Q3.1格式的數是-1即11.0,即10.111 >> 10.1 + 1 >> 11.0。操作上相當于上面說的舍棄掉多余的小數位,然后加1。

????????其他類似,不贅述了。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/42314.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/42314.shtml
英文地址,請注明出處:http://en.pswp.cn/web/42314.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Docker技術簡介

Docker是一種開源的容器化平臺&#xff0c;旨在簡化應用程序的創建、部署和運行過程。它通過將應用程序及其所有依賴項打包到一個稱為容器的可移植單元中來實現這一目標。以下是Docker技術的簡介&#xff1a; Docker的核心概念 1、容器&#xff08;Container&#xff09;&…

將WordPress的文章重新排序的3個方法

有效的調整文章顯示順序看開可以更好突出內容&#xff0c;還可以保持網站的新鮮感&#xff0c;今天我將帶您了解三種方法&#xff0c;通過重新排序文章顯著提升網站的吸引力。我們將逐步講解從調整設置到使用插件以及“置頂”文章的每一種方法&#xff0c;確保WordPress 新手也…

Linux將mysql導出

1、基礎導出 要在Linux系統中將MySQL數據庫導出&#xff0c;通常使用mysqldump命令行工具。以下是一個基本的命令示例&#xff0c;用于導出整個數據庫&#xff1a; mysqldump -u username -p database_name > export_filename.sql 其中&#xff1a; username 是你的MySQL用…

利用python進行數據分析 —— python正則表達式(持續更新中!)

文章目錄 利用python進行數據分析 —— python基礎知識進階重點筆記&#xff1a;正則表達式re.match 匹配開頭re.search 全文匹配re.sub 替換刪除re.compile 編譯正則findall 返回列表finditer 返回迭代器re.split 分割返回列表(?P...) 分組匹配正則表達符號、修飾符通配符1 ^…

谷歌上新!最強開源模型Gemma 2,27B媲美LLaMA3 70B,挑戰3140億Grok-1

文章目錄 LMSYS Chatbot Arena&#xff1a;開源模型性能第一Gemma為什么這么強&#xff1f;架構創新對AI安全性的提升 A領域競爭激烈&#xff0c;GPT-4o 和 Claude 3.5 Sonnet 持續發力&#xff0c;谷歌迅速跟進。 谷歌為應對AI競爭所采取的策略&#xff1a;依靠 Gemini 閉源模…

hdu物聯網硬件實驗3 按鍵和中斷

學院 班級 學號 姓名 日期 成績 實驗題目 按鍵和中斷 實驗目的 實現閃燈功能轉換 硬件原理 無 關鍵代碼及注釋 /* Button Turns on and off a light emitting diode(LED) connected to digital pin 13, when pressing a pushbutton attached…

AI端側大模型未來發展趨勢

一、定義與優勢 端側AI大模型是指基于移動終端設備上的大型神經網絡模型&#xff0c;這些模型能夠在本地設備&#xff08;如智能手機、PC、汽車、XR以及物聯網設備等&#xff09;上直接運行和處理人工智能算法&#xff0c;實現如圖像識別、語音識別、自然語言處理等任務。端側…

解決WSL2報錯:當前電腦配置不支持WSL2,請啟用虛擬機平臺 Windows 功能并確保在 BIOS 中啟用虛擬化

事情要追溯到突發奇想下載了騰訊的手游模擬器開始。。。因為一直閃退&#xff0c;模擬器自檢就要求把虛擬化功能關閉了&#xff0c;結果還是一直閃退&#xff0c;WSL2也給我報錯了。。。大無語 主要通過以下兩個步驟解決&#xff0c;操作了之后需要把電腦重啟&#xff1a; 一、…

docker里日志分割的方法

在Docker中對日志進行按大小分割&#xff08;log rotation&#xff09;是一個常見的需求&#xff0c;因為長時間運行的容器可能會生成大量日志&#xff0c;導致磁盤空間不足。Docker提供了內置的日志管理功能&#xff0c;可以通過配置日志驅動來實現日志的自動分割。以下是具體…

安卓系統裁剪原生app

目錄 前言一、修改build目錄main.mk二、修改build目錄product.mk三、在.mk中使用PRODUCT_DEL_PACKAGES屬性 前言 安卓系統裁剪預置應用或服務基本步驟 一、修改build目錄main.mk ifdef FULL_BUILD# The base list of modules to build for this product is specified# by th…

小程序做自定義分享封面圖,Canvas base64圖片數據真機上不顯示?【已解決】

首選說一下需求&#xff0c;做一個小程序分享&#xff0c;但是封面圖要自定義&#xff0c;除了要有對應商品還有有背景圖&#xff0c;商品名。類似這種 實現邏輯&#xff0c;把商品圖和背景圖&#xff0c;再加上價格和商品名用canvas 渲染出來 這是弄好之后的效果圖&#xff0…

管理者要勇敢做“壞人”

有點正義感的人都對壞人深惡痛絕&#xff0c;但在團隊管理上&#xff0c;有一種觀念或許會讓你感到意外&#xff0c;那就是管理者要敢于做“壞人”。這并不是讓管理者去做惡&#xff0c;而是在某些關鍵時刻&#xff0c;要有勇氣打破常規的“好人”形象&#xff0c;做出不受歡迎…

執行數據庫語句時沒有報錯,并且提示執行成功,但在數據庫中沒有新增數據

這可能是因為你沒有提交事務。在執行 INSERT、UPDATE 或 DELETE 等修改數據的操作后&#xff0c;需要明確地提交事務才能將更改持久化到數據庫中。 以下是一個示例&#xff0c;展示python中如何在執行 INSERT 語句后提交事務&#xff1a; import pymysql# MySQL數據庫連接配置…

SpringSecurity中文文檔(Servlet Method Security)

Method Security 除了在請求級別進行建模授權之外&#xff0c;Spring Security 還支持在方法級別進行建模。 您可以在應用程序中激活它&#xff0c;方法是使用EnableMethodSecurity 注釋任何Configuration 類&#xff0c;或者將 < method-security > 添加到任何 XML 配…

springbootAl農作物病蟲害預警系統-計算機畢業設計源碼21875

摘要 隨著農業現代化的推進&#xff0c;農作物病蟲害的防治已成為農業生產中的重要環節。傳統的病蟲害防治方法往往依賴于農民的經驗和觀察&#xff0c;難以準確、及時地預測和防控病蟲害的發生。因此&#xff0c;開發一種基于現代信息技術的農作物病蟲害預警系統&#xff0c;對…

【計算機畢業設計】012基于微信小程序的科創微應用平臺

&#x1f64a;作者簡介&#xff1a;擁有多年開發工作經驗&#xff0c;分享技術代碼幫助學生學習&#xff0c;獨立完成自己的項目或者畢業設計。 代碼可以私聊博主獲取。&#x1f339;贈送計算機畢業設計600個選題excel文件&#xff0c;幫助大學選題。贈送開題報告模板&#xff…

Python數據分析實戰,公交車站點設置優化分析,案例教程編程實例課程詳解

一、引言 隨著城市化進程的加快,公共交通在城市交通中扮演著越來越重要的角色。公交車站點作為公共交通系統的重要組成部分,其布局設計直接影響到公共交通的運輸效率和市民的出行體驗。本文將通過Python數據分析的方法,對某城市的公交車站點設置進行優化分析,旨在提出合理的…

解決vite 斷點調試定位不準確問題

問題&#xff1a;vite構建時&#xff0c;控制臺報錯行數等信息定位不準確或debugger斷點調試定位不準確 解決&#xff1a;F12后打開設置面板&#xff0c;把“JavaScript源代碼映射”去掉可臨時解決&#xff0c;如需永久解決需升級vite到最新版 還有一種&#xff1a; 參考&…

esp32_spfiffs

生成 spiffs image python spiffsgen.py <image_size> <base_dir> <output_file> eg, python spiffsgen.py 0x2000 ./folder hello.bin Arduino 的庫有例子可以直接用于 OTA 升級 spiffs 分區 HTTPUpdateResult HTTPUpdate::updateSpiffs(HTTPClient &h…

7.9 cf div3

BProblem - B - Codeforces 題目解讀&#xff1a; 找到嚴格大于相鄰數字的數&#xff0c;將其減一&#xff0c;直到整個數組成為穩定的&#xff08;不存在數字嚴格大于相鄰數&#xff09; ac代碼 #include<bits/stdc.h> typedef long long ll;#define IOS ios::sync_w…