标签: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. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。