【问题标题】:How to create port map that maps a single signal to 1 bit of a std_logic_vector?如何创建将单个信号映射到 std_logic_vector 的 1 位的端口映射?
【发布时间】: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) =&gt; open, dout(8 downto 0) =&gt; open, 或将 dout 连接到全宽信号,然后从中选择您想要的。
  • 我选择显式映射未使用的引脚以打开。你这个男人,谢谢!
  • @BrianDrummond 您展示的解决方案将在 VHDL-2018 中提供。 VHDL 中不允许部分未连接的端口。请创建一个中间信号并单独连接所需的位或将所有未使用的引脚分配给一个新信号,例如floating.
  • 这个问题没有提供minimal reproducible example,也没有识别工具。

标签: vhdl hdl


【解决方案1】:

正如 Brian D 在 cmets 中所建议的那样……端口映射关联不完整。这是港口地图的更新版本。

u26: ripple_counter port map (
    clk => u22d_out,
    clear => u21b_out,
    dout(11) => u26_q12_out,
    dout(10) => open,
    dout(9) => q10,
    dout(8 downto 0) => open
);

【讨论】:

  • IEEE Std 1076-2008 6.5.6.3 端口条款,第 8 段“如果正式端口与实际端口、信号或表达式相关联,则称正式端口为已连接。如果一个正式端口与保留字 open 相关联,那么该正式端口被称为 unconnected。...如果复合形式的某些子元素是错误的端口已连接,而其他端口未连接或未关联。”注意 Paebbels 对您的问题的评论。您的回答无效,布赖恩评论的第二部分是。你有接受这种结构的工具吗?
  • 该工具似乎是 Mentor Precision,如果它支持该构造,则表明在使用仿真之前验证设计的可取性。
  • 我是硬件设计领域的新手,所以请原谅我开枪不完全理解布赖恩的评论。我永远不会将他评论的第二部分翻译成“你有接受这种结构的工具吗”。用于编译 VHDL 设计的工具是 Microchip 的 ProChip Designer
  • 如果此答案无效。您是否有有效的信息要提供或信息不足?
  • “你有接受这个结构的工具吗?”似乎很清楚。您的构造不是有效的 VHDL,它被定义为错误。询问该问题以确定您的回答有什么依据(除了上面提到的 Brian 评论的第一部分和 Paebbels 的评论显示无效)。 Brian 评论的第二部分是“或者将 dout 连接到一个全宽信号并从中选择你想要的”。这是连接端口的有效方式。不需要所有这些信号元素都连接到其他任何东西或进行评估。
猜你喜欢
  • 1970-01-01
  • 2016-11-28
  • 2015-08-09
  • 2018-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多