Verilog使用有符号数

在Verilog中使用二进制补码数据,对负数求绝对值,也就是负数取反,正数不变。


已知负数A,则|A|=~A+1,或者|A|=-A,两种是等效的,但是FPGA编译出来资源一样?等待试试。

但是,但是,有符号数的负最大值,取反后,还是原数,如x[3:0] 是1000=-8,取反加1后后,还是1000,

则需要进行符号位扩展,在高位扩展一位符号位,然后取反加1,才是绝对值。

求绝对值,必须得符号位扩展,

下面是Modelsim仿真程序:

module tb_signed_x;
    reg signed [3:0] signed_x;
    reg        [3:0] unsigned_x;
    
    reg signed [3:0] abs_x;
    reg signed [4:0] abs_x_ext;
    reg signed [4:0] abs_x_minus;
    
    reg clk;
    always #5 clk = ~clk;
    
    integer ii;
    initial begin
      ii = 0;
      clk = 0;
      for(ii = 0;ii<16;ii=ii+1) begin
          signed_x   = ii; 
          unsigned_x = ii;
          abs_x = signed_x[3]?(~signed_x + 1'b1):signed_x;     //不进行符号位扩展,<span style="font-family: Arial;">|A|=~A+1</span>
          abs_x_ext = signed_x[3]?(~{1'b1,signed_x}+1'b1):{1'b0,signed_x};  //符号位扩展,<span style="font-family: Arial;">|A|=~A+1</span>
          abs_x_minus = signed_x[3]?(-{1'b1,signed_x}):{1'b0,signed_x};    //符号位扩展,<span style="color: rgb(51, 51, 51); font-family: Arial; font-size: 14px; line-height: 26px;">|A|=-A</span>
          @(posedge clk);
      end
      
      $stop;
    end
    
    
endmodule


仿真图形:



符号位扩展,才不会出现错误,在负极大值,仿真图形,-8处,不进行符号位扩展,则绝对值计算错误,取反后还是原数;符号位扩展后,结果正确;


数据显示为二进制格式:


可以清晰看见转换后的二进制格式;

-----

图片看不清楚,可以右键,在新标签页打开图片,可以看大图,很清晰

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Verilog中,可以使用符号进行累加运算。有符号使用补码表示的,其范围通常是从最小负到最大正。为了设计一个有符号累加器,你可以使用符号输入和输出端口,并在接收到有效据时进行累加运算。具体而言,你可以使用一个输入端口i_data来接收-8到7范围内的有符号使用一个i_valid端口来表示输入据的有效性。当接收到4个据后,可以进行有符号累加运算,并将结果输出到o_data端口。同时,拉高o_ready线来指示累加器已经准备好输出结果。这样,你就可以在Verilog中实现有符号的累加器功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Verilog 和VHDL有符号和无符号相关运算](https://blog.csdn.net/yh13572438258/article/details/125526450)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [verilog符号加法器设计](https://download.csdn.net/download/qq_42025108/16392840)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值