VHDL。每隔一个时钟周期在组件之间交替

时间:2014-09-03 13:18:14

标签: components vhdl

我有一个组件我希望有2个实例,并且我希望每隔一个时钟周期交替发送/接收每个数据。像这样:

component piece is
  port(
     clk  : in std_logic;
     a  : in std_logic;
     b  : in std_logic;
     c  : in std_logic_vector(7 downto 0);
     d  : in std_logic_vector(7 downto 0)
  );
end component;

piece_0  : if clk='0' generate
  U_0: piece
    port map(
      clk  =>  clk,
      a    =>  a,
      b    =>  b,
      c    =>  c,
      d    =>  d
    );
end generate;

piece_1  : if clk='1' generate
  U_1: piece
    port map(
      clk  =>  clk,
      a    =>  a,
      b    =>  b,
      c    =>  c,
      d    =>  d
    );
end generate;

编译时,我收到警告Condition in IF GENERATE must be static 当我合成它时崩溃......

关于如何实现这一点的任何想法?

谢谢!

1 个答案:

答案 0 :(得分:1)

在编译期间评估generate语句,因此信号的值没有相关性。它用于实例化代码块,可选地(在if ... generate的情况下),取决于某些静态值,例如常量或泛型,或在循环中(在for ... generate的情况下) ,对于同一代码块的重复实例。

您正在尝试使用它来控制运行时的行为,这是无效的。您想要的是实例化两个组件并使用多路复用器选择输出。由于您的piece组件没有输出,因此提供一些直接适用于您的问题的代码有点困难,但一般来说:

U_0 : piece
  port map (
    clk => clk,
    a   => a,
    ...
    q   => q0
  );

U_1 : piece
  port map (
    clk => clk,
    a   => a,
    ...
    q   => q1
  );

q_muxed <= q0 when clk = '0' else q1;

我使用简单的并发语句编写了多路复用器,但还有其他方法可以做到。您可能还需要考虑使用clk以外的信号作为选择/切换。在大多数设备的逻辑操作中使用clk可能会产生不良后果,如果它可以工作的话。