我是一名軟件工程師(JAVA/C++),而不是電氣工程師,所以你可以想象VHDL對我來說是徹底的困惑,因爲我不知道什麼是合成器正試圖在幕後做。它告訴我,它無法綜合我認爲是一個非常簡單的架構。 (實際上它是爲我的幾個實體做的,所以我懷疑我誤解了一些基本概念,並在多個地方重複了架構錯誤。)這是爲什麼不能合成? (在NOT(時鐘邊沿)不保留它的值)
爲什麼不能合成... (ERROR - controller.vhd( 63):語句不是合成的,因爲它不 NOT(時鐘邊緣)的條件下保持其價值VHDL-1242 完成:錯誤代碼2)
LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY controller IS
PORT (
ack: out STD_LOGIC := '0';
data_request: in STD_LOGIC
);
END controller;
ARCHITECTURE logic OF controller IS
BEGIN
PROCESS (data_request)
BEGIN
if (rising_edge(data_request)) then
-- other logic will be added here
ack <= '1';
elsif (falling_edge(data_request)) then
-- other logic will be added here too
ack<='0';
end if;
END PROCESS;
END logic;
(是的,我完全知道,該過程的「邏輯」可以由 ack < = data_request替代;但是我的vhdl源實際上比t更復雜他的 ,但我已經將其歸結爲引發錯誤的最簡單的子集。請不要建議用不同的結構/併發語句替換進程。)
基本上,當data_request行轉換爲高電平時,ack輸出應該被驅動爲高電平;在下降的時候應該改變爲低點。 (並且在每種情況下,我都希望其他一些東西也會發生變化,因此我需要該過程而不是併發語句,但更改它只是爲了向頂層實體發出請求已完成的信號。)
什麼是「不持有其價值」?什麼「時鐘」是指什麼時候它說「不(時鐘邊緣)」?
我很想解釋如何解決這個問題(不改變結構)以及我想要問合成器做什麼以及爲什麼合成器無法完成目標的解釋。
我可能已經找出了一些原因,爲什麼...讀取後,我認爲在靈敏度過程中的「X <= Y」分配中的X輸出由合成器實現,其中觸發器附加到靈敏度事件上作爲時鐘我試圖用兩個觸發器不支持的不同時鐘源來驅動觸發器。它是否正確?那麼,如何根據兩個不同的事件來改變輸出,比如兩種不同的方式? – user3059763
您的綜合工具將具有用於順序邏輯的HDL指南,其中顯示了從IEEE Std 1076.6-2004(撤回)派生的可接受形式。這裏的問題是你試圖使用data_request的兩個邊作爲雙數據速率時鐘,而DDR如果支持,只能用於iO單元並需要特殊調用(並使用兩個觸發器)。通常每個進程只能支持一個時鐘邊沿。認爲硬件描述語言。 – user1155120