2014-05-09 57 views
2

我有下面的代碼,我想盡可能使它更專業,例如使用循環。VHDL簡單優化

ENTITY cc IS 
    PORT (s, x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, y0, y1, y2, y3, y4, y5, y6, y7, y8, y9 : IN BIT; 
      m0, m1, m2, m3, m4, m5, m6, m7, m8, m9            : OUT BIT); 
END cc; 

ARCHITECTURE cc_logic OF cc IS 
BEGIN 
    m0 <= (NOT(s) XOR x0) XNOR (s OR y0) ; 
    m1 <= (NOT(s) XOR x1) XNOR (s OR y1) ; 
    m2 <= (NOT(s) XOR x2) XNOR (s OR y2) ; 
    m3 <= (NOT(s) XOR x3) XNOR (s OR y3) ; 
    m4 <= (NOT(s) XOR x4) XNOR (s OR y4) ; 
    m5 <= (NOT(s) XOR x5) XNOR (s OR y5) ; 
    m6 <= (NOT(s) XOR x6) XNOR (s OR y6) ; 
    m7 <= (NOT(s) XOR x7) XNOR (s OR y7) ; 
    m8 <= (NOT(s) XOR x8) XNOR (s OR y8) ; 
    m9 <= (NOT(s) XOR x9) XNOR (s OR y9) ; 
END cc_logic ; 

這可能嗎?

回答

5

standard封裝bit還具有bit_vector,因此,如果該接口 可以改變爲使用矢量而不是單個位,則該代碼可以是 作爲VHDL-2002寫成:

ENTITY cc IS 
    PORT (s : IN BIT; 
      x : IN BIT_VECTOR(0 TO 9); 
      y : IN BIT_VECTOR(0 TO 9); 
      m : OUT BIT_VECTOR(0 TO 9)); 
END cc; 

ARCHITECTURE cc_logic OF cc IS 
BEGIN 
    loop_gen : FOR idx IN m'RANGE GENERATE 
    m(idx) <= ((NOT s) XOR x(idx)) XNOR (s OR y(idx)); 
    end generate; 
END cc_logic; 

需要注意的是NOT(s),改爲(NOT s),因爲假設是,它是 意圖和邏輯運算做外XOR相當於時。

架構也沒有產生循環做這樣寫:

ARCHITECTURE cc_logic OF cc IS 
    SIGNAL s_vec : BIT_VECTOR(0 to 9); 
BEGIN 
    s_vec <= (OTHERS => s); 
    m <= ((NOT s_vec) XOR x) XNOR (s_vec OR y); 
END cc_logic; 

如果VHDL-2008在使用工具的支持,那麼你就可以減少甚至 多用:

ARCHITECTURE cc_logic OF cc IS 
BEGIN 
    m <= ((NOT s) XOR x) XNOR (s OR y); 
END cc_logic; 

最後,您可能會考慮使用std_logicstd_logic_vector而不是 bitbit_vector,因爲std_logic mak中的附加狀態當輸入數據未知時,模擬更精確。

+1

對於模擬使用更好的精度'std_ulogic'和'std_ulogic_vector'這將有助於你找到雙驅動器的錯誤,一個解決的類型將面膜。 – Chiggs

+0

@Chiggs:對於VHDL-2008這聽起來很合理,但是對於VHDL-2002和之前然後'std_ulogic_vector'和'std_logic_vector'是不同的。因此不兼容的類型,所以這將是不方便使用'std_ulogic_vector'與第三方模塊,以自己的模塊組合通常使用'std_logic_vector'。此外,任何雙重驅動程序都被綜合工具識別並報告爲錯誤,因此它們不會長時間不被注意。 –