Verilog有符号整型数(signed int)比大小
本文参考了https://blog.csdn.net/wenxinwukui234/article/details/42119265/ 关于2进制补码的思考和讨论。
======================================================================================================
即使在变量声明的时候定义了signed属性, 在Verilog中使用>(大于),>=(大于等于),<(小于)和<=(小于等于)进行有符号数的大小比较时还是没有想要的结果。
现在需要实现一个有符号数比较的功能。
1、一些注记。
以8位有符号数(signed int)为例,表示范围是-128~+127,有一些边缘的数很有特征,记下来方便使用:
0000_0000 表示 0;
0000_0001 表示 +1;
1111_1111 表示 -1;
0111_1111 表示 +127;
1000_0001 表示 -127;
1000_0000 表示 -128.
我们发现,(1)除了0和-128,其他相反数按无符号相加,得到的是0000_0000(即0000_0000)。
(2)非负数的MSB(最高位)=0;负数的MSB=1。
2、比较规则。
我们设a和b为输入的两个signed 8类型的比较数,并且a>=b(GE)时输出信号y为1,否则输出为0。比较的规则如下:
(1)非负数一定大于负数。
(2)负数一定小于非负数。
(3)a、b同是非负数,则按unsigned比较两个数:a>=b则y=1;a<b则y=0。
(4)a、b同是负数,则按unsigned比较a和b的[6:0]即除去符号位:a[6:0]>=b[6:0]则y=1;a[6:0]<b[6:0]则y=0。
3、Verilog模块。
//************************************ // A >= B -> 1 // A < B -> 0 // //************************************ module ageb_s8( rst_n, sys_sam_clk, a, b, cmp_out ); //**************************************** // Port Def. // //**************************************** input wire rst_n; input wire sys_sam_clk; input wire[7:0] a; input wire[7:0] b; output wire cmp_out; //**************************************** // Define // //**************************************** localparam YES = 1'b1; localparam NO = 1'b0; //**************************************** // Variables // //**************************************** reg cmp_reg; //**************************************** // Behaviour // //**************************************** assign cmp_out = cmp_reg; //*** Compare Logic always@(posedge sys_sam_clk)begin if(!rst_n)begin cmp_reg <= 1'b0; end else begin case({a[7], b[7]}) 2'b01:begin // a+, b- cmp_reg <= 1'b1; end 2'b10:begin // a-, b+ cmp_reg <= 1'b0; end 2'b00:begin // a+, b+, Compare Amplitude if(a[6:0] >= b[6:0])begin // Unsigned Compare cmp_reg <= 1'b1; end else begin cmp_reg <= 1'b0; end end 2'b11:begin // a-, b-, Compare [6:0] if(a[6:0] >= b[6:0])begin cmp_reg <= 1'b1; end else begin cmp_reg <= 1'b0; end end default:begin cmp_reg <= 1'b0; end endcase end end endmodule
4、仿真
仿真结果满足我的需要。
原文地址:https://www.cnblogs.com/YangGuangPu/p/11809554.html
- [喵咪Liunx(3)]端口转发工具rinetd
- 基于PhalApi的Smarty拓展
- PhalGo-参数验证过滤
- [喵咪Redis]Redis配置文件和主从设置
- [喵咪Redis]Redis-Sentinel
- [喵咪Redis]Redis安装与介绍
- [喵咪Liunx(4)Monit进程监控
- 【第四期】GC专题
- ML中相似性度量和距离的计算&Python实现
- ASP.NET MVC Model元数据及其定制: Model元数据的定制
- 小白也可以操作的手机TensorFlow教程:Android版和iOS版
- PhalApi-PHPExcel基于PhalApi的PHPExcel拓展
- [喵咪软件推荐(2)]全球服务器测速工具speedtest-cli
- 使用Keras创建一个卷积神经网络模型,可对手写数字进行识别
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- MySQL在Docker环境下运行基础
- Redis 秒杀实战
- Oracle 19c集群重装步骤详解
- 神经网络训练中回调函数的实用教程
- DGA域名检测的数据分析与深度学习分类
- Saferwall:下一代开源恶意软件分析平台
- Java安全编码之SQL注入
- Wireshark解密HTTPS流量
- 独家 | 如何用XGBoost做时间序列预测?
- 关于Web点击劫持的一些实例
- LeetCode 爬取官网所有题目和自己的最近题解
- 一张图实现3D人脸建模!这是中科院博士生入选ECCV的新研究 | 开源
- client-go 之 DeltaFIFO 实现原理
- KEDA-Kubernetes 中基于事件驱动的自动伸缩
- 更新 Kubernetes APIServer 证书