大家好,我最近開始使用VHDL編寫代碼(這裏的代碼是T觸發器),而且我有一個錯誤提示「進程時鐘過於複雜」,這是第一個代碼附在下面,令人驚訝的是我的解決方案太。但我不知道它是如何工作的,代碼沒有錯誤是第二個代碼。我搜索了半個小時的錯誤,但找不到滿意的原因。請幫忙。VHDL錯誤「過程時鐘過於複雜。」
首先代碼:
LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY t_ff IS
PORT(t,clk,rst:IN STD_LOGIC;
q,q_bar:OUT STD_LOGIC);
END t_ff;
ARCHITECTURE t_ff OF t_ff IS
SIGNAL temp: STD_LOGIC;
BEGIN
PROCESS(clk,rst)
BEGIN
IF(clk='1' AND clk'event)THEN
IF(t='1')THEN temp<= NOT temp;
END IF;
ELSIF(rst='1')THEN temp<='0';
END IF;
q<= temp;
q_bar<= NOT temp;
END PROCESS;
END t_ff;
二碼:
LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY t_ff IS
PORT(t,clk,rst:IN STD_LOGIC;
q,q_bar:OUT STD_LOGIC);
END t_ff;
ARCHITECTURE t_ff OF t_ff IS
SIGNAL temp: STD_LOGIC;
BEGIN
PROCESS(clk,rst)
BEGIN
IF(rst='1')THEN temp<='0';
ELSIF(clk='1' AND clk'event)THEN
IF(t='1')THEN temp<= NOT temp;
END IF;
END IF;
q<= temp;
q_bar<= NOT temp;
END PROCESS;
END t_ff;
我有4點,我不清楚。 1在第一個代碼中,你寫了'q <= q',所以我需要將它定義爲INOUT。 2爲什麼我不能寫'clk ='1'和clk'event'是因爲硬件(FPGA)缺乏這種能力。 3我怎麼知道我在設計中使用了多少觸發器?我正在使用Altera Max + plus II。 4爲什麼我不能寫異步。檢查t輸入後復位。 – rockingsharma
@rockingsharma 1)使用vhdl2008設置,因爲這支持輸出讀數,否則你應該使用臨時中間信號。 2)'rising_edge(clk)'更好。 3)你的綜合工具應該報告這一點。你應該切換到quartus II。 4)你不能在'如果rising_edge(clk)''後面使用'elsif',那只是糟糕的代碼結構。 – JHBonarius
@rockingsharma 1)你是對的(除非你用J.H.Bonarius說的VHDL 2008)。假設你不是,我已經重寫了我的答案。您需要將分配移至過程中的'q'和'q_bar'。 2&3)見上面4)我回答了上面的問題。如果你寫的是在時鐘上升沿測試後異步復位,那麼你正在模擬一個不存在的觸發器的行爲。真正的觸發器的異步復位輸入具有優先權:如果您在復位時持有一個實際的觸發器,則其輸出在復位時保持不變。結束。如果你沒有重置它,你只能計時。 –