2017-09-13 70 views
1

我有多個屬於一起的輸入(在相同的時鐘等採樣),但在邏輯上不是一個矢量(即不是並行總線)我需要修改的代碼。
此前,他們被定義爲VHDL:使用std_logic與使用std_logic_vector的子類型的數組

type my_type is array (my_width - 1 downto 0) of std_logic; 
signal my_signal : my_type; 

直到現在,爲此,我一直用這個:

subtype my_subtype is std_logic_vector(my_width - 1 downto 0); 
signal my_signal : my_subtype; 

對於大多數的意圖和目的,陣列和載體可幾乎處理同樣的,所以我的問題是:
任何一種做事方式都有優勢嗎?有一種首選/標準方式嗎?

+3

兩者都有效。你可以訪問ieee.std_logic_1164包中'std_logic_vector'聲明的所有操作符和功能,另一種方法是你必須編寫和測試你自己的。這是一件不容易的事情。 –

+2

儘管信號並不代表並行總線,但它們代表的是同一類事物的集合嗎?例如,8個狀態LED可能不被解釋爲一個連貫的「字節」,但它們至少都是'狀態LED'。對於不同類型的東西,例如寫入啓用,重置,時鐘,我可能會試圖將它們放在記錄中而不是矢量中。 –

+0

@scary_jeff它們相當於您的狀態LED示例 - 實際上是多個MISO線路,其中所有從屬設備都連接到相同的SCK和CS(這是奇怪的硬件) – DLnd

回答

0

有一個區別,這與strong typing有關。

隨着你的第一段代碼,你創建一個新的類型。它是獨立的,與其他類型不兼容。只是考慮下一段代碼:

entity e is end entity; 
library ieee; 
architecture a of e is 
    use ieee.std_logic_1164.all; 
    type slv1_t is array (15 downto 0) of std_logic; 
    signal slv1 : slv1_t; 
    type slv2_t is array (7 downto 0) of std_logic; 
    signal slv2 : slv2_t; 
begin 
    slv2 <= slv1(7 downto 0); 
end architecture; 

當編譯的ModelSim,該代碼會給出錯誤:

Error: C:/HDL/TypeVsSubtype/Type.vhd(10): Cannot resolve slice name as type slv2_t.

對於第二一段代碼,基礎類型仍然是一個std_logic_vector。因此這些亞型是兼容的。考慮下一段代碼:

entity e is end entity; 
library ieee; 
architecture a of e is 
    use ieee.std_logic_1164.all; 
    subtype slv1_t is std_logic_vector(15 downto 0); 
    signal slv1 : slv1_t; 
    subtype slv2_t is std_logic_vector(7 downto 0); 
    signal slv2 : slv2_t; 
begin 
    slv2 <= slv1(7 downto 0); 
end architecture; 

這會編譯(即沒有錯誤)。