题
我试图在verilog中设计一个4位加法器减法器。这只是我用verilog写的第二件事,我还不知道所有正确的语法。这是我到目前为止的模块:
module Question3(carryin, X, Y, Z, S, carryout, overflow);
parameter n = 4;
input carryin, Z;
input [n-1:0]X, Y;
output reg [n-1:0]S;
output reg carryout, overflow;
if(Z==0)
begin
Y = not(y) + 4'b0001;
end
always @(X, Y, carryin)
begin
{carryout, S} = X + Y + carryin;
overflow = carryout ^ X[n-1]^Y[n-1]^S[n-1];
end
endmodule
我的编译器(xilinx 10.1),一直说“if if附近的语法错误”。我尝试了很多不同的转换方法,包括使用一个以Y为参数的Case,然后检查所有可能的4位组合,并将它们转换为二进制补码。
Z决定加法器是否进行减法或加法。如果它为0,则表示减法,我想将y转换为2的补码,然后只进行常规加法。我确定加法器的其余部分是正确的,我只是不知道我试图转换的部分有什么问题。
解决方案
reg [n-1:0] Y_compl;
always @( Z, Y, X, carryin ) begin
Y_ = ( ~Y + 4'b0001 );
if ( Z == 1'b0 ) begin
{carryout, S} = X + Y_compl + carryin;
overflow = carryout ^ X[n-1] ^ Y_compl[n-1] ^ S[n-1];
end
else begin
{carryout, S} = X + Y + carryin;
overflow = carryout ^ X[n-1] ^ Y[n-1] ^ S[n-1];
end
end
有几个要点。
- 将if语句放在always块中。不要使用两个always块,你将在模拟器中创建一个竞争条件。
- 我创建了一个新变量Y_因为使用Y作为输入,记住,在作业的左侧可能会推断出锁定或在合成时做一些令人讨厌的事情。
- 我建议使用按位反转运算符'〜'来反转Y而不是'不' 原始。综合工具可以更自由地以这种方式优化代码。
- 仔细检查结果是否正确,自从我制作了一个加法器以来已经有一段时间了。 醇>
其他提示
您使用的是小写字母“y”。在“Y =不(y)+ 4'b0001;”
中此外,您使用的内容超出了您的需求。 X-Y与NOT(NOT(X)+ Y)相同。
将if语句放在初始块中 http://www.asic-world.com/verilog/vbehave1.html
不隶属于 StackOverflow