我开始在VHDL,并试图实现一个电路时,我发现我需要像leading one/zero detectors
或leading one/zero counters
这样的基本元素。由于我认为这些基本的,我想知道是否有一个库包括。VHDL库的基本元素
如果我必须放在一起,我自己的实现是否有一个可以从中复制的集合,还是我需要重新发明轮子? (我可以一个接一个地搜索它们,并在论坛中找到实现,但是其中一些看起来相当糟糕/实现不够普遍(i.e. this multiplexer))。
我开始在VHDL,并试图实现一个电路时,我发现我需要像leading one/zero detectors
或leading one/zero counters
这样的基本元素。由于我认为这些基本的,我想知道是否有一个库包括。VHDL库的基本元素
如果我必须放在一起,我自己的实现是否有一个可以从中复制的集合,还是我需要重新发明轮子? (我可以一个接一个地搜索它们,并在论坛中找到实现,但是其中一些看起来相当糟糕/实现不够普遍(i.e. this multiplexer))。
为什么你建议的方法(一个简单的可重用元素库)没有得到满足的原因之一:没有它们,你往往会变得更好。
您链接到的例子复用器说明了这一点相当不错:
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,依此类推。
现在它不是一个单线程,除非你为它编写一个过程(也可以用大多数工具合成!),但将它与实例实例(和互连)的大小进行比较。
当然,程序库和函数库可能很有用;和(对于不那么琐碎的任务),对于实体也是如此,但是在我看来,使它们足够普遍以对所有人有用,而不使它们变得重量级,将是相当成功的。
很好地做一个多路复用很容易(一个语句,因为你已经展示),但要小心给我看一个简单的领导者/为零? – ted
公平意见;这些通常在时钟进程中实现。让我编辑答案。 –
谢谢。这实际上是比我发现的更好的实现。从我所采取的,我必须生成我自己的函数/程序库。我很惊讶,因为我认为会有一个图书馆,因为据我所知,这些工具仍然可以通过手工优化来打败。 (我发现一个关于多路复用器的线程,其中LUT级联的手动输入导致了80个而不是96个LUT(使用了20%!),我现在找不到) – ted