我正在以低功耗實現VHDL中的數字設計。該設計有許多輸入被聲明爲多個標準邏輯向量。如果任何輸入上有任何變化,則允許器件喚醒。這必須是組合邏輯,因爲設備處於掉電狀態。什麼我試圖做的代碼說明了一切:(ToggleSTDBY是一個信號,這是合法的)std_logic_vector上的VHDL事件關鍵字
P_Wakeup: PROCESS (VEC1, VEC2, VEC3, Rst_N) IS
BEGIN
IF Rst_N = '0' THEN
ToggleSTDBY <= '0';
ELSIF VEC1'event OR VEC2'event OR VEC3'event THEN
ToggleSTDBY <= NOT(ToggleSTDBY);
END IF;
END PROCESS P_Wakeup;
這是在模擬合法的,但在合成時它說:「'只支持單位事件信號」。我怎樣才能解決這個問題?總共有66位的矢量在一起,我真的不想寫66個程序來喚醒設備。所有位上的按位OR不會解決任何問題,因爲大多數信號都是高電平,所以所有位上的或將總是導致高電平。下面的代碼:
P_Wakeup: PROCESS (VEC, Rst_N) IS
BEGIN
IF Rst_N = '0' THEN
ToggleSTDBY <= '0';
ELSE
FOR i IN VEC'RANGE LOOP
IF VEC(i)'EVENT THEN
ToggleSTDBY <= NOT(ToggleSTDBY);
END IF;
END LOOP;
END IF;
END PROCESS P_Wakeup;
給出錯誤「信號屬性的前綴「事件必須是靜態信號名稱」。我怎樣才能解決它,並保持代碼的可讀性?
這可能沒有時鐘嗎?我會認爲'事件需要有關於信號先前狀態的一些信息,我認爲這需要一個時鐘。除非這可以使用鎖存器來完成? – Russell
@Russell:它用XOR和延遲線完成。該綜合工具知道器件中不同模塊的時序,因此它可以確保XOR每個輸入的延遲不同,因此XOR將會脈衝爲高電平,儘管其輸入是相同的信號,因爲瞬態到達一側在另一個之前。 DFF模塊的時鐘輸入還內置了邊沿檢測電路。 –