1

我从 VHDL 开始,在尝试实现一个电路时,我发现我需要像leading one/zero detectorsor之类的基本元素leading one/zero counters。因为我认为这些是基本的,所以我想知道是否有一个可以包含。

如果我必须将自己的实现放在一起,是否有一个可以从中复制的集合,或者我是否需要重新发明轮子?

(我可以一一谷歌它们并在论坛中找到实现,但是其中一些看起来很糟糕/实现不够通用(即这个多路复用器))。

4

2 回答 2

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,依此类推。

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

当然,程序库和函数库会很有用。并且(对于不那么琐碎的任务)实体也是如此,但在我看来,使它们足够通用以对所有人有用,而不使它们变得重量级,将是一项相当大的成就。

于 2013-04-02T12:29:18.500 回答
0

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

于 2013-04-02T12:40:09.897 回答