使用泛型来确定VHDL中的(de)mux大小?

时间:2011-05-05 01:27:11

标签: vhdl

我想使用通用的'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实现代码是什么?它甚至可能吗?

3 个答案:

答案 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,
...
...