这个Verilog模块有什么作用?

时间:2015-03-29 23:56:21

标签: verilog

以下Verilog模块有什么作用?

module mystery(r, a);
  parameter IW = 16, OW = 32;
  input  [IW-1:0] a;
  output [OW-1:0] r;

  wire   [OW-1:0] al;

  assign al = {{(OW-IW){a[IW-1]}} , a};
  assign r  = (al << 2) + (al << 1) + al;
endmodule

3 个答案:

答案 0 :(得分:0)

IWOW是定义输入和输出位宽的参数。

我们有一个16位输入和一个32位输出,al是一个内部32位值。宽度通常声明为0到WIDTH-1。而不是1到WIDTH,这就是为什么我们有[IW-1:0][OW-1:0]

Verilog有一个复制函数{ NUMBER { VALUE }}这会复制VALUE一次。

Verilog也有点连接{VALUE_A, VALUE_B}

我们也可以为LSB(最低有效位)选择数组a [0],为最少两个有效位选择[1:0]或为MSB选择[IW-1](最重要的)位)。

有符号值的MSB包含签名信息,有时也称为符号位。

这三条规则结合在这条指令中:

assign al = {  {(OW-IW){a[IW-1]}}, a  };

它取得a的MSB(Sign)并复制它,OW和IW之间的差异,即16次。然后将其与a连接起来。通常使用此模式,因为符号扩展

第2部分

<<向左移动了一点。这与乘以2相同。向左移动两次(<<2)与乘以4相同。

所以留下一些东西让你找出最后一行相当于:

assign r  = (al*4) + (al*2) + (al*1);

请记住al只是输入a的符号扩展。 al包含相同的数值。

答案 1 :(得分:0)

模块之谜(r,a);

参数IW = 16,OW = 32;

输入[IW-1:0] a;

输出[OW-1:0] r;

电线[OW-1:0] al;

指定al = {{(OW-IW){a [IW-1]}},a};

指定r =(al <&lt; 2)+(al <&lt; 1)+ al;

endmodule

逐行说明: 第1行:使用两个信号定义模块 mystery - r,a

第2行:定义两个参数,IW和OW,以及代码中指示的相应值。参数类似于Verilog中的常量。

第3,4行:声明 r 作为输出, a 作为输入;这些是向量网,输入从[16-1:0]开始,即15 down_to 0(它是16位向量) 输出r从[32-1:0]开始,即31 down_to 0(它的32位向量) 请注意,参数IW和OW的值将替换为16和32 resp。

第5行声明一条网络数据类型 al 向量,大小为31:0,即32位

第6行并行分配到网 al

(OW-IW)=(32-16)= 16

[IW-1] = [16-1] = 15

verilog中的

{}表示连接操作,所以我们可以,

{{16 {a [15]}},a}即第15位&#39; a&#39;被复制16次,结果与原始的16位向量相连接&#39; a&#39;从而导致32位向量 al

第7行它对al执行左移操作2和1,并添加这些移位值,如代码所示。

所以它可以被视为:

R =(ΔL* 4)+(ΔL* 2)+(人);

左移 n 表示将值乘以 2n

希望我能够清除您的查询! :) 继续编码! :)

答案 2 :(得分:0)

这一行:分配al = {{(OW-IW){a [IW-1]}},a} sign-扩展输入字,重复其最左边(符号)位所需的次数,使其与输出的大小相同。

该行:赋予r =(al <&lt; 2)+(al <&lt; 1)+ al; 添加(4x输入值)+(2x输入值)+ 1x输入值 利用之前的标志扩展。 如果输出字大小不足以大于输入字大小,则此添加可能会溢出。

因此,该模块将带符号输入异步乘以固定值7。