ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Verilog有符号整型数(signed int)比大小

2019-11-07 11:01:30  阅读:1526  来源: 互联网

标签:wire 0000 int signed 负数 Verilog input reg cmp


本文参考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、仿真

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

 

局部:a<b

局部:a>b

仿真结果满足我的需要。

 

标签:wire,0000,int,signed,负数,Verilog,input,reg,cmp
来源: https://www.cnblogs.com/YangGuangPu/p/11809554.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有