题
我正在尝试用 Verilog 编写 BCD 加法器,但其中一个模块遇到问题。具体来说,加法器将两个 BCD 数字相加。所以,如果两位数之和小于或等于九,那么它就是正确的。但是,如果它更大,则必须添加 6 的偏移量。这是到目前为止我的 Verilog 代码:
module DIGITADD(
input [3:0] IN_A,
input [3:0] IN_B,
input CIN,
output reg COUT,
output reg [3:0] SUM
);
wire s2, c2;
always @ ( * )
begin
assign {c2, s2} = IN_A + IN_B + CIN;
if(s2 <= 9 && c2 == 0) begin
assign {COUT, SUM} = {c2, s2};
end
else if({c2, s2} > 9) begin
assign {COUT, SUM} = {c2, s2 + 6};
end
end
endmodule
无论如何,当我尝试在 Xilinx 中综合它时,我收到以下错误:
错误:HDLCompilers:247 - “DIGITADD.v”第 33 行对标量线“c2”的引用不是合法的寄存器或变量左值
错误:HDLCompilers:247 - “DIGITADD.v”第 33 行对标量线“s2”的引用不是合法的寄存器或变量左值
错误:HDLCompilers:42 - “DIGITADD.v”第 33 行程序分配的左侧非法
我尝试改变一些东西,例如将电线更改为reg,但我仍然无法让它工作。任何帮助表示赞赏。
解决方案
好吧,我明白了,正确的代码如下。基本上,请参阅我对我的问题所做的评论,以获取一些需要记住的提示。有趣的是,与我之前遇到的混乱相比,这要简单得多。
module DIGITADD(
input [3:0] IN_A,
input [3:0] IN_B,
input CIN,
output COUT,
output [3:0] SUM
);
reg [4:0] s2;
assign SUM = s2[3:0];
assign COUT = s2[4];
always @ ( * )
begin
s2 = IN_A + IN_B + CIN;
if (s2 > 9)
begin
s2 = s2 + 6;
end
end
endmodule
其他提示
在纯文本中,不要在程序块中使用连续赋值,例如“赋值”语句,即总是或初始。
记住规则,生活就会美好:-)
不隶属于 StackOverflow