我从VHDL开始,在尝试实现电路时,我发现我需要基本元素,如leading one/zero detectors
或leading one/zero counters
。由于我认为这些是基本的,我想知道是否有库来包含。
如果我必须把我自己的实现放在一起,那么有一个可以复制的集合,还是我需要重新发明轮子?
(我可以逐个google它们并在论坛中找到实现,但是其中一些看起来非常糟糕/实现不够通用(i.e. this multiplexer))。
答案 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具有“语言模板”部分,其中包含基本的综合结构,编码示例,......