一、異步復位加法計數器
代碼:
library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity CNT10 is port( CLK,RST,EN: in std_logic; DOUT : out std_logic_vector (3 downto 0); COUT : OUT std_logic ); end CNT10; architecture behav of CNT10 is begin process(CLK,RST,EN) variable Q : std_logic_vector (3 downto 0); begin if RST = '1' then Q := (others => '0'); elsif CLK 'event and CLK = '1' then if EN = '1' then if Q < 9 then Q := Q + 1; else Q := (others => '0'); end if; end if; end if; if Q = "1001" then COUT <= '1'; else COUT <= '0'; end if; DOUT <= Q; end process; end behav;
仿真:
RST信號與CLK信號無關,隨時可以置零
二、同步復位加法計數器
代碼:
library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity CNT10 is port( CLK,RST,EN: in std_logic; DOUT : out std_logic_vector (3 downto 0); COUT : OUT std_logic ); end CNT10; architecture behav of CNT10 is begin process(CLK,RST,EN) variable Q : std_logic_vector (3 downto 0); begin if CLK 'event and CLK = '1' then if RST = '1' then Q := (others => '0'); else if EN = '1' then if Q < 9 then Q := Q + 1; else Q := (others => '0'); end if; end if; end if; end if; if Q = "1001" then COUT <= '1'; else COUT <= '0'; end if; DOUT <= Q; end process; end behav;
仿真:
RST信號只有等到CLK信號的下一個上升沿到時才能清零
三、總結
所謂“同步”是指與系統時鍾同步。同步復位是指當復位信號有效時,並不立刻生效,而是要等到復位信號有效之后系統時鍾的有效邊沿到達時才會生效;
而異步復位則是立刻生效的,只要復位信號有效,無論系統時鍾是怎樣的,系統都會立即被復位。
在用VHDL描述復位信號時,在系統時鍾有效邊沿到達之后才判斷同步復位是否有效;而對異步復位的判斷則與系統時鍾無關。
同步復位: IF clock'event AND clock='1' THEN IF reset='1' THEN -- 復位系統 ELSE -- 正常運作 END IF; END IF; 異步復位: IF reset='1' THEN -- 復位系統 ELSIF clock'event AND clock='1' THEN -- 正常運作 END IF;