微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

创建具有可变宽度和输入数量的 VHDL 多路复用器

如何解决创建具有可变宽度和输入数量的 VHDL 多路复用器

我正在尝试创建一个具有可变宽度和输入数量的总线/数据流多路复用器,并将其用作 Vivado 模块设计中的 IP 模块。到目前为止,我已经成功地创建了一个宽度可变的 2to1 多路复用器:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity mux is
  Generic ( NUM_BITS : integer);
  Port ( 
    SEL : in STD_LOGIC;
    A : in STD_LOGIC_VECTOR(NUM_BITS-1 downto 0);
    B : in STD_LOGIC_VECTOR(NUM_BITS-1 downto 0);
    X : out STD_LOGIC_VECTOR(NUM_BITS-1 downto 0));
end mux;

architecture Behavioral of mux is

begin
    X <= A when (SEL = '0') else B;
end Behavioral; 

这有效。我可以将其放入 Vivado 的块设计工具中,并且可以自定义块并更改“NUM_BITS”的值。

Customizable IP Mux in Block Design

我几乎成功地创建了一个固定宽度的可变输入复用器:

use IEEE.STD_LOGIC_1164.ALL;
package my_pkg is
 -- Generic ( NUM_BITS : integer);
  type inputs is array(natural range<>) of STD_LOGIC_VECTOR(8 downto 0);
end my_pkg;

library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.NUMERIC_STD.ALL;
use work.my_pkg.all;
entity mux is
  Generic ( SEL_WIDTH : integer);
  Port ( 
    SEL : in STD_LOGIC_VECTOR(SEL_WIDTH-1 downto 0);
    INPUT : in inputs(0 downto 2**SEL_WIDTH-1);
    OUTPUT : out STD_LOGIC_VECTOR(8 downto 0));
end mux;

architecture Behavioral of mux is

begin
    OUTPUT <= INPUT(to_integer(unsigned(SEL)));
end Behavioral;

但是,我无法将其放入模块设计工具中,因为端口类型需要是 std_logic_vector 才能被模块设计工具识别。

Block Design Error

我看到其他一些帖子解决了类似的问题:

Using array of std_logic_vector as a port type,with both ranges using a generic - 无法在块设计工具中使用提供的示例

Use generic parameter as port array length - 用它来创建第二部分的代码

但是这些都没有帮助我实现我想要的。 我想将这两个组合成一个多路复用器,同时具有可变输入和宽度。 我使用的是 Xilinx Vivado 2020.1

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。