端口映射中的语法/逻辑错误

时间:2014-03-01 11:51:24

标签: compiler-errors vhdl

对于此代码:

architecture sm1 of SubModule is

component ME
    port
    (
        bN      : in integer;
        eP      : in integer;
        mD      : in integer;
        CLK     : in std_logic;
        RDY     : out std_logic;
        result  : out integer
    );
end component;

...

begin   

PROCESS_1: process (N, j, CLK)
    type State_type is (ReadState, ExecPhase1State, ExecPhase2State, OperateMEState, WaitForMEState, WaitForOtherProcessState);
    variable State : State_Type;
    ...
    variable denum : integer;
    variable num : integer;
    variable ep : integer;
    variable MERdy : std_logic;

begin
    if rising_edge(CLK) then
        if State = ReadState then
            ...

        elsif State = ExecPhase1State then          
            ...

        elsif State = OperateMEState then
            State := WaitForMEState;
            ME_1: ME port map 
            (
                bN => 16, 
                eP => ep, 
                mD => denum, 
                CLK => CLK, 
                RDY => MERdy, 
                result => num
            );

        elsif State = WaitForMEState then
            if MERdy = "1" then
                MERdy <= "0";
                State := ExecPhase2State;
            end if;

        elsif State = ExecPhase2State then
            ...

        elsif State = WaitForOtherProcessState then
            if rdy_2 = "1" then
                State := ReadState;
            end if;
        end if;
    end if;
end process;

...

end sm1;

编译器生成以下两个错误:  靠近文本“port”;期待“(”,“或”,或“。”  靠近文字“;”;期待“:=”或“&lt; =”

请注意,两者都与端口映射段相关(第二个引用ME_1的“;”:ME端口映射(...);)

我也试过没有“全信号映射”,即代替“bN =&gt; 16”,只是“16”,虽然这不应该有任何区别,并且得到了相同的错误。对我来说最令人困惑的部分是这些错误表明语法错误,但是,我检查了端口映射语法的各种来源,并没有发现任何差异。我的错在哪里?

2 个答案:

答案 0 :(得分:2)

认识到VHDL本质上是两种不同的语言。

在流程之外,它是一种并行处理语言,具有一组允许的构造来创建和互连多个流程。它的运行方式与数据流语言类似,与Haskell等函数式编程语言有一些共同之处。

在一个进程中,它是一种顺序语言,如Ada或C,通常选择语句,表达式,循环和抽象,如函数和过程(C调用void函数)。

您正在尝试在C程序中编写Haskell ...无法正常工作。

ME是一个组件:这是对单独进程(或一组进程)的抽象。

重新创建“ME”的功能作为一个过程(在这里是合法的),或者将其实例化为过程外的单独组件,并学习如何使用信号(进程间通信机制)将ME连接到您的主流程。

例如,如果向ME输入“启用”,则可以在相关状态下将其驱动为“1”,在其他状态下将其驱动为“0”,并等待来自ME的“完成”信号为“1” '在进入下一个州之前。

答案 1 :(得分:1)

代码在ME的进程内部有一个ME_1: ME port map模块实例化,这是非法的,因为模块实例化是一个并发语句,因此它只在进程外部进行。