目次
前
次
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)
目次
前
次