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、仿真

整體:比較結果y是PWM信號的形式。

 

局部:a<b

局部:a>b

仿真結果滿足我的需要。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM