FPGA秋招-笔记整理(3)无符号数、有符号数

参考:Verilog学习笔记——有符号数的乘法和加法

一、无符号数、有符号数

将输入输出全部定义为有符号数

(1)无符号数读取按照原码进行,有符号数的读取应该按照补码读取,计算规则为去掉符号位后取反、加1在计算数值。

(2)直接赋值十进制数据,乘数在以无符号数读取时时按照原码读取,127就对应 8 位二进制数 8’b0111_1111,十进制 128 就对应 8 位二进制 8’b1000_0000;而以有符号数读取的时候是会直接转换为补码形式,如 -127,先去掉符号位是 127,对应 7 位二进制数 7’b111_1111,取反为 7’b000_0000,加 1 为 7’b000_0001,将符号位补回到最高位为 8’b1000_0001;对于 -128 的表示比较特殊,8-bit的二进制数最高位是符号位,表示正负,剩下的 7-bit 能够表示的数的范围是 0 ~ 127,前面加上 ± 就能表示 -127 ~ 127,其中有 2 个数很特殊就是 8’b0000_0000 和 8’b1000_0000,按照上面会出现 +0 和 -0,为了区分出这两个数,前人定义 8’b0000_0000 表示 0,而 8’b1000_0000 表示 -128,这样不仅能区分开两个数,还多表示了一个数 -128(整个计算机体系通用,其他位数时类似表示一个负数)

(3)计算准则:

                 无符号 * 无符号 = 无符号;

                 有符号 * 有符号 = 有符号;

                 如果表达式中有一个无符号数,则所有的操作数都会被强行转换为无符号数;

当后面设计输入输出时,如果是有符号,那么将相关计算的输入/输出和中间量都显式的用 signed 定义。(如果是有符号数的计算,那么所有的输入、输出、中间量的计算都应该设置为有符号数

符号扩展计算方法:

计算准则:

对于乘法,在运算的时候将符号位扩展到和积的位数相等。一般使用位拼接符{}进行计算。

对有符号数的加法,同样的,要么相关的运算全部定义成有符号数,要么进行符号位的扩展对于加法操作,只需要每个被加数扩展 1 位符号位即可


参考:Verilog学习笔记——有符号数的乘法和加法

案例:

下面的输入和输出都没有指定成 signed 有符号数,计算时默认是按照无符号数计算(是把读取到的 8 位二进制数当做原码去算),此时若外部传入的数据实际上是有符号数(比如 FIR 滤波器传入了正负均有的待滤波信号),那么需要对符号位进行扩展来计算乘法和加法;


module signed_test_2(input   [7:0]   data_in_1,input   [7:0]   data_in_2,output  [15:0]  data_out_1,output  [15:0]  data_out_2
);

对于乘法,需要扩展符号位 到 和积的位数相等,比如乘数a为 N-bit,乘数 b 为M-bit,两个相乘得到 N+M 位数据,此时需要对 a 扩展 M-bit 到 N+M 位,对 b 扩展 N-bit 到 N+M 位;

下面,使用 位拼接符 { } 来做演示,位拼接符可以按照二进制的位来进行高低位的拼接,假设 data_in_1= 8’b1000_0011,对于 {{8{data_in_1[7]}},data_in_1} 可以这样理解:

(1) 先看 8{data_in_1[7]},表示取出 8-bit 数据 data_in_1 的最高位 data_in_1[7],重复 8 次,相当于 { data_in_1[7], data_in_1[7], data_in_1[7], data_in_1[7], data_in_1[7], data_in_1[7], data_in_1[7], data_in_1[7] },即高位扩展 8-bit 的 1

(2) {{8{data_in_1[7]}},data_in_1} 相当于在 data_in_1 的前面补上 8 个 data_in_1[7],即 结果为 16-bit 的 16’b1111_1111_1000_0011;

//不做符号位扩展,直接相乘
assign data_out_1 = data_in_1 * data_in_2;
//做符号位扩展,再相乘
assign data_out_2 = {{8{data_in_1[7]}},data_in_1} * {{8{data_in_2[7]}},data_in_2};

仿真测试数据如下,1 处用十六进制给出数据,2 处用有符号的十进制赋值,3 处是为了和 2 处对比,看最后赋值是否一样;

仿真结果如下,可以看到上图 2 处和 3 处的赋值在仿真时是同样的数据,把所有数据都用有符号的十进制数显示(右键数据 Radix -> Signed Decimal)

 (可以看到对于负数数据的读入是将其补码读入)

可以看到,data_out_1的结果是错的(没有补符号位),data_out_2的结果是对的(补符号位);

利用IP进行计算

除此之外,还可以调用乘法器的 IP 来代替 乘法符号 *,或者加法器的 IP 来代替 加法符号 +,在 IP 核中配置输入输出为有符号数即可

二、有符号位的位宽匹配问题

参考:verilog有符号数的位宽转换_verilog 有符号数位宽大到位宽小-CSDN博客

当有符号低位宽向高位宽匹配时,高位需要补充符号位

reg [3:0]	original;								//定义4位有符号数寄存器变量
reg [7:0]	later;									//定义8位有符号数寄存器变量
assign later = {{4{original[3]}}},original};		//高4位补original的符号位

