用于基本元素的VHDL库

时间:2013-04-02 11:52:12

标签: vhdl

我从VHDL开始,在尝试实现电路时,我发现我需要基本元素,如leading one/zero detectorsleading one/zero counters。由于我认为这些是基本的,我想知道是否有来包含。

如果我必须把我自己的实现放在一起,那么有一个可以复制的集合,还是我需要重新发明轮子?

(我可以逐个google它们并在论坛中找到实现,但是其中一些看起来非常糟糕/实现不够通用(i.e. this multiplexer))。

2 个答案:

答案 0 :(得分:2)

你建议的方法(一个简单的可重复使用的元素库)没有流行的一个原因是:没有它们你通常会更好。

您链接的示例多路复用器非常清楚地说明了这一点:

ENTITY multiplexer IS
PORT (
   a, b, c, d, e, f, g, h : IN STD_LOGIC;
   sel : IN STD_LOGIC_VECTOR(2 DOWNTO 0);
   y : OUT STD_LOGIC
);
END ENTITY multiplexer;

给出稍好的设计,使用您可以编写的类型系统(可能在可重复使用的包中)

subtype sel_type is natural range 0 to 7;

然后在你的设计中,给出信号声明

signal sel_inputs : std_logic_vector(sel_type);
signal sel        : sel_type;
signal y          : std_logic;

你可以简单地写

sel_inputs <= a & b & c & d & e & f & g & h;
y          <= sel_inputs(sel);

与实际多路复用器组件的实例化相比要少得多。

领先的零探测器乍一看看起来更难:它们通常被实现为时钟进程,或者作为更大时钟进程的一部分。

VHDL的最新趋势正朝着半合成VHDL的半行为方式发展,其中很多都是在单个时钟进程中以顺序方式编写的。这在“单一过程状态机”中最为明显;比通常教授的“两个过程”风格更小,更容易理解,更可靠*。

(*除非您的工具支持组合过程的VHDL-2008“过程(全部)”敏感度列表。)

在一个时钟进程内(即假设以下内容在if rising_edge(clk) then内,可以使用for循环表示计算数组中前导零的简单任务;例如:

   for i in sel_type loop
      if sel_inputs(i) = '1' then
         zero_count <= sel_type'high - i;
      end if;
   end loop;

最后一项任务将获胜;如果h ='1',则计数为0,否则如果g ='1',则计数为1,依此类推。

现在它不是一个单行程序,除非你为它编写程序(也可以与大多数工具合成!),但将它与实体实例化(和互连)的大小进行比较。

当然,程序和功能库可能很有用; (对于不那么琐碎的任务)对于实体来说也是如此,但在我看来,将它们变得通用以使所有人都有用,而不是让它们变得重量级,这将是一项非常成就。

答案 1 :(得分:0)

某些IDE直接带有示例库。例如Xilinx ISE具有“语言模板”部分,其中包含基本的综合结构,编码示例,......