本文參考了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
仿真結果滿足我的需要。