是否可以在VHDL中编写通用DEMUX(1输入,多输出)?

时间:2017-05-18 16:54:40

标签: generics vhdl

我的FPGA软件具有拖放功能,可用于开发元素或系统设计。它最适用于“通用”组件,允许用户设置可修改的参数,而无需进入代码和更改内容。为此,我决定创建一个具有一个输入和多个输出的通用分路器。设计必须允许用户定义输出数量和输入和输出端口的位宽(两者都是相同的宽度)。该设计还必须根据所选输出端口的数量确定输出选择端口的位宽(我用功能处理的部分)。请注意,由于我的限制,输出端口的数量可以在2到256个输出之间。是否可以在设计中编码可变数量的输出,或者它是一个梦想。请注意,我已为许多固定输出解复用器编写了代码。

2 个答案:

答案 0 :(得分:1)

我不确定我是否完全明白你在寻找什么,但我会尽力回答。

首先,这取决于您的工具是否支持VHDL-2008。 VHDL-1993中没有许多可自定义的功能。

如果你这样做可能会起作用:

首先需要在包your_package.vhdl

中定义类型
TYPE    demux_output    IS ARRAY (natural range <>) OF  std_logic_vector;

然后您可以按如下方式定义您的实体:

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.NUMERIC_STD.ALL;
USE WORK.your_package.ALL;

ENTITY demux IS
    GENERIC (PORT_WIDTH : integer := 8; -- define your data width
            NB_OUTPUT : integer := 50); -- define the number of outputs needed

    PORT    (input      : IN std_logic_vector(PORT_WIDTH - 1 DOWNTO 0);
            output      : OUT demux_output(0 TO NB_OUTPUT - 1)(PORT_WIDTH - 1 DOWNTO 0);
            sel         : IN std_logic_vector(7 DOWNTO 0));

END ENTITY;

ARCHITECTURE RTL OF demux IS

SIGNAL sel_int  : integer := 0;

BEGIN

sel_int <= to_integer(unsigned(sel));

PROCESS (sel_int, input)
BEGIN
    output <= (OTHERS => (OTHERS => '0'));
    FOR i IN 0 TO (NB_OUTPUT - 1) LOOP
        IF (i = sel_int) THEN
            output(i) <= input;
        END IF;
    END LOOP;
END PROCESS;

END ARCHITECTURE;

在那里,您只需要声明端口的宽度(PORT_WIDTH)和输出端口的数量(NB_OUTPUT)。

如果您的工具不符合VHDL-2008,您将无法在demux_output类型中声明无约束的数据宽度。这就是为什么你必须定义一个全局常量,但这可能会失去你正在寻找的“可定制部分”。

答案 1 :(得分:0)

致A.K和scary_jeff,感谢您的回复。我将检查我的工具,看它是否符合VHDL-2008。大家都知道,我对VHDL很新,并且学习很快,但是我不需要花很长时间才能进入更复杂的设计,最终我想尽可能简单。这些是我想要遵循的几行,但对我来说是新的,例如;

输出:OUT demux_output(0 TO NB_OUTPUT - 1)(PORT_WIDTH - 1 DOWNTO 0);

虽然我理解它的含义,但在我所做的所有研究中,它都没有显示出能力或类似的例子。另一行;

输出&lt; =(OTHERS =&gt;(OTHERS =&gt;&#39; 0&#39;));

我再也没见过关键字&#34;其他&#34;所以这条线对我来说没有意义。你能解释一下,或者让我知道一个好的&#34;我可以使用的VHDL资源。这样,我可以在更复杂的问题上寻求帮助,而不是询问新手类型的问题。再次,谢谢。