目次

Cristal marker

 アマチュア無線の往年の名機には、クリスタルマーカーと呼ばれる
 周波数表示のメータを調整する回路が入っています。

 クリスタルマーカーを、CPLD/FPGAで実現できるはずと考え
 4MHzを分周して100kHz、25kHzの矩形波を生成してみます。

 単純に分周用カウンタを並べれば、実現できるので
 ブロック図を描いて考えました。



 4MHzを40分周し100kHzを生成、その100kHzを4分周し
 25kHzとします。

 40分周のVHDLコードは、以下としました。

  -- divider (generate 100kHz)
  process (nRESET,CLOCK)
  begin
    if ( nRESET = '0' ) then
      iCNT <= 0 ;
    elsif rising_edge(CLOCK) then
      if ( iCNT = CNTMAX ) then
        iCNT <= 0 ;
      else
        iCNT <= iCNT + 1 ;
      end if ;
    end if ;
  end process ;
  iCLK <= '1' when ( iCNT < CNTHALF ) else '0' ;

 iCLKが100kHzなので、さらに4分周します。

  -- divider (generate 25kHz)
  process (nRESET,iCLK)
  begin
    if ( nRESET = '0' ) then
      iCNT25 <= 0 ;
    elsif rising_edge(iCLK) then
      if ( iCNT25 = CNTMAX25 ) then
        iCNT25 <= 0 ;
      else
        iCNT25 <= iCNT25 + 1 ;
      end if ;
    end if ;
  end process ;
  iCLK25 <= '1' when ( iCNT25 < CNTHALF25 ) else '0' ;

 まとめたVHDLコードは、以下。

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity cmarker is
  port (
    -- system
    nRESET : in  std_logic ;
    CLOCK  : in  std_logic ; -- 4MHz
    -- monitor
    COUT : out std_logic_vector(1 downto 0) --;
  );
end cmarker ;

architecture behavioral of cmarker is
  --
  CONSTANT CNTMAX    : integer := 39 ;
  CONSTANT CNTHALF   : integer := 20 ;
  CONSTANT CNTMAX25  : integer := 3 ;
  CONSTANT CNTHALF25 : integer := 2 ;
  -- divider
  signal iCNT   : integer range 0 to CNTMAX ;
  signal iCLK   : std_logic ;
  signal iCNT25 : integer range 0 to CNTMAX25 ;
  signal iCLK25 : std_logic ;
begin
  -- output
  COUT <= iCLK25 & iCLK ;

  -- divider (generate 100kHz)
  process (nRESET,CLOCK)
  begin
    if ( nRESET = '0' ) then
      iCNT <= 0 ;
    elsif rising_edge(CLOCK) then
      if ( iCNT = CNTMAX ) then
        iCNT <= 0 ;
      else
        iCNT <= iCNT + 1 ;
      end if ;
    end if ;
  end process ;
  iCLK <= '1' when ( iCNT < CNTHALF ) else '0' ;

  -- divider (generate 25kHz)
  process (nRESET,iCLK)
  begin
    if ( nRESET = '0' ) then
      iCNT25 <= 0 ;
    elsif rising_edge(iCLK) then
      if ( iCNT25 = CNTMAX25 ) then
        iCNT25 <= 0 ;
      else
        iCNT25 <= iCNT25 + 1 ;
      end if ;
    end if ;
  end process ;
  iCLK25 <= '1' when ( iCNT25 < CNTHALF25 ) else '0' ;

end behavioral;

 XC9572を利用したので、ピンアサインは次のように
 定義しました。

# system
NET "CLOCK"  LOC = "P5"  ;
NET "nRESET" LOC = "P39" ;

# clock out
NET "COUT<0>" LOC = "P1" ;
NET "COUT<1>" LOC = "P9" ;

 2つの周波数が出ているかをマルチメータの周波数
 カウンタで測定すると、次のようになりました。

 25kHz



 100kHz



 周波数カウンタの精度の問題で、10Hzほど小さく
 表示されています。


目次

inserted by FC2 system