【问题标题】:VHDL FSM Implementation using port mapping使用端口映射的 VHDL FSM 实现
【发布时间】:2014-07-16 01:24:36
【问题描述】:

我正在尝试使用 Finite state machine 和端口映射到组件来实现 VHDL 代码

有没有人知道怎么做,因为不允许在进程语句中包含端口映射?

------ 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;
-------------------------------------------------

这是一个声明的例子,我想实现三个状态,每个状态实现一个组件。

【问题讨论】:

  • “每个状态都实现一个组件”是什么意思?您希望每个州会发生什么?
  • 每个状态实现一个组件瞬间.. state0 实现 u1,state1 实现 u2,state2 实现 u3。
  • 您希望发生什么操作?您希望改变哪些价值观?你想驱动什么信号?您还没有说明您要完成的功能。
  • 我的目标是如何学习如何使用有限状态机的端口映射,我以这段代码为例,,,,
  • 假设我想添加 4 个信号 a、b、c、d,并且我想使用 adder_2 添加它们,它只添加到信号中......我想以加法器树格式实现它们,所以在第一个状态 a 和 b 将被添加并保存在信号 y 和 c 和 d 也将被添加并保存在信号 z 然后在下一个状态 y 和 z 将被添加并且结果将在输出 x..

标签: vhdl state-machine


【解决方案1】:

首先,将组件实例化和端口映射视为布线电路组件,而不是执行操作。映射本身不执行任何操作 - 组件中的逻辑与驱动到组件中的信号相结合来实现这一点。这也是您不能在流程中映射组件的原因 - 接线是固定连接,而不是您可以作为运行时操作执行的操作。这不是执行的代码——它是并发逻辑。

在您的示例代码中,组件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;

或者还有什么其他原因让您尝试按照自己的方式进行操作?

【讨论】:

  • 非常感谢 fru1tbat 的宝贵解释........ .最好的问候
  • 我不确定这是个好主意。如果您有具体问题,最好还是在这里提问——社区知识渊博。
  • 你有任何关于端口映射的材料吗?它与有限状态机一起使用?
  • 我不太确定您在寻找什么。 FSM 没有什么特别之处——它只是架构中的一个进程或进程集合,就像其他任何东西一样。真的没有这么具体的概念。也许您需要有关 FSM 的教程或 VHDL 初学者指南?有很多可供选择。
  • 我试图把我正在处理的hte代码..但是它太大了所以我把它放在这里..drive.google.com/drive/#folders/…你可以看到我在做什么
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-12
  • 2011-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-06
相关资源
最近更新 更多