目次
前
次
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ほど小さく
表示されています。
目次
前
次