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.mzph.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…