verilog有符號數處理摘要

在FPGA設計中,一般的算數運算符都是按照無符號數進行的。那么需要有符號數計算的時候,該怎么辦呢?

很久很久以前也就是Verilog-2001還沒有出現時,是手動操作的,也就是說,對于一個8位的無符號數,比如reg [7:0] a; 我們手動把最高位當做符號位,剩余的7位則是數值位,整個二進制以補碼的形式表示。這個時候進入的二進制以補碼的形式表示,出來的二進制也以補碼的形式表示,在查看波形時,也以補碼的形式查看。總之,里面涉及到的二進制、二進制運算,都是基于二進制補碼的這個編碼形式。這個時候,這個模塊里面的變量、要處理的數都是有符號數,不要添上與無符號相關東西了,容易亂。無符號數的數據流想要進入這個模塊,得先經過補碼編碼后再輸進來。

后來,Verilog-2001出現了,當我們想處理有符號數時,再也不用我們手動認最高位了,因為這個時候的Verilog被定義得很“智能”了。是有符號還是無符號,就要看變量有沒有signed的聲明了。意思就是說,一個數進來,比如說8位,如果是 reg [7:0] a; 那么a就會被識別為無符號的8位數。如果是reg signed [7:0] a; 那么a就會被識別為有符號數,并且是識別為8位的二進制補碼。所謂的signed只有在參與運算的過程中才會有作用,再連線方面或是其他方面,沒有任何作用,因為都是補碼。

在Verilog-2001出現之后,一個模塊中出現有符號和無符號的處理問題也不大了,因為Verilog 2001提供了 s i g n e d ( ) 及 signed()及 signed()signed()機制,能夠進行有符號與無符號之間的轉換(然而我還是不建議一個模塊里面同時處理有符號和無符號的數據)。

盡量不要使有符號數與無符號數進行混合計算。因為只要有一個無符號數的運算單元,整個算式將被將成無符號數進行計算。
  
下面是例子:

例子1:

input signed [7:0] a, b;
output signed [15:0] o;
assign o = a * b;

上面輸入兩個有符號數a和b,這兩個數都將被識別為二進制補碼(我們在查看波形的時候,也應該以補碼的形式查看)。這兩個數進行有符號數的乘法運算,得到的自然也是有符號數的積,因此這里的輸出也定義為有符號數。從這個例子中我們可以看到,操作數變量被定義為有符號數,那么操作的結果變量也應該被定義為有符號數。

例子2:
input [7:0] a, b;
output [15:0] o;
wire signed [15:0] o_sgn;
assugb o_sgn = $signed(a) * $signed(b);
assign o = $unsigned(o_sgn);

例子2中,輸入的是兩個無符號數,輸出也定義為無符號數。然而,(假設)應用時,發現只有一個有符號的乘法器可以使用,這個時候就要用Verilog中的signed()及 s i g n e d ( ) 機制 . 首先使用 signed()機制.首先使用 signed()機制.首先使用signed()把輸入變成有符號數,同時定義一個有符號的中間結果,這樣子就可以使用有符號的乘法器進行運算了。最后使用$unsigned()把有符號的中間結果轉換為無符號輸出。

例子3:

input signed [7:0] a, b;
input signed [8:0] o;
assign o = a + b; // Verilog會自動進行符號的擴展。

Verilog-2001會自動擴展符號位。意思是說,當我們進行有符號數進行運算的時候,我們不要手動轉換符號位了,Verilog會自動識別最高位為符號位,同時在運算過程中會自動進行符號位的擴展。因此,正負號的擴展時,應多加利用Verilog的implicity signed extension,避免手動進行轉換。

例子4:

