(57)【要約】【課題】低速メモリデバイスに格納された圧縮プログラムを高速メモリデバイスに転送するときに、ハードウェアを用いて圧縮プログラムの伸長処理を高速に行う。【解決手段】低速メモリデバイスとしてのプログラムメモリ２から、可逆的に圧縮されたプログラムをリードＤＭＡＣ１２によって読み出して、パイプライン回路８で伸長する。パイプライン回路８は、圧縮プログラムの伸長処理が遅いために、圧縮プログラムの入力に間に合わなくならないように、伸長をパイプライン処理で行うようにしている。これにより、間断なくプログラムメモリ２から読み出された圧縮プログラムの伸長処理を行うので、プログラムメモリ２からの高速メモリデバイスとしてのメインメモリ３へ高速でプログラムを転送することができる。【選択図】図１
2010086321.tif 000002
【特許請求の範囲】
【請求項１】
圧縮プログラムおよび起動用の非圧縮プログラムを格納する第１メモリ装置と、
当該第１メモリ装置より高速で動作する第２メモリ装置と、
前記第１メモリ装置から読み出された前記圧縮プログラムを伸長して前記第２メモリ装置に転送する転送回路と、
前記第２メモリ装置に転送された伸長後の前記圧縮プログラムを実行するとともに、起動時に前記非圧縮プログラムを実行するＣＰＵとを備え、
前記転送回路は、前記ＣＰＵの起動後に前記圧縮プログラムをパイプライン処理で伸長する伸長回路を有していることを特徴とするメモリ制御システム。
【請求項２】
前記非圧縮プログラムが前記圧縮プログラムより小さいことを特徴とする請求項１に記載のメモリ制御システム。
【請求項３】
前記第１メモリ装置に格納された前記圧縮プログラムを前記伸長回路に読み出すリードＤＭＡＣを備えていることを特徴とする請求項１または２に記載のメモリ制御システム。
【請求項４】
前記伸長回路によって前記圧縮プログラムから伸長されたプログラムを蓄えるＦＩＦＯメモリと、
前記ＦＩＦＯメモリから出力される前記プログラムを前記第２メモリ装置に書き込むライトＤＭＡＣとを備えていることを特徴とする請求項３に記載のメモリ制御システム。
【請求項５】
前記伸長回路は、前記第１メモリ装置から読み出された前記圧縮プログラムを保持する第１工程と、前記圧縮プログラムにおける命令の出現頻度に基づいて読出アドレスを決定する第２工程と、前記読出アドレスに基づいて、圧縮プログラムの符号化コードに対応する圧縮前の値を読み出す第３工程とを順次並行して実行することを特徴とする請求項１から４のいずれか１項に記載のメモリ制御システム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、低速のメモリ装置に格納されたプログラムを高速のメモリ装置に高速で転送するメモリ制御システムに関するものである。
【背景技術】
【０００２】
ＮＯＲフラッシュメモリ、ＮＡＮＤフラッシュメモリ、ＳＲＡＭ、ハードディスク装置等の低速のメモリデバイスに格納されたプログラムをＣＰＵによって実行するには、ＤＲＡＭ等の高速のメモリデバイスに当該プログラムを転送する。プログラムをそのままの状態で転送する場合、低速メモリデバイスからのリード動作が低速で行われるため、転送に時間がかかり、システムの高速化を図ることができない。また、メモリの利用効率向上などのために、プログラムを圧縮した状態で低速メモリデバイスに格納しておくこともある。この場合は、プログラムを高速メモリデバイスに転送するときの伸長がソフトウェアで行われるため、プログラムを圧縮しない場合よりも転送に時間を要することが多い。
【０００３】
これに対し、特許文献１には、圧縮されたプログラムをハードウェアで伸長することが記載されている。この構成では、ＲＯＭから読み出された圧縮されたプログラムが、ＲＯＭインターフェースに設けられた伸長ハードウェアで伸長されて、ＲＡＭに格納された後に、ＣＰＵを起動する。
【特許文献１】特開２００７−１４８８６５号公報（２００７年６月１４日公開）
【発明の開示】
【発明が解決しようとする課題】
【０００４】
特許文献１には、ハードウェアで圧縮されたプログラムを伸長することが開示されているが、具体的な伸長方法については開示されていない。ハードウェアでプログラムを伸長する場合、ＲＯＭから読み出された圧縮プログラムを取り込む時間よりも、圧縮プログラムを伸長する処理に時間がかかり、圧縮プログラムの読み出しが滞ってしまう。これは、圧縮のアルゴリズムが複雑化したり、伸長回路への入力データサイズが動的に変化したりすることで、より顕著になる。このため、ＣＰＵの起動が遅くなるという不都合が生じる。
【０００５】
本発明は、上記の問題点に鑑みてなされたものであり、低速メモリデバイスに格納された圧縮プログラムを高速メモリデバイスに転送するときに、ハードウェアを用いて圧縮プログラムの伸長処理を高速に行うことができるメモリ制御システムを提供することを目的としている。
【課題を解決するための手段】
【０００６】
本発明に係るメモリ制御システムは、上記の課題を解決するために、圧縮プログラムおよび起動用の非圧縮プログラムを格納する第１メモリ装置と、当該第１メモリ装置より高速で動作する第２メモリ装置と、前記第１メモリ装置から読み出された前記圧縮プログラムを伸長して前記第２メモリ装置に転送する転送回路と、前記第２メモリ装置に転送された伸長後の前記圧縮プログラムを実行するとともに、起動時に前記非圧縮プログラムを実行するＣＰＵとを備え、前記転送回路が、前記ＣＰＵの起動後に前記圧縮プログラムをパイプライン処理で伸長する伸長回路を有していることを特徴としている。
【０００７】
上記の構成では、転送回路によって、第１メモリ装置から第２メモリ装置に圧縮プログラムが転送されるときに、まず、第１メモリ装置から読み出された非圧縮プログラム、すなわち起動プログラムによってＣＰＵが起動される。その後に、伸長回路によって、第１メモリ装置から読み出されたプログラムがパイプライン処理で行われる。具体的には、例えば、前記伸長回路は、前記第１メモリ装置から読み出された前記圧縮プログラムを保持する第１工程と、前記圧縮プログラムにおける命令の出現頻度に基づいて読出アドレスを決定する第２工程と、前記読出アドレスに基づいて、圧縮プログラムの符号化コードに対応する圧縮前の値を読み出す第３工程とを順次並行して実行する。
【０００８】
これにより、伸長処理が複数ステージ（複数工程）からなる一連の処理が並行的に繰り返し行われる。それゆえ、伸長処理に要する時間を短縮することができる。
【０００９】
また、伸長回路がＣＰＵの起動後に圧縮プログラムを伸長することにより、ＣＰＵの起動を優先させることから、ＣＰＵの起動の遅れを回避することができる。
【００１０】
前記メモリ制御システムにおいては、前記非圧縮プログラムが前記圧縮プログラムより小さいことが好ましい。起動プログラムは、ＣＰＵの起動のみに用いられるため、一般に、第２メモリ装置に転送される圧縮プログラムの圧縮前のプログラムよりも小さく、多くの場合は極めて小さく作成することができる。このため、圧縮プログラムの伸長の開始を早めることができる。
【００１１】
前記メモリ制御システムにおいて、前記第１メモリ装置に格納された前記圧縮プログラムを前記伸長回路に読み出すリードＤＭＡＣを備えていることが好ましい。これにより、高速で第１メモリ装置から圧縮プログラムを伸長回路に読み出すことができる。
【００１２】
前記メモリ制御システムは、前記伸長回路によって前記圧縮プログラムから伸長された前記プログラムを蓄えるＦＩＦＯメモリと、前記ＦＩＦＯメモリから出力される前記プログラムを前記第２メモリ装置に書き込むライトＤＭＡＣとを備えていることが好ましい。これにより、伸長回路から出力されるプログラムのバンド幅が動的に変化しても、それを吸収するとともに、第２メモリ装置への書き込みタイミングを調整することができる。また、ライトＤＭＡＣを用いることにより、ＦＩＦＯメモリから第２メモリ装置へのプログラムの書き込みを高速で行うことができる。
【発明の効果】
【００１３】
本発明に係るメモリ制御システムは、以上のように、圧縮プログラムおよび起動用の非圧縮プログラムを格納する第１メモリ装置と、当該第１メモリ装置より高速で動作する第２メモリ装置と、前記第１メモリ装置から読み出された前記圧縮プログラムを伸長して前記第２メモリ装置に転送する転送回路と、前記第２メモリ装置に転送された伸長後の前記圧縮プログラムを実行するとともに、起動時に前記非圧縮プログラムを実行するＣＰＵとを備え、前記転送回路が、前記ＣＰＵの起動後に前記圧縮プログラムをパイプライン処理で伸長する伸長回路を有している。これにより、伸長処理に要する時間を短縮することができる。したがって、メモリ制御システムにおいて、第１メモリ装置から第２メモリ装置への圧縮プログラムの転送の過程において、ＣＰＵの起動を遅らせることなく、ハードウェアを用いて圧縮プログラムの伸長処理を高速に行うことができるという効果を奏する。
【発明を実施するための最良の形態】
【００１４】
本発明の実施形態について図１〜図５に基づいて説明すると、以下の通りである。
【００１５】
なお、図１および図２において各回路間の接続線は、太い実線が複数ビットの信号線を表し、細い実線が１ビットの信号線を表している。
【００１６】
図１に示すように、本実施の形態に係るメモリ制御システム１は、プログラムメモリ２と、メインメモリ３と、ＣＰＵ４と、転送回路５と、３ステートバッファ６，７とを備えている。
【００１７】
プログラムメモリ２（第１メモリ装置）は、ＮＯＲフラッシュメモリ、ＮＡＮＤフラッシュメモリ、ＳＲＡＭ、ハードディスク装置等の低速のメモリデバイスによって構成されている。このプログラムメモリ２には、圧縮プログラムと、非圧縮プログラムとを格納している。プログラムメモリ２は、ＣＰＵ４によってリードアドレスがアドレス端子ＡＤＤに与えられると、記憶している非圧縮プログラムをデータ出力端子ＤＡＴＡから出力する。また、プログラムメモリ２は、後述するリードＤＭＡＣ１２（図２参照）によってリードアドレスがアドレス端子ＡＤＤに与えられると、記憶している圧縮プログラムをデータ出力端子ＤＡＴＡから出力する。
【００１８】
圧縮プログラムは、アプリケーションプログラム等のプログラムであって、ＣＰＵ４によって実行されるために、メインメモリ３に転送されて格納される。また、圧縮プログラムは、例えば、ハフマン符号等によって可逆的に圧縮されている。この圧縮プログラムは、通常命令と高頻度命令とからなる。
【００１９】
通常命令は、圧縮前のプログラムにおいて最も出現頻度が低い命令であり、圧縮されない。通常命令が圧縮されないのは、最も出現頻度が低いために、圧縮プログラム全体の圧縮度の低下に及ぼす影響が低く、かつ圧縮および伸長の効率を向上させることができるからである。この通常命令は、５バイトからなり、最初の１バイト（第１バイト）が通常命令を表す“００ｈ”というコードであり、残余の４バイトが命令本体を表すコードとなっている。
【００２０】
高頻度命令は、通常命令より出現頻度が高い命令である。この高頻度命令は、３２ビット（４バイト）の命令が１バイトに圧縮されており、上記の“００ｈ”以外の値で構成されている。
【００２１】
非圧縮プログラムは、ＣＰＵ４の起動用（リセット後の動作用）のプログラムであって、メインメモリ３には転送されない。また、非圧縮プログラムは、後述するリードＤＭＡＣ１２の設定および起動を行うとともに、リードＤＭＡＣ１２の動作終了の検知も行う。このような非圧縮プログラムは、圧縮プログラムに比べて小さい、多くの場合は極めて小さいサイズを有しており、実行時間も短いため、ＣＰＵ４の起動から、後述する圧縮プログラムの転送処理の完了に至る総処理時間を長引かせることはない。
【００２２】
メインメモリ３（第２メモリ装置）は、ＤＲＡＭ等の高速メモリデバイスであり、プログラムメモリ２に比べて高速に動作する。
【００２３】
ＣＰＵ４は、プログラムメモリ２から読み出された上記の非圧縮プログラムを実行することにより、起動処理を行うとともに、伸長されてメインメモリ３に転送される上記の圧縮プログラムを実行する。
【００２４】
転送回路５は、プログラムメモリ２に格納された圧縮プログラムをメインメモリ３に転送する回路である。また、この転送回路５は、プログラムメモリ２から圧縮プログラムを読み出して伸長するとともに、書き込みのタイミングを調整しながらメインメモリ３へ書き込む。この転送回路５については、後に詳述する。
【００２５】
３ステートバッファ６は、プログラムメモリ２からのデータバス２１の接続および遮断を行う回路であり、ＣＰＵ４からのバスアクノリッジ信号ＢＡＣＫが“Ｌ”となるときに、データバス２１を接続し、バスアクノリッジ信号ＢＡＣＫが“Ｈ”となるときに、データバス２１を遮断する。３ステートバッファ７は、プログラムメモリ２へのアドレスバス２２の接続および遮断を行う回路であり、ＣＰＵ４からのバスアクノリッジ信号ＢＡＣＫが“Ｌ”となるときにアドレスバス２２を接続し、バスアクノリッジ信号ＢＡＣＫが“Ｈ”となるときにアドレスバス２２を遮断する。
【００２６】
続いて、転送回路５について、より詳しく説明する。
【００２７】
転送回路５は、パイプライン回路８、ＦＩＦＯメモリ９、３ステートバッファ１０、メモリコントローラ１１、リードＤＭＡＣ１２およびライトＤＭＡＣ１３を有している。また、メモリ制御システム１は、図２に示すように、カウンタ１４およびＡＮＤゲート１５をさらに有している。
【００２８】
パイプライン回路８は、プログラムメモリ２から読み出された圧縮プログラムに施された符号化に対応した復号化を行うことにより圧縮プログラムを伸長する回路である。このパイプライン回路８は、圧縮プログラムの伸長処理が遅いために、圧縮プログラムの入力に間に合わなくならないように、伸長をパイプライン処理で行うようにしている。パイプライン回路８については、後に詳細に説明する。
【００２９】
ＦＩＦＯメモリ９は、パイプライン回路８によって伸長されたプログラムを一時的に蓄えるバッファメモリとして機能している。これにより、ＦＩＦＯメモリ９は、パイプライン回路８から出力されるプログラムのバンド幅（データビット長と速度との積）が動的に変化しても、それを吸収するとともに、メインメモリ３への書き込みタイミングを調整することができる。また、ＦＩＦＯメモリ９は、記憶領域に空きがある状態（記憶可能状態）のときに“Ｈ”となり、記憶領域に空きがない状態（出力可能状態）のときに“Ｌ”となる出力制御信号ＯＣをライトＤＭＡＣ１３に与える。ＦＩＦＯメモリ９は、出力制御信号ＯＣが“Ｈ”となる期間にプログラムの記憶を継続して出力を行い、出力制御信号ＯＣが“Ｌ”となる期間にプログラムの記憶を停止して、読み出しを行う。
【００３０】
３ステートバッファ１０は、ＦＩＦＯメモリ９からのデータバス２１の接続および遮断を行う回路であり、ＣＰＵ４からのバスアクノリッジ信号ＢＡＣＫが“Ｈ”となるときに、データバス２１を接続し、バスアクノリッジ信号ＢＡＣＫが“Ｌ”となるときに、データバス２１を遮断する。
【００３１】
メモリコントローラ１１は、ＦＩＦＯメモリ９からのプログラムのメインメモリ３への書き込み、およびメインメモリ３からＣＰＵ４へのプログラムの読み出しを制御する回路である。
【００３２】
リードＤＭＡＣ１２は、プログラムメモリ２からパイプライン回路８への圧縮プログラムの読み出しを制御する回路である。このリードＤＭＡＣ１２は、ＣＰＵ４からバス権を取得するときに、バスリクエスト信号ＢＲＥＱを“Ｈ”とし、ＣＰＵ４へバス権を受け渡すときに、バスリクエスト信号ＢＲＥＱを“Ｌ”とする。また、リードＤＭＡＣ１２は、パイプライン回路８に伸長を制御するための制御信号を与える。
【００３３】
ライトＤＭＡＣ１３は、ＦＩＦＯメモリ９からメモリコントローラ１１へのプログラムの読み出しを制御する回路である。このライトＤＭＡＣ１３は、ＦＩＦＯメモリ９からの出力制御信号ＯＣが“Ｌ”となるときに、アドレスバスに２２にリードアドレスを出力する。また、ライトＤＭＡＣ１３は、ＣＰＵ４からバス権を取得するときに、バスリクエスト信号ＢＲＥＱを“Ｈ”とし、ＣＰＵ４へバス権を受け渡すときに、バスリクエスト信号ＢＲＥＱを“Ｌ”とする。また、ライトＤＭＡＣ１３は、ＦＩＦＯメモリ９からの出力制御信号ＯＣが“Ｈ”となるときには、ＦＩＦＯメモリ９からプログラムが出力されないので、リードアドレスを出力しないが、出力制御信号ＯＣが“Ｌ”となるときには、ＦＩＦＯメモリ９からプログラムが出力されるので、リードアドレスを出力をメインメモリ３に出力する。
【００３４】
メモリコントローラ１１は、ＦＩＦＯメモリ９から３ステートバッファ１０を介して読み出されたプログラムをライトＤＭＡＣ１３から出力されるリードアドレスとともに、メインメモリ３に与えて、プログラムの書き込みを制御する。また、メモリコントローラ１１は、ＣＰＵ４からのリードアドレスをメインメモリ３に与えることによって、メインメモリ３に記憶されているプログラムをデータバスに読み出してＣＰＵ４に与える。
【００３５】
引き続いて、パイプライン回路８について詳細に説明する。
【００３６】
図２に示すように、パイプライン回路８は、セレクタ８１，８２、レジスタ８３〜８５、ＮＯＲゲート８６、ステートマシン８７およびテーブルＲＯＭ８８を有している。
【００３７】
セレクタ８１は、Ｓ端子の値が“１”となるときに、プログラムメモリ２から出力される圧縮プログラム（圧縮コード化された８ビットのデータ）を出力する一方、Ｓ端子の値が“０”となるときに、レジスタ８３の出力データを出力する。Ｓ端子に入力される値は、カウンタ１４およびＡＮＤゲート１５によって生成される。
【００３８】
カウンタ１４は、ベースクロック信号ＢＣＬＫをカウントする２ビットバイナリカウンタである。ＡＮＤゲート１５は、カウンタ１４がベースクロック信号ＢＣＬＫを４クロックカウントして“１１”を出力する毎に１クロック期間だけ“１”を出力する。ＡＮＤゲート１５の出力は、リードＤＭＡＣ１２によるプログラムメモリ２の読み出しを制御するレディ信号ＲＤＹとして用いられる。このレディ信号ＲＤＹにより、リードＤＭＡＣ１２は、リードアドレスをプログラムメモリ２に出力するとともに、カウンタ１４に与えるリセット信号を“１”から“０”にする。カウンタ１４は、このリセット信号によりリセットされると、カウンタを再開する。
【００３９】
ＮＯＲゲート８６は、プログラムメモリ２から出力される８ビットの圧縮プログラムの最下位ビットが“０”となり、かつリードＤＭＡＣ１２からの前述のリセット信号が“０”となるときのみ“１”を出力する。
【００４０】
レジスタ８３は、セレクタ８１から出力された圧縮プログラムならびにＡＮＤゲート１５およびＮＯＲゲート８６の出力をベースクロック信号ＢＣＬＫのタイミングで保持する。レジスタ８４は、レジスタ８３に保持された圧縮プログラムをベースクロック信号ＢＣＬＫのタイミングで保持する。
【００４１】
ステートマシン８７は、ＲＯＭＲＤＹ１端子に入力されるレディ信号ＲＤＹの状態、およびＮＣＴ端子に入力されるＮＯＲゲート８６から入力される圧縮プログラムの組み合わせに応じて、ＴＢＬＡＤＲ端子から出力されるアドレス、ＮＣＥＮ端子から出力されるセレクタ制御信号およびＷＲＴＥＮ端子から出力される書込制御信号を、レジスタ８３が圧縮プログラムを保持するタイミングと同じベースクロック信号ＢＣＬＫに基づいたタイミングで出力するデジタル回路である。また、ステートマシン８７は、ＮＣＴ端子から通常命令の各バイト（第１〜第５バイト）が入力される毎に１を加算していく３ビットの内部カウンタ（図示せず）を含んでおり、現在どのバイトが入力されているかを認識する。この内部カウンタは、第５バイトをカウントすると初期化される。
【００４２】
ステートマシン８７が実行する処理は、図３に示すように、ハフマンコードをデコード処理するように行われる。このデコード処理については後に詳しく説明する。
【００４３】
テーブルＲＯＭ８８は、レジスタ８４からの８ビットのデータがテーブルアドレスの上位８ビット（Ａ９−Ａ２）として入力され、ステートマシン８７のＴＢＬＡＤＲ端子から出力されるアドレスがテーブルアドレスの下位の２ビット（Ａ０，Ａ１）として入力される。テーブルＲＯＭ８８は、上記のようにして入力される１０ビットのテーブルアドレス（Ａ９−Ａ０）に対応する８ビットのデータ（Ｄ７−Ｄ０）を書込データとして出力する。具体的には、図４に示すように、テーブルＲＯＭ８８は、テーブルアドレス（Ａ９−Ａ０）が“０００”から“００３”までの４バイトの領域を使用せず、以降の４バイト×８ビット（１ワード）の領域毎に各１個の機械語として伸長された３２ビットの高頻度命令（伸長コード）を格納している（合計２５５個）。
【００４４】
ハフマン符号化法によって得られるコードは、出現頻度が高いほどビット数が少なくなっている。圧縮プログラムがハフマン符号化法によって圧縮されたものである場合、テーブルＲＯＭ８８は、ハフマン符号化されたコードのデコードテーブルとして構成されており、各テーブルアドレスに各ビット数の少ない順にコードを格納している。
【００４５】
セレクタ８２は、Ｓ端子の値が“１”となるときに、レジスタ８４から８ビットのデータを出力する一方、Ｓ端子の値が“０”となるときに、テーブルＲＯＭ８８から出力される８ビットのデータを出力する。
【００４６】
レジスタ８３は、セレクタ８２から出力されたデータおよびステートマシン８７のＷＲＴＥＮ端子から出力される書込制御信号をベースクロック信号ＢＣＬＫのタイミングで保持して、ＦＩＦＯメモリ９に与える。
【００４７】
続いて、ステートマシン８７における状態の遷移について説明する。ここでは、ハフマン符号によってプログラムを圧縮した場合の復号を行う例について説明する。
【００４８】
図３に示すように、まず、プログラムメモリ２のウエイト状態において、ＲＯＭＲＤＹ１端子の値が“０”である場合、ＮＣＥＮ端子の値、ＷＲＴＥＮ端子の値、ＴＢＬＡＤＲ端子の値および内部カウンタのカウント値ＣＮＴの値が全て“０”となる。この場合は、プログラムメモリ２から圧縮プログラムが読み出されていない状態であるので、ウエイト状態を持続する。
【００４９】
〔状態遷移（１）〕
“（ＲＯＭＲＤＹ１ ＆ ＮＣＴ）＝１”は、ＲＯＭＲＤＹ１端子の値が“１”であり、かつＮＣＴ端子に入力されるバイトが“００ｈ”（通常命令）であることを表している。この場合、ＮＣＥＮ端子の値の値が“１”となる一方、ＷＲＴＥＮ端子および内部カウンタのカウント値ＣＮＴの値が“０”となる。この場合は、通常命令の出力処理に状態が遷移し、セレクタ８２からレジスタ８４に保持された通常命令の第１バイト（００ｈ）が出力されて、レジスタ８５に保持される。しかしながら、“００ｈ”は、通常命令であることを表すコードであり、命令本体ではないので、ＦＩＦＯメモリ９への書き込みは行われない。
【００５０】
〔状態遷移（２）〕
通常命令の出力処理において、“（ＲＯＭＲＤＹ１＝１） ＆＆ （ＣＮＴ！＝４）”は、通常命令の第２バイトから第４バイトがそれぞれ入力されたことを表している。この場合、ＷＲＴＥＮ端子の値を“１”とし、カウント値ＣＮＴを第２バイトから第４バイトが入力される毎に１つずつ加算する。また、この場合、状態遷移（１）と同様、ＮＣＥＮ端子の値の値が“１”に維持されているので、セレクタ８２から出力された通常命令の第２〜第４バイトはレジスタ８４に保持されて、ＦＩＦＯメモリ９に書き込まれる。
【００５１】
〔状態遷移（３）〕
通常命令の出力処理において、“（ＲＯＭＲＤＹ１＝１） ＆＆ （ＣＮＴ＝４）”は、通常命令の第５バイトが入力されたことを表している。この場合、ＷＲＴＥＮ端子の値を“１”とし、カウント値ＣＮＴを次のカウントに備えるため初期化する。また、この場合、状態遷移（１）と同様、ＮＣＥＮ端子の値の値が“１”に維持されているので、セレクタ８２から出力された通常命令の第５バイトはレジスタ８４に保持されて、ＦＩＦＯメモリ９に書き込まれる。そして、状態をメモリプログラム２のウエイト状態に戻す。
【００５２】
〔状態遷移（４）〕
通常命令の出力処理において、ＲＯＭＲＤＹ１端子の値が“０”である場合、ＷＲＴＥＮ端子の値が“０”となる。この場合は、プログラムメモリ２から圧縮プログラムが読み出されないので、ＦＩＦＯメモリ９への書き込みは行われない。
【００５３】
〔状態遷移（５）〕
“（ＲＯＭＲＤＹ１ ＆ ＾ＮＣＴ）＝１”は、ＲＯＭＲＤＹ１端子の値が“１”であり、かつＮＣＴ端子に入力されるバイトが“００ｈ”（通常命令）以外のコードであることを表している。この場合、ＮＣＥＮ端子の値およびＴＢＬＡＤＲ端子の値が“０”（“００”）となる一方、ＷＲＴＥＮ端子の値が“１”となる。この場合は、高頻度命令の伸長処理に状態が遷移し、レジスタ８４を介して入力された上記のバイトと上記のＴＢＬＡＤＲ端子の値とからなるテーブルアドレスにより、テーブルＲＯＭ８８から伸長コードが読み出される。この伸長コードは、セレクタ８２を介してレジスタ８５に保持され、ＦＩＦＯメモリ９に書き込まれる。
【００５４】
〔状態遷移（６）〕
高頻度命令の伸長処理において、ＲＯＭＲＤＹ１端子の値が“０”である場合、ＴＢＬＡＤＲ端子の値に１を加算して出力する。この場合は、新たに圧縮プログラムが読み出されないので、テーブルＲＯＭ８８から、前のテーブルアドレスに１が加算されたテーブルアドレスの伸長コードが出力される。
【００５５】
〔状態遷移（７）〕
高頻度命令の伸長処理において、状態遷移（５）と同様、“（ＲＯＭＲＤＹ１ ＆ ＾ＮＣＴ）＝１”で表されるように、ＮＣＴ端子に入力されるバイトが通常命令以外のコードである場合、高頻度命令の伸長処理状態を維持する。
【００５６】
〔状態遷移（８）〕
高頻度命令の伸長処理において、状態遷移（１）と同様、“（ＲＯＭＲＤＹ１ ＆ ＮＣＴ）＝１”で表されるように、ＮＣＴ端子に入力されるバイトが通常命令を表す場合、通常命令の出力処理状態に遷移する。
【００５７】
〔状態遷移（９）〕
高頻度命令の伸長処理において、状態遷移（５）と同様、“（ＲＯＭＲＤＹ１ ＆ ＾ＮＣＴ）＝１”で表されるように、ＮＣＴ端子に入力されるバイトが通常命令以外のコードである場合、高頻度命令の伸長処理状態に遷移する。
【００５８】
ここで、上記のように構成されるメモリ制御システム１のプログラム転送の動作について説明する。
【００５９】
まず、ＣＰＵ４がリセットされると、ＣＰＵ４がバスアクノリッジ信号ＢＡＣＫを“Ｌ”とするので、３ステートバッファ６がデータバス２１をＣＰＵ４側に接続するとともに、３ステートバッファ７がアドレスバス２２をＣＰＵ４側に接続する。これにより、ＣＰＵ４は、プログラムメモリ２から非圧縮プログラムを読み出すように、リードアドレスをプログラムメモリ２に与える。すると、非圧縮プログラムがプログラムメモリ２からＣＰＵ４に読み出され、ＣＰＵ４により実行される。
【００６０】
非圧縮プログラムは、実行が終了すると、リードＤＭＡＣ１２を起動させるように規定されている。これにより、ＣＰＵ４の起動処理が終了すると、リードＤＭＡＣ１２は、起動して、ＣＰＵ４からバス権を取得するように、バスリクエスト信号ＢＲＥＱを“Ｈ”とする。すると、ＣＰＵ４はバスアクノリッジ信号ＢＡＣＫを“Ｈ”として、リードＤＭＡＣ１２へバス権を譲渡する。このとき、３ステートバッファ６はデータバス２１をＣＰＵ４側と切り離し、３ステートバッファ７はアドレスバス２２をＣＰＵ４側と切り離す。また、３ステートバッファ１０はデータバス２１をＦＩＦＯメモリ９とメモリコントローラ１１側とで接続する。
【００６１】
この状態で、リードＤＭＡＣ１２は、プログラムメモリ２にリードアドレスを与え、圧縮プログラムをパイプライン回路８に読み出す。パイプライン回路８では、圧縮プログラムの伸長処理がパイプライン処理で行われ、圧縮プログラムが圧縮前のプログラムに復元される。これにより、伸長処理が並列化されるので、並列処理に要する時間が短縮され、伸長処理の速度を圧縮プログラムの入力速度に合わせることができる。したがって、圧縮プログラムを間断なく読み出すことができる。
【００６２】
パイプライン回路８で伸長（復元）されたプログラムは、ＦＩＦＯメモリ９に一時的に蓄えられる。このとき、ライトＤＭＡＣ１３は、“Ｈ”のバスアクノリッジ信号ＢＡＣＫにより起動状態にあるので、ＦＩＦＯメモリ９からの出力制御信号ＯＣが“Ｌ”となる期間に、ＦＩＦＯメモリ９からプログラムの読み出しを行う。また、ライトＤＭＡＣ１３は、併せてリードアドレスをメモリコントローラ１１に出力する。読み出されたプログラムは、３ステートバッファ１０を介してメモリコントローラ１１に出力され、メモリコントローラ１１によって、メインメモリ３のリードアドレスに指定された領域に書き込まれる。パイプライン回路８で伸長されたプログラムを一旦ＦＩＦＯメモリ９に蓄えることにより、パイプライン回路８の出力のバンド幅が動的に変化しても、それを吸収することができる。
【００６３】
続いて、パイプライン回路８における伸長動作について説明する。
【００６４】
まず、プログラムメモリ２から読み出された圧縮プログラム（リードデータ）はセレクタ８１に入力される。また、このとき、カウンタ１４は、図５に示すように、ベースクロック信号ＢＣＬＫをカウントしており、ＡＮＤゲート１５は、カウンタ１４がカウントの開始から４クロック分カウントした出力により、“１”となるレディ信号ＲＤＹを出力する。これにより、セレクタ８１は、リードデータを選択して出力する。このときのベースクロック信号ＢＣＬＫのクロックを第１クロックＣＬ１とする。
【００６５】
また、レディ信号ＲＤＹが“１”となるとき、リードＤＭＡＣ１２からのリセット信号ＲＳＴがベースクロック信号ＢＣＬＫの１クロック分“０”となることにより、カウンタ１４がリセットされ、ベースクロック信号ＢＣＬＫのカウントが再開される。このリセット信号ＲＳＴは、ＮＯＲゲート８６にも入力されている。また、ＮＯＲゲート８６には、プログラムメモリ２からの８ビットのリードデータが入力される。
【００６６】
当該リードデータが通常命令である場合、最初の第１バイトがＮＯＲゲート８６を介してレジスタ８３に入力される。また、リードデータが高頻度命令である場合、その１バイトがＮＯＲゲート８６を介してレジスタ８３に入力される。このＮＯＲゲート８６の出力は、前述の第１クロックＣＬ１に続く第２クロックＣＬ２のタイミングで、レディ信号ＲＤＹおよびセレクタ８１からのリードデータとともにレジスタ８３に保持される。このように、セレクタ８１の出力、ＮＯＲゲート８６の出力およびレディ信号ＲＤＹがレジスタ８３に保持されるまでの工程が第１ステージとなる。
【００６７】
レジスタ８３に保持されたリードデータは、上記の第２クロックＣＬ２に続く第３クロックＣＬ３のタイミングで、レジスタ８４に保持される。また、レジスタ８３に保持されたＮＯＲゲート８６の出力（リードデータ）とレディ信号ＲＤＹ（“１”）とは、それぞれステートマシン８７のＲＯＭＲＤＹ１端子とＮＣＴ端子とに入力される。ステートマシン８７では、上記の第３クロックＣＬ３のタイミングで、ＮＣＥＮ端子、ＷＲＴＥＮ端子およびＴＢＬＡＤＲ端子のそれぞれの値が決定される。
【００６８】
このように、第１ステージの終わりから、圧縮プログラムのレジスタ８４への保持、ならびにステートマシン８７によるＮＣＥＮ端子、ＷＲＴＥＮ端子およびＴＢＬＡＤＲ端子の各値の決定までの工程が第２ステージとなる。
【００６９】
テーブルＲＯＭ８８では、レジスタ８４に保持された８ビットのリードデータと、上記のＴＢＬＡＤＲ端子の２ビットの値とが与えられる。これらの１０ビットからなるテーブルアドレス（Ａ９−Ａ０）で指定された領域に格納された伸長コード（復元値）が伸長されたプログラム、すなわち出力データ（Ｄ７−Ｄ０）としてセレクタ８２に出力される。
【００７０】
セレクタ８２は、Ｓ端子の値（ＮＣＥＮ端子の値）が“０”であることから、テーブルＲＯＭ８８からの出力データを選択してレジスタ８５に出力する。この出力データは、上記の第３クロックＣＬ３に続く第４クロックＣＬ４のタイミングで、ステートマシン８７から書込制御信号として出力されるＷＲＴＥＮ端子の値とともにレジスタ８５に保持される。そして、レジスタ８５に保持された出力データ（プログラム）がＦＩＦＯメモリ９に書き込まれる。
【００７１】
このように、第２ステージの終わりから、テーブルＲＯＭ８８からのデータ出力およびセレクタ８２から出力のレジスタ８５への保持までの工程が第３ステージとなる。
【００７２】
上記のような第１ないし第３ステージの処理が行われることにより、高頻度命令の場合、第１〜第４クロックＣＬ１〜ＣＬ４からなる１サイクルで１つの高頻度命令が伸長されてＦＩＦＯ９に書き込まれる。また、通常命令の場合は、第１クロックＣＬ１の期間に読み出された第１バイトが、続く第２〜第４クロックＣＬ２〜ＣＬ４の期間で、それぞれレジスタ８３〜８５に保持され、第２〜第４バイトも同様にして読み出されて保持される。したがって、第１〜第４クロックＣＬ１〜ＣＬ４からなるサイクルが５回繰り返されることにより、５バイト分の１つの通常命令がＦＩＦＯ９に書き込まれる。
【００７３】
ここで、パイプライン回路８における並行処理について説明する。
【００７４】
上記の第１ステージでリードデータのレジスタ８３への取り込みが行われている第２クロックＣＬ２の期間では、カウンタ１４がベースクロック信号ＢＣＬＫのカウントを再開しており、４クロック分のカウントに達していないことから、ＡＮＤゲート１５の出力であるレディ信号ＲＤＹが“０”となる。このため、リードＤＭＡＣ１２からリードデータが読み出されない。また、セレクタ８１のＳ端子が“０”となるので、今回の第１ステージでは、前回の第１ステージでレジスタ８３に保持されているリードデータがセレクタ８３を介してレジスタ８３に入力され、第３クロックＣＬ３のタイミングで再び保持される。今回の第２ステージにおいても、ＲＯＭＲＤＹ１端子の値が“０”となることから、高頻度命令の伸長処理の場合、リードデータステートマシン８７では、第４クロックＣＬ４のタイミングでＴＢＬＡＤＲ端子の値に１が加算される（状態遷移（６））。
【００７５】
今回の第３ステージにおいて、テーブルＲＯＭ８８に入力されるＡ０，Ａ１が１つ増加することから、テーブルアドレスが変更される。これにより、前回の第３ステージにおいてテーブルＲＯＭ８８から読み出された伸長コードと異なる領域に格納された伸長コードがセレクタ８２から出力されて、次のサイクルの第１クロックＣＬ１のタイミングでレジスタ８５に保持され、さらにＦＩＦＯメモリ９に書き込まれる。
【００７６】
このように、高頻度命令の場合は、カウンタ１４によるベースクロック信号ＢＣＬＫのカウントが４クロック分のカウントに達するまで、ステートマシン８７では、ＴＢＬＡＤＲ端子の値に１が順次加算されていくので、リードデータの読み出しがない第２〜第４クロックＣＬ２〜ＣＬ４の期間でも、異なる出力データがテーブルＲＯＭ８８から読み出される。
【００７７】
このように、第１ないし第３ステージの処理が、ベースクロック信号ＢＣＬＫのタイミングに基づいて繰り返して並行的に行われるので、プログラムメモリ２からの圧縮プログラムの読み出しが滞ることなく、伸長処理を行うことができる。したがって、圧縮プログラムが１／Ｎに圧縮されている場合、圧縮されていない場合に比べて、ほぼＮ倍の速度でプログラムメモリ２からメインメモリ３へのプログラムの転送を行うことができる。
【００７８】
なお、本実施の形態では、圧縮プログラムの符号化をハフマン符号化法を用いた例について説明しているが、圧縮プログラムの符号化方法についてはハフマン符号化法に限定されず、他の可逆型の圧縮符号化法を用いることも可能である。
【００７９】
本発明は、上述した実施形態に限定されるものではなく、請求項に示した範囲で種々の変更が可能である。すなわち、請求項に示した範囲で適宜変更した技術的手段を組み合わせて得られる実施形態についても本発明の技術的範囲に含まれる。
【産業上の利用可能性】
【００８０】
本発明のメモリ制御システムは、可逆的に圧縮されたプログラムを低速メモリデバイスから読み出し、パイプライン処理で伸長して高速メモリデバイスに転送するので、圧縮プログラムの伸長処理が遅いために、圧縮プログラムの入力に間に合わなくなることが回避され、低速メモリデバイスから高速メモリデバイスへ高速でプログラムを転送することができる。このため、本メモリ制御システムを含むシステムの動作の高速化を図ることに好適に利用できる。
【図面の簡単な説明】
【００８１】
【図１】本発明の実施形態に係るメモリ制御システムの構成を示すブロック図である。
【図２】上記メモリ制御システムにおけるパイプライン回路の構成を示すブロック図である。
【図３】上記パイプライン回路におけるステートマシンで実行される処理の遷移状態を示す図である。
【図４】上記パイプライン回路におけるテーブルＲＯＭにおけるデータ格納の構成を示す図である。
【図５】上記パイプライン回路の動作を示すタイミングチャートである。
【符号の説明】
【００８２】
１    メモリ制御システム
２    プログラムメモリ（第１メモリ装置）
３    メインメモリ（第２メモリ装置）
４    ＣＰＵ
５    転送回路
８    パイプライン回路（伸長回路）
【図１】
2010086321.tif 000003
【図２】
2010086321.tif 000004
【図３】
2010086321.tif 000005
【図４】
2010086321.tif 000006
【図５】
2010086321.tif 000007