我有一个组件我希望有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
当我合成它时崩溃......
关于如何实现这一点的任何想法?
谢谢!
答案 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
可能会产生不良后果,如果它可以工作的话。