首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“模板”VHDL实体

“模板”VHDL实体
EN

Stack Overflow用户
提问于 2013-11-25 22:50:06
回答 2查看 2.1K关注 0票数 3

这让我困扰了相当长一段时间,但是用VHDL描述实体是否可能类似于模板在C++中的工作方式(或者更小的扩展泛型?)只需在合成/编译过程中决定实际的端口类型?

一个例子是复用器,比如说我有一个4输入复用器,现在我有几个总线大小,我使用这个复用器,-4,6,7,8-。目前,我为每个不同的总线大小编写了不同的多路复用器;但是,输出只是转发的所选输入之一,因此与总线的类型相同。

这似乎过于冗馀和容易出错(在正确的时间选择正确的多路复用器,使它们保持一致,在我更改总线大小时更新它们)。没有办法把这个参数化吗?

下面的非通用版本展示了这个想法。

代码语言:javascript
复制
entity mux_6bit_4input is
    port (  input_0 : in    std_logic_vector (5 downto 0);
        input_1 : in    std_logic_vector (5 downto 0);
        input_2 : in    std_logic_vector (5 downto 0);
        input_3 : in    std_logic_vector (5 downto 0);
        sel : in    std_logic_vector (1 downto 0);
        output  : out   std_logic_vector (5 downto 0)
    );
end entity mux_6bit_4input;
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-26 00:51:41

也许我误解了这个问题,但是使用泛型的通用解决方案不是解决了您的问题吗?

代码语言:javascript
复制
library ieee;
use ieee.std_logic_1164.all;

entity mux_4x1 is
    generic (
        DATA_WIDTH: integer := 8
    );
    port (
        input_0: in std_logic_vector(DATA_WIDTH-1 downto 0);
        input_1: in std_logic_vector(DATA_WIDTH-1 downto 0);
        input_2: in std_logic_vector(DATA_WIDTH-1 downto 0);
        input_3: in std_logic_vector(DATA_WIDTH-1 downto 0);
        sel: in std_logic_vector (1 downto 0);
        output: out std_logic_vector(DATA_WIDTH-1 downto 0)
    );
end;

architecture behavior of mux_4x1 is
begin
    output <=
        input_0 when sel = "00" else
        input_1 when sel = "01" else
        input_2 when sel = "10" else
        input_3;
end;

另一个解决方案,如果您想保持事物真正的通用,是使用冷静的通用类型在VHDL-2008。我的模拟器还不支持这个特性,所以这里有一个来自优秀书籍VHDL 2008:新事物的例子

代码语言:javascript
复制
entity generic_mux2 is
    generic (type data_type);
    port (
        sel: in bit;
        a, b: in data_type;
        z: out data_type
    );
end;

architecture rtl of mux2 is
begin
    z <= a when sel = '0' else b;
end;
票数 5
EN

Stack Overflow用户

发布于 2013-11-26 10:41:35

另一种选择是使用无约束数组:

代码语言:javascript
复制
entity mux_4input is
    port ( 
        input_0 : in    std_logic_vector ;
        input_1 : in    std_logic_vector ;
        input_2 : in    std_logic_vector ;
        input_3 : in    std_logic_vector ;
        sel     : in    std_logic_vector (1 downto 0);
        output  : out   std_logic_vector
    );
end entity mux_4input;

它们将从实例化实体中所包含的信号继承它们的宽度(和方向)。

在这种特殊的mux情况下,这可能不是正确的做法,rick的回答是我会选择什么,但是不受约束的数组不会被提及太多,所以我想我应该提供它们!在这种情况下,您可能还需要一些断言来确保所有连接到的都是相同的宽度。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20205073

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档