VHDL非法使用信号声明

时间:2015-11-26 01:34:47

标签: vhdl

以下是我的代码:

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY work4 IS
PORT (  CS: IN STD_LOGIC;
        RD: IN STD_LOGIC;
        WR: IN STD_LOGIC;
        DATA : INOUT STD_LOGIC_VECTOR(3 DOWNTO 0) );
 END work4; 
ARCHITECTURE behav OF work4 IS BEGIN 

PROCESS(CS, RD,WR) 
SIGNAL T: STD_LOGIC_VECTOR(3 DOWNTO 0);

BEGIN 
 IF CS'EVENT AND CS = '1' THEN 
    IF WR='1' AND RD='0' THEN DATA<=T;
    ELSE IF WR='0' AND RD='1' THEN T<=DATA;
    END IF;
END IF;
END IF; 
 END PROCESS; 
 END behav;

当我编译它时,我的编译器抱怨:

Error: found illegal use of signal declaration in process declarative part

我知道我使用了错误的信号,但不知道它出了什么问题。

有人可以提供帮助吗?

1 个答案:

答案 0 :(得分:3)

流程声明部分中允许的流程声明性项目在IEEE Std 1076-2008中定义11.3流程声明第2段:

 process_declarative_item ::=
        subprogram_declaration
      | subprogram_body
      | type_declaration
      | subtype_declaration
      | constant_declaration
      | variable_declaration
      | file_declaration
      | alias_declaration
      | attribute_declaration
      | attribute_specification
      | use_clause
      | group_type_declaration
      | group_declaration

你可以注意到信号声明没有列出。

该信号声明可以在体系结构声明部分中进行(在开始之前最紧接在体系结构体中的保留字体系结构之后)。

进行改变:

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY work4 IS
PORT (  CS: IN STD_LOGIC;
        RD: IN STD_LOGIC;
        WR: IN STD_LOGIC;
        DATA : INOUT STD_LOGIC_VECTOR(3 DOWNTO 0) );
 END work4; 
ARCHITECTURE behav OF work4 IS 
    SIGNAL T: STD_LOGIC_VECTOR(3 DOWNTO 0);
BEGIN 

PROCESS(CS, RD,WR) 
--SIGNAL T: STD_LOGIC_VECTOR(3 DOWNTO 0);

BEGIN 
 IF CS'EVENT AND CS = '1' THEN 
    IF WR='1' AND RD='0' THEN DATA<=T;
    ELSE IF WR='0' AND RD='1' THEN T<=DATA;
    END IF;
END IF;
END IF; 
 END PROCESS; 
 END behav;

你的代码分析。

(以及它是否符合你的意图并不是这个问题的一部分)。

您也可以使用变量代替信号:

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY work4 IS
PORT (  CS: IN STD_LOGIC;
        RD: IN STD_LOGIC;
        WR: IN STD_LOGIC;
        DATA : INOUT STD_LOGIC_VECTOR(3 DOWNTO 0) );
 END work4; 
ARCHITECTURE behav OF work4 IS 
--    SIGNAL T: STD_LOGIC_VECTOR(3 DOWNTO 0);
BEGIN 

PROCESS(CS, RD,WR) 
--SIGNAL T: STD_LOGIC_VECTOR(3 DOWNTO 0);
    variable T: std_logic_vector (3 downto 0);
BEGIN 
 IF CS'EVENT AND CS = '1' THEN 
    IF WR='1' AND RD='0' THEN DATA <= T;
    ELSE IF WR='0' AND RD='1' THEN T := DATA;
    END IF;
END IF;
END IF; 
 END PROCESS; 
 END behav;

使用变量有几个限制。您无法在流程外使用它,也无法在波形显示中看到它。