Generics 使用泛型的泛型MUX和DEMUX

Generics 使用泛型的泛型MUX和DEMUX,generics,vhdl,mux,Generics,Vhdl,Mux,目前的流程似乎可以解决这一问题: process(sel, X) begin -- set all to 0 mux_out <= (others => zero); -- Set input in correct line mux_out(to_integer(unsigned(sel))) <= X; end process; 提前感谢您的帮助。使用VHDL-2008可以像这样完成: library ieee; use ieee.std_l

目前的流程似乎可以解决这一问题:

process(sel, X)
begin
    -- set all to 0
    mux_out <= (others => zero);
    -- Set input in correct line
    mux_out(to_integer(unsigned(sel))) <= X;
end process;

提前感谢您的帮助。

使用VHDL-2008可以像这样完成:

library ieee;
use ieee.std_logic_1164.all;

package mux_p is
  type slv_array_t is array (natural range <>) of std_logic_vector;
end package;

package body mux_p is
end package body;


library ieee;
use ieee.std_logic_1164.all;
use work.mux_p;

entity mux is
  generic(
    LEN : natural;   -- Bits in each input
    NUM : natural);  -- Number of inputs
  port(
    v_i   : in  mux_p.slv_array_t(0 to NUM - 1)(LEN - 1 downto 0);
    sel_i : in  natural range 0 to NUM - 1;
    z_o   : out std_logic_vector(LEN - 1 downto 0));
end entity;

architecture syn of mux is
begin
  z_o <= v_i(sel_i);
end architecture;

使用VHDL-2008,可以执行以下操作:

library ieee;
use ieee.std_logic_1164.all;

package mux_p is
  type slv_array_t is array (natural range <>) of std_logic_vector;
end package;

package body mux_p is
end package body;


library ieee;
use ieee.std_logic_1164.all;
use work.mux_p;

entity mux is
  generic(
    LEN : natural;   -- Bits in each input
    NUM : natural);  -- Number of inputs
  port(
    v_i   : in  mux_p.slv_array_t(0 to NUM - 1)(LEN - 1 downto 0);
    sel_i : in  natural range 0 to NUM - 1;
    z_o   : out std_logic_vector(LEN - 1 downto 0));
end entity;

architecture syn of mux is
begin
  z_o <= v_i(sel_i);
end architecture;

可能重复:我不久前回答了此问题,此解决方案适用于VHDL-93和VHDL-2008。可能重复:我不久前回答了此问题,此解决方案适用于VHDL-93和VHDL-2008。感谢MUX,它工作正常,代码非常短且清晰。我现在对解复用器有问题,使用相同的结构会导致“锁存”的警告,我编辑了我的问题来解释这一点。想想没有选择输出的位会发生什么。。。对于当前代码,这些位被指定用于保存前一个值,这需要一个锁存器,锁存器会生成警告,因为它们通常不是所需的,而是具有非预期行为的代码的结果,如您的情况。确定如何处理未选择的输出,并更新代码。一种可能是将所有输出默认分配给0或X,然后覆盖实际选择的输出。通过使用一个似乎已解决的过程,RTL设计看起来也不错:)多亏了MUX,它工作正常,代码非常短且清晰。我现在对解复用器有问题,使用相同的结构会导致“锁存”的警告,我编辑了我的问题来解释这一点。想想没有选择输出的位会发生什么。。。对于当前代码,这些位被指定用于保存前一个值,这需要一个锁存器,锁存器会生成警告,因为它们通常不是所需的,而是具有非预期行为的代码的结果,如您的情况。确定如何处理未选择的输出,并更新代码。一种可能是将所有输出默认分配给0或X,然后覆盖实际选择的输出。通过使用似乎已解决的过程,RTL设计看起来也不错:)
library ieee;
use ieee.std_logic_1164.all;

package mux_p is
  type slv_array_t is array (natural range <>) of std_logic_vector;
end package;

package body mux_p is
end package body;


library ieee;
use ieee.std_logic_1164.all;
use work.mux_p;

entity mux is
  generic(
    LEN : natural;   -- Bits in each input
    NUM : natural);  -- Number of inputs
  port(
    v_i   : in  mux_p.slv_array_t(0 to NUM - 1)(LEN - 1 downto 0);
    sel_i : in  natural range 0 to NUM - 1;
    z_o   : out std_logic_vector(LEN - 1 downto 0));
end entity;

architecture syn of mux is
begin
  z_o <= v_i(sel_i);
end architecture;
library ieee;
use ieee.std_logic_1164.all;

entity mdl is
  port(
    a_i   : in  std_logic_vector(1 downto 0);
    b_i   : in  std_logic_vector(1 downto 0);
    c_i   : in  std_logic_vector(1 downto 0);
    sel_i : in  natural;
    z_o   : out std_logic_vector(1 downto 0));
end entity;

architecture syn of mdl is
begin
  mux_e : entity work.mux
    generic map(
      LEN => 2,
      NUM => 3)
    port map(
      v_i(0) => a_i,
      v_i(1) => b_i,
      v_i(2) => c_i,
      sel_i  => sel_i,
      z_o    => z_o);
end architecture;