本文参考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[:] a;
input wire[:] b; output wire cmp_out; //****************************************
// Define
//
//****************************************
localparam YES = 'b1;
localparam NO = '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[], b[]})
'b01:begin // a+, b-
cmp_reg <= 'b1;
end
'b10:begin // a-, b+
cmp_reg <= 'b0;
end
'b00:begin // a+, b+, Compare Amplitude
if(a[:] >= b[:])begin // Unsigned Compare
cmp_reg <= 'b1;
end
else begin
cmp_reg <= 'b0;
end
end
'b11:begin // a-, b-, Compare [6:0]
if(a[:] >= b[:])begin
cmp_reg <= 'b1;
end
else begin
cmp_reg <= 'b0;
end
end
default:begin
cmp_reg <= 'b0;
end
endcase
end
end endmodule

4、仿真

整体:比较结果y是PWM信号的形式。

局部:a<b

局部:a>b

仿真结果满足我的需要。

Verilog有符号整型数(signed int)比大小的更多相关文章

  1. v.size() return size_t not int 返回无符号整型数

    In the C++ STL, the vector size() function return size_t, which is unsigned int, not int. So imagine ...

  2. 无符号整型 unsigned int、unsigned long、usigned long long、size_t 比较和格式控制

    位数比较 由于数据的长度和平台相关,所以基于 64 位系统比较. Windows Linux unsigned int 32 bits/4294967295 32 bits unsigned long ...

  3. leetcode菜鸡斗智斗勇系列(1)---把一个链表中的二进制数字转换为一个整型数(int)

    Convert Binary Number in a Linked List to Integer这道题在leetcode上面算作是“easy”,然而小生我还是不会做,于是根据大佬的回答来整理一下思路 ...

  4. 使用程序获取整型数据和浮点型数据在内存中的表示---gyy整理

    使用程序获取整型数据和浮点型数据在内存中的表示. C++中整型(int).短整型(short int).单精度浮点数(float).双精度浮点数(double)在内存中所占字节数不同,因此取值范围也不 ...

  5. strtoul (将字符串转换成无符号长整型数)

    strtoul strtoul (将字符串转换成无符号长整型数) 相关函数 atof,atoi,atol,strtod,strtol 表头文件 #include<stdlib.h> 定义函 ...

  6. 求一个整型数字中有没有相同的部分,例如12386123这个整型数字中相同的部分是123,相同的部分至少应该是2位数,如果有相同部分返回1,如果没有则返回0。方法是先将整型数字转换到数组中,再判断。函数为 int same(int num)其中num是输入的整型数字

    import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class Test { pub ...

  7. 整型:int

    整型:int 整型变量的定义和输出 注意://short<=int<=long<=longlong   代码示例一:   #include<stdio.h> int ma ...

  8. PHP中IP地址与整型数字互相转换详解

    这篇文章主要介绍了PHP中IP地址与整型数字互相转换详解,本文介绍了使用PHP函数ip2long与long2ip的使用,以及它们的BUG介绍,最后给出自己写的两个算法,需要的朋友可以参考下 IP转换成 ...

  9. 使用头文件climits中的符号常量获知整型数据的表数范围---gyy整理

    在头文件climits(limits.h)以宏定义的方式定义了各种符号常量来表示各种整型类型表示数的范围,如int的最大最小值,long的最大最小值等. 符号常量 表示 CHAR_BIT char 的 ...

随机推荐

  1. Python学习第二十四课——Mysql 外键约束

    外键:主要是关联两个表的 举个栗子:在建表中创建外键 -- 添加外键例子 CREATE TABLE teacher( id TINYINT PRIMARY KEY auto_increment, na ...

  2. pytorch资料

    torchvision是独立于pytorch的关于图像操作的一些方便工具库. torchvision的详细介绍在:https://pypi.org/project/torchvision/ torch ...

  3. MQTT的签名算法

    一 使用技小新的算法,时间戳不能带参数否则连接失败: 二 网页的签名算法:http://encode.chahuo.com/ 注意将红色的4个参数换成你自己的clientIddeviceName 密钥 ...

  4. Update(stage3):第1节 redis组件:8、主从复制架构;9、Sentinel架构

    8.redis的主从复制架构 在Redis中,用户可以通过执行SLAVEOF命令或者设置slaveof选项,让一个服务器去复制(replicate)另一个服务器,我们称呼被复制的服务器为主服务器(ma ...

  5. 洛谷 P3009 [USACO11JAN]利润Profits

    嗯... 题目链接:https://www.luogu.org/problemnew/show/P3009 这是DP的另一个功能,求最大子段和(最大子段和模板:https://www.luogu.or ...

  6. linux操作系统及内核

    自己的一点总结,把知识重新编码~ 一.操作系统概述 在Richard Stevens的unix环境高级编程中这样定义“它控制计算机硬件资源,提供程序运行环境.一般而言我们称这种软件为内核(kernel ...

  7. SpringBoot笔记二:整合篇

    Spring Boot与缓存 jsr-107 Java Caching定义了5个核心接口分别是CachingProvider, CacheManager, Cache, Entry 和 Expiry. ...

  8. KVM的客户机可以使用的存储

    KVM的虚拟机可以直接使用宿主机器内的存储设备,比如可以把宿主机器内的硬盘直接暴露给 虚拟机挂载使用 -hda /dev/sfa(宿主机的设备文件) 还可以把镜像文件挂接到虚拟机,作为虚拟机的存储设备 ...

  9. StringBuffer调整空间

    在无法估算字符串大小情况下,可以使用StringBuffer的trimToSize()方法调整到合适大小.

  10. 关于盒模型的外边距padding和内边距margin

    边框border属性值  solid实线   dashed虚线   dotted点线   double双实线 /* 内边距 */padding:20px 30px 30px 30px;若有四个值代表  ...