図面を参照して本発明の実施例を以下に説明する。まず、外部デバイスコントローラが外部デバイスから受信するデータについて、外部デバイスコントローラの出力クロックに対して1サイクル以上遅延する際の課題解決のための実施例を以下に説明する。
図19は外部デバイス107と通信を行う情報処理装置とを備えたシステムのブロック図である。外部デバイス107と通信を行う機能を有するLSIであるASIC100は、CPU101、DRAMコントローラ104、DMAコントローラ102、外部デバイスコントローラ103とCLOCKジェネレータ105を有する。(ASICはApplication Specific Integrated Circuitの略称で、DMAはDirect Memory Accessの略称。)また、発振手段としてのCLOCKジェネレータ105はCPU101、DMAコントローラ102、外部デバイスコントローラ103及びDRAMコントローラ104の用いるクロック(cpu_clock113、dmac_clock114、host_clock115、dram_clock116)を生成して供給する。CPU101はCPU I/F110を介して、外部デバイスコントローラ103とDMAコントローラ102とDRAMコントローラ104へレジスタアクセスを行う。DMAコントローラ102はCPU I/F110を介して、DRAMコントローラ104との間でデータ転送を行う。DRAMコントローラ104はDRAM I/F117を介してDRAM106との間でデータ転送を行う。外部デバイスコントローラ103はDMA I/F111を介して、DMAコントローラ102との間でデータ転送を行う。また、外部デバイスコントローラ103は外部デバイスI/F112を介して、外部デバイス107との間でデータ転送を行う。
次に、外部デバイスコントローラについて説明する。図1は本発明に係る一実施例における外部デバイスコントローラ103の構成を示す。
外部デバイスコントローラ103はCLOCKジェネレータ105からホストクロック115(図中、host_clock)を受け取る。ホストクロック115は外部デバイスコントローラ103内の各ブロックに接続されており、外部デバイスコントローラ103の各ブロックは、このホストクロック115に同期して動作する。
CPU I/F制御部201は、CPU101からのカードへ送信するデータやコマンド、レジスタアクセスを受付ける一方で、CPU101へカードから受信したコマンドやデータを送信する。DMA I/F制御部111は、外部デバイス107へ送信するデータをDMAコントローラ102から受付け、一方で外部デバイス107から受信するデータをDMAコントローラ102へ送信する。
外部デバイスコントローラ103は、送信コマンドパラレルシリアル変換部125、受信コマンドシリアルパラレル変換部126を介して外部デバイス107とコマンドをやりとりする。まず、CPU I/F制御部201はCPU I/F110を介してCPU101から受け取ったパラレル形式の送信コマンド223(s_cmd)を送信コマンドパラレルシリアル変換部125(以降、送信コマンドPS変換部)に送信する。送信コマンドPS変換部125は、受け取ったパラレル形式の送信コマンド223をシリアル形式の送信コマンド224(s_cmd_data)に変換して、外部デバイス107に送信する。
外部デバイス107は受け取ったシリアル形式の送信コマンド224のデコードを行い、送信コマンドを検知する。さらに、外部デバイス107は送信コマンドの検知結果を示す検知情報をシリアル形式の受信コマンド226(r_cmd_data)として、外部デバイスコントローラ103に送信する。
受信コマンドシリアルパラレル変換部126(以降、受信コマンドSP変換部)は外部デバイス107の出力するシリアル形式の受信コマンド226を受信し、パラレル形式の受信コマンド225(r_cmd_reg)に変換してCPU I/F制御部201、CPU I/F110を介してCPU101へ送信する。
また、外部デバイスコントローラ103は、送信バッファ207、送信データパラレルシリアル変換部208、スキュー制御部211、受信データシリアルパラレル変換部210、受信バッファ209を介して外部デバイス107とデータをやりとりする。また、出力クロック244をデアサート(de-assert)して外部デバイス107からのデータを停止させるために、出力クロック制御部213と出力クロックゲーティング部214を有している。さらに外部デバイスコントローラ103は有効なサイクル調整を行うために、ゲーティングモード設定レジスタ605とゲーティングパターン設定レジスタ606を有している。
また、外部デバイスコントローラ103はスキュー調整(補正)をするために、スキュー制御部211とスキュー設定レジスタ212とを有する。ここで、スキュー調整(補正)とは、受信データシリアルパラレル変換部210(以降、受信データSP変換部)に入力されるデータ又は外部デバイスコントローラ103(スキュー制御部211)のデータ取り込みタイミング(ラッチタイミング)を(ホストクロック115に対して)1サイクル以内の遅延によって調整(補正)することを示す。
また、外部デバイスコントローラ103はサイクル調整(補正)をするために、サイクル設定レジスタ601、サイクル演算部602、サイクル制御部603および期待値設定レジスタ604を有する。ここで、サイクル調整(補正)とは、受信データSP変換部210の制御信号である受信イネーブル信号250(rcv_en)を(ホストクロック115に対して)サイクル単位で遅延させて受信データSP変換部210のデータ取り込み停止タイミング、データ取り込み再開タイミングを調整(補正)することを示す。
スキュー設定レジスタ212はCPU I/F制御部201からスキュー設定値227(skew_reg)を受け取り保持する。スキュー制御部211は、スキュー設定レジスタ212からスキュー選択値238(skew_sel)を受け取り、設定値に応じて外部デバイス107から受け取ったシリアル形式の受信データ236(d2h_data、以降、単に受信データ236と略する場合もある)を遅延させる。
サイクル設定レジスタ601はCPU I/F制御部201からサイクル設定値256(cycle_reg)を受け取り保持する。期待値設定レジスタ604はCPU I/F制御部201から期待値設定値253(exp_reg)を受け取り保持する。期待値設定値253の例を図20に示す。実際のサイクル数との差が0の場合に受信されるパターンは真値(外部デバイス107の出力したパターン)と一致するが、外部デバイスコントローラ103の受信するパターンはキャリブレーションを行った際のサイクル設定値と正しいサイクル設定値との差(後述するサイクル遅延量に相当する)に応じて変化する。サイクル演算部602はサイクル設定レジスタ601からサイクル設定値255(cycle_val)と、期待値設定レジスタ604から期待値254(exp_pattern)を受け取り、望ましいサイクル設定値を演算する。具体的には、受信したキャリブレーションパターンと期待値とを比較して一致するかを判定する。一致した場合の期待値に対応したサイクル設定値と、正しいサイクル設定値の差を求める。その後、求めた差を、キャリブレーションを行った際のサイクル設定値に加算することで、正しいサイクル設定値を演算する。サイクル制御部603は、サイクル演算部602から正しいサイクル選択値249(cycle_sel)を受け取る。さらに、サイクル制御部603は出力クロック制御部213から出力クロックイネーブル信号243(クロック制御信号)を受け取る。
〔データ受信処理〕
次に、外部デバイスコントローラ103が外部デバイス107からデータ(外部デバイスデータ)を受信する処理について説明する。
外部デバイスコントローラ103はデータ受信を開始する際に、まず前述したコマンド送受信処理によって、外部デバイス107からのデータ受信を指示するコマンドを外部デバイスコントローラ103は外部デバイス107に送信する。さらに、外部デバイス107はこの送信コマンドに対する返答を受信コマンドとして外部デバイスコントローラ103に送信し、さらにデータを送信する。
データの受信は以下のように行う。まず、外部デバイス107から送信されたシリアル形式の受信データ236(d2h_data)をスキュー制御部211が受信する。
スキュー制御部211は、シリアル形式の受信データ236と、外部デバイスコントローラのクロック115(host_clk)との間のスキュー調整を行う(詳細は後述する)。スキュー調整後受信データ235は受信データSP変換部210に入力される。
受信データSP変換部210は、出力クロック制御部213の出力する出力クロックイネーブル信号243を、後述するサイクル制御部603によって遅延させた受信イネーブル信号250(詳細は後述する)を受け取り可能な構成になっている。そして、受信イネーブル信号250がアサート(assert)されていれば、受信データSP変換部210は入力されたスキュー調整後受信データ235を受信し、パラレル形式の受信データ234(r_data_buf)へ変換する。
受信データSP変換部210は、不図示のK段のシフトレジスタ(直列入力並列出力型フリップフロップ)を有しておりシリアル形式で受信するデータをKbitのパラレル形式のデータとして送出する構成になっている。従って、受信データSP変換部210は受信イネーブル信号がアサートされ続けていれば、Kサイクルに1回パラレル形式のデータを送出する。ここで、受信データSP変換部210が外部デバイス107からのデータ(外部デバイスデータ)を取り込むタイミングとは、(外部デバイス107側からみて)1段目(0bit)のフリップフロップのラッチタイミングに相当するといえる。
保持手段としての受信バッファ209は受信バッファフル信号241によって、自身が現在保持しているデータ以上のデータを保持できないことを通知可能に構成されている。そこで、受信イネーブル信号250がアサートされ且つ受信バッファ209の受信バッファフル信号241(r_buff_full)がデアサートされていれば、受信データSP変換部210は受信バッファ209にパラレル形式の受信データ234を送信する。一方で、受信イネーブル信号250がアサートされていなければ、受信データSP変換部210はスキュー調整後受信データ235の受信を停止する。
受信データSP変換部210はデータの受信を開始すると、受信ステータス信号239(rcv_status)をアサートする。受信データSP変換部210は最終データを外部デバイス107から受信するまで受信ステータス信号239をアサートし続け、スキュー調整後受信データ235のエンドビットを検出したらデアサートする。受信データSP変換部210が受信バッファ209にパラレル形式の受信データ234を送信すると、受信バッファ209は受信バッファエンプティ-信号233(r_buff_emp)をデアサートする。
受信バッファ209は受信データSP変換部210からパラレル形式に変換された受信データ234(r_data_buff)を受信し保持する。ここで、受信バッファ209がフルになった場合、受信バッファ209は出力クロック制御部213及び受信データSP変換部210へ受信バッファフル信号241をアサートする。一方で、受信バッファ209がエンプティ-になった場合には、受信バッファ209はDMA I/F制御部206に受信バッファエンプティ-信号233をアサートする。
DMA I/F制御部206は受信バッファ209の受信バッファエンプティ-信号233のデアサートを受けて、受信バッファ209に外部デバイス107からの受信データが残っていることを検出する。そして、受信バッファ209が保持しているパラレル形式の受信データ232(r_data_dma)を受信バッファ209から受信し、DMA I/F111へ送信する。ただし、受信バッファ209がエンプティ-になった場合には、データの受信を停止させる。データの受信を停止させないと、受信バッファ209のバッファアンダーランが発生することがある。従って、受信バッファ209の受信バッファエンプティ-信号233がアサートされている場合には、DMA I/F制御部206はパラレル形式の受信データ232の受信を停止し、DMA I/F111へのデータの送信を停止する。
受信バッファ209の受信バッファエンプティ-信号233がデアサートされたら、DMA I/F制御部206はパラレル形式の受信データ232の受信を再開し、DMA I/F111への受信データの送信を再開する。
一方で、受信バッファ209がフルの状態で新たな受信バッファへの書込みが発生する場合には、受信バッファ209のバッファオーバーランが発生するので、データの受信を停止する。受信データSP変換部210がデータ受信中であり、且つ、受信バッファ209がフルの場合に、出力クロック制御部213は出力クロックイネーブル信号243をデアサートする。
受信データSP変換部210が、データ受信中であることは、受信ステータス信号239のアサートによって検出される。受信データSP変換部210は最初の受信データを受信すると受信ステータス信号239をアサートし、最終データを受信するまでアサートし続け、最終データを受信するとデアサートする。そのため、受信データ待ちの状態(スタートビット検出待ちの状態)では、出力クロックイネーブル信号243はデアサートしない。
外部デバイス107は出力クロック244(dev_clk)のデアサートを受けて、受信データ237(d2h_data’)の送信を停止する。データ受信は、受信バッファ209の受信バッファフル信号241(r_buff_full)がデアサートされるまで停止し続ける。受信バッファ209の受信バッファフル信号241(r_buff_full)がデアサートされると、受信データSP変換部210はデータの受信を再開する。そして、出力クロックゲーティング部214は出力クロック244のゲーティングを解除し、外部デバイス107は受信データ237の送信を再開する。
〔スキュー補正構成〕
次に、スキュー補正をするための構成の詳細を説明する。
図2(a)はスキュー制御部211のブロック図である。スキュー制御部211はCLOCKジェネレータ105(図19)からホストクロック115(host_clk)を受け取る。ホストクロック115は入出力が直列に接続されているN1個の遅延素子216(第1遅延手段)によって遅延させられる。各遅延素子216の出力は遅延選択部217に入力され、スキュー選択値238(skew_sel)の値に基づいて出力に用いる遅延素子216が選択される。
選択された遅延付きクロック信号246(clk_with_skew)はフリップフロップ218へクロックとして入力される。一方、外部デバイスから送信されるシリアル形式の受信データ236(d2h_data)はフリップフロップ218が受信し、フリップフロップ218によって遅延付きクロック信号246(clk_with_skew)に同期させられる。同期させたシリアル形式の受信データは、スキュー調整後のシリアル形式の受信データ235(d2h_data_1d、以降スキュー調整後受信データ235と称す)として、スキュー制御部211が受信データSP変換部210に出力する。
なお、スキュー制御部211のN1個の遅延素子は、好ましくは(ホストクロック115の)1クロックをN1等分した遅延、もしくはそれより少し小さい遅延を生じさせる。
図2(b)はスキュー設定値を0,1,2としたの場合に、スキュー制御部211が扱う信号のタイミングチャートを示す。図2(b)の各信号を図1および図2(a)の符号と対応させると、上から順にhost_clk115、dh2_data236、clk_with_skew246(skew_sel238=0,1,2)、d2h_data_1d235(skew_sel238=0,1,2)となる。
図2(b)のタイミングチャートでは、スキュー選択値238(skew_sel)が0と1の時には、 clk_with_skew246の立ち上がりでd2h_data236が不定である。従って、フリップフロップ218に取り込まれるデータd2h_data_1d235も不定になってしまい、データの取り込みが正常に出来てない。一方、スキュー選択値238が2の時には、clk_with_skew246の立ち上がりでd2h_data236が安定したデータを出力している為、フリップフロップ218に取り込まれるデータd2h_data_1d235も正常である。スキュー選択値238の調整は、後述するキャリブレーションシーケンスによって行われる。
〔サイクル補正構成〕
次に、サイクル遅延を補正するための構成の詳細を説明する。
図3(a)はサイクル制御部603の概略構成を示す。サイクル制御部603は入出力が直列に接続されているN2個のフリップフロップ701(第2遅延手段)を有し、フリップフロップ701は出力クロックイネーブル信号243を夫々1クロックの遅延を生じさせる。サイクル制御部603は、入力された出力クロックイネーブル信号243をサイクル設定値256の示すサイクル数だけフリップフロップ701によって遅延させる。遅延させた出力クロックイネーブル信号243は、受信イネーブル信号250として、受信データSP変換部210に入力されるようにしている。
図3(b)はサイクル制御部603が扱う各種信号の波形を示す。図3(b)の各信号を図1の符号と対応させて説明すると、上から順にhost_clk115、dev_clk_en243、rcv_en250となる。サイクル制御部603は、入力される出力クロックイネーブル信号243をサイクル選択値249(cycle_sel=0,1,2,3)の値に応じて遅延させ、受信イネーブル信号250として出力する。サイクル選択値249の示す値を2とすると、サイクル制御部603はセレクタ702によって2つのフリップフロップ701を通過した出力を選択することで、出力クロックイネーブル信号243を2サイクル遅延させて、受信イネーブル信号250として出力する。図3の構成ではN2個のフリップフロップ701があるので、1サイクルの整数倍(最大でN2サイクル)だけ出力クロックイネーブル信号243を遅延させることができる。
本実施例で受信データSP変換部210は、受信イネーブル信号250のデアサートによってデータ取り込み停止タイミングを判断し、受信イネーブル信号250を再びアサートした際にデータ取り込み再開タイミングを判断する。
ゲーティングモード設定レジスタ605はCPU I/F制御部201から、ゲーティングモードレジスタ設定値(247 gate_reg)を受け取り、保持する。また、ゲーティングモード設定レジスタ605は、受け取ったゲーティングモードレジスタ設定値247をゲーティングモード設定値(251 gate_mode)として出力クロック制御部213に出力する。
ここで、本実施例の外部デバイスコントローラ103のゲーティングモードには、キャリブレーションモードと通常データ転送モードの二種類のモードがある。ゲーティングパターン設定レジスタ606はCPU I/F制御部201からゲーティングパターンレジスタ設定値(248 pattern_reg)を受け取り、保持する。また、受け取ったゲーティングパターンレジスタ設定値248をゲーティングパターン設定値(252 gate_pattern)として出力クロック制御部213に出力する。
ゲーティングパターンレジスタ設定値248は、クロックゲーティングパターンを生成するための情報(ゲーティング情報)であり、どのようにクロックゲーティングするかを示す。(詳細には図5に後述するL,N,S,Eを示す情報である。)
図4(b)は本実施例で選択手段として機能する出力クロック制御部213の構成を示す。第一クロック制御部221(第一制御部)は、受信バッファフル信号241と受信ステータス信号239とを受信して、特許文献1や参考例(図21参照)と同様のクロック制御を行う(第三クロック制御モード)。一方で、第二クロック制御部222(第二制御部)は、受信ステータス信号239とゲーティングパターン252に基づいて、後述するクロック制御を行う(第一クロック制御モード)。さらに、第三クロック制御部223(第三制御部)は外部デバイスコントローラのホストクロック115を停止させずにそのまま出力するように制御する出力クロックイネーブル信号243を生成するように制御する(第二クロック制御モード)。
まず、受信データSP変換部210が受信データ236の何ビット目まで受信したか等の受信状態を示す情報を受信ステータス信号239に付加して出力クロック制御部213へ送信する。第二のクロック制御部222は受信ステータス信号239に付加されている受信情報に基づいて、受信データSP変換部210が何ビット目まで受信したか判断する。そして、ゲーティングパターン252がゲーティングするように示す条件に当てはまっていなければ出力クロックイネーブル信号243を生成する。
クロック制御選択部220はセレクタであり、ゲーティングモード設定レジスタからのゲーティングモード251が示す設定値に応じて、第一のクロック制御部221、第二のクロック制御部222および第三のクロック制御部223から1つを選択的に機能させる。
〔コマンド・データフォーマット〕
ここで、外部デバイスコントローラ103と外部デバイス107との間でコマンドやデータの授受に用いる信号のフォーマットについて説明する。
外部デバイスコントローラ103と外部デバイス107は、図21(b)に示すフォーマットでシリアル形式のコマンド、又は、シリアル形式のデータを互いにやりとりする。なお、以下の説明ではパラレル形式のコマンド、パラレル形式のデータも同様のフォーマットであるとする。
まず、シリアル形式の送信コマンド224とシリアル形式の受信コマンド226の送受信時に扱う信号について、図21(b)に基づいて説明する。送信コマンド224は1ビットのスタートビットとNビットの送信コマンドとMビットのCRC(巡回冗長検査信号)と1ビットのエンドビットによって構成されている。送信コマンドPS変換部125は、パラレル形式の送信コマンド223の受信を検知すると、まず、1ビットのスタートビットを送信する。続いて、Nビットのパラレル形式の送信コマンド223をシリアル形式の送信コマンド224に変換して送信する。送信コマンドPS変換部125は、シリアル形式の送信コマンドの送信と共にCRCの演算を行う。そして、シリアル形式の送信コマンド224を送信した後に、演算されたMビットのCRCを送信する。最後に1ビットのエンドビットの送信を行い、コマンド送信を完了する。
シリアル形式の受信コマンド226のフォーマットも図21(b)に示すとおりであるが、受信コマンドと送信コマンドとが一致する必要はないので、受信コマンドと送信コマンドとでコマンド長やCRCの長さは異なっていても構わない。
受信コマンドSP変換部126は1ビットのスタートビットを検出し、コマンドの受信を開始する。続いて、Nビットのシリアル形式の受信コマンドを受信し、パラレル形式の受信コマンドに変換する。受信コマンドSP変換部126はシリアル形式の受信コマンドの受信と共にCRCの演算を行う。そして、シリアル形式の受信コマンドを受信した後に、演算したCRCと送付されるMビットのCRCとの比較(巡回冗長検査)を行い、CRCエラーを検出する。最後に、1ビットのエンドビットの受信を行い、コマンド受信を完了する。
送信データPS変換部208は、送信バッファ207からパラレル形式の送信データ230(s_data_buf)を受け取ると、送信コマンドPS変換部125と同様にパラレル形式の送信データをシリアル形式の送信データ231に変換して外部デバイス107へ送信する。ただし、送信データの長さやCRCの長さは、送信コマンドと異なっていても構わない。
受信データのフォーマットは図21(b)に示すとおりである。ただし、受信データの長さやCRCの長さは、送信コマンドと異なっていても構わない。
受信データSP変換部210は、1ビットのスタートビットを検出するとデータの受信を開始する。そして、受信コマンドSP変換部126と同様に処理してシリアル形式のスキュー調整後受信データ235をパラレル形式の受信データ234に変換し受信バッファ209へ送信する。送信データPS変換部208と受信データSP変換部210のCRCの演算処理、比較処理は送信コマンドPS変換部と受信コマンドSP変換部の処理と同様であるので省略する。
〔キャリブレーション〕
次に、外部デバイスコントローラ103が正しくデータを取り込めるように、各種パラメータ(スキュー設定値、サイクル設定値)を調節するキャリブレーション処理について説明する。
まず、図21に示す構成を有する参考例の外部デバイスコントローラ103におけるキャリブレーションフローを、図22を用いて説明する。
まず、ステップS101で外部デバイスコントローラ103はCPU101からキャリブレーション開始を指示されると、外部デバイス107にキャリブレーションパターンを出力させるための送信コマンドを外部デバイス107に送信する。次に、外部デバイス107はキャリブレーション用の送信コマンドに対する受信コマンドを外部デバイスコントローラ103に送信する。さらに、外部デバイス107は予め決められたキャリブレーションパターンをシリアル形式の受信データ237の代わりに外部デバイスコントローラ103に送信する。外部デバイスコントローラ103は、前述したデータ受信フローに従って、キャリブレーションパターンの受信を行う。受信されたキャリブレーションパターンは、DMAコントローラ102、DRAMコントローラ104を経由して、DRAM106に書き込まれる。
全てのキャリブレーションパターンがDRAMに106に書き込まれた後に、CPU101はステップS102において、予め期待値としてDRAM等に記憶しているキャリブレーションパターンと、実際に受信されたキャリブレーションパターンとを比較する。両者は一致しているとCPU101が判定した場合には、スキュー設定が正しいと考えられるために、キャリブレーションシーケンスを完了させる。一方、両者が一致しない場合には、スキュー設定が誤っていると考えられる。そこで、CPU101はステップS103において、異なるスキュー設定値227を外部デバイスコントローラ103に設定し、再度キャリブレーションシーケンス(S101、S102)を行う。以上の処理をキャリブレーションが成功するまで繰り返し行う。
なおここでは、キャリブレーションパターンは外部デバイス107側に予め記憶されており、外部デバイス107はキャリブレ-ションを開始するコマンドを受信すると記憶しているキャリブレーションパターンを送信するものとする。
ここで、スキュー調整が完了した際にステップS101で扱う信号の波形について説明する。図23は参考例における、受信データ236に1サイクル以上の遅延がある場合の、キャリブレーションシーケンス中の波形を示す。(ここで、受信データ236に1サイクル以上の遅延がある場合とは、外部デバイスコントローラ103と外部デバイス107との間で1/2サイクル以上の配線遅延が生じている場合に相当する。)図23の各信号を図21および図2の符号と対応させて説明すると、上から順にdev_clk244、dev_clk_en243、d2h_data236、clk_with_skew246、d2h_data_1d235、host_clk115、r_data_buff234、dev_clk’245、d2h_data’237となる。なお、取り込みクロックと取り込んだデータのタイミングに差があるが、これは実際の回路でクロックのエッジを基準にして取り込む場合に、データがフリップフロップに取り込まれるまでの遅延を示しており、本発明の課題と直接関係が無い箇所で生ずる遅延であり、その遅延量も小さい。従って、受信データが1サイクル以上遅延する際に、この遅延は無視(除外)してもよい。また、図23についてキャリブレーションの後半の波形は一部省略している。
図23の例では、外部デバイス107に入力されるクロック245(dev_clk’)が外部デバイスコントローラ103の出力する出力クロック244(dev_clk)に対し1/2サイクルだけ遅延している。また、外部デバイスコントローラの受信する受信データ236(d2h_data)が、外部デバイスの送信する受信データ237(d2h_data’)に対して、1/2サイクルだけ遅延している。
これらの遅延は、外部デバイス107と外部デバイスコントローラ103間の基板上の往復遅延と外部デバイス107内での出力遅延や外部デバイスコントローラ103内の遅延などの影響によるものと考えられる。その結果、図23の例では、外部デバイスコントローラ103の出力クロック244に対して、外部デバイス107が応答出力するデータを外部デバイスコントローラ103が取り込む受信データ236に1サイクルの遅延がついていることになる。
キャリブレーションパターンは通常、受信バッファ209のサイズよりも十分小さい。そのため、参考例における外部デバイスコントローラ103はキャリブレーション中に出力クロックが停止しない。(そもそも、キャリブレーションパターンが受信バッファ209のサイズよりも大きかったとしても、出力クロックが停止するかどうかは、DMAコントローラ102の転送レートなどに依存する。従って、キャリブレーション中に出力クロック244が停止する状況は発生し難い。)
図23を参照すると、r_data_buff(0)234と入力されたシリアル形式の受信データd2h_data236との内容が一致しているので、キャリブレーション処理は完了してしまう。しかし、図24に示すように実際にデータを受信する際にはデータの取りこぼしなどが発生する。
図24のタイミングチャートは、受信データ236に図23と同様に1サイクルの遅延がある場合に、実際に外部デバイスコントローラ103が外部デバイス107からデータを受信している際の信号の波形を示している。各信号における図21や図2との対応関係は図23と同様なので説明を省略する。
図24では、シリアル形式の受信データ236の“D0”を受信した時点で、受信バッファ209が受信バッファフル信号241(図24では不図示)をアサートされる状況が発生している。そして、受信バッファフル信号241のアサートに伴って、出力クロック制御部213は出力クロックイネーブル信号243(dev_clk_en)をデアサートする。出力クロックゲーティング部214は出力クロックイネーブル信号243のデアサートを受けて、出力クロック244をゲーティングする。出力クロックゲーティング部214によって出力クロック244をゲーティングしているにも係らず、外部デバイス107からシリアル形式の受信データ“D1”と“D2”が送信されてしまっている。
元々、受信バッファ209に入るデータ(受信バッファフル信号241を発行する時の基準となる)が外部デバイス107から外部デバイスコントローラ103に入る時点で1/2サイクル遅延している。そして、受信バッファフル信号241がアサートされた後に、出力クロック244がゲーティングされるまでの遅延に加えて、出力クロック244がゲーティングされたことを外部デバイス107が認識できるまでの1/2サイクルの遅延がある。結果的に、外部デバイスコントローラ103はデータ送信の停止を要求していることを外部デバイス107が認識するには、これらの遅延の総和だけ遅れるため、“D1”、“D2”が送信されてしまう。
受信データSP変換部210は、出力クロックイネーブル信号243のデアサートを受けて、すぐにシリアル形式の受信データ236の受信を停止する。これによって、受信データSP変換部210はシリアル形式の受信データ“D1”を受信できなくなってしまう。(図に示すように、受信データSP変換部210が受信し、受信バッファ209に送信するパラレル形式の受信データ234には“D1”が含まれていない。)
また、受信バッファ209が受信バッファフル信号241をデアサートされてから、出力クロックイネーブル信号243がアサートされ、出力クロック244のゲーティングが解除される。出力クロック244は立ち下がりを基準にゲーティングしたので、解除されてから1/2経ってから立ち上がる。しかし、出力クロック244のゲーティングが解除されているにも係らず、外部デバイス107と外部デバイスコントローラ間の遅延によって外部デバイス107からシリアル形式の受信データ“D2”が送信され続けてしまう。
一方で、受信データSP変換部210は、出力クロックイネーブル信号243のアサートを受けて、すぐにシリアル形式の受信データの受信を再開する。そのため、受信データSP変換部210はシリアル形式の受信データ“D2”を2回受信してしまう。パラレル形式の受信データ234を見るとD2が2回受信されてしまっていることが分かる。
このように、外部デバイスコントローラ103と外部デバイス107との間で往復して1サイクル以上の遅延がある場合には、参考例の構成ではキャリブレーションが完了しても(図23)、実際のデータ受信は失敗してしまうことがある(図24)。
以上のことから、参考例の外部デバイスコントローラ103では、キャリブレーションシーケンスで受信データ236に発生する1サイクル以上の遅延の有無が検出できない場合があるということが分かる。
なお、図24は説明の為に受信バッファフル信号241がアサートされてデアサートされるまでの期間が極端に短く受信バッファが極端に小さい前提になっているが、これは説明を簡単にするためである。
次に、本実施例のキャリブレーションフローを図4(a)を用いて説明する。本実施例のキャリブレーションフローでは、まず、第三クロック制御部223を機能させながらスキュー調整を行い、次に第二クロック制御部222を機能させながらサイクル調整を行う。なお、キャリブレーションパターンが、受信バッファのサイズよりも十分に小さく、キャリブレーションパターン受信中に必ずクロックゲーティングが発生しないことが分かっていれば、第三クロック制御手段の代わりに第一クロック制御手段を用いてもよい。
ここで、スキュー調整とは図2に示す構成によってホストクロック115と受信データ236の位相のズレ(位相ズレ)を修正するように調整するものである。一方で、サイクル調整とは図3に示す構成によってホストクロック115と受信データ236の周期単位のズレを修正するように調整するものである。以降の説明では周期ズレ(データ取り込みタイミングのズレやデータ取り込み再開タイミングのズレに相当する)を単に遅延サイクル数(サイクル遅延量)とする。
まず、スキュー調整フローについて説明する。ステップS1201において、CPU101は外部デバイスコントローラ103に対して、クロックゲーティングモードを、クロックを停止させないキャリブレーションモード(第三クロック制御部を使うモード)に設定する。CPU101は、ステップS1202において、外部デバイスコントローラ103に対し、キャリブレーションパターンの取得を指示する。外部デバイスコントローラ103による、キャリブレーションパターンの取得処理は、参考例と同様である。キャリブレーションパターンの取得が完了すると、CPU101はステップS1203において、受信する予定のキャリブレーションパターンとしてROMやRAMから読み出したものと、実際に受信したキャリブレーションパターンとの比較を行う。比較結果が一致している場合には、スキュー設定が正しいと考えられるために、スキュー調整フローを完了する。
一方、比較結果が一致しない場合には、スキュー設定が誤っていると考えられる。その場合、CPU101はステップS1204においてスキュー設定レジスタ212の値を変更し、スキュー設定を変更してステップS1202へ遷移する。スキュー設定を変更し、ステップS1203でパターンが一致するまでステップS1202、S1203の処理を繰り返し行う。
続いて、サイクル調整フローについて説明する。ステップS1205において、CPU101は外部デバイスコントローラ103のクロックゲーティングモードを、受信ステータス信号239の示す値とゲーティングパターン252とに基づいてクロックを停止させるキャリブレーションモード(第二クロック制御手段を機能させるモード)に設定する。さらに、CPU101は外部デバイスコントローラ103に対して、ゲーティングパターンレジスタ設定値248を設定する。CPU101は、ステップS1206において、外部デバイスコントローラ103に対し、キャリブレーションパターンの取得を指示する。外部デバイスコントローラ103による、キャリブレーションパターンの取得処理の概略は、参考例と同様である。
ただし、実施例1の出力クロック制御部213は、ゲーティングパターン252に応じて、出力クロックイネーブル信号243を発行する。そして、出力クロックゲーティング部214はキャリブレーションパターンの受信中に、出力クロックイネーブル信号243に応じて出力クロック244をゲーティングする。ステップS1206においてサイクル演算部602がキャリブレーションパターンの取得を完了するとステップS1207に遷移する。そして、サイクル演算部602はステップS1207において、受信する予定のキャリブレーションパターンとしてCPU101がDRAM106などから読み出して期待値設定レジスタ604に格納させている期待値と、実際に受信したキャリブレーションパターンとの比較を行う。実際に受信するキャリブレーションパターンは、ゲーティングパターンやキャリブレーションパターン(期待値)、現在のサイクル設定値と実際の遅延サイクルとの差、によって異なる。(詳細については後述する。)
図20に、キャリブレーションパターンとして“01010101”を用いた一例を示す。詳細は後述するが、現在のサイクル設定値と実際の遅延サイクル数が合致している場合は、外部デバイスコントローラ103はキャリブレーションパターンを“01010101”のように受信できる。しかし、現在のキャリブレーションパターンに対して、実際の遅延サイクル数が1サイクル多い場合にキャリブレーションパターンとして、“01011101”のように受信する。その場合、サイクル演算部602が前述の処理によって受信したキャリブレーションパターンと、受信する予定のキャリブレーションパターン(期待値)とを比較して、遅延の有無を検出する。遅延がある場合には、遅延が発生する場合のキャリブレーションパターン(図20参照)実際の遅延サイクル数を検知する。サイクル演算部602(又はCPU101)はS1208において、検知された実際の遅延サイクルを、サイクル設定値として設定し、サイクル調整フローを完了する。なお、キャリブレーションシーケンスを終了した場合、出力クロック制御部213が第三クロック制御モードに切り替えてデータの送受信に備える。
上述したように、キャリブレーションパターンのサイズを受信バッファ209のサイズよりも小さくすると、キャリブレーションシーケンス中に受信バッファ209がフルになることはない。しかし、本実施例1の外部デバイスコントローラ103は受信バッファフル信号241のアサートによらず、出力クロック244をゲーティングパターンに基づいてゲーティングする。サイクル設定又はスキュー設定が誤っていれば、そのとおりに誤ったキャリブレーションパターンが(キャリブレーションが成功していないことがわかるように)取得される。図4(a)に示すフローを用いてキャリブレーションを完了した後、第一クロック制御部221を用いるモードに切り替えるため、CPU101はゲーティングモード設定レジスタ605にクロック制御選択部へ“0”を格納させる設定をし、データの送受信に備える。
以上の処理によって、本実施例の外部デバイスコントローラ103は、受信データ236に1クロックサイクル以上の遅延が生じても、その遅延の有無を検出できるので、取りこぼしなくデータの送受信をするための各種パラメータ(スキュー設定、サイクル設定)を設定することができる。
また、図4(a)に示すように、クロックゲーティングを行わずにスキュー調整でサイクル内の遅延の調整を行った後に、ゲーティングパターンに基づいてクロックゲーティングを行いながらサイクル間の遅延の調整を行うことで効率的にキャリブレーションできる。このようにスキュー調整とサイクル調整を分離しないと、期待値と受信データ236が一致するまで総当りでキャリブレーションパターンの受信及び比較(最大でN1×N2回)を行わなければならず、キャリブレーション処理にかなりの時間を要する。
また、キャリブレーションパターンが受信バッファ209のサイズよりも十分に小さければ、図4(a)のステップS1201~S1204で第三クロック制御部223を用いずに第一クロック制御部221によってスキュー調整をしてもよい。(キャリブレーションパターンの受信中に第一クロック制御部221を用いても必ずクロックゲーティングが発生しないためである。)この場合でも、ステップS1205~S1208の処理によって、図21(a)に示した参考例と比べるとキャリブレーションが成功し易くなる(回数を減らせる)。
〔キャリブレーションパターンとゲーティングパターンについて〕
ここで、キャリブレーションパターンとゲーティングパターンの相関について説明する。キャリブレーション処理が完了した際には、サイクル設定値256の示すサイクル数が、実際に遅延しているサイクル数と一致するものとする。図24の例では、サイクル遅延が1サイクルである為に、設定すべき正しいサイクル設定値256の示す値は“1”となる。(図24に示す波形は、サイクル設定値256がサイクル未調節の場合に相当する。)
出力クロック244のゲーティングパターンとキャリブレーションパターン設定を適切にするとそれだけキャリブレーション処理の精度が上がる。例えば、図24の例では、受信データ“D1”を受信出来ず、その代わりに受信データ“D2”が2回受信されてしまっている。このようにデータの置き換えが発生してしまうため、好ましくないキャリブレーションパターン(後述の観点を考慮していないパターン)を用いて受信データ236との比較をすると、キャリブレーションパターンの受信及び比較を行う回数が増えたり処理の精度が低下したりする可能性が高くなる。例えば、スキュー調整とサイクル調整について、期待値と受信データ236が一致するまで総当りで比較(最大でN1+N2回となる)を行う必要がある。
以下、4つの観点で、出力クロック244のゲーティングパターンとキャリブレーションパターンの相関について説明する。これらの観点を考慮しているキャリブレーションパターンを用いることでキャリブレーション処理の比較を短縮することができる(最大でN1+1回となる)。
ゲーティングパターンは、キャリブレーションパターンと下記の4つの観点とに基づいて設定する。ゲーティングパターンをキャリブレーションに用いることで、受信データSP変換部210のデータ取り込み制御を停止させる制御信号(出力クロックイネーブル信号243)がサイクル遅延量だけ遅延できていない場合に、実際に外部デバイスコントローラ103の受信するデータ(受信データ234)に重複や取りこぼしを発生させることができる。図20は好ましいゲーティングパターン(例として“01010101”)を設定した状況で、サイクル遅延量と受信データSP変換部210が受信することになるパターン(受信データ234)との相関を示している。
(1)実際のディレイ量とサイクル設定値との差分(以降、ディレイ指標M)と受信されるキャリブレーションパターンとの相関
ディレイ指標M=(実際のディレイ量)-(サイクル設定値)とし、ディレイ指標Mと受信されるキャリブレーションパターンとの相関について説明する。ここで、実際のディレイ量とは、サイクル設定値が“0”の場合(スキュー調節後でサイクル未調節に相当)に、受信データ236が出力クロック244に対して遅延しているサイクル数である。
図6、図7は、受信イネーブル信号250の変化タイミングを、ディレイがない時のタイミングに固定し、実際のディレイ量を変化させた場合のパラレル形式の受信データ234の波形を示す。図6、図7の信号を上から順に図1の符号と対応させると、dev_clk244、dev_clk_en243、dh2_data236、host_clk115、rcv_en250、r_data_buff234である。また、図6、図7はディレイ指標Mが0,1,2,3となる場合の4セットを示している。
図6、図7では、D3を受信した時点で、出力クロックイネーブル信号243のゲーティングを行い、出力クロック244デアサートにしている。図6、図7に示すように、受信するキャリブレーションパターン(dh2_data236に相当する)は、ディレイ指標Mによって異なる。ディレイ指標が、M>1の場合には、ゲーティングを開始した時点で受信したデータ(図6、図7の例ではD3)を基準として、1サイクル後のデータからMサイクル後のデータまでがM+1サイクル後のデータに置き換わる。一方M=0の時は、実際のディレイ量とサイクル設定値があっているため、正しいパターンが受信されている。
(2)ゲーティング量(N)と受信されるパターンとの相関
出力クロック244をゲーティングし続けるサイクル数をゲーティング量Nとして、(スキュー調節後でサイクル調節が誤っている場合に)Nと受信されるキャリブレーションパターンの相関について説明する(Nの定義は図5参照)。
図8、図9、図10はNが夫々1,2,3である時の、キャリブレーション中の波形を示す。図8、図9、図10のr_data_buff234の夫々の波形を参照するとNの値にかかわらず、Mサイクル分のデータが置き換わっていることが分かる。ただし、どのデータに置き換わるかはNの値によって異なっている。例えば、N=3の場合は、D1~D3がD4に置き換わり、N=2の場合はD1がD3に、D2とD3がD4に置き換わる。また、N=1の場合は、D1がD2に、D2がD3に、D3がD4に夫々置き換わる。
(3)ゲーティング間のサイクル(L)と受信されるパターンとの相関
ゲーティングを複数回行う場合、前のゲーティングタイミングから、次のゲーティングタイミングまでのサイクルをLとし、(スキュー調節後でサイクル調節が誤っている場合に)Lと受信されるキャリブレーションパターンとの相関について説明する。(Lの定義は図5参照)。図11、図12、図13、図14にLが1~4の時の、キャリブレーション中の波形を示す。L>=Mならば、複数回のゲーティングは、独立したゲーティングとして扱える。すなわち、Mサイクル分のデータの置き換えが、ゲーティングの回数分だけ発生する。そうでない場合には、複数回のゲーティングは、互いに相関を持ち、M*(ゲーティングの回数)-(M-L)個のデータが連続して置き換わる。
(4)ゲーティング開始位置(S)及びゲーティング終了位置(E)と受信されるパターンとの相関
ゲーティング開始位置をS、ゲーティング終了位置をEとし、(スキュー調節後でサイクル調節が誤っている場合に)S、Eと受信されるキャリブレーションパターンとの相関について説明する(S,Eの定義は図5参照)。
図15、図16、図17にSとスタートビットの位置関係、及びEとエンドビットの位置関係を変えた場合のキャリブレーション中の波形を示す。図15は、ゲーティング開始位置Sがスタートビット検出後であり且つゲーティング終了位置Eがエンドビット検出前である場合の波形を示す。図16は、ゲーティング開始位置Sがスタートビット検出前であり且つゲーティング終了位置Eがエンドビット検出後である場合の波形を示す。図17はゲーティング開始位置Sがスタートビット検出後でありゲーティング終了位置Eである場合の波形を示す。
図16のように、ホストクロック115の1サイクルと同期するように周期的にクロックゲーティングを行う場合は、L>Mを満たさず、且つSがスタートビットよりも前の位置で且つEがエンドビットよりも後の位置であると、キャリブレーションに適さない。サイクル調整が誤っているにも関わらず正しくデータが受信できてしまうためである。
一方、Sがスタートビット後、又は、Eがエンドビット後であれば、サイクル調整が誤っている状況で正しくデータが受信できていないので、このゲーティングパターンはキャリブレーションに適していることが分かる。従って、S又はEのどちらか1つのだけをキャリブレーションパターン受信中に配置するか、ゲーティング間のサイクルLを考慮する必要がある。
また、図15、図16、図17には直接示していないが、受信データSP変換部210が受信するキャリブレーションパターンの値が変動するタイミング(後述する所定数の異なる値が入力されている間)で、ゲーティング開始位置Sもしくはゲーティング終了位置Eがくるようにゲーティングパターンを設定しなければならない。すなわち、キャリブレーションパターンの値が変動するタイミングの1つで出力クロック244を停止し始める又は停止を解除するようにゲーティングパターンを設定する。例えば、値が変動するタイミングとは“01”(又は“10”)の場合であって、ゲーティング開始位置Sは“01”の“1”(又は“10”の“0”)、ゲーティング終了位置Eは“01”の“0”(又は“10”の“1”)にくるようにゲーティングパターンを設定する。
以上説明したように、キャリブレーションパターンとゲーティングパターンには(1)~(4)に示す相関がある。図6、図7の例では、キャリブレーションパターンの“D3”を受信した次のサイクルでゲーティングを行っている。この例の場合では、サイクル設定値と実際のディレイとの関係から、“D4~D6”が“D5~D7”に置き換わる可能性がある。そのため、仮にキャリブレーションパターンの“D4~D7”が全て同じ値であった場合、置き換わる前の値と置き換わる後の値が同じ値である為に、ディレイ(サイクル遅延)の検出には好ましくない。図6、図7の例では、(1)~(4)の相関を考慮して、キャリブレーションパターンの“D4~D7”を以下のパターンにすることが好ましい。
“D4~D7=0101”
これは、(1)~(4)の相関に基づいて設定している、もちろん“1”と“0”は逆であっても、その場合に対応する期待値を設定しておけばよい。
さらに、このキャリブレーションパターン(期待値)を用いた場合の、実際のサイクル数との差と受信されるパターン(受信データ236)との関係を図20に示す。受信されるパターンと図20に示す遅延量との関係を示す情報に基づいて実際のサイクル数との差が判定可能である。なお、Mに応じて1:1で異なるキャリブレーションパターンが受信されるようなパターンを設定する必要がある。従って、(1)~(4)の相関に沿ったゲーティングパターンを用いる場合、キャリブレーションパターン中の連続する値(ビット、”1”や”0”など)について、先に外部デバイスコントローラ103へ入力される値と異なる値が所定数だけ連続する場合、所定数サイクルまでの遅延を検出できる。すなわち、検知され得る遅延サイクル数以上、直前に(受信データSP変換部210へ)入力される値と異なる値が連続することが好ましい。上述の“D4~D7=0101”の場合“101”の部分で、直前に入力される値と異なる値が連続していることを保証できる。
なお、この関係を示す遅延情報(図20のようなルックアップテーブルや単なる数列など)は予め試験をしてCPU101が参照可能なDRAM106やその他の記憶装置に記憶しておき、サイクル遅延量を判定する際にCPU101が参照すればよい。
次に、図1の構成に正しいパラメータ(スキュー設定値、サイクル設定値)を用いて動作させた場合の、データ受信中に外部デバイスコントローラ103と外部デバイス107の扱う信号の様子を図18に示す。図18の例も図24の例と同様に、サイクル遅延が1サイクルであるが、キャリブレーションを完了し、1サイクルに対応するサイクル選択値249(サイクル設定値256)が設定されている時の波形を示している。(なお、受信データ236に発生する遅延が1サイクルである場合の、正しいサイクル選択値249(サイクル設定値256)の示す設定は1になる。サイクル選択値249の示す設定が1である為、受信イネーブル信号250は、出力クロックイネーブル信号243に対して、サイクル制御部603によって1サイクル遅延する。)
図18の例では、シリアル形式の受信データ236について“D0”の受信を開始した時点で、出力クロックイネーブル信号243をデアサートして、出力クロック244をゲーティングしている。出力クロック244をゲーティングしているが、外部デバイス107からシリアル形式の受信データ237について“D1”と“D2”が送信される。出力クロックイネーブル信号243のデアサート開始から1サイクル後に、受信イネーブル信号250もデアサートされる。受信データSP変換部210は、受信イネーブル信号250のデアサートを受けて、すぐにシリアル形式の受信データの受信を停止する。
そのため、スキュー調整後受信データ235の“D1”を受信したまま、データの受信を停止する。パラレル形式の受信データ234の1ビット目データを見ると“D1”が受信できており、受信データSP変換部210のデータ取り込み停止タイミングがサイクル遅延に対応するように調節できていることが分かる。
また、出力クロックイネーブル信号243はデアサートされた1サイクル後に再びアサートされ、これを受けて出力クロック244のゲーティングが解除されている。ここで、出力クロック244のゲーティングが解除されていても、前述の受信データ236に1サイクル以上の遅延があるため、外部デバイス107からシリアル形式の受信データ236の“D2”が送信され続ける。
サイクル設定値256の示す遅延量(1サイクル)によって、出力クロックイネーブル信号243のアサートの1サイクル後に、受信イネーブル信号250もアサートされる。受信データSP変換部210は、受信イネーブル信号250のアサートを受けて、すぐにシリアル形式の受信データの受信を再開する。そのため、シリアル形式の受信データ236の“D2”を正しく受信できる。パラレル形式の受信データ234の1ビット目を見ると“D2”が正しく受信出来ており受信データSP変換部210のデータ取り込み再開タイミングがサイクル遅延に対応するように調節できていることが分かる。
以上、本実施例では、設定が正しくないままキャリブレーションが完了してしまうことを抑制できる。従って、受信データ236に1サイクル以上の遅延があっても正しく検出ができる。
また、本実施例のサイクル制御部603によると、正しいサイクル設定値256が設定されていれば、外部デバイスコントローラ103と外部デバイス107との間で生ずるサイクル遅延の量に対応するように、受信データSP変換部210のデータ取り込み停止タイミングとデータ取り込み再開タイミングとを遅延させられる。これにより、図24に示したようなデータの取りこぼしが発生することを抑制する。
また、上述の実施例ではスキュー制御部211とサイクル制御部603を別々に構成しているが、スキュー調整とサイクル調整を単一の構成として組み合わせてもよいし、受信データSP変換部210に組み合わせてもよい。さらに、スキュー調整ではズレを補正したクロックを入力することで調整しているが、データを供給する系にスキュー調整やサイクル調整用の遅延構成(遅延素子、フリップフロップ)を直接配置し、セレクタ等で遅延量を選択してもよい。
また、上述の実施例ではキャリブレーション処理を実行する機会については言及していないが、公知の外部デバイスコントローラと同様の機会でキャリブレーションをすれば本発明の効果は得られる。例えば、ASIC100の起動時や、外部デバイスコントローラ103の初期化時、所定時間毎(例えば、SDXC等の規格にある208MHz時に10msec毎)もしくは所定サイクル数毎、また外部デバイス107との接続をASIC100が検出した時に実施をすればよい。
なお、前述の実施例において、サイクル演算部602、サイクル設定レジスタ601、期待値設定レジスタ604、はハードウェアとして説明しているが、CPU101で代用してソフトウェアで実現してもよい。その場合、CPU101がサイクル演算部602としての機能を実現するためのプログラムをDRAM106等から読み出して実行し、各種レジスタに相当する記憶領域はCPU101のキャッシュ(もしくはDRAM106)上に確保して、前述する各種レジスタの格納する値を記憶領域に記憶する。
前述の外部デバイス107と外部デバイスコントローラ103間の配線遅延について、外部デバイス107が外部デバイスIF112に着脱できる構成である場合に遅延量のバラツキが大きくなると考えられる。実際には配線の長さや材質、温度上昇以外にも、接触不良など種々の要因による遅延を含むことが考えられる。
上述の実施例ではホストクロック115がどの程度の周波数であるかは例示していないが、動作周波数が高くなればなるほど、図21(a)に示す構成で受信データ236に発生する1サイクル以上の遅延検出が困難になり、キャリブレーション不良も生じ易い。外部デバイスコントローラ103と外部デバイス107との間でより高速にデータをやりとりするにはホストクロック115の周波数を高めることが考えられるため、本発明は高速で信頼性の高いデータ通信の実現にも寄与するといえる。
また、上述の実施例でサイクル演算部602がキャリブレーションパターン(受信データ234)と期待値とを比較してサイクル調整を行っているが、スキュー調整と同様にCPU101が期待値を読出し、比較処理をするようにしてもよい。
また、上述の実施例では受信データ236のデータ部分(図21bのD0、D1…)について比較しているが、算出手段としての受信データSP変換部210の算出したCRC部分(図21bのCRC0、CRC1…)を比較に用いるようにしてもよい。その場合は、予め記憶しているキャリブレーションパターンについて、スキュー設定とサイクル設定が正常な場合に受け取るCRCを予め演算して記憶しておく必要がある。
なお、図1では外部デバイスコントローラ103と外部デバイス107の間では1bit幅のバスを用いて通信している様に説明しているが、4bit幅のバスや8bit幅のバス等でもよく、本発明はバス幅には限定されず適用できる。しかし、例えば4bit幅(8bit)のバスを用いる場合などは、スキュー制御部211にフリップフロップ218と遅延選択部217を4つ配置し1bit幅ずつスキュー調整をできるようにしておいてもよい。この場合、受信データSP変換部210では4bitを合流させればよく、受信データSP変換部210もしくは受信バッファ209などに4bitのデータの並び順を変えて、外部デバイス107が出力しようとしたデータと一致させる構成が必要になる。
また、上述の実施例ではホストクロック115の動作周波数が単一の例しか説明していないが、外部デバイス107を識別して動作周波数を切り替えるようにしてもよい。例えば、CLOCKジェネレータ105から外部デバイスコントローラ103の間に、ホストクロックを分周させる分周回路や逓倍回路等を設けて外部デバイスコントローラ103に入力するホストクロックの周波数を替えてもよい。この場合CLOCKジェネレータ105に加えて分周回路や逓倍回路も発振手段の一部とする。
この時、前述のキャリブレーションが不調な場合に外部デバイス107に入力されるホストクロック115をより低い周波数に減少させて外部デバイスとの通信を安定させるようにしてもよい。キャリブレーションが不調な場合とは、例えば前述のキャリブレーションが単位時間辺りに所定回数以上発生してしまう場合やキャリブレーションに要する時間が所定時間以上(例えば、総当りに要する回数以上になる場合)を要してしまう場合などが挙げられる。また、外部デバイスIF112の物理的なコネクタ形状を規格に定められた特定種類の外部デバイス107と嵌合するように設計する場合、分周回路や逓倍回路で切り替える周波数として特定種の規格で定められている周波数を用いても良い。(例えば、208MHzで不調であれば、100MHzに切り替える等)これにより、同系統の外部デバイスであってバージョンによって動作周波数が異なる場合において、外部デバイスコントローラ103の後方互換性を維持できる。
なお、本発明をSDXC(SD eXtended Capacity)規格の外部デバイス107に利用する場合、データの送受信前に、外部デバイス107の規格(又は外部デバイス107とコントローラの通信種別)を識別できる。この場合、CPU101が前述のコマンド送受信によって、外部デバイス107の種別(又は通信種別)を示す識別情報を返すように指示する。そして識別情報に従ってCPU101から、識別した規格に応じてSDXCなら前述の発振手段によって高周波数(208MHz)へ、それ以外なら低周波数(50Hzや20Hz)へ切り替えるよにしてもよい。上述した1サイクル以上の遅延がデータの受信に影響しない程度の低周波数の通信を用いていると判断できる場合は、前記キャリブレーションのサイクル調整の機能を停止するようにしてもよい。
ここで、本発明をSDXC規格の外部デバイス107に適用する場合、外部デバイス107は64byteのキャリブレーションパターンを外部デバイスコントローラ103へ送信するように構成されている。この場合、外部デバイスコントローラ103は64byte分のキャリブレーションパターンを扱ってもよい。しかし、64byteのうち検出され得る遅延サイクル量だけ先に入力される値と異なる値が連続して続く箇所、に着目してもよい。その場合は、外部デバイスコントローラ103の受信する64byteのキャリブレーションパターンをDRAM106に書き出した後、着目する箇所のアドレスだけCPU101が読み出すようにすればよい。また、規格によっては外部デバイス107と外部デバイスコントローラ103との間で許容する最大の遅延量を定義しているので、その許容遅延量に基づいて、異なる値を連続させる個数(前述の所定数)を決定してもよい。この場合、許容遅延量に対応する数より大きい数を前述の所定数として予め設定しておくことが好ましい。
また、上述の実施例における送信バッファ207や受信バッファ209はFIFO構造にしてもよい。その場合、バッファフル信号やバッファエンプティー信号はFIFOの空き容量を示す情報(残量情報)に基づいて作成したり、残量情報をそのまま代用したりしてもよい。この場合、受信バッファ209のFIFOが格納できるデータのサイズがキャリブレーションパターンのデータのサイズ以上である場合は、キャリブレーションパターンを一旦FIFOに書き込んだ後に、CPU101が比較にそのまま用いるようにしてもよい。しかし、受信バッファのFIFOが格納できるデータサイズがキャリブレーションパターンより小さい場合は、キャリブレーションパターンのFIFO容量以下のデータサイズずつ逐次的(所定サイクル毎)に比較することが好ましい。又は、キャリブレーション中に受信バッファ209のFIFOに取り込まずに逐次的に比較する構成に分岐させるようにしてもよい。(比較手段としてCPU101とは別構成を有し、期待値も同じデータサイズずつ読み出すレジスタと構成する、所定サイクル分のデータの比較器を構成すればよい。)そうしないと、スキュー調整で第三クロック制御手段223によりクロックを止めない様にしている場合に、受信バッファ209がオーバーフローしてしまう可能性があるためである。
また、上述の実施例における出力クロックイネーブル信号243などの制御信号は、イネーブル信号をデアサートするタイミングにディスエーブル信号をアサートするように構成しても構わない。
なお、上述の実施例では外部デバイスコントローラ103を有する情報処理装置として本発明を説明したが、上述の外部デバイス107の構成を情報処理装置内部として有する場合にも適用できるので、デバイスコントローラに適用できるともいえる。また、本発明を適用する情報処理装置としては、画像処理装置や計算処理装置など種々の装置が挙げられる。
また、本発明は、以下の処理を実行することによっても実現される。即ち、上述した実施例の機能を実現するソフトウェア(プログラム)を、ネットワーク又は各種記憶媒体を介してシステム或いは装置に供給し、そのシステム或いは装置のコンピュータ(またはCPUやMPU等)がプログラムを読み出して実行する処理である。