我對VHDL(以及一般的數字電路)相當陌生,我試圖用BCD樣式塊實現兩位數的計數器。在這個電路外部會出現一些按鈕,當按下按鈕時,會將感興趣的數字加1(就像鬧鐘一樣)。這是一個異步操作,並且會在某種形式的編輯模式(外部強制執行)下發生。我寫的代碼工作正常,沒有「elsif rising_edge(digitUp1)然後」和「elsif rising_edge(digitUp1)然後」塊,但是失敗並且包含它們。我真的不知道爲什麼它不起作用或我如何解決它。請繼續收到錯誤,如「無法在此時鐘邊沿實現寄存器分配」,「無法爲count2 [3]推斷寄存器,因爲它的行爲取決於多個不同時鐘的邊沿」和「無法推斷寄存器」在MinuteCounter.vhd(21)處計數[count2 [3]「,因爲它不在時鐘邊緣外保持其值。任何幫助將不勝感激。VHDL:一個進程塊內的多個rising_edge檢測
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_signed.all;
-- ToDo: ENFORCE ON ALL COUNTERS (externally) LOGIC TO PAUSE AT MAX/MIN
entity MinuteCounter is
port(clockIn, digitUp1, digitUp2, reset, counting, countUp : in std_logic;
clockOut : out std_logic;
BCD1, BCD2 : out std_logic_vector(3 downto 0));
end MinuteCounter;
architecture structure of MinuteCounter is
signal count1, count2 : std_logic_vector(3 downto 0);
signal carryOut : std_logic;
begin
process(clockIn, digitUp1, digitUp2, countUp, reset, counting)
begin
-- Asynchronous reset
if reset = '1' then
count1 <= "0000";
count2 <= "0000";
-- What to run when there's an active edge of the clock
elsif rising_edge(clockIn) then
-- Code to run when timer is running
if counting = '1' then
-- What to do when counting up
if countUp = '1' then
if ((count1 = "1001") and (count2 = "0101")) then
count1 <= "0000";
count2 <= "0000";
if carryOut = '0' then
carryOut <= '1';
else
carryOut <= '0';
end if;
elsif count1 = "1001" then
count1 <= "0000";
count2 <= count2 + 1;
else
count1 <= count1 + 1;
end if;
-- What to do when counting down (This logic is hard to understand)
else
if ((count1 = "0000") and (count2 = "0000")) then
count1 <= "1001";
count2 <= "0101";
if carryOut = '0' then
carryOut <= '1';
else
carryOut <= '0';
end if;
elsif count1 = "0000" then
count1 <= "1001";
count2 <= count2 - 1;
else
count1 <= count1 - 1;
end if;
end if;
-- When counting is disabled, but there is an active edge (do nothing)
else
count1 <= count1;
count2 <= count2;
end if;
-- Code to run when entering values (will not be run if counting = '1') << Externally enforced
elsif rising_edge(digitUp1) then
if count1 = "1001" then
count1 <= "0000";
count1 <= count1 + 1;
else
count1 <= count1 + 1;
end if;
-- Code to run when entering values (will not be run if counting = '1') << Externally enforced
elsif rising_edge(digitUp2) then
if count2 = "0101" then
count2 <= "0000";
count2 <= count2 + 1;
else
count2 <= count2 + 1;
end if;
-- What to do when there is no active edge or other events (nothing)
else
count1 <= count1;
count2 <= count2;
end if;
end process;
-- Assign outputs
BCD1 <= count1;
BCD2 <= count2;
clockOut <= carryOut;
end structure;
從開關製造時鐘充滿了潛在的災難,當多個邊緣切換時彈跳:) –
@Martin:的確如此,但那是另一回事!當然值得警惕。 –