【问题标题】:How to implement an n-bit adder whose input vectors are represented in octal?如何实现输入向量以八进制表示的 n 位加法器?
【发布时间】:2014-02-23 20:22:50
【问题描述】:

我对这个问题有些困惑:

"编写一个verilog模块,用于n位整数的全加。令参数,位数,等于3。从测试台调用此模块,并在测试台中指定要添加的数字数组。将八进制值分配给 X 和 Y 数组。进位为 0。"

是的,这是家庭作业。

我能够为 n 位加法器编写模块:

module addern(carryin, X, Y, S, carryout, overflow);
  parameter n = 3;
  input carryin;
  input [n-1:0] X, Y;
  output reg [n-1:0] S;
  output reg carryout, overflow;

  always @(X,Y, carryin)
    begin 
      {carryout, S} = X + Y + carryin;
      overflow = (X[n-1] & Y[n-1] & ~S[n-1]) | (~X[n-1] & ~Y[n-1] & S[n-1]);
    end

endmodule   

我了解问题的这一部分。但是,我不确定如何实现八进制数加法。 verilog 中有没有办法表明数组保存的是八进制值,而不是二进制?

verilog 中有什么类似于 typecast 的东西吗?例如,input (octal) [n-1:0] X, Y,并在测试台上做同样的事情。

感谢任何建设性的意见。

【问题讨论】:

  • 你不需要;只需将你的总数分成三个一组。
  • 好点。那么我是否只需将参数n 更改为9?我唯一关心的是问题的措辞。例如,在页面下方,它表示将 X 显式设置为 [0,1,3]。
  • 他们要求你做的就是为 X 分配一个八进制文字 - x = 9'o013
  • 这是有道理的。如果我这样做,verilog 是否足够智能以添加八进制数字,即parameter n = 3;
  • 八进制、十六进制和十进制只是在一天结束时可视化数字的方式,当以数字方式存储时它们是二进制的。

标签: verilog


【解决方案1】:

我很确定我和你在同一个班。我认为您需要做的是创建一个分层的 Verilog 模块,然后在那里分配您的值。那将是您的测试平台。例如,如果你想让 X 你写输入 [n-1:0] X = 3'o013,或者如果 Oli 是正确的,它可能是 X = 9'o013。你不改变 n,但它有点像 BCD,它们是成组的,你有一定数量的位可以在溢出之前表示。

【讨论】:

    【解决方案2】:

    为了帮助解决问题,请思考以下问题:
    Q) 数字如何存储在数字硬件中?
    A) 二进制,数字逻辑我们只能表示 2 个值 1 和 0,但这样我们就可以表示整数、定点或浮点数。

    因此,数字数字以 2 为底(两个可能的值),同时能够表示任何数字。存在其他基数,例如八进制 (base 8) 十六进制 (base 16) 和十进制 (base 10),但这些只是表示数字的方式,类似于二进制仅表示数字的方式。

    十进制的 1 表示为 1 n 所有的基数,当存储为二进制时,它们都是相同的。 verilog 中的一些值的示例以及二进制等价物。

    Octal    Decimal   Hex     Binary
    3'O7  => 3'd7   => 3'h7 =>    3'b111
    6'O10 => 6'd8   => 6'h8 => 6'b001000
    

    verilog 中的八进制、十进制和十六进制只是二进制格式的表示,是查看数据的一种方式。由于低级电子无法表示除 0 和 1 之外的任何事物。

    关于八进制和十六进制的有趣之处在于它们具有 2 的幂,因此它们使用精确的位数,因此 9'O123 与单独处理每个八进制位置并将它们连接在一起 9'O123 == {3'O1, 3'O2, 3'O3} 相同。这也适用于十六进制值,但不是十进制(以 10 为底)值,因为 10 不是 2 的幂,并且不会完全占据数字空间。

    这确实允许创建“八进制”端口,这只是 3 位二进制端口

    module octal_concat (
      input  [2:0] octal_2,
      input  [2:0] octal_1,
      input  [2:0] octal_0,
      output [8:0] concat
    );
      assign concat = {octal_2, octal_1, octal_0};
    endmodule
    
    octal_concat octal_concat_0 (
      .octal_2(3'O1), 
      .octal_1(3'O2), 
      .octal_0(3'O3),  
      .concat() //Drives 9'O123 which is also 9'b001_010_011
    );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-16
      • 1970-01-01
      • 1970-01-01
      • 2011-01-10
      • 1970-01-01
      • 1970-01-01
      • 2022-10-04
      • 1970-01-01
      相关资源
      最近更新 更多