对于此代码:
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”,虽然这不应该有任何区别,并且得到了相同的错误。对我来说最令人困惑的部分是这些错误表明语法错误,但是,我检查了端口映射语法的各种来源,并没有发现任何差异。我的错在哪里?
答案 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
模块实例化,这是非法的,因为模块实例化是一个并发语句,因此它只在进程外部进行。