2013-04-02 40 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