我想使用通用的'p'来定义demux将拥有多少输出。输入和所有输出均为1位。输出,控制和输入可以是简单的:
signal control : std_logic_vector(log 2 p downto 0); -- I can use a generic for the log2..
signal input : std_logic;
signal outputs : std_logic_vector(p-1 downto 0);
但是mux实现代码是什么?它甚至可能吗?
答案 0 :(得分:3)
不需要任何通用:
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity demux is
port(
control : in unsigned;
input : in std_logic;
outputs : out std_logic_vector
);
end entity demux;
architecture rtl of demux is
-- Check size of input vectors
assert 2**control'length = outputs'length
report "outputs length must be 2**control length"
severity failure;
-- actually do the demuxing - this will cause feedback latches to be inferred
outputs(to_integer(unsigned(control)) <= input;
end architecture;
(未经测试,只是输入了我的头顶......)
这会推断锁存器 - 这就是你想要的吗?
答案 1 :(得分:0)
您需要提供log_p
作为通用,并计算p
。
library ieee;
use ieee.std_logic_1164.all;
entity demux is
generic (
log_p: integer);
port(
control : in std_logic_vector(log_p downto 0);
input :in std_logic;
outputs : out std_logic_vector(2**log_p - 1 downto 0)
);
end entity demux;
答案 2 :(得分:0)
除非你总是使用2的幂,否则你需要将输出的数量和控制数组的大小都作为泛型传递。
在(de)mux模块之外(即:实例化时),可以使用代码计算控制总线的位数。我在一个公共包中有一个函数,用于初始化各种配置常量和泛型,它们被传递给类似于你的(de)mux应用程序的代码:
-- Calculate the number of bits required to represent a given value
function NumBits(val : integer) return integer is
variable result : integer;
begin
if val=0 then
result := 0;
else
result := natural(ceil(log2(real(val))));
end if;
return result;
end;
...允许你做以下事情:
constant NumOut : integer := 17;
signal CtrlBus : std_logic_vector(NumBits(NumOut)-1 downto 0);
my_mux : demux
generic map (
NumOut => NumOut,
NumCtrl => NumBits(NumOut) )
port map (
control => CtrlBus,
...
...