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;