input [7:0] a;
input signed [7:0] b;
output signed [15:0] o;// Don't do this: assign o = a * b;
// The $signed({1'b0, a}) can convert the unsigned number to signed number.
assign o = $signed({1'b0, a}) * b;

上述代碼中,輸入a被識別為無符號數,而輸入b則被識別為二進制補碼,輸出則被定義為二進制補碼輸出。在進行運算的時候,我們不能直接讓a、b直接相乘,因為在一個verilog敘述中只要有一個無號數的??運算元,整個算式將被當成無號數進行計算。這個時候,因為輸出是有符號的,我們最好把輸入也變成有符號的,方便運算。因此我們首先需要把無符號的輸入手動添加一個符號位后,使用 s i g n e d ( ) 把輸入轉換稱為與 b 一樣的有符號形式;如果不使用 signed()把輸入轉換稱為與b一樣的有符號形式;如果不使用 signed()把輸入轉換稱為與b一樣的有符號形式;如果不使用signed(),直接使用{1’b0,a}與b相乘,這樣還是無符號*有符號,因此還是需要把{1’b0,a}轉成有符號的形式。

同樣地,當乘以一個常數時,也要用$signed()把常數轉換一下:

input signed [7:0] a;
output signed [15:0] o;// Don't do this: assign o = a * 8'b10111111;
// Use $signed() system task
assign o = a * $signed(8'b10111111);
// or sb keyword.
assign o = a * 8'sb10111111;

還有一個需要的是,部分選擇(也就是進行位選的時候),位選運算過后的結果是無號數!!!就算是選擇的范圍包含整個register或wire,例子如下所示:

input signed [7:0] a;
input signed [7:0] b;
output signed [15:0] o1, o2;// Don't do this: assign o1 = a[7:0];//a[7:0]是得到的是無符號數,將一個無符號賦值給一個有符號數的時候,結果肯定會出錯
assign o1 = a;
// Don't do this: assign o2 = a[6:0] * b;
assign o2 = $signed(a[6:0]) + b

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

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

相關文章

在IDEA中連接達夢數據庫:詳細配置指南

達夢數據庫(DM Database)作為國產關系型數據庫的代表,廣泛應用于企業級系統開發。本文將詳細介紹如何在IntelliJ IDEA中配置并連接達夢數據庫,助力開發者高效完成數據庫開發工作。 準備工作 1. 下載達夢JDBC驅動 訪問達夢官方資…

app.config.globalProperties

目錄 一:基礎使用 1、簡介 2、使用 3、打印結果: 二:封裝 1、創建一個.ts文件(utils/msg.ts) 2、在main.ts中全局注冊 3、在頁面中使用 4、打印結果 一:基礎使用 1、簡介 app.config.globalProperties 是 Vue 3 應用實例(app)的一個配置屬性&…

openai 標準化協議 Structured Outputs 具體示例教程

Structured Outputs 具體示例教程 場景:個人財務管理助手 假設我們要構建一個 AI 助手,幫助用戶記錄和管理個人財務支出。用戶可以輸入自然語言描述(如“昨天我花了50元買了午餐”),助手將提取關鍵信息并以結構化 JS…

16.使用讀寫包操作Excel文件:XlsxWriter 包

一 XlsxWriter 的介紹 XlsxWriter 只能寫入 Excel 文件。 OpenPyXL 和 XlsxWriter 的區別在筆記 15 。 二 如何使用 XlsxWriter 1.導包 import datetime as dtimport xlsxwriterimport excel 2.實例化工作簿 book xlsxwriter.Workbook("xlxswriter.xlsx") book.clo…

ChatGPT and Claude國內使用站點

RawChat kelaode chatgptplus chatopens(4.o mini免費,plus收費) 網頁: 定價: wildcard 網頁: 虛擬卡定價: 2233.ai 網頁: 定價: MaynorAPI chatgpt cla…

【MySQL】MySQL審計工具Audit Plugin安裝使用

MySQL審計工具Audit Plugin安裝使用 https://www.cnblogs.com/waynechou/p/mysql_audit.html MySQL 5.6 開啟審計功能 https://blog.51cto.com/u_15127556/4344503 MySQL之添加日志審計功能 https://blog.csdn.net/weixin_43279032/article/details/105507170 MySQL開啟日志記錄…

QT 磁盤文件 教程04-創建目錄、刪除目錄、遍歷目錄

【1】新建目錄 bool CreateDir(QString name){QString fileName name ;QDir dir(fileName);if (dir.isEmpty()) {dir.mkdir(fileName);return true;}else{qDebug()<<"文件夾已存在";return false;} } 【2】刪除目錄 bool DeleteDir(QString fileName){if (…

Git——分布式版本控制工具使用教程

本文主要介紹兩種版本控制工具——SVN和Git的概念&#xff0c;接著會講到Git的安裝&#xff0c;Git常用的命令&#xff0c;以及怎么在Vscode中使用Git。幫助新手小白快速上手Git。 1. SVN和Git介紹 1.1 SVN 集中式版本控制工具&#xff0c;版本庫是集中存放在中央服務器的&am…

Vue:添加響應式數據

Vue&#xff1a;添加響應式數據 1. 什么是響應式&#xff1f; 修改 data 后&#xff0c;頁面自動改變/刷新&#xff0c;這就是響應式。就像我們在使用 Excel 的時候&#xff0c;修改一個單元格中的數據&#xff0c;其它單元格的數據會聯動更新&#xff0c;這也是響應式。在前…

算法刷題記錄——LeetCode篇(10) [第901~1000題](持續更新)

(優先整理熱門100及面試150&#xff0c;不定期持續更新&#xff0c;歡迎關注) 994. 腐爛的橘子 在給定的 m x n 網格 grid 中&#xff0c;每個單元格可以有以下三個值之一&#xff1a; 值 0 代表空單元格&#xff1b;值 1 代表新鮮橘子&#xff1b;值 2 代表腐爛的橘子。 每…

Secs/Gem第二講 (基于secs4net項目的ChatGpt介紹)

好的&#xff0c;我們正式進入&#xff1a; 第二講&#xff1a;深入 SECS4NET 項目結構——主機程序是怎么搭起來的&#xff1f; 關鍵詞&#xff1a;項目結構、類圖、通信類、事件處理、連接生命周期、異步機制 本講目的 我們從源碼入手&#xff0c;一步步搞懂&#xff1a; S…

壓測實戰 | 微信小程序商城 “雙 11” 的壓測實踐

背景 某全球知名珠寶品牌&#xff0c;始終以創新驅動零售變革。隨著全渠道戰略的深化&#xff0c;其小程序官方商城逐漸成為品牌私域流量的核心陣地&#xff0c;不僅承載了線上銷售、會員運營等功能&#xff0c;同時還與其內部系統打通&#xff0c;如會員管理系統、人力資源系…

垃圾分類--環境配置

寫在前面&#xff1a; 如果你們打這屆比賽時&#xff0c;還有我們所保留的內存卡&#xff0c;那么插上即可運行&#xff08;因為內存卡里我們已經配置好所有的環境&#xff09; 本文提供兩種環境的配置 一種是基于yolov8&#xff1a;YOLOv8 - Ultralytics YOLO Docshttps://d…

工具(十二):Java導出MySQL數據庫表結構信息到excel

一、背景 遇到需求&#xff1a;將指定數據庫表設計&#xff0c;統一導出到一個Excel中&#xff0c;存檔查看。 如果一個一個弄&#xff0c;很復雜&#xff0c;耗時長。 二、寫一個工具導出下 廢話少絮&#xff0c;上碼&#xff1a; 2.1 pom導入 <dependency><grou…

Postman 新手入門指南:從零開始掌握 API 測試

Postman 新手入門指南&#xff1a;從零開始掌握 API 測試 一、Postman 是什么&#xff1f; Postman 是一款功能強大的 API 開發與測試工具&#xff0c;支持 HTTP 請求調試、自動化測試、團隊協作等功能。無論是開發人員還是測試工程師&#xff0c;都可以用它快速驗證接口的正確…

運維工具推薦 -- 寶塔面板:一鍵部署服務器

標題&#xff1a;寶塔面板&#xff1a;一鍵部署服務器&#xff0c;輕松管理你的云端世界 引言 在數字化時代&#xff0c;服務器管理對于個人開發者、中小企業或站長來說既是機遇也是挑戰。手動配置服務器環境耗時費力&#xff0c;而 寶塔面板 作為一款 免費開源、功能全面 的服…

【軟件工程】03_軟件需求分析

3.1 系統分析 1. 系統分析概述 系統分析是一組統稱為計算機系統工程的活動。它著眼于所有的系統元素,而非僅僅局限于軟件。系統分析主要探索軟件項目的目標、市場預期、主要的技術指標等,其目的在于幫助決策者做出是否進行軟件項目立項的決定。 2. 可行性分析(Feasibility …

WD5202L超低成本 Buck 電源芯片的特性與應用電路解析, 將市電轉換為 5V 電壓

WD5202L&#xff1a;超低成本 Buck 電源芯片的特性與應用電路解析 在現代電子設備的小型化、低成本化趨勢下&#xff0c;對電源管理芯片的性能、成本和尺寸提出了嚴苛要求。WD5202L 作為一款超低成本的 Buck 電源芯片&#xff0c;憑借其獨特的特性&#xff0c;在眾多應用場景中…

UART轉AHB模塊ModelSim仿真

一、簡介 UART轉AHB模塊用于實現一種簡單的通過上位機控制FPGA內部寄存器的方式。上位機通過串口助手發送讀寫寄存器的指令&#xff0c;UART轉AHB模塊接收指令后解析出地址&#xff0c;命令&#xff0c;數據信息&#xff0c;然后轉成AHB總線格式輸出。這時UART轉AHB模塊相當于A…

Qt5.15.2實現Qt for WebAssembly與示例

目錄 1.什么是Qt for WebAssembly&#xff1f; 1.1 什么是 WebAssembly&#xff1f; 1.2 WebAssembly 的優勢 1.3 什么是 Qt for WebAssembly&#xff1f; 1.4 Qt for WebAssembly 的特點 1.5 編譯過程 1.6 運行時環境 注意&#xff01;&#xff01;&#xff01;注意&am…