Verilog:乘以无符号符号
Verilog: Multiply signed by unsigned
现在我正在尝试通过一个 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中的radix type根据我等着看
我做错了什么?谢谢
这一行不会像我想的那样进行符号扩展:
assign signed_amp = amp;
amp
是 8 位宽且无符号。 Verilog 将通过在左侧添加 1'b0
将其扩展为 9 位,而不管 amp
的位 7 的状态如何。 signed_amp
已签名的事实无关紧要。
要完成这项工作,您需要先将 amp
转换为使用 $signed
系统函数进行签名:
assign signed_amp = $signed(amp);
我认为这也不符合您的预期:
assign out = $signed(amp) * (in >> 8);
>>
是 合乎逻辑的 右移。因此,将在左侧添加零。我怀疑你需要这个:
assign out = $signed(amp) * (in >>> 8);
使用 算术 右移运算符 - >>>
,这将保留 in
的符号。
现在我正在尝试通过一个 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中的radix type根据我等着看
我做错了什么?谢谢
这一行不会像我想的那样进行符号扩展:
assign signed_amp = amp;
amp
是 8 位宽且无符号。 Verilog 将通过在左侧添加 1'b0
将其扩展为 9 位,而不管 amp
的位 7 的状态如何。 signed_amp
已签名的事实无关紧要。
要完成这项工作,您需要先将 amp
转换为使用 $signed
系统函数进行签名:
assign signed_amp = $signed(amp);
我认为这也不符合您的预期:
assign out = $signed(amp) * (in >> 8);
>>
是 合乎逻辑的 右移。因此,将在左侧添加零。我怀疑你需要这个:
assign out = $signed(amp) * (in >>> 8);
使用 算术 右移运算符 - >>>
,这将保留 in
的符号。