我正在尝试使用Finite state machine
和端口映射到组件
是否有人知道如何操作,因为不允许在进程语句中包含端口映射?
------ and_2.vhd (component): ---------
LIBRARY ieee;
USE ieee.std_logic_1164.all;
---------------------------------------
ENTITY and_2 IS
PORT ( a, b: IN STD_LOGIC;
y:OUT STD_LOGIC);
END and_2;
---------------------------------------
ARCHITECTURE and_2 OF and_2 IS
BEGIN
y <= a AND b;
END and_2;
---------------------------------------
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE work.my_data.all;
ENTITY FSM_PORTMAPP IS
PORT(
clk,reset : IN STD_LOGIC;
A,b,c,d: IN STD_LOGIC;
x: out STD_LOGIC
);
END FSM_PORTMAPP;
ARCHITECTURE Flow OF FSM_PORTMAPP IS
-----------------------
COMPONENT and_2 IS
PORT ( a, b: IN STD_LOGIC; y: OUT STD_LOGIC);
END COMPONENT;
-----------------------
TYPE state IS (state0, state1, state2);
SIGNAL pr_state, nx_state: state;
signal y,z :std_logic;
BEGIN
U1:and_2 PORT MAP(a,b ,y);
U2:and_2 PORT MAP(c,d,z);
U3:and_2 PORT MAP(y,z,x);
process(clk,reset)
BEGIN
IF (reset='1') THEN
pr_state <= state0;
ELSIF (clk'EVENT AND clk='1') THEN
pr_state <= nx_state;
END IF;
end process;
process(pr_state)
BEGIN
case pr_state IS
WHEN state0 =>
nx_state <= state1;
WHEN state1=>
nx_state <= state2;
WHEN state2 =>
nx_state <= state0;
END CASE;
end process;
END Flow;
-------------------------------------------------
这是声明的一个例子,我想实现三个状态,每个状态实现一个组件。
答案 0 :(得分:0)
首先,将组件实例化和端口映射视为接线电路组件,而不是执行操作。映射本身不执行任何操作 - 组件中的逻辑与驱动到组件中的信号相结合。这也是您无法在流程中映射组件的原因 - 布线是固定连接,而不是您可以作为运行时操作执行的操作。它不是执行代码 - 它是并发逻辑。
在您的示例代码中,组件and_2
有三个实例,在任何进程之外。这种映射基本上是您所需要的(前提是您将组件和信号类型更改为您的特定功能)。 然后,在状态机中,您可以选择性地驱动输入,或读取输出,或任何您需要的输入。你可能需要一些中间信号,你需要改变你的布线,你第一次尝试时最有可能获得的是带有锁存器的有问题的代码,你不需要它们和那样的好东西。您可以做什么而不是只是注册加法器输出:
U1 : adder_2 port map (a, b, y);
U2 : adder_2 port map (c, d, z);
U3 : adder_2 port map (y_r, z_r, x);
adder_regs : process (clk)
begin
if rising_edge(clk) then
y_r <= y;
z_r <= z;
end if;
end process adder_regs;
或者你是否有其他原因想要按照自己的方式去做?