我的节目中遇到了一个令人困惑的问题。我需要在我的程序中端口映射(调用)组件。此外,在组件内部,我需要进行另一个端口映射(调用),这在VHDL中是非法的。你有这个问题的替代解决方案吗?这是我的意思的一个例子。
我在这里开始我的计划:
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity binary1 is
port( N: in std_logic;
d: out integer);
end binary1 ;
Architecture Behavior1 of binary1 is
以下是一个组件:
component binary_integer_1 is
port ( b1: in std_logic;
int1: out integer);
end component;
调用组件的命令: 开始 s0:binary_integer_1端口映射(n,d); 结束Behavior1;
此外,这是主程序:
library ieee;
use ieee.std_logic_1164.all;
entity binary_integer_1 is
port ( b1: in std_logic;
int1: out integer);
end binary_integer_1;
architecture Behavior4 of binary_integer_1 is
begin
process(b1)
begin
if b1 = '1' then
int1 <= 1;
else
int1 <= 0;
end if;
end process;
end Behavior4;
例如,如果我想在上层实体内部执行端口映射。我有一个非法的声明。 请给我另一种方法。
答案 0 :(得分:1)
我做了一个三级设计层次结构的小例子。实体和体系结构对从下到上列出。
entity comp1 is
port (
x: in integer;
y: out integer
);
end entity;
architecture foo of comp1 is
begin
y <= x after 2 ns;
end architecture;
entity comp2 is
port (
a: in integer;
b: out integer
);
end entity;
architecture fum of comp2 is
component comp1 is
port (
x: in integer;
y: out integer
);
end component;
begin
INST_COMP1:
comp1 port map (X => A, Y => B);
end architecture;
entity top is
end entity;
architecture fum of top is
component comp2 is
port (
a: in integer;
b: out integer
);
end component;
signal a: integer := 0;
signal b: integer;
begin
INST_COMP2:
comp2 port map (a => a, b => b);
TEST:
process
begin
wait for 5 ns;
a <= 1;
wait for 5 ns;
a <= 2;
wait for 5 ns;
a <= 3;
wait for 5 ns;
wait;
end process;
end architecture;
ghdl -a component.vhdl
ghdl -e top
ghdl -r top --wave = top.ghw
(用gtkwave打开top.ghw,设置波形显示),并且:
所以我们有一个顶层实体top,恰好是一个测试平台(没有端口),它实例化了包含实例化组件comp1的组件comp2,它提供了一个2 ns延迟分配给输入的输出。 / p>
整数b的最大负值是整数范围的左值,是默认值,就像std_logic左边的值是'U'一样;输出显示默认值,直到模拟时间前进到在comp1中(在2 ns之后)分配给y的x的出现。由于x在顶部的默认值,因此转换为0。
我使用整数来避免上下文子句(库子句和use子句)。我可以使用直接实体实例化,但是你展示了一个组件声明。