Vhdl 近;循环";:期待如果;近;“过程”:期望循环

Vhdl 近;循环";:期待如果;近;“过程”:期望循环,vhdl,modelsim,Vhdl,Modelsim,这就是错误所在 错误:C:/modeltech64_10.5/examples/zarb.vhd(51):接近“循环”:(vcom-1576)应为IF 错误:C:/modeltech64_10.5/examples/zarb.vhd(56):接近“进程”:(vcom-1576)预期循环 IEEE库; 使用IEEE.std_logic_1164.all; 使用IEEE.std\u logic\u signed.all; 使用IEEE.numeric_std.all; 实体MULT是 泛型(

这就是错误所在

  • 错误:C:/modeltech64_10.5/examples/zarb.vhd(51):接近“循环”:(vcom-1576)应为IF

  • 错误:C:/modeltech64_10.5/examples/zarb.vhd(56):接近“进程”:(vcom-1576)预期循环

IEEE库;
使用IEEE.std_logic_1164.all;
使用IEEE.std\u logic\u signed.all;
使用IEEE.numeric_std.all;
实体MULT是
泛型(n:整数=4);
端口(A,B:标准逻辑向量中(n-1向下至0);
P:out标准逻辑向量(2*n-1到0));--产品
终端实体;
MULT的建筑展台是
开始
展位:流程(A、B)
变量X:std_逻辑_向量(2*n到0);
变量Y:std_逻辑_向量(n-1到0);
变量Z:std_逻辑_向量(n-1向下至0);
变量U:std_逻辑_向量(n-1到0);
开始
对于0到n-1回路中的J
U(j):='0';
端环;
X:=U&A和“0”;
Y:=B;
对于0到n-1循环中的I
如果(X(1)='1'和X(0)='0'),则
Z:=X(2*n到n+1);
X(2*n向下到n+1):=Z-Y;
X(2*n-1向下到0):=X(2*n向下到1);
如果(X(1)='0'和X(0)='1'),则
Z:=X(2*n到n+1);
X(2*n向下到n+1):=Z+Y;
x(2*n-1向下到0):=x(2*n向下到1);
其他的
X(2*n-1向下到0):=X(2*n向下到1);
如果结束;
端环;

P(2*n-1到0)

让我们试着理解编译器在这里告诉您的内容。在

结束循环
中,它希望在
结束时
。这意味着当您尝试关闭
循环时,实际上您在另一个
if
中。下一个错误只是第一个错误的结果

为什么会这样

让我们检查所讨论的块的起点可能在哪里。根据编译器的说法,在
结束循环
上方的
结束if
处,显然您成功地关闭了一个
if
,但您仍在另一个
内。如果(X(1)='1'和X(0)='0'),您认为您关闭了
,那么
,但显然您没有,否则我们就不会出现该错误

在那一个和
end if
之间是否还有另一个
if
是的它在这行:
否则如果(X(1)='0'和X(0)='1'),那么

显然,您认为这是原始
if
的一部分,但编译器认为不是,因此,如果vhdl
,您可以在这里搜索
else。然后您会发现正确的语法实际上是
elsif
,因为否则您会在
else
中添加一个新的、单独的
if
,这就是此处发生的情况

要可视化所发生的情况,请使用与编译器现在看到的内容相匹配的缩进:

0到n-1循环中的I的

如果(X(1)='1'和X(0)='0'),则
...
其他的
如果(X(1)='0'和X(0)='1'),则
...
其他的
...
如果结束;
??? (若此处缺失,则结束)

端环 让我们试着理解编译器在这里告诉您的内容。在
结束循环
中,它希望在
结束时
。这意味着当您尝试关闭
循环时,实际上您在另一个
if
中。下一个错误只是第一个错误的结果

为什么会这样

让我们检查所讨论的块的起点可能在哪里。根据编译器的说法,在
结束循环
上方的
结束if
处,显然您成功地关闭了一个
if
,但您仍在另一个
内。如果(X(1)='1'和X(0)='0'),您认为您关闭了
,那么
,但显然您没有,否则我们就不会出现该错误

在那一个和
end if
之间是否还有另一个
if
是的它在这行:
否则如果(X(1)='0'和X(0)='1'),那么

显然,您认为这是原始
if
的一部分,但编译器认为不是,因此,如果vhdl
,您可以在这里搜索
else。然后您会发现正确的语法实际上是
elsif
,因为否则您会在
else
中添加一个新的、单独的
if
,这就是此处发生的情况

要可视化所发生的情况,请使用与编译器现在看到的内容相匹配的缩进:

0到n-1循环中的I的

如果(X(1)='1'和X(0)='0'),则
...
其他的
如果(X(1)='0'和X(0)='1'),则
...
其他的
...
如果结束;
??? (若此处缺失,则结束)

结束循环。减去或添加Y作为有符号值会导致ALU的符号扩展为2*N-1位。Booth乘法器工作(并且)…减去或添加Y作为有符号值会导致ALU的符号扩展为2*N-1位。你的展位倍增器工作(和)。