目次

CRTC(Cathod Ray Tube Controller)

 2011年7月22日から、日本国内のTV放送はデジタルに切替えられ  地上デジタル放送対応のTV受信機器でなければ、TV放送の受信は  不可能になりました。  アナログ回路の集大成である、アナログTVが廃棄されることに。  アナログTVの映像信号を、CPLD/FPGAを利用して生成することで  NTSC方式の理解とVHDLコード作成技術を向上させます。  CRTコントローラを作成してみます。  VDHLコードを作成するため、NTSC信号の内容を見ていきます。  同期信号   同期信号には水平と垂直の2種類があるので、モノクロ映像を   対象に、別々にタイミングチャートを眺めていきます。   水平同期信号のタイミングチャートは、以下。   タイミングチャートから、水平同期信号は、3ブロック構成で   以下のようになっています。これらを含めて、水平帰線信号と   呼んでいます。   利用するクロックを10MHz(周期は、0.1us)とすると   全体カウンタを635までカウントするとして、コードは   次の記述となります。 CONSTANT HCNTMAX : integer := 635 ; CONSTANT HSYNC0 : integer := 15 ; CONSTANT HSYNC1 : integer := 63 ; process (nRESET,CLOCK) begin if ( nRESET = '0' ) then iHCNT <= 0 ; elsif rising_edge( CLOCK ) then if ( iHCNT = HCNTMAX ) then iHCNT <= 0 ; else iHCNT <= iHCNT + 1 ; end if ; end if ; end process ; iHSYNC <= '0' when ( HSYNC0 < iHCNT and iHCNT < HSYNC1 ) else '1' ;   垂直同期信号のタイミングチャートは、以下。   タイミングチャートから、垂直同期信号は、3ブロック構成で   以下のようになっています。これらを含めて、垂直帰線信号と   呼んでいます。   後置等価パルスから映像信号出力までの期間には、カラー   バースト信号が出力されます。この期間には水平同期信号   を出力しています。   垂直方向では、全体を263までカウントすると考えます。   カウンタはiVCNTで扱うとして、コードは以下。 CONSTANT VCNTMAX : integer := 263 ; CONSTANT VSYNC0 : integer := 23 ; CONSTANT VSYNC1 : integer := 316 ; CONSTANT VSYNC2 : integer := 340 ; CONSTANT VSYNC3 : integer := 269 ; CONSTANT VSYNC4 : integer := 317 ; CONSTANT VSYNC5 : integer := 529 ; -- VSYNC PULSE iHSYNCX <= '0' when ( iHCNT < VSYNC0 ) else '0' when ( VSYNC1 < iHCNT and iHCNT < VSYNC2 ) else '1' ; iHSYNCZ <= '0' when ( iHCNT < VSYNC0 ) else '1' ; -- EQUATION PULSE iHSYNCY <= '0' when ( VSYNC3 < iHCNT and iHCNT < VSYNC4 ) else '0' when ( VSYNC5 < iHCNT ) else '1' ; -- VSYNC iVSYNC <= iHSYNCX when ( iVCNT < 3 ) else iHSYNCY when ( 2 < iVCNT and iVCNT < 6 ) else (not iHSYNCX) when ( 5 < iVCNT and iVCNT < 9 ) else iHSYNCZ when ( 9 < iVCNT and iVCNT < 20 ) else iHSYNC ;   カウンタiVCNTは、水平関連のカウンタを利用すれば   簡単に生成できます。 process (nRESET,CLOCK) begin if ( nRESET = '0' ) then iHCNT <= 0 ; iVCNT <= 0 ; elsif rising_edge( CLOCK ) then if ( iHCNT = HCNTMAX ) then iHCNT <= 0 ; iVCNT <= iVCNT + 1 ; else iHCNT <= iHCNT + 1 ; end if ; if ( iVCNT = VCNTMAX ) then iVCNT <= 0 ; end if ; end if ; end process ;   同期信号は、垂直と水平の合成した複合同期信号で出力します。 VHSYNC <= iVSYNC ;  映像信号   映像信号は、水平帰線期間を越えてから、水平帰線期間が   始まるまでの期間に出力します。   アナログTVでは、40usくらいを映像信号出力にするのが   相場と言われているので、映像信号を出力してよい間を   iHCNTから求めて、利用します。 CONSTANT BEGINVIDEO : integer := 109 ; CONSTANT EXITVIDEO : integer := 510 ; iVENAX <= '1' when ( BEGINVIDEO < iHCNT and iHCNT < EXITVIDEO ) else '0' ; iVENAY <= '1' when ( 19 < iVCNT ) else '0' ; iVENA <= iVENAX and iVENAY ;   映像出力が可能な期間に、映像専用のカウンタを使い   映像信号を生成します。 -- video signal generator process (CLOCK) begin if rising_edge( CLOCK ) then if ( iVENA = '1' ) then iVIDEOCNT <= iVIDEOCNT + 1 ; else iVIDEOCNT <= 0 ; end if ; end if ; end process ; -- test bar iVIDEO <= '1' when ( 9 < iVIDEOCNT and iVIDEOCNT < 32 ) else '1' when ( 200 < iVIDEOCNT and iVIDEOCNT < 222 ) else '0' ;  テスト処理のVHDLコードは、以下となります。 library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity tsttv is Port ( -- system nRESET : in std_logic ; CLOCK : in std_logic ; -- 10MHz -- handling VHSYNC : out std_logic ; VIDEO : out std_logic --; ); end tsttv; architecture Behavioral of tsttv is -- CONSTANT HCNTMAX : integer := 635 ; CONSTANT HSYNC0 : integer := 15 ; CONSTANT HSYNC1 : integer := 63 ; CONSTANT VCNTMAX : integer := 263 ; CONSTANT VSYNC0 : integer := 23 ; CONSTANT VSYNC1 : integer := 316 ; CONSTANT VSYNC2 : integer := 340 ; CONSTANT VSYNC3 : integer := 269 ; CONSTANT VSYNC4 : integer := 317 ; CONSTANT VSYNC5 : integer := 529 ; CONSTANT BEGINVIDEO : integer := 109 ; CONSTANT EXITVIDEO : integer := 510 ; -- signal iVCNT : integer range 0 to VCNTMAX ; signal iHCNT : integer range 0 to HCNTMAX ; -- signal iHSYNC : std_logic ; signal iHSYNCX : std_logic ; signal iHSYNCY : std_logic ; signal iHSYNCZ : std_logic ; signal iVSYNC : std_logic ; -- signal iVENAX : std_logic ; signal iVENAY : std_logic ; signal iVENA : std_logic ; signal iVIDEOCNT : integer range 0 to HCNTMAX ; signal iVIDEO : std_logic ; begin -- output VHSYNC <= iVSYNC ; VIDEO <= iVIDEO when ( iVENA = '1' ) else '0' ; -- master counter process (nRESET,CLOCK) begin if ( nRESET = '0' ) then iHCNT <= 0 ; iVCNT <= 0 ; elsif rising_edge( CLOCK ) then if ( iHCNT = HCNTMAX ) then iHCNT <= 0 ; iVCNT <= iVCNT + 1 ; else iHCNT <= iHCNT + 1 ; end if ; if ( iVCNT = VCNTMAX ) then iVCNT <= 0 ; end if ; end if ; end process ; -- HSYNC iHSYNC <= '0' when ( HSYNC0 < iHCNT and iHCNT < HSYNC1 ) else '1' ; -- VSYNC PULSE iHSYNCX <= '0' when ( iHCNT < VSYNC0 ) else '0' when ( VSYNC1 < iHCNT and iHCNT < VSYNC2 ) else '1' ; iHSYNCZ <= '0' when ( iHCNT < VSYNC0 ) else '1' ; -- EQUATION PULSE iHSYNCY <= '0' when ( VSYNC3 < iHCNT and iHCNT < VSYNC4 ) else '0' when ( VSYNC5 < iHCNT ) else '1' ; -- VSYNC iVSYNC <= iHSYNCX when ( iVCNT < 3 ) else iHSYNCY when ( 2 < iVCNT and iVCNT < 6 ) else (not iHSYNCX) when ( 5 < iVCNT and iVCNT < 9 ) else iHSYNCZ when ( 9 < iVCNT and iVCNT < 20 ) else iHSYNC ; -- enable video signal iVENAX <= '1' when ( BEGINVIDEO < iHCNT and iHCNT < EXITVIDEO ) else '0' ; iVENAY <= '1' when ( 19 < iVCNT ) else '0' ; iVENA <= iVENAX and iVENAY ; -- video signal generator process (CLOCK) begin if rising_edge( CLOCK ) then if ( iVENA = '1' ) then iVIDEOCNT <= iVIDEOCNT + 1 ; else iVIDEOCNT <= 0 ; end if ; end if ; end process ; -- test bar iVIDEO <= '1' when ( 9 < iVIDEOCNT and iVIDEOCNT < 32 ) else '1' when ( 200 < iVIDEOCNT and iVIDEOCNT < 222 ) else '0' ; end Behavioral;  XC9572で実現したので、ピンアサインを記しておきます。 # system NET "CLOCK" LOC = "P9" ; NET "nRESET" LOC = "P74" ; # NTSC (group A) NET "VHSYNC" LOC = "P1" ; NET "VIDEO" LOC = "P2" ;  同期信号と映像出力処理ができれば、次の回路を接続し  アナログTVにモノクロ画像を表示できます。  コントローラとしての実用性を考えると、メモリアクセス  機能を用意し、フレームメモリも扱えるようにします。 (under construction)


目次 inserted by FC2 system