Verilog:乘以未签名

时间:2018-07-10 18:52:23

标签: verilog modelsim

现在我正在尝试通过8位变量来调整12位带符号输入的幅度。

module mixer_4input (in, amp, out);

input signed    [11:0]  in;
input           [7:0]   amp;
wire signed     [8:0]   signed_amp;
output signed  [19:0]   out;

assign signed_amp = amp; 
assign out = $signed((in  >> 8) * signed_amp);  
//assign out = $signed(amp) * (in >> 8); //this one works wrong too

endmodule

modelsim screenshot here

但是输出要么缺少符号,要么完全错误。 根据我等待的结果来设置modelsim中的基数类型

我在做什么错?谢谢

1 个答案:

答案 0 :(得分:0)

此行不会像我期望的那样符号扩展:

assign signed_amp = amp;

amp为8位宽且无符号。无论1'b0的第7位处于何种状态,Verilog都会通过在左侧添加amp将其扩展为9位。 signed_amp已签名的事实无关紧要。

要执行此操作,您需要首先使用amp系统功能将$signed转换为签名:

assign signed_amp = $signed(amp);

我认为这也不符合您的预期:

assign out = $signed(amp) * (in >> 8);

>>逻辑右移。因此,零将添加到左侧。我怀疑您需要这个:

assign out = $signed(amp) * (in >>> 8);

使用算术右移运算符->>>,它将保留in的符号。