【问题标题】:how do I represent negative decimal verilog我如何表示负十进制verilog
【发布时间】:2016-03-18 13:39:56
【问题描述】:

我已将一些十进制值转换为定点,并希望进行一些乘法,但是其中一些值是负数,谁能告诉我一个简单的方法来进行乘法我尝试过但没有成功:

pix_r2m<=($signed({1'b0,pix_rld})*8'b11101101;// the binary is:-0.148.

这是以同步方式发生的,pix_r2mpix_rld 定义为:

reg [16:0]pix_r2m;
reg [7:0]pix_rld;

【问题讨论】:

  • @morgan 你能把我的verilog整体看一下吗?还有很多代码
  • 如果代码处于编译状态,则可以将其发布到Code Review SE。否则,这里是单独解决每个问题的最佳地点。
  • @Morgan 我如何将 -0.148 表示为 8 位并以十进制表示应该给我 -38 我如何将其表示为十进制而不是二进制?
  • 您实际上并没有说明您的数据是什么格式。假设 8 位小数。 0.148 * 2^8 是 38(8 个小数位)。在命令行上将 8 位十进制转换为 ruby​​ (irb) 中的二进制我可以这样做 38.to_s(2) => "100110" 如果想要对它进行负数补码,这是正数版本。
  • Verilog 不关心十进制、二进制或十六进制,因为它们都只表示二进制位模式。我在问,以便我可以检查小数点/二进制点是您放置的位置。但在这种情况下,我认为问题在于 verilog 恢复为无符号算术。但是您没有提供输入刺激和预期输出以及您实际看到的错误输出,因此很难判断我是否解决了正确的问题。

标签: math verilog fixed-point


【解决方案1】:

如果有任何机会,Verilog 将恢复为无符号算术,这里的被乘数或系数是无符号的。告诉它是用 8'sb 签名的,可以进行正确的符号扩展。

module test;
  reg [16:0]pix_r2m;
  reg [7:0]pix_rld;

  always @* begin
    //* -0.148
    pix_r2m = $signed({1'b0,pix_rld}) * 8'sb11110111;
  end

  initial begin
    pix_rld = {4'd1,4'd0}; //1
    #1 $display("%b", pix_r2m);


    pix_rld = {4'd2,4'd0}; //2
    #1 $display("%b", pix_r2m);
  end


endmodule

EDA Playground.

但您可能希望将结果标记为已签名,因此您应该使用:

reg signed [16:0]pix_r2m;

【讨论】:

    猜你喜欢
    • 2021-07-12
    • 2011-10-02
    • 2018-04-23
    • 1970-01-01
    • 2021-12-07
    • 2013-10-30
    • 1970-01-01
    • 2014-11-30
    • 2021-08-13
    相关资源
    最近更新 更多