现在我正在尝试通过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中的基数类型
我在做什么错?谢谢
答案 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
的符号。