Verilog:无符号乘有符号
现在我正试图通过一个8位变量来调整12位有符号输入的振幅Verilog:无符号乘有符号,verilog,modelsim,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 >>
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中的基数类型是根据我等待看到的设置的
我做错了什么?谢谢这一行不会像我想的那样延伸:
assign signed_amp = amp;
amp
为8位宽且无符号。Verilog将通过在左侧添加一个1'b0
将其扩展到9位,无论amp
的第7位的状态如何。signed\u amp
已签名这一事实与此无关
要实现此功能,首先需要使用$signed
系统功能将amp
转换为要签名:
assign signed_amp = $signed(amp);
我认为这也不是你所期望的:
assign out = $signed(amp) * (in >> 8);
>
是逻辑右移。因此,将在左侧添加零。我想你需要这个:
assign out = $signed(amp) * (in >>> 8);
使用算术右移运算符-
>
,它将在中保留的符号 我使用>>8将输入除以256,这样就可以乘以0…255。事实证明,变量的“12位有符号”部分存储在前12位(duh!),而modelsim显示整个19位的值,这是误导性的