以下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
答案 0 :(得分:0)
IW
和OW
是定义输入和输出位宽的参数。
我们有一个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
)与乘以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。