2013-04-02 38 views
1

我开始在VHDL,并试图实现一个电路时,我发现我需要像leading one/zero detectorsleading one/zero counters这样的基本元素。由于我认为这些基本的,我想知道是否有一个包括。VHDL库的基本元素

如果我必须放在一起,我自己的实现是否有一个可以从中复制的集合,还是我需要重新发明轮子? (我可以一个接一个地搜索它们,并在论坛中找到实现,但是其中一些看起来相当糟糕/实现不够普遍(i.e. this multiplexer))。

回答

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; 

你可以简化ly写

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

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

当然,程序库和函数库可能很有用;和(对于不那么琐碎的任务),对于实体也是如此,但是在我看来,使它们足够普遍以对所有人有用,而不使它们变得重量级,将是相当成功的。

+0

很好地做一个多路复用很容易(一个语句,因为你已经展示),但要小心给我看一个简单的领导者/为零? – ted

+0

公平意见;这些通常在时钟进程中实现。让我编辑答案。 –

+0

谢谢。这实际上是比我发现的更好的实现。从我所采取的,我必须生成我自己的函数/程序库。我很惊讶,因为我认为会有一个图书馆,因为据我所知,这些工具仍然可以通过手工优化来打败。 (我发现一个关于多路复用器的线程,其中LUT级联的手动输入导致了80个而不是96个LUT(使用了20%!),我现在找不到) – ted

0

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

+0

它的一个很好的提示,但我找不到领先的/零 – ted