DRAMのようなメモリだけでなく、様々なコントローラのレジスタもアドレス上に存在するI/O操作方法をメモリマップI/Oという。
めんどい処理はシリアル・コントローラに投げるのだが、肝心の渡したいデータはシリアル・コントローラで湧きでるでもなくCPUが渡すし、送信・受信といった制御(このあと具体的に何を制御するか出てくると思う)はCPUから指定できないとどんな通信するんだか選択もできない。
ということでシリアル・コントローラに対して上記を実施するためのなんらかの方法が必要になる。
コントローラの持つレジスタを媒介にしてデータを受け渡すとのこと。
で、レジスタへのアクセス方法は?
レジスタ…ここ
■本の説明の段取り
DRAMのアドレス参照を紹介しシリアル・コントローラのレジスタ参照もその延長上のお話ですということを示しています。
【アドレス】
まずアドレスという概念を理解することが必要。
おなじみと言えばおなじみなのだがデータが置いてあるメモリの位置情報のこと。
【CPUはメモリにアドレス使って参照】
CPUが出力ピンとしてアドレスバスというのもあるのだが、アドレス指定をするためにCPUが持っている出力ピンのこと。
CPUの外部にあるDRAM上のデータを読み書きする際に、どの位置のデータを読みたいのかをDRAMに通知する必要があるり、アドレス・バスによってDRAMにアドレスを通知することで、指定した位置のデータを読み書きすることができる。
アドレスバスが32ビットならば約43億倍とのメモリの位置(メモリ空間)にアクセス可能。
【段取り】
①1つのDRAMチップをCPUでつなげた時について
"CPUはメモリにアドレス使って参照"で挙げたようなDRAM上へのアクセスするベースとなる考え方を説明。
②複数のDRAMチップをCPUにつなげた時について
同じDRAMを複数繋げた場合、それぞれのDRAMでのアドレス配置が同じなので、どのDRAMのアドレスに対してアクセスしているかの情報も付加しないとアドレスを識別できないという課題を出したうえで、CS(チップセレクト),CE(チップエナブル)という信号ピンを保持しており複数DRAMがあっても自分がどのように識別されるかを判別されるようにしている。回路上ではDRAM毎、CS/CEに、比較機(コンパレータ)がくっついていて自分向けのDRAMへのアクセスかを判別してそうであれば、CE/CEに対して1の信号を出すような回路を設ける。
⇒そうであるとすると、DRAMとCPUとマザーボード(比較機)の組み合わせは規定されたものでないといけない気がするなぁ★
アドレス指定とDRAMの対応は以下の通り。
アドレス指定(赤文字部分は上位12ビット) 動作する(CSが有効になる)DRAM
0x00000000~0x000fffff DRAM1
0x00100000~0x001fffff DRAM2
0x00200000~0x002fffff DRAM3
0x00300000~0x003fffff DRAM4
比較機(コンパレータ)…ここ
どのDRAMにアクセスしているかの情報の付加も含めてアドレスとして扱い、とにかくぶつからないようにする工夫をしている。これを「DRAMチップは0x00000000~0x003fffffのアドレスにマッピングされている」という。
③複数のDRAMチップとシリアル・コントローラをCPUにつなげた時について
シリアルコントローラは制御用に1ビットのレジスタを16個持っているとのこと。
4ビットのアドレスバスを持っていれば16個のレジスタを識別可能。
アドレス指定とシリアル・コントローラのレジスタの対応は以下の通り。
0x10000000 レジスタ1
0x10000001 レジスタ2
0x10000002 レジスタ3
0x10000003 レジスタ4
0x10000004 レジスタ5
0x10000005 レジスタ6
0x10000006 レジスタ7
0x10000007 レジスタ8
0x10000008 レジスタ9
0x10000009 レジスタ10
0x1000000a レジスタ11
0x1000000b レジスタ12
0x1000000c レジスタ13
0x1000000d レジスタ14
0x1000000e レジスタ15
0x1000000f レジスタ16
結論としてはDRAMとシリアルコントローラのレジスタも比較機のおかげでCPUから識別可能ということでアクセス可能でそのような仕組みをメモリマップドI/Oという。
めんどい処理はシリアル・コントローラに投げるのだが、肝心の渡したいデータはシリアル・コントローラで湧きでるでもなくCPUが渡すし、送信・受信といった制御(このあと具体的に何を制御するか出てくると思う)はCPUから指定できないとどんな通信するんだか選択もできない。
ということでシリアル・コントローラに対して上記を実施するためのなんらかの方法が必要になる。
コントローラの持つレジスタを媒介にしてデータを受け渡すとのこと。
で、レジスタへのアクセス方法は?
レジスタ…ここ
■本の説明の段取り
DRAMのアドレス参照を紹介しシリアル・コントローラのレジスタ参照もその延長上のお話ですということを示しています。
【アドレス】
まずアドレスという概念を理解することが必要。
おなじみと言えばおなじみなのだがデータが置いてあるメモリの位置情報のこと。
【CPUはメモリにアドレス使って参照】
CPUが出力ピンとしてアドレスバスというのもあるのだが、アドレス指定をするためにCPUが持っている出力ピンのこと。
CPUの外部にあるDRAM上のデータを読み書きする際に、どの位置のデータを読みたいのかをDRAMに通知する必要があるり、アドレス・バスによってDRAMにアドレスを通知することで、指定した位置のデータを読み書きすることができる。
アドレスバスが32ビットならば約43億倍とのメモリの位置(メモリ空間)にアクセス可能。
【段取り】
①1つのDRAMチップをCPUでつなげた時について
"CPUはメモリにアドレス使って参照"で挙げたようなDRAM上へのアクセスするベースとなる考え方を説明。
②複数のDRAMチップをCPUにつなげた時について
同じDRAMを複数繋げた場合、それぞれのDRAMでのアドレス配置が同じなので、どのDRAMのアドレスに対してアクセスしているかの情報も付加しないとアドレスを識別できないという課題を出したうえで、CS(チップセレクト),CE(チップエナブル)という信号ピンを保持しており複数DRAMがあっても自分がどのように識別されるかを判別されるようにしている。回路上ではDRAM毎、CS/CEに、比較機(コンパレータ)がくっついていて自分向けのDRAMへのアクセスかを判別してそうであれば、CE/CEに対して1の信号を出すような回路を設ける。
⇒そうであるとすると、DRAMとCPUとマザーボード(比較機)の組み合わせは規定されたものでないといけない気がするなぁ★
アドレス指定とDRAMの対応は以下の通り。
アドレス指定(赤文字部分は上位12ビット) 動作する(CSが有効になる)DRAM
0x00000000~0x000fffff DRAM1
0x00100000~0x001fffff DRAM2
0x00200000~0x002fffff DRAM3
0x00300000~0x003fffff DRAM4
比較機(コンパレータ)…ここ
どのDRAMにアクセスしているかの情報の付加も含めてアドレスとして扱い、とにかくぶつからないようにする工夫をしている。これを「DRAMチップは0x00000000~0x003fffffのアドレスにマッピングされている」という。
③複数のDRAMチップとシリアル・コントローラをCPUにつなげた時について
シリアルコントローラは制御用に1ビットのレジスタを16個持っているとのこと。
4ビットのアドレスバスを持っていれば16個のレジスタを識別可能。
アドレス指定とシリアル・コントローラのレジスタの対応は以下の通り。
0x10000000 レジスタ1
0x10000001 レジスタ2
0x10000002 レジスタ3
0x10000003 レジスタ4
0x10000004 レジスタ5
0x10000005 レジスタ6
0x10000006 レジスタ7
0x10000007 レジスタ8
0x10000008 レジスタ9
0x10000009 レジスタ10
0x1000000a レジスタ11
0x1000000b レジスタ12
0x1000000c レジスタ13
0x1000000d レジスタ14
0x1000000e レジスタ15
0x1000000f レジスタ16
結論としてはDRAMとシリアルコントローラのレジスタも比較機のおかげでCPUから識別可能ということでアクセス可能でそのような仕組みをメモリマップドI/Oという。