2017-10-17 69 views
0

我知道这是一个相当常见的问题。无论如何,通过论坛,我无法找到一个令人满意的答案,为什么我得到以下CT错误,对于给定的VHDL代码。你能帮我吗?使用对象但未声明

VHDL代码

library IEEE; 
use IEEE.std_logic_1164.all; 
entity design is 
port(clk:IN std_logic; 
reset:IN std_logic; 
A:IN std_logic; 
B:IN std_logic; 
Q:OUT std_logic); 
end design; 

architecture behave of design is 
--signal R0,R1,R2,R3,R4:std_logic; 
begin 
process(clk,reset) 
variable R0,R1,R2,R3,R4:std_logic; 
begin 
if (reset='1') then 
R0:='0'; 
R1:='0'; 
R2:='0'; 
R3:='0'; 
R4:='0'; 
elsif falling_edge(clk) then 
R0:=R4; 
R1:=R0 xor A; 
R2:=R1 xor B; 
R3:=R2; 
R4:=R2 xor R3; 
end if; 
end process; 
Q<=R4;  -- ERROR POINTED HERE 
end behave; 

错误: -

Error (10482): VHDL error at design.vhd(31): object "R4" is used but not declared 

是否有端口分配变量的正确方法,我失踪?

+0

IEEE Std 1076-2008 12.2声明的范围“*声明的范围,除架构主体外,从声明的开始处延伸到立即关闭声明区域的末尾; ... *”12.3可见性“* ...声明只在其作用域的某个部分中可见;这部分从声明的末尾开始...... *”“* ...声明被认为在它的直接范围;这部分延伸到声明的直接范围的末尾... *“ – user1155120

+0

12.1声明区域”* ...单个声明区域由以下每个文本组成:... h )进程声明... *“ – user1155120

回答

2

R4在您的过程的声明区域中声明为变量。它在你的过程之外是不可见的,所以你的工具会给你错误。如果将Q<=R4;行内的行移动到end if;之后,则错误应该消失,因为此时该变量仍然可见。

这样说,我不认为你的代码会做你认为它会。我看到你开始使用signalR1等。你应该避免使用variable,直到你很好地理解了信号和变量之间的差异。还有其他现有问题可以解决这个问题。

+0

@ @scary_jeff,我只是通过试验和错误测试,看看我得到什么样的电路。谢谢。 –

+0

@SaiKamat scary_jeff意味着这里没有电路,因为它减少到一个常数'0',因为A xor A = 0。 –

0

R4是您在代码中声明的变量。它不能在endif声明之外使用。所以这就是为什么你的设备给你一个错误按摩。为了消除这个错误,你可以在Q < = R4之外再声明R4,并且在endif语句中。