我正在尝试仅使用VHDL中的并发代码对8位全加器进行编码,但是语法错误。首先,我是这样做的:
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
ENTITY concfulladder IS
PORT( A: IN std_logic_vector (7 DOWNTO 0);
B: IN std_logic_vector (7 DOWNTO 0);
Cin: IN std_logic_vector (7 DOWNTO 0);
Sum: OUT std_logic_vector(7 DOWNTO 0);
Cout: OUT std_logic_vector(7 DOWNTO 0));
END concfulladder;
ARCHITECTURE cfulladder OF concfulladder IS
BEGIN
sum(0) <= '0' WHEN (A(0) XOR B(0) XOR CIN(0)) = '0' ELSE
'1';
cout(0) <= '0' WHEN ((A(0) AND B(0)) OR (Cin(0) AND A(0)) OR (Cin(0) AND B(0))) = '0' ELSE
'1';
sum(1) <= '0' WHEN (A(1) XOR B(1) XOR CIN(1)) = '0' ELSE
'1';
cout(1) <= '0' WHEN ((A(1) AND B(1)) OR (Cin(1) AND A(1)) OR (Cin(1) AND B(1))) = '0' ELSE
'1';
sum(2) <= '0' WHEN (A(2) XOR B(2) XOR CIN(2)) = '0' ELSE
'1';
cout(2) <= '0' WHEN ((A(2) AND B(2)) OR (Cin(2) AND A(2)) OR (Cin(2) AND B(2))) = '0' ELSE
'1';
sum(3) <= '0' WHEN (A(3) XOR B(3) XOR CIN(3)) = '0' ELSE
'1';
cout(3) <= '0' WHEN ((A(3) AND B(3)) OR (Cin(3) AND A(3)) OR (Cin(3) AND B(3))) = '0' ELSE
'1';
sum(4) <= '0' WHEN (A(4) XOR B(4) XOR CIN(4)) = '0' ELSE
'1';
cout(4) <= '0' WHEN ((A(4) AND B(4)) OR (Cin(4) AND A(4)) OR (Cin(4) AND B(4))) = '0' ELSE
'1';
sum(5) <= '0' WHEN (A(5) XOR B(5) XOR CIN(5 )) = '0' ELSE
'1';
cout(5) <= '0' WHEN ((A(5) AND B(5)) OR (Cin(5) AND A(5)) OR (Cin(5) AND B(5))) = '0' ELSE
'1';
sum(6) <= '0' WHEN (A(6) XOR B(6) XOR CIN(6)) = '0' ELSE
'1';
cout(6) <= '0' WHEN ((A(6) AND B(6)) OR (Cin(6) AND A(6)) OR (Cin(6) AND B(6))) = '0' ELSE
'1';
sum(7) <= '0' WHEN (A(7) XOR B(7) XOR CIN(7)) = '0' ELSE
'1';
cout(7) <= '0' WHEN ((A(7) AND B(7)) OR (Cin(7) AND A(7)) OR (Cin(7) AND B(7))) = '0' ELSE
'1';
END cfulladder;
所有这些都是正确的,我没有收到任何错误。但是,如果尝试使用for循环减少行数,则会出现错误:
PROCESS (all) IS
BEGIN
FOR I IN 0 TO 7 LOOP
Sum(I) <= '0' WHEN (A(I) XOR B(I) XOR CIN(I)) = '0' ELSE
'1';
Cout(I) <= '0' WHEN ((A(I) AND B(I)) OR (Cin(I) AND A(I)) OR (Cin(I) AND B(I))) = '0' ELSE
'1';
END LOOP;
END PROCESS;
错误是:文字WHEN附近的错误;期待“;”。在Internet上搜索解决方案时,我发现我无法在同一程序中使用顺序代码和并发代码。这个问题有解决方案吗?
答案 0 :(得分:1)
when..else
。对于以前的版本,您需要在流程外部使用when..else
语句。
答案 1 :(得分:1)
这里不需要条件分配。而是尝试:
PROCESS (all) IS
BEGIN
FOR I IN 0 TO 7 LOOP
Sum(I) <= A(I) XOR B(I) XOR CIN(I);
Cout(I) <= (A(I) AND B(I)) OR (Cin(I) AND A(I)) OR (Cin(I) AND B(I));
END LOOP;
END PROCESS;
或者,所有的VHDL逻辑运算符都是按位的,因此您也应该能够将其写为(但请确保在仿真中进行验证):
Sum <= A XOR B XOR CIN;
Cout <= (A AND B) OR (Cin AND A) OR (Cin AND B);
从历史上看,在基于数组进行决策并推导出标量值时,我们需要“何时”“其他”。例如:
Decode1 <= '1' when BlockSelect = '1' and Addr = X"A5" else '0';
在VHDL-2008中,这种用法也将消失,因为我们可以使用?=来重新表达它,而无需使用条件”分配。
Decode1 <= BlockSelect and Addr ?= X"A5";
与任何VHDL-2008代码一样,您的综合供应商可能尚不支持它。如果他们没有(并且您已经在他们的工具中打开了VHDL-2008),请确保针对他们的实施提交错误报告。