两个';verilog中的s补码
我一直在尝试构建一个模块,它返回(3位)输入的两个补码表示(第一位是符号)。我认为下面的代码在概念上是正确的,但我可能遗漏了它的结构:当我尝试编译时,我会出现以下错误:两个';verilog中的s补码,verilog,Verilog,我一直在尝试构建一个模块,它返回(3位)输入的两个补码表示(第一位是符号)。我认为下面的代码在概念上是正确的,但我可能遗漏了它的结构:当我尝试编译时,我会出现以下错误: (vlog-2110) Illegal reference to net "f_o". (vlog-2110) Illegal reference to net "f_o". (vlog-2110) Illegal reference to net "f_o". 搜索该错误表明,当同时使用变量作为输入和输出时,通常会看到该错误
(vlog-2110) Illegal reference to net "f_o".
(vlog-2110) Illegal reference to net "f_o".
(vlog-2110) Illegal reference to net "f_o".
搜索该错误表明,当同时使用变量作为输入和输出时,通常会看到该错误,但我的情况并非如此。你能指出错误在哪里吗
module ca2 (a_i,f_o);
input [2:0] a_i;
output [2:0] f_o;
always @(a_i[2:0] or f_o[2:0])
begin
if (a_i[2] == 1)
begin
f_o[2] = a_i[2];
f_o[1:0] = (~a_i[1:0] + 'b1);
end
else
begin
f_o = a_i;
end
end
endmodule
在Verilog中,在大多数情况下,未声明的标识符被认为是隐式的wire声明。由于f_o尚未声明,编译器将其视为一个连接,而不是一个变量。这会导致编译器抱怨所有赋值
// What was typed
module ca2 (a_i,f_o);
input [2:0] a_i;
output [2:0] f_o;
// What the compiler implicitly declares
wire [2:0] a_i;
wire [2:0] f_o;
要修复它,您可以声明变量或同时声明端口和变量
module ca2 (a_i,f_o);
input [2:0] a_i;
output [2:0] f_o;
reg [2:0] f_o;
module ca2 (a_i,f_o);
input [2:0] a_i;
output reg [2:0] f_o;
f_o
需要声明为reg<代码>输出注册表[2:0]f_o
我也不知道你在计算什么,这不是标准的二补
module ca2 (
input [2:0] a_i,
output [2:0] twos_comp,
output [2:0] also_twos_comp
);
assign twos_comp = ~a_i + 1'b1;
assign also_twos_comp = -a_i ;
endmodule
您可能正在处理一个编码输入,但Two S_补码是对我期望符号位(MSB)改变的数字求反。虽然我们将其称为符号位,但它也包含有关值的信息,因此不能将其去掉,保持数字不变。非常感谢。。。一些如此“小”的东西,我无法用手指触摸它!也谢谢,问题的解决方案与Adam12相同。关于你的其他评论,基本上我所做的是,如果输入为正,则保持数字不变,如果输入为负,则更改为ca2表示法(即:如果输入为101,则表示-3,ca2为011)。我不知道这个例子是否有意义,但在任何情况下,代码都满足了我的需要。啊,这就是将符号(MSB)大小(LSB)转换为两个补码。