-- *************************************************************************
-- ***** BLANCA オーディオ/ビジュアルプロセッサ(AVP)用  (Spartan3/1500)
-- ***** SH-4A(SH7780)接続版  トップモジュール
-- *************************************************************************

library ieee;
use ieee.std_logic_1164.all;

library UNISIM;
use UNISIM.VCOMPONENTS.ALL;

entity AVP_SH4A is
	port (

	-- システムリセット/NMI信号ピン
		SYS_nRST		: in	std_logic;						-- リセット
		SYS_nNMI		: in	std_logic;						-- NMI入力
		SYS_nNMIo		: out	std_logic;						-- NMI出力(I/Oプロセッサへ)

	-- ユーザー拡張用クロック入力ピン
		USER_CLK		: in	std_logic;						-- 拡張用

	-- ローカルバス信号ピン(SH-4A)
		L_nRST			: in	std_logic;						-- ローカルリセット入力
		L_CLK			: in	std_logic;						-- ローカルクロック入力
		L_nCS			: in	std_logic_vector( 6 downto 0);	-- チップセレクト入力
		L_nROMCS		: out	std_logic;						-- ROMチップセレクト出力
		L_A				: in	std_logic_vector(25 downto 0);	-- アドレスバス入力
		L_nBS			: in	std_logic;						-- バスサイクルスタート
		L_RnW			: in	std_logic;						-- リード/ライト入力
		L_nRD			: in	std_logic;						-- リード入力
		L_nWE			: in	std_logic_vector( 3 downto 0);	-- ライトバイトイネーブル入力
		L_D				: inout	std_logic_vector(31 downto 0);	-- データバス
		L_nRDY			: out	std_logic;						-- レディ出力
		L_nINT			: out	std_logic_vector( 3 downto 0);	-- CPU割り込み出力

	-- I/Oプロセッサ割り込み入力
		IOP_nINT		: in	std_logic_vector( 4 downto 0);	-- I/Oプロセッサ割り込み入力(負論理)

	-- PCIバス信号ピン
		PCI_CLK			: in	std_logic;						-- PCIバスクロック
		PCI_AD			: inout std_logic_vector(31 downto 0);	-- アドレス/データバス
		PCI_C_nBE		: inout	std_logic_vector( 3 downto 0);	-- PCIバスコマンド/バイトイネーブル
		PCI_nFRAME		: inout	std_logic;						-- フレーム
		PCI_nIRDY		: inout	std_logic;						-- イニシエータレディ
		PCI_nDEVSEL		: inout	std_logic;						-- デバイスセレクション
		PCI_nTRDY		: inout	std_logic;						-- ターゲットレディ
		PCI_nSTOP		: inout	std_logic;						-- 転送ストップ要求
		PCI_PAR			: inout	std_logic;						-- パリティビット
		PCI_nPERR		: inout	std_logic;						-- パリティエラー
		PCI_nSERR		: inout	std_logic;						-- システムエラー
		PCI_nINTA		: inout	std_logic;						-- 割り込みINTA#
		PCI_nINTB		: inout	std_logic;						-- 割り込みINTB#
		PCI_nINTC		: inout	std_logic;						-- 割り込みINTC#
		PCI_nINTD		: inout	std_logic;						-- 割り込みINTD#
		PCI_nREQ		: out	std_logic;						-- バス使用要求信号出力
		PCI_nGNT		: in	std_logic;						-- バス使用許諾信号入力
	-- PCIバス(セントラルリソース)信号ピン
		PCI_nRST		: out	std_logic;						-- PCIバスリセット出力
		PCI_M66EN		: in	std_logic;						-- 66MHz PCIモード
		PCI_XCAP		: in	std_logic;						-- PCI-Xモード

	-- アナログRGB信号ピン
		V_F48M			: in	std_logic;						-- ビデオクロック入力1
		V_F25M			: in	std_logic;						-- ビデオクロック入力2
		V_CLK			: out	std_logic;						-- ビデオクロック出力
		V_nBLANK		: out	std_logic;						-- ブランキング
		V_nHSYNC		: out	std_logic;						-- 水平同期
		V_nVSYNC		: out	std_logic;						-- 垂直同期
		V_R				: out	std_logic_vector( 7 downto 0);	-- 赤
		V_G				: out	std_logic_vector( 7 downto 0);	-- 緑
		V_B				: out	std_logic_vector( 7 downto 0);	-- 青

	-- AC97コーデック信号ピン
		AC97_nRST		: out	std_logic;						-- リセット
		AC97_SCLK		: in	std_logic;						-- クロック
		AC97_SYNC		: out	std_logic;						-- 同期
		AC97_SDO		: out	std_logic;						-- データ出力
		AC97_SDI		: in	std_logic;						-- データ入力

	-- フラッシュROM信号ピン(ノーマル版)
		ROM_nCE			: out	std_logic;						-- チップイネーブル
		ROM_nOE			: out	std_logic;						-- アウトプットイネーブル
		ROM_nWE			: out	std_logic;						-- ライトイネーブル
		ROM_nBYTE		: out	std_logic;						-- バイトセレクト
		ROM_A			: out	std_logic_vector(23 downto 1);	-- アドレスバス
		ROM_D			: inout	std_logic_vector(15 downto 0);	-- データバス

	-- SDRAM信号ピン
		SD_CLK			: out	std_logic;						-- SDRAM駆動外部クロック
		SD_CKE			: out	std_logic;						-- クロックイネーブル
		SD_nCS			: out	std_logic;						-- チップセレクト
		SD_nRAS			: out	std_logic;						-- /RAS
		SD_nCAS			: out	std_logic;						-- /CAS
		SD_nWE			: out	std_logic;						-- ライトイネーブル
		SD_DQM			: out	std_logic_vector( 3 downto 0);	-- バイトイネーブル
		SD_MBA			: out	std_logic_vector( 1 downto 0);	-- バンクアドレス
		SD_MA			: out	std_logic_vector(11 downto 0);	-- アドレスバス
		SD_MD			: inout	std_logic_vector(31 downto 0);	-- データバス

	-- MMCカード信号ピン
		MMC_CLK			: out	std_logic;						-- クロック
		MMC_nCS			: out	std_logic;						-- チップセレクト
		MMC_DIN			: out	std_logic;						-- カードデータ入力
		MMC_DOUT		: in	std_logic;						-- カードデータ出力
		MMC_nCD1		: in	std_logic;						-- カードディテクト1
		MMC_nCD2		: in	std_logic;						-- カードディテクト2
		MMC_DATA1		: out	std_logic;						-- データバス1
		MMC_DATA2		: out	std_logic;						-- データバス2
		MMC_nWP			: in	std_logic;						-- ライトプロテクト

	-- COMポート信号ピン
		COM2_TxD		: out	std_logic;						-- TxD
		COM2_RxD		: in	std_logic;						-- RxD
		COM2_RTS		: out	std_logic;						-- RTS
		COM2_CTS		: in	std_logic;						-- CTS
		COMx_EN			: out	std_logic;						-- シリアルドライバイネーブル

	-- ディップスイッチ/LED信号ピン
		AVP_LED			: out	std_logic_vector( 3 downto 0);	-- ディップスイッチ
		AVP_DIPSW		: in	std_logic_vector( 3 downto 0)	-- LED

	);
