【发布时间】:2018-08-16 04:53:33
【问题描述】:
我正在使用 VHDL 设计一些硬件。我的设计需要使用一个 12 位的纹波计数器,它最终会连接起来,如下面的示意图所示。
我从网上找到了一个用于波纹计数器的现有实体和架构,我认为它应该适合我的设计。在这里,以防它有助于回答我的问题。
entity ripple_counter is
generic (
n : integer := 12
);
port (
clk : in std_logic;
clear : in std_logic;
dout : out std_logic_vector(n-1 downto 0)
);
end ripple_counter;
architecture behavioral of ripple_counter is
signal clk_i, q_i : std_logic_vector(n-1 downto 0);
begin
clk_i(0) <= clk;
clk_i(n-1 downto 1) <= q_i(n-2 downto 0);
gen_cnt: for i in 0 to n-1 generate
dff: process(clear, clk_i)
begin
if (clear = '1') then
q_i(i) <= '1';
elsif (clk_i(i)'event and clk_i(i) = '1') then
q_i(i) <= not q_i(i);
end if;
end process dff;
end generate;
dout <= not q_i;
end behavioral;
您会看到纹波计数器实体使用 n 位(在本例中为 12 位)std_logic_vector 作为其输出。但是,只有两个 Q* 输出连接。波纹计数器的组件和端口映射声明已创建如下。请注意,u22d_out、u21b_out 和 u26_q12_out 都是在与纹波计数器的组件和端口映射相同的结构架构中定义的信号。另外,q10 是系统的输出。
component ripple_counter is
generic (
n : integer := 12
);
port (
clk : in std_logic;
clear : in std_logic;
dout : out std_logic_vector(n-1 downto 0)
);
end component;
u26: ripple_counter port map (
clk => u22d_out,
clear => u21b_out,
dout(11) => u26_q12_out,
dout(9) => q10
);
当我尝试运行我的设计时,我收到以下错误...
错误:[42972]:“c:/somefilepath/somefilename.vhd”,第 493 行:正式 dout 的子元素关联不完整
错误:[42604]:“c:/somefilepath/somefilename.vhd”,第 489 行:端口和端口映射不匹配
错误:[40008]:HDL 分析失败。
- 第 493 行是读取 dout(9) => q10 的行。
- 第 489 行是读取 u26:ripple_counter 端口映射的行。
我不确定这是语法错误还是功能问题。如何将向量的特定位映射到单个信号?
【问题讨论】:
-
“不完整的子元素关联”......所以完成它。
dout(10) => open, dout(8 downto 0) => open,或将dout连接到全宽信号,然后从中选择您想要的。 -
我选择显式映射未使用的引脚以打开。你这个男人,谢谢!
-
@BrianDrummond 您展示的解决方案将在 VHDL-2018 中提供。 VHDL 中不允许部分未连接的端口。请创建一个中间信号并单独连接所需的位或将所有未使用的引脚分配给一个新信号,例如
floating. -
这个问题没有提供minimal reproducible example,也没有识别工具。