当有符号高位宽向低位宽匹配时,直接对于低位进行截取,当然在这个过程中可能会将符号位截掉。

对于短位宽赋值给长位宽的情况,需要对高位进行位扩展,具体是扩展1还是扩展0,记住:完全依据右操作数!,具体如下:
1)右操作数是无符号数,则无论左操作数是什么类型,高位都扩展成0;
2)右操作数是有符号数,则要看右操作数的符号位,按照右操作数的符号位扩展,符号位是1就扩展1,是0就扩展0;
3)位扩展后的左操作按照是无符号数还是有符号数解释成对应的十进制数值,如果是无符号数,则直接转换成十进制数值,如果是有符号数,则看成2的补码解释成十进制数;
4)从上面4种情况看出,有符号数赋值成无符号数会出现数据错误的情况,因此要避免这种赋值,而其他情况都是可以保证数据正确的。

                   
引自:https://blog.csdn.net/qq_31006535/article/details/106216391

三、例子 

1. 题目

根据指示信号select的不同,对输入信号a,b实现不同的运算。输入信号a、b为8bit有符号数,

当select[1:0] = 0,输出a;

当select[1:0] = 1,输出b;

当select[1:0] = 2,输出a+b;

当select[1:0] = 3,输出a-b。

 思路:有符号数的加减法有两种方式

(1)将有符号数输入、输出、中间变量全部定义为有符号数

注意:如果在运算工程中出现无符号数,那么在运算的过程中都会将有符号数(补码形式)视为无符号数参与计算

(2)采用符号位扩展的方式进行运算


