我開始在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