end AVP_SH4A;


architecture RTL of AVP_SH4A is


	signal	TX_RED : std_logic_vector(7 downto 0);
	signal	TX_GRN : std_logic_vector(7 downto 0);
	signal	TX_BLU : std_logic_vector(7 downto 0);
	signal	TX_HS : std_logic;
	signal	TX_VS : std_logic;
	signal	TX_DE : std_logic;
	signal	TX_CLK : std_logic;
	signal	TX_RST_N : std_logic;

component xil_csc is
port (
	DDR_RED			: out   std_logic_vector(7 downto 0);	-- out   [DDR] red [7:0]
	DDR_GRN			: out   std_logic_vector(7 downto 0);	-- out   [DDR] grn [7:0]
	DDR_BLU			: out   std_logic_vector(7 downto 0);	-- out   [DDR] blu [7:0]
	DDR_HS			: out   std_logic;						-- out   [DDR] #hsync
	DDR_VS			: out   std_logic;						-- out   [DDR] #vsync
	DDR_DE			: out   std_logic;						-- out   [DDR] de
	DDR_CLK			: out   std_logic;						-- out   [DDR] clock

	TX_RED			: in    std_logic_vector(7 downto 0);	-- in    [RGB] red [7:0]
	TX_GRN			: in    std_logic_vector(7 downto 0);	-- in    [RGB] grn [7:0]
	TX_BLU			: in    std_logic_vector(7 downto 0);	-- in    [RGB] blu [7:0]
	TX_HS			: in    std_logic;						-- in    [RGB] #hsync
	TX_VS			: in    std_logic;						-- in    [RGB] #vsync
	TX_DE			: in    std_logic;						-- in    [RGB] de
	TX_CLK			: in    std_logic;						-- in    [RGB] clock
	TX_RST_N		: in    std_logic						-- in    [RGB] #reset
);
end component;


-- ***** SH-4Aローカルバスモジュール定義 ***** --
component LBUS_SH4A is
	port (

	-- ローカルバス信号ピン
		L_nCS			: in	std_logic_vector( 6 downto 0);	-- チップセレクト入力
		L_A				: in	std_logic_vector(25 downto 0);	-- アドレスバス入力
		L_nBS			: in	std_logic;						-- バスサイクルスタート
		L_RnW			: in	std_logic;						-- リード/ライト入力
		L_nRD			: in	std_logic;						-- リード入力
		L_nWE			: in	std_logic_vector( 3 downto 0);	-- バイトイネーブル入力
		L_D_i			: in	std_logic_vector(31 downto 0);	-- データバス入力
		L_D_o			: out	std_logic_vector(31 downto 0);	-- データバス出力
		L_D_t			: out	std_logic;						-- データバス制御
		L_nRDY_o		: out	std_logic;						-- ウェイト出力
		L_nRDY_t		: out	std_logic;						-- ウェイト制御

		ROM_Select		: in	std_logic_vector( 3 downto 0);	-- CS0空間選択信号
		ROM_nCS0		: out	std_logic;						-- CPUオンボードフラッシュROMセレクト信号

	-- デバイス選択信号
		SYS_HitDevice	: in	std_logic;						-- デバイス選択信号

	-- BLANCAシステムバス信号(マスタ)
		SYS_Clock		: in	std_logic;						-- クロック
		SYS_Reset		: in	std_logic;						-- リセット
		SYS_Address		: out	std_logic_vector(31 downto 0);	-- アドレスバス
		SYS_ByteEnable	: out	std_logic_vector( 3 downto 0);	-- バイトイネーブル
		SYS_ReadWrite	: out	std_logic;						-- リード/ライト
		SYS_AccStart	: out	std_logic;						-- アクセススタート
		SYS_WriteData	: out	std_logic_vector(31 downto 0);	-- ライトデータバス
		SYS_ReadData	: in	std_logic_vector(31 downto 0);	-- リードデータバス
		SYS_AccReady	: in	std_logic						-- アクセスレディ

	);
