2013-02-24 400 views
1

我是VHDL的新手。我從這個代碼得到了如何從24MHz的輸入時鐘信號產生1Hz(50%佔空比)的時鐘信號。我有一些問題需要更多澄清。VHDL時鐘分頻器:計數器 - 佔空比

  1. 如何選擇櫃檯限制?在下面的情況下,12000000.如果我想產生一個8Hz的時鐘信號,這個極限是什麼 。
  2. 如果我想將佔空比 更改爲80%,應如何調整代碼?

    library IEEE; 
    use IEEE.STD_LOGIC_1164.ALL; 
    use IEEE.STD_LOGIC_ARITH.ALL; 
    use IEEE.STD_LOGIC_UNSIGNED.ALL; 
    entity clock is 
        port (CLKin: in std_logic; 
          reset: in std_logic; 
          CLKout: out std_logic); 
    end clock; 
    architecture arch of clock is 
    
        signal counter: integer:=0; 
        signal temp : std_logic := '1'; 
    begin 
    process(CLKin,counter,reset) 
    begin 
        if(reset='0') then counter<=0; temp<='1'; 
        elsif(CLKin'event and CLKin='1') then counter <=counter+1; 
        if (counter = 12000000) then temp <= NOT temp; counter<=0; 
        end if; 
        end if; 
        CLKout <= temp; 
    end process; 
    end arch; 
    

回答

8

要劃分爲24MHz的時鐘,是2400赫茲,1赫茲。 因此,您創建一個計數器,可以計算CLKin(24 MHz)的每個上升沿。 經過24000000/2 = 12000000計數,你就在中間。這就是你改變輸出信號電平值的地方(temp <= not temp)。因爲你的規格說它必須是50%的工作週期。這樣做時,您也會從頭開始再次開始計數。

爲8MHz的,你必須有一個計數器(八分之二千四百萬)/ 2 = 150萬。

而只是一個小的話:這是更好地使用ieee.numeric_std庫ISO的ieee_logic_arithieee.std_logic_unsigned

注意:代碼首先分配給信號temp。然後信號temp輸出clkout。其原因是在VHDL中不允許從輸出端口讀取(clkout)。在做output <= not output;時,你應該從中讀取它。從一個信號,允許閱讀。

另外還有一個注意事項:在過程的靈敏度列表中,沒有必要在那裏有counter信號。

process(CLKin, reset) -- no counter needed 

而且,還有一點...計數12000000次循環爲:0 - >(12000000-1)= 11999999