`timescale 1ns/1ns
module data_select(input clk,input rst_n,input signed[7:0]a,input signed[7:0]b,input [1:0]select,output reg signed [8:0]c
);always@(posedge clk,negedge rst_n)beginif(~rst_n)beginc <= 9'b0;endelse begincase(select)2'b00: c<= {a[7],a};2'b01: c<= {b[7],a};2'b10: c<= {a[7],a} + {b[7],a};2'b11: c<= {a[7],a} - {b[7],a};endcaseend
end
endmodule

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/4456.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

中国人工智能奠基人张钹院士:走进“无人区” 探索人工智能之路

4月23日&#xff0c;中国人工智能奠基人、清华大学计算机系教授、中国科学院院士张钹在“人文清华”讲坛作专题分享。在2小时的直播中&#xff0c;张钹以《走进“无人区” 探索人工智能之路》为主题&#xff0c;回顾人工智能的发展历程&#xff0c;为大家解读ChatGPT的意义&…

掺硼金刚石电极(BDD电极)电化学特性优异 全球市场将持续扩大

掺硼金刚石电极&#xff08;BDD电极&#xff09;电化学特性优异 全球市场将持续扩大 掺硼金刚石电极&#xff0c;简称BDD电极&#xff0c;是以掺硼金刚石&#xff08;BDD&#xff09;为材料制造而成的电极&#xff0c;即以金属或非金属材料为衬底&#xff0c;采用化学气相沉积法…

十大经典排序算法之选择排序。

​ 选择排序&#xff08;Selection Sort&#xff09;是一种简单直观的排序算法&#xff0c;它的基本思想是通过重复从未排序的部分选择最小&#xff08;或最大&#xff09;的元素&#xff0c;并将其放到已排序部分的末尾&#xff0c;直到整个列表都排序完成&#xff0c;也就是说…

基于Springboot的web后端开发三层架构上手实操

引言 我们拿到了xml文件 我们要将将xml文件中的数据加载并解析 完成数据的处理 并且返回给前端页面(result格式) 1.将xml文件放在resources目录下 xml是我们需要解析的文件 查看xml文件 2.在springboot中引入dom4j依赖 解析xml需要在springboot中引入dom4j依赖 这边我们…

Thread类的基本用法

1.线程创建 这里介绍线程创建常用的五种方法 1.继承Thread&#xff0c;重写run class MyThread extends Thread{public void run(){//这里写的代码就是线程要完成的任务while (true){System.out.println("hello thread");try {Thread.sleep(1000);//线程会休眠一秒…

二维码门楼牌管理应用平台建设:取保候审人员管理的新模式

文章目录 前言一、取保候审人员管理的新挑战二、二维码门楼牌管理应用平台的引入三、平台的功能与应用四、优势与挑战五、结论 前言 随着科技的不断进步&#xff0c;二维码门楼牌管理应用平台已成为城市管理的创新手段。特别是在取保候审人员管理领域&#xff0c;这一技术的应…

电视盒子哪款好?实体店主盘点畅销电视盒子排名

电视盒子功能丰富&#xff0c;是升级电视机最具性价比的方案。我本人做实体数码店多年来&#xff0c;电视盒子是店内销量最好的产品之一&#xff0c;最近很多网友在讨论电视盒子哪款好&#xff0c;我整理了店内销量最好的电视盒子排名&#xff0c;想买电视盒子可以看看下面这几…

海外盲盒App开发:探索全球惊喜,开启无限可能

一、前言 随着全球化的深入发展&#xff0c;人们对于不同文化、不同地域的商品充满了好奇与向往。盲盒文化&#xff0c;作为一种充满神秘与惊喜的消费方式&#xff0c;正逐渐在全球范围内受到热烈追捧。为了满足海外用户对于盲盒的需求&#xff0c;我们团队精心策划并开发了一…

读写锁ReentrantReadWriteLockStampLock详解

现实中有这样一种场景&#xff1a;对共享资源有读和写的操作&#xff0c;且写操作没有读操作那么频繁&#xff08;读多写少&#xff09;。在没有写操作的时候&#xff0c;多个线程同时读一个资源没有任何问题&#xff0c;所以应该允许多个线程同时读取共享资源&#xff08;读读…

盲人安全过马路:科技赋能,独立出行不再难

作为一位资深记者&#xff0c;我长期关注特殊群体的生活现状与科技助力下的改善举措。今天&#xff0c;我要讲述的是盲人朋友在独立出行&#xff0c;尤其是过马路时面临的挑战&#xff0c;以及一款叫做蝙蝠避障的创新辅助应用如何通过实时避障与拍照识别功能&#xff0c;显著提…

深入解读Dubbo:微服务RPC框架的佼佼者

在微服务盛行的今天&#xff0c;RPC&#xff08;远程过程调用&#xff09;框架的重要性日益凸显。Dubbo&#xff0c;作为阿里巴巴公司开源的一款高性能、轻量级的Java RPC框架&#xff0c;已经成为众多企业构建微服务架构的首选。作为一名资深的架构师&#xff0c;我深知Dubbo在…

IntelliJ IDEA 如何启用 JDK 预览特性

IntelliJ IDEA 也可以启用 JDK 的预览特性。 针对项目&#xff0c;选择项目结构。 配置是在语言结构上。 单击语言结构上的 SDK 默认&#xff0c;往下拉&#xff0c;就可以看到针对新版本的选项。 同时还可以看到那些版本是支持新特性预览的&#xff0c;那些版本是不支持新特…

Vue报错 Cannot read properties of undefined (reading ‘websiteDomains‘) 解决办法

浏览器控制台如下报错&#xff1a; Unchecked runtime.lastError: The message port closed before a response was received. Uncaught (in promise) TypeError: Cannot read properties of undefined (reading websiteDomains) at xl-content.js:1:100558 此问题困扰了…

多目标粒子群算法及其MATLAB实现

多目标粒子群优化&#xff08;Multi-Objective Particle Swarm Optimization, MOPSO&#xff09;算法是一种基于种群的优化算法&#xff0c;它结合了粒子群优化&#xff08;Particle Swarm Optimization, PSO&#xff09;和多目标优化的思想。多目标粒子群&#xff08;MOPSO&am…

PCL:投影滤波器

1.介绍 在点云处理中,投影滤波器是一种常用的工具,它可以将点云投影到给定的模型上,并保留投影后的点云数据。 投影滤波器主要应用于以下场景: 平面投影:将点云投影到一个已知的平面上,以获取平面上的点云数据。几何模型投影:将点云投影到已知的几何模型上,如圆柱体、…

IP地址信息——IP地址、子网掩码、默认网关和DNS

IP地址信息 通常来说&#xff0c;一个完整的IP地址信息应该包括IP地址、子网掩码、默认网关和DNS等4部分内容&#xff0c;只有当它们各司其职、协同工作时&#xff0c;我们才可以访问Internet&#xff0c;并被Internet中的计算机所访问。需要注意的是&#xff0c;采用静态IP地…

开发工具-pycharm的代码自动部署服务器以及服务端python配置、项目开发环境一键启动服务

文章目录 一、pycharm的ssh配置1.本地生成ssh密钥2.密钥配置到远端服务器(1-1) 有权限ssh访问到服务器(1-2) 无权限ssh访问到服务器(1-3) 没有办法通过以上形式上传到服务器(2) 配置到authorized_keys自动访问 3.pycharm中配置ssh(1) 选择File中的settings(1) 选择Tools中的SSH…

在 React Router v5 中,写子路由,父级路由如果加了exact属性,就显示不了子组件

在 React Router v5 中&#xff0c;当你在父级路由上使用 exact 属性时&#xff0c;它意味着该路由只有在其 path 完全匹配当前 URL 时才会被激活。这意味着&#xff0c;如果父级路由精确匹配了&#xff0c;React Router 就不会继续向下查找子路由&#xff0c;因为 exact 限制了…

js的算法-插入排序(折半插入排序)

直接插入排序的步骤 1. 从前面的有序子表中查找出待插入元素应该被插入的位置 2. 给插入位置腾空间 3. 将待插入元素复制到表中的插入位置。 直接插入排序&#xff1a;边比较边移动&#xff1b; 折半插入排序 先折半查找出元素的待插入位置&#xff0c;然后统一地移动待插…

上位机图像处理和嵌入式模块部署(树莓派4b之远程vnc桌面访问)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 对于很多嵌入式开发比较精通的同学来说&#xff0c;使用命令行和开发板之间进行沟通是他们完全能够接受的一种开发方式。但是对于更多的朋友来说&a…