1

私はVHDLが初めてです。24 MHz の入力クロック信号から 1 Hz (50 % のデューティ サイクル) のクロック信号を生成する方法について、このコードが与えられました。より明確にするためにいくつか質問があります。

  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;
    
4

1 に答える 1

8

24000000 Hz の 24 MHz のクロックを 1 Hz に分割したいとします。したがって、CLKin (24 MHz) の立ち上がりエッジごとにカウントアップするカウンターを作成します。24000000/2=12000000カウントしたら真ん中です。ここで、出力信号のレベル値を変更します ( temp <= not temp)。あなたの仕様では、50%のデューティサイクルでなければならないと言っているからです。その際、あなたも最初からカウントし直します。

8MHz の場合、(24000000/8)/2 = 1500000 のカウンターがあります。

ちょっとした注意:ieee.numeric_stdライブラリ isoieee_logic_arithとthe を使用することをお勧めします。ieee.std_logic_unsigned

注: コードは最初に signal に割り当てていますtemp。そして、temp出力する信号clkout。これは、VHDL では出力ポートからの読み取りが許可されていないためです ( clkout)。を実行するときは、そこから読み取る必要がありますoutput <= not output;。信号から、読み取りが許可されます。

counterもう 1 つ注意してください: プロセスのセンシティビティ リストでは、そこにシグナルを含める必要はありません。

process(CLKin, reset) -- no counter needed

そして、もう 1 つ...

于 2013-02-24T15:28:31.057 に答える