end component;

	signal SYS_HitDevice	: std_logic;

	-- ***** BLANCAシステムバス信号 ***** --
	signal SYS_Clock		: std_logic;
	signal SYS_Reset		: std_logic;
	signal SYS_Address		: std_logic_vector(31 downto  0);
	signal SYS_ByteEnable	: std_logic_vector( 3 downto  0);
	signal SYS_ReadWrite	: std_logic;
	signal SYS_AccStart		: std_logic;
	signal SYS_WriteData	: std_logic_vector(31 downto  0);
	signal SYS_ReadData		: std_logic_vector(31 downto  0);
	signal SYS_AccReady		: std_logic;

	-- ***** 割り込み関連レジスタ ***** --
	signal SYS_Interrupt	: std_logic;
	signal SYS_IntLevel		: std_logic_vector( 7 downto  0);
	signal IOP_Interrupt	: std_logic_vector(15 downto  0);



-- ***** A/Vプロセッサ スレーブリソース BLANCAシステムバスモジュール定義 ***** --
component AVP_BUS is
	port (

	-- BLANCAシステムバス信号
		SYS_Clock		: in	std_logic;						-- クロック
		SYS_Reset		: in	std_logic;						-- リセット
		SYS_Address		: in	std_logic_vector(31 downto 0);	-- アドレスバス
		SYS_ByteEnable	: in	std_logic_vector( 3 downto 0);	-- バイトイネーブル
		SYS_ReadWrite	: in	std_logic;						-- リード/ライト
		SYS_AccStart	: in	std_logic;						-- アクセススタート
		SYS_WriteData	: in	std_logic_vector(31 downto 0);	-- ライトデータ入力バス
		SYS_ReadData	: out	std_logic_vector(31 downto 0);	-- リードデータ出力バス(トライステート)
		SYS_AccReady	: out	std_logic;						-- アクセスレディ出力
		SYS_Interrupt	: out	std_logic;						-- 割り込み出力
		SYS_IntLevel	: out	std_logic_vector( 7 downto 0);	-- 割り込みレベル
		SYS_NMIin		: in	std_logic;						-- NMI入力
		SYS_HitDevOut	: out	std_logic;						-- デバイス選択出力

	-- I/Oプロセッサ割り込み入力
		IOP_Interrupt	: in	std_logic_vector(15 downto 0);	-- I/Oプロセッサ割り込み入力(負論理)

	-- ユーザー拡張用クロック入力ピン
		USER_CLK		: in	std_logic;						-- 拡張用

	-- アナログRGB信号ピン
		V_F48M			: in	std_logic;						-- ビデオクロック入力1
		V_F25M			: in	std_logic;						-- ビデオクロック入力2
		V_CLK			: out	std_logic;						-- ビデオクロック出力
		V_nBLANK		: out	std_logic;						-- ブランキング
		V_nHSYNC		: out	std_logic;						-- 水平同期
		V_nVSYNC		: out	std_logic;						-- 垂直同期
		V_R				: out	std_logic_vector( 7 downto 0);	-- 赤
		V_G				: out	std_logic_vector( 7 downto 0);	-- 緑
		V_B				: out	std_logic_vector( 7 downto 0);	-- 青

	-- AC97コーデック信号ピン
		AC97_nRST		: out	std_logic;						-- リセット
		AC97_SCLK		: in	std_logic;						-- クロック
		AC97_SYNC		: out	std_logic;						-- 同期
		AC97_SDO		: out	std_logic;						-- データ出力
		AC97_SDI		: in	std_logic;						-- データ入力

	-- MMCカード信号ピン
		MMC_CLK			: out	std_logic;						-- クロック
		MMC_nCS			: out	std_logic;						-- チップセレクト
		MMC_DIN			: out	std_logic;						-- カードデータ入力
		MMC_DOUT		: in	std_logic;						-- カードデータ出力
		MMC_nCD1		: in	std_logic;						-- カードディテクト1
		MMC_nCD2		: in	std_logic;						-- カードディテクト2
		MMC_DATA1		: out	std_logic;						-- データバス1
		MMC_DATA2		: out	std_logic;						-- データバス2
		MMC_nWP			: in	std_logic;						-- ライトプロテクト

	-- COMポート信号ピン
		COM2_TxD		: out	std_logic;						-- TxD
		COM2_RxD		: in	std_logic;						-- RxD
		COM2_RTS		: out	std_logic;						-- RTS
		COM2_CTS		: in	std_logic;						-- CTS

	-- ディップスイッチ/LED信号ピン
		AVP_LED			: out	std_logic_vector( 3 downto 0);	-- ディップスイッチ
		AVP_DIPSW		: in	std_logic_vector( 3 downto 0);	-- LED

	-- SDRAM信号ピン
		SDRAM_Clock		: in	std_logic;						-- SDRAMコントローラ内部クロック
		SD_nCS			: out	std_logic;						-- チップセレクト
		SD_nRAS			: out	std_logic;						-- /RAS
		SD_nCAS			: out	std_logic;						-- /CAS
		SD_nWE			: out	std_logic;						-- ライトイネーブル
		SD_DQM			: out	std_logic_vector( 3 downto 0);	-- バイトイネーブル
		SD_MBA			: out	std_logic_vector( 1 downto 0);	-- バンクアドレス
		SD_MA			: out	std_logic_vector(11 downto 0);	-- アドレスバス
		SD_MD_i			: in	std_logic_vector(31 downto 0);	-- データバス入力
		SD_MD_o			: out	std_logic_vector(31 downto 0);	-- データバス出力
		SD_MD_t			: out	std_logic;						-- データバス制御

	-- フラッシュROM信号ピン(ノーマル版)
		ROM_nCE			: out	std_logic;						-- チップイネーブル
		ROM_nOE			: out	std_logic;						-- アウトプットイネーブル
		ROM_nWE			: out	std_logic;						-- ライトイネーブル
		ROM_nBYTE		: out	std_logic;						-- バイトセレクト
		ROM_A			: out	std_logic_vector(23 downto 1);	-- アドレスバス
		ROM_D_i			: in	std_logic_vector(15 downto 0);	-- データバス入力
		ROM_D_o			: out	std_logic_vector(15 downto 0);	-- データバス出力
		ROM_D_t			: out	std_logic;						-- データバス制御

	-- PCIバス信号ピン
		PCI_CLK			: in	std_logic;						-- PCIバスクロック
		PCI_AD_i		: in	std_logic_vector(31 downto 0);	-- アドレス/データバス入力
		PCI_AD_o		: out	std_logic_vector(31 downto 0);	-- アドレス/データバス出力
		PCI_AD_t		: out	std_logic;						-- アドレス/データバス制御
		PCI_C_nBE_i		: in	std_logic_vector( 3 downto 0);	-- PCIバスコマンド/バイトイネーブル入力
		PCI_C_nBE_o		: out	std_logic_vector( 3 downto 0);	-- PCIバスコマンド/バイトイネーブル出力
		PCI_C_nBE_t		: out	std_logic;						-- PCIバスコマンド/バイトイネーブル制御
		PCI_nFRAME_i	: in	std_logic;						-- フレーム入力
		PCI_nFRAME_o	: out	std_logic;						-- フレーム出力
		PCI_nFRAME_t	: out	std_logic;						-- フレーム制御
		PCI_nIRDY_i		: in	std_logic;						-- イニシエータレディ入力
		PCI_nIRDY_o		: out	std_logic;						-- イニシエータレディ出力
		PCI_nIRDY_t		: out	std_logic;						-- イニシエータレディ制御
		PCI_nDEVSEL_i	: in	std_logic;						-- デバイスセレクション入力
		PCI_nDEVSEL_o	: out	std_logic;						-- デバイスセレクション出力
		PCI_nDEVSEL_t	: out	std_logic;						-- デバイスセレクション制御
		PCI_nTRDY_i		: in	std_logic;						-- ターゲットレディ入力
		PCI_nTRDY_o		: out	std_logic;						-- ターゲットレディ出力
		PCI_nTRDY_t		: out	std_logic;						-- ターゲットレディ制御
		PCI_nSTOP_i		: in	std_logic;						-- 転送ストップ要求入力
		PCI_nSTOP_o		: out	std_logic;						-- 転送ストップ要求出力
		PCI_nSTOP_t		: out	std_logic;						-- 転送ストップ要求制御
		PCI_PAR_i		: in	std_logic;						-- パリティビット入力
		PCI_PAR_o		: out	std_logic;						-- パリティビット出力
		PCI_PAR_t		: out	std_logic;						-- パリティビット制御
		PCI_nPERR_i		: in	std_logic;						-- パリティエラー入力
		PCI_nPERR_o		: out	std_logic;						-- パリティエラー出力
		PCI_nPERR_t		: out	std_logic;						-- パリティエラー制御
		PCI_nSERR_i		: in	std_logic;						-- システムエラー入力
		PCI_nSERR_o		: out	std_logic;						-- システムエラー出力
		PCI_nSERR_t		: out	std_logic;						-- システムエラー制御
		PCI_nINTA_i		: in	std_logic;						-- 割り込みINTA#入力
		PCI_nINTA_o		: out	std_logic;						-- 割り込みINTA#出力
		PCI_nINTA_t		: out	std_logic;						-- 割り込みINTA#制御
		PCI_nINTB_i		: in	std_logic;						-- 割り込みINTB#入力
		PCI_nINTB_o		: out	std_logic;						-- 割り込みINTB#出力
		PCI_nINTB_t		: out	std_logic;						-- 割り込みINTB#制御
		PCI_nINTC_i		: in	std_logic;						-- 割り込みINTC#入力
		PCI_nINTC_o		: out	std_logic;						-- 割り込みINTC#出力
		PCI_nINTC_t		: out	std_logic;						-- 割り込みINTC#制御
		PCI_nINTD_i		: in	std_logic;						-- 割り込みINTD#入力
		PCI_nINTD_o		: out	std_logic;						-- 割り込みINTD#出力
		PCI_nINTD_t		: out	std_logic;						-- 割り込みINTD#制御
		PCI_nREQ		: out	std_logic;						-- バス使用要求信号出力
		PCI_nGNT		: in	std_logic;						-- バス使用許諾信号入力
	-- PCIバス(セントラルリソース)信号ピン
		PCI_nRST		: out	std_logic;						-- PCIバスリセット出力
		PCI_M66EN		: in	std_logic;						-- 66MHz PCIモード
		PCI_XCAP		: in	std_logic						-- PCI-Xモード

	);
end component;

	-- ***** 双方向信号制御 ***** --
	signal L_D_i		: std_logic_vector(31 downto 0);
	signal L_D_o		: std_logic_vector(31 downto 0);
	signal L_D_t		: std_logic;
	signal L_nRDY_o		: std_logic;
	signal L_nRDY_t		: std_logic;

	signal PCI_AD_i		: std_logic_vector(31 downto 0);
	signal PCI_AD_o		: std_logic_vector(31 downto 0);
	signal PCI_AD_t		: std_logic;
	signal PCI_C_nBE_i	: std_logic_vector( 3 downto 0);
	signal PCI_C_nBE_o	: std_logic_vector( 3 downto 0);
	signal PCI_C_nBE_t	: std_logic;
	signal PCI_nFRAME_i	: std_logic;
	signal PCI_nFRAME_o	: std_logic;
	signal PCI_nFRAME_t	: std_logic;
	signal PCI_nIRDY_i	: std_logic;
	signal PCI_nIRDY_o	: std_logic;
	signal PCI_nIRDY_t	: std_logic;
	signal PCI_nDEVSEL_i: std_logic;
	signal PCI_nDEVSEL_o: std_logic;
	signal PCI_nDEVSEL_t: std_logic;
	signal PCI_nTRDY_i	: std_logic;
	signal PCI_nTRDY_o	: std_logic;
	signal PCI_nTRDY_t	: std_logic;
	signal PCI_nSTOP_i	: std_logic;
	signal PCI_nSTOP_o	: std_logic;
	signal PCI_nSTOP_t	: std_logic;
	signal PCI_PAR_i	: std_logic;
	signal PCI_PAR_o	: std_logic;
	signal PCI_PAR_t	: std_logic;
	signal PCI_nPERR_i	: std_logic;
	signal PCI_nPERR_o	: std_logic;
	signal PCI_nPERR_t	: std_logic;
	signal PCI_nSERR_i	: std_logic;
	signal PCI_nSERR_o	: std_logic;
	signal PCI_nSERR_t	: std_logic;
	signal PCI_nINTA_i	: std_logic;
	signal PCI_nINTA_o	: std_logic;
	signal PCI_nINTA_t	: std_logic;
	signal PCI_nINTB_i	: std_logic;
	signal PCI_nINTB_o	: std_logic;
	signal PCI_nINTB_t	: std_logic;
	signal PCI_nINTC_i	: std_logic;
	signal PCI_nINTC_o	: std_logic;
	signal PCI_nINTC_t	: std_logic;
	signal PCI_nINTD_i	: std_logic;
	signal PCI_nINTD_o	: std_logic;
	signal PCI_nINTD_t	: std_logic;

	signal SD_MD_i		: std_logic_vector(31 downto 0);
	signal SD_MD_o		: std_logic_vector(31 downto 0);
	signal SD_MD_t		: std_logic;

	signal ROM_D_i		: std_logic_vector(15 downto 0);
	signal ROM_D_o		: std_logic_vector(15 downto 0);
	signal ROM_D_t		: std_logic;


	-- ***** クロック逓倍/BUFG信号 ***** --
	signal CLKa			: std_logic;
	signal CLKb			: std_logic;
	signal CLKc			: std_logic;
	signal CLKd			: std_logic;
	signal CLKe			: std_logic;
	signal PLL_LOCKED0	: std_logic;


begin



	-- ***** システムクロック/リセット信号 ***** --
	SYS_Clock	<= CLKc;	-- SH-4A ローカルバスクロック
--	SYS_Reset	<= not (SYS_nRST and PLL_LOCKED0);	-- システムリセット入力(負論理)
	SYS_Reset	<= not L_nRST;		-- ローカルバスリセット入力(負論理)

	-- ***** NMI信号処理 ***** --
	SYS_nNMIo	<= SYS_nNMI;		-- I/OプロセッサにNMI信号を出力

	-- ***** SH-4A 割り込み出力 ***** --
	L_nINT	<= SYS_IntLevel(3 downto 0) when (SYS_Interrupt = '1') else (others => '1');



-- *************************************************************************
-- ***** マスタデバイス接続
-- *************************************************************************

-- ***** SH-4Aローカルバスモジュール接続 ***** --
CPU_U0 : LBUS_SH4A
	port map (

	-- ローカルバス信号ピン
		L_nCS			=> L_nCS,
		L_A				=> L_A,
		L_nBS			=> L_nBS,
		L_RnW			=> L_RnW,
		L_nRD			=> L_nRD,
		L_nWE			=> L_nWE,
		L_D_i			=> L_D_i,
		L_D_o			=> L_D_o,
		L_D_t			=> L_D_t,
		L_nRDY_o		=> L_nRDY_o,
		L_nRDY_t		=> L_nRDY_t,

		ROM_Select		=> AVP_DIPSW,
		ROM_nCS0		=> L_nROMCS,

	-- デバイス選択信号
		SYS_HitDevice	=> SYS_HitDevice,

	-- BLANCAシステムバス信号(マスタ)
		SYS_Clock		=> SYS_Clock,
		SYS_Reset		=> SYS_Reset,
		SYS_Address		=> SYS_Address,
		SYS_ByteEnable	=> SYS_ByteEnable,
		SYS_ReadWrite	=> SYS_ReadWrite,
		SYS_AccStart	=> SYS_AccStart,
		SYS_WriteData	=> SYS_WriteData,
		SYS_ReadData	=> SYS_ReadData,
		SYS_AccReady	=> SYS_AccReady

	);




-- *************************************************************************
-- ***** スレーブデバイス接続
-- *************************************************************************

	TX_RST_N <= not SYS_Reset;

csc : xil_csc 
port map (
	DDR_RED => V_R,						-- out   [DDR] red [7:0]
	DDR_GRN => V_G,						-- out   [DDR] grn [7:0]
	DDR_BLU => V_B,						-- out   [DDR] blu [7:0]
	DDR_HS => V_nHSYNC,					-- out   [DDR] #hsync
	DDR_VS => V_nVSYNC,					-- out   [DDR] #vsync
	DDR_DE => V_nBLANK,					-- out   [DDR] de
	DDR_CLK => V_CLK,					-- out   [DDR] clock

	TX_RED => TX_RED,					-- in    [RGB] red [7:0]
	TX_GRN => TX_GRN,						-- in    [RGB] grn [7:0]
	TX_BLU => TX_BLU,						-- in    [RGB] blu [7:0]
	TX_HS => TX_HS,						-- in    [RGB] #hsync
	TX_VS => TX_VS,						-- in    [RGB] #vsync
	TX_DE => TX_DE,						-- in    [RGB] de
	TX_CLK => TX_CLK,					-- in    [RGB] clock
	TX_RST_N => TX_RST_N				-- in    [RGB] #reset
);



-- ***** A/Vプロセッサ スレーブリソース BLANCAシステムバスモジュール接続 ***** --
AVP : AVP_BUS
	port map (

	-- BLANCAシステムバス信号
		SYS_Clock		=> SYS_Clock,
		SYS_Reset		=> SYS_Reset,
		SYS_Address		=> SYS_Address,
		SYS_ByteEnable	=> SYS_ByteEnable,
		SYS_ReadWrite	=> SYS_ReadWrite,
		SYS_AccStart	=> SYS_AccStart,
		SYS_WriteData	=> SYS_WriteData,
		SYS_ReadData	=> SYS_ReadData,
		SYS_AccReady	=> SYS_AccReady,
		SYS_Interrupt	=> SYS_Interrupt,
		SYS_IntLevel	=> SYS_IntLevel,
		SYS_NMIin		=> SYS_nNMI,
		SYS_HitDevOut	=> SYS_HitDevice,

	-- ユーザー拡張用クロック入力ピン
		USER_CLK		=> USER_CLK,

	-- I/Oプロセッサ割り込み入力
		IOP_Interrupt	=> IOP_Interrupt,

	-- アナログRGB信号ピン
		V_F48M			=> V_F48M,
		V_F25M			=> V_F25M,
--		V_CLK			=> V_CLK,
--		V_nBLANK		=> V_nBLANK,
--		V_nHSYNC		=> V_nHSYNC,
--		V_nVSYNC		=> V_nVSYNC,
--		V_R				=> V_R,
--		V_G				=> V_G,
--		V_B				=> V_B,
		V_CLK			=> TX_CLK,
		V_nBLANK		=> TX_DE,
		V_nHSYNC		=> TX_HS,
		V_nVSYNC		=> TX_VS,
		V_R				=> TX_RED,
		V_G				=> TX_GRN,
		V_B				=> TX_BLU,

	-- AC97コーデック信号ピン
		AC97_nRST		=> AC97_nRST,
		AC97_SCLK		=> AC97_SCLK,
		AC97_SYNC		=> AC97_SYNC,
		AC97_SDO		=> AC97_SDO,
		AC97_SDI		=> AC97_SDI,

	-- MMCカード信号ピン
		MMC_CLK			=> MMC_CLK,
		MMC_nCS			=> MMC_nCS,
		MMC_DIN			=> MMC_DIN,
		MMC_DOUT		=> MMC_DOUT,
		MMC_nCD1		=> MMC_nCD1,
		MMC_nCD2		=> MMC_nCD2,
		MMC_DATA1		=> MMC_DATA1,
		MMC_DATA2		=> MMC_DATA2,
		MMC_nWP			=> MMC_nWP,

	-- COMポート信号ピン
		COM2_TxD		=> COM2_TxD,
		COM2_RxD		=> COM2_RxD,
		COM2_RTS		=> COM2_RTS,
		COM2_CTS		=> COM2_CTS,

	-- ディップスイッチ/LED信号ピン
		AVP_LED			=> AVP_LED,
		AVP_DIPSW		=> AVP_DIPSW,

	-- SDRAM信号ピン
		SDRAM_Clock		=> CLKc,
		SD_nCS			=> SD_nCS,
		SD_nRAS			=> SD_nRAS,
		SD_nCAS			=> SD_nCAS,
		SD_nWE			=> SD_nWE,
		SD_DQM			=> SD_DQM,
		SD_MBA			=> SD_MBA,
		SD_MA			=> SD_MA,
		SD_MD_i			=> SD_MD_i,
		SD_MD_o			=> SD_MD_o,
		SD_MD_t			=> SD_MD_t,

	-- フラッシュROM信号ピン(ノーマル版)
		ROM_nCE			=> ROM_nCE,
		ROM_nOE			=> ROM_nOE,
		ROM_nWE			=> ROM_nWE,
		ROM_nBYTE		=> ROM_nBYTE,
		ROM_A			=> ROM_A,
		ROM_D_i			=> ROM_D_i,
		ROM_D_o			=> ROM_D_o,
		ROM_D_t			=> ROM_D_t,

	-- PCIバス信号ピン
		PCI_CLK			=> PCI_CLK,
		PCI_AD_i		=> PCI_AD_i,
		PCI_AD_o		=> PCI_AD_o,
		PCI_AD_t		=> PCI_AD_t,
		PCI_C_nBE_i		=> PCI_C_nBE_i,
		PCI_C_nBE_o		=> PCI_C_nBE_o,
		PCI_C_nBE_t		=> PCI_C_nBE_t,
		PCI_nFRAME_i	=> PCI_nFRAME_i,
		PCI_nFRAME_o	=> PCI_nFRAME_o,
		PCI_nFRAME_t	=> PCI_nFRAME_t,
		PCI_nIRDY_i		=> PCI_nIRDY_i,
		PCI_nIRDY_o		=> PCI_nIRDY_o,
		PCI_nIRDY_t		=> PCI_nIRDY_t,
		PCI_nDEVSEL_i	=> PCI_nDEVSEL_i,
		PCI_nDEVSEL_o	=> PCI_nDEVSEL_o,
		PCI_nDEVSEL_t	=> PCI_nDEVSEL_t,
		PCI_nTRDY_i		=> PCI_nTRDY_i,
		PCI_nTRDY_o		=> PCI_nTRDY_o,
		PCI_nTRDY_t		=> PCI_nTRDY_t,
		PCI_nSTOP_i		=> PCI_nSTOP_i,
		PCI_nSTOP_o		=> PCI_nSTOP_o,
		PCI_nSTOP_t		=> PCI_nSTOP_t,
		PCI_PAR_i		=> PCI_PAR_i,
		PCI_PAR_o		=> PCI_PAR_o,
		PCI_PAR_t		=> PCI_PAR_t,
		PCI_nPERR_i		=> PCI_nPERR_i,
		PCI_nPERR_o		=> PCI_nPERR_o,
		PCI_nPERR_t		=> PCI_nPERR_t,
		PCI_nSERR_i		=> PCI_nSERR_i,
		PCI_nSERR_o		=> PCI_nSERR_o,
		PCI_nSERR_t		=> PCI_nSERR_t,
		PCI_nINTA_i		=> PCI_nINTA_i,
		PCI_nINTA_o		=> PCI_nINTA_o,
		PCI_nINTA_t		=> PCI_nINTA_t,
		PCI_nINTB_i		=> PCI_nINTB_i,
		PCI_nINTB_o		=> PCI_nINTB_o,
		PCI_nINTB_t		=> PCI_nINTB_t,
		PCI_nINTC_i		=> PCI_nINTC_i,
		PCI_nINTC_o		=> PCI_nINTC_o,
		PCI_nINTC_t		=> PCI_nINTC_t,
		PCI_nINTD_i		=> PCI_nINTD_i,
		PCI_nINTD_o		=> PCI_nINTD_o,
		PCI_nINTD_t		=> PCI_nINTD_t,
		PCI_nREQ		=> PCI_nREQ,
		PCI_nGNT		=> PCI_nGNT,
	-- PCIバス(セントラルリソース)信号ピン
		PCI_nRST		=> PCI_nRST,
		PCI_M66EN		=> PCI_M66EN,
		PCI_XCAP		=> PCI_XCAP

	);


	-- ***** I/Oプロセッサ割り込み信号受信処理 ***** --
	process(SYS_Clock, SYS_Reset)
		variable FRAME : std_logic_vector (1 downto 0);	-- 次のステート
	begin
		if (SYS_Reset = '1') then
			IOP_Interrupt <= (others => '0');
			FRAME   := "00";
		elsif (SYS_Clock'event and SYS_Clock = '1') then
			case FRAME is
			when "00" =>
				if (IOP_nINT(4) = '0') then	-- スタート信号検出
					IOP_Interrupt( 3 downto  0) <= not IOP_nINT( 3 downto  0);
					FRAME := "01";
				else
					FRAME   := "00";
				end if;
			when "01" =>
				IOP_Interrupt( 7 downto  4) <= not IOP_nINT( 3 downto  0);
				FRAME := "10";
			when "10" =>
				IOP_Interrupt(11 downto  8) <= not IOP_nINT( 3 downto  0);
				FRAME := "11";
		--	when "11" =>
			when others =>
				IOP_Interrupt(15 downto 12) <= not IOP_nINT( 3 downto  0);
				FRAME := "00";
			end case;
		end if;
		-- ↑5本の信号線で16本分の割り込み信号情報で伝達
	end process;


	-- ***** UARTドライバ制御信号処理 ***** --
	COMx_EN		<= SYS_Reset;		-- RS-232-Cドライバイネーブル制御


-- ***** クロック逓倍モジュール接続 ***** --
CLK0_IBUFG_INST : IBUFG
	port map (
		I => L_CLK,		-- ローカルバスクロック
		O => CLKa
	);

DCM_U0 : DCM
	Generic map (
		CLK_FEEDBACK => "1X",
		CLKDV_DIVIDE => 2.0,
		CLKFX_DIVIDE => 1,
		CLKFX_MULTIPLY => 2,
		CLKIN_DIVIDE_BY_2 => FALSE,
		CLKIN_PERIOD => 25.0,
		CLKOUT_PHASE_SHIFT => "NONE",
		DESKEW_ADJUST => "SYSTEM_SYNCHRONOUS",
		DFS_FREQUENCY_MODE => "LOW",
		DLL_FREQUENCY_MODE => "LOW",
		DUTY_CYCLE_CORRECTION => TRUE,
		PHASE_SHIFT => 0,
		STARTUP_WAIT => FALSE
	)
	port map (
		CLKIN	=> CLKa,
		CLKFB	=> CLKc,
		RST		=> not SYS_nRST,
		PSEN	=> '0',
		PSINCDEC=> '0',
		PSCLK	=> '0',
		DSSEN	=> '0',
		CLK0	=> CLKb,
		CLK90	=> open,
		CLK180	=> open,
		CLK270	=> CLKd,
		CLKDV	=> open,
		CLK2X	=> open,
		CLK2X180=> open,
		CLKFX	=> open,
		CLKFX180=> open,
		STATUS	=> open,
		LOCKED	=> PLL_LOCKED0,
		PSDONE	=> open
	);

CLK0_BUFG_INST : BUFG
	port map (
		I => CLKb,
		O => CLKc
	);

CLK270_BUFG_INST : BUFG
	port map (
		I => CLKd,
		O => CLKe
	);


	-- ***** SDRAMクロック制御 ***** --
	SD_CKE	<= PLL_LOCKED0;
	SD_CLK	<= CLKe;

	-- ***** SDRAMデータバス IOBUF ***** --
	SD_MD	<= SD_MD_o when (SD_MD_t = '1') else (others => 'Z');
	SD_MD_i	<= SD_MD;


	-- ***** ローカルバスデータバス IOBUF ***** --
	L_D		<= L_D_o when (L_D_t = '1') else (others => 'Z');
	L_D_i	<= L_D;

	L_nRDY	<= L_nRDY_o when (L_nRDY_t = '1') else 'Z';


	-- ***** PCIバス IOBUF ***** --
	PCI_AD		<= PCI_AD_o when (PCI_AD_t = '1') else (others => 'Z');
	PCI_AD_i	<= PCI_AD;

	PCI_C_nBE	<= PCI_C_nBE_o when (PCI_C_nBE_t = '1') else (others => 'Z');
	PCI_C_nBE_i	<= PCI_C_nBE;

	PCI_nFRAME	 <= PCI_nFRAME_o when (PCI_nFRAME_t = '1') else 'Z';
	PCI_nFRAME_i <= PCI_nFRAME;

	PCI_nIRDY	 <= PCI_nIRDY_o when (PCI_nIRDY_t = '1') else 'Z';
	PCI_nIRDY_i	 <= PCI_nIRDY;

	PCI_nDEVSEL	 <= PCI_nDEVSEL_o when (PCI_nDEVSEL_t = '1') else 'Z';
	PCI_nDEVSEL_i<= PCI_nDEVSEL;

	PCI_nTRDY	 <= PCI_nTRDY_o when (PCI_nTRDY_t = '1') else 'Z';
	PCI_nTRDY_i	 <= PCI_nTRDY;

	PCI_nSTOP	 <= PCI_nSTOP_o when (PCI_nSTOP_t = '1') else 'Z';
	PCI_nSTOP_i	 <= PCI_nSTOP;

	PCI_PAR		 <= PCI_PAR_o when (PCI_PAR_t = '1') else 'Z';
	PCI_PAR_i	 <= PCI_PAR;

	PCI_nPERR	 <= PCI_nPERR_o when (PCI_nPERR_t = '1') else 'Z';
	PCI_nPERR_i	 <= PCI_nPERR;

	PCI_nSERR	 <= PCI_nSERR_o when (PCI_nSERR_t = '1') else 'Z';
	PCI_nSERR_i	 <= PCI_nSERR;

	PCI_nINTA	 <= PCI_nINTA_o when (PCI_nINTA_t = '1') else 'Z';
	PCI_nINTA_i	 <= PCI_nINTA;

	PCI_nINTB	 <= PCI_nINTB_o when (PCI_nINTB_t = '1') else 'Z';
	PCI_nINTB_i	 <= PCI_nINTB;

	PCI_nINTC	 <= PCI_nINTC_o when (PCI_nINTC_t = '1') else 'Z';
	PCI_nINTC_i	 <= PCI_nINTC;

	PCI_nINTD	 <= PCI_nINTD_o when (PCI_nINTD_t = '1') else 'Z';
	PCI_nINTD_i	 <= PCI_nINTD;


	-- ***** FlashROMデータバス IOBUF ***** --
	ROM_D	<= ROM_D_o when (ROM_D_t = '1') else (others => 'Z');
	ROM_D_i	<= ROM_D;



end RTL;
