ディジタル回路 第1回 ガイダンス、CMOSの基本回路

Similar documents
計算機アーキテクチャ

MIPSのマイクロアーキテクチャ

-2 外からみたプロセッサ GND VCC CLK A0 A1 A2 A3 A4 A A6 A7 A8 A9 A10 A11 A12 A13 A14 A1 A16 A17 A18 A19 D0 D1 D2 D3 D4 D D6 D7 D8 D9 D10 D11 D12 D13 D14 D1 MEMR

スライド 1

ディジタル回路 第1回 ガイダンス、CMOSの基本回路

arduino プログラミング課題集 ( Ver /06/01 ) arduino と各種ボードを組み合わせ 制御するためのプログラミングを学 ぼう! 1 入出力ポートの設定と利用方法 (1) 制御( コントロール ) する とは 外部装置( ペリフェラル ) が必要とする信号をマイ

計算機アーキテクチャ

Microsoft PowerPoint - kougi7.ppt

MW100 Modbusプロトコルによるデータ通信の設定について

PowerPoint プレゼンテーション

アナログ・接点変換器

スライド 1

MODBUS ユーザーズマニュアル 페이지 1 / 23

マウス操作だけで本格プログラミングを - 世界のナベアツをコンピュータで - プログラムというと普通は英語みたいな言葉で作ることになりますが 今回はマウスの操作だけで作ってみます Baltie, SGP System 操作説明ビデオなどは 高校 情

COMET II のプログラミング ここでは機械語レベルプログラミングを学びます 1

CommCheckerManual_Ver.1.0_.doc

書式に示すように表示したい文字列をダブルクォーテーション (") の間に書けば良い ダブルクォーテーションで囲まれた文字列は 文字列リテラル と呼ばれる プログラム中では以下のように用いる プログラム例 1 printf(" 情報処理基礎 "); printf("c 言語の練習 "); printf

ソフトウェア基礎技術研修

コンピュータ工学Ⅰ

ソフトウェア基礎技術研修

命令セットの構成例 a) 算術 演算命令 例 )ADD dest, source : dest dest + source SUB dest, source : dest dest - source AND dest, source : dest dest AND source SHR reg, c

PowerPoint プレゼンテーション

QuartusII SOPC_Builderで利用できるGPIF-AVALONブリッジとは?

Microsoft Word - FCTT_CS_Mod( )Jver1.doc

また RLF 命令は 図 2 示す様に RRF 命令とは逆に 各ビットを一つずつ 左方向に回転 ( ローテイト ) する命令である 8 ビット変数のアドレスを A とし C フラグに 0 を代入してから RLF A,1 を実行すると 変数の内容が 左に 1 ビットシフトし 最下位ビット (LSB)

PLCシリアル通信 MODBUS通信 データ送信/受信プログラム例

本書は INpMac v2.20(intime 5.2 INplc 3 Windows7/8/8.1に対応 ) の内容を元に記載しています Microsoft Windows Visual Studio は 米国 Microsoft Corporation の米国及びその他の国における登録商標です

2.RL78 での割り込み処理 ( 割り込み受け付け ) マスクが解除された (xxmk ビットが 0 の ) 割り込み要求信号は 2 つの用途で使用されます 一つ目は,CPU のスタンバイ状態の解除です この動作は, 割り込み優先順位とは全く無関係で, マスクされていない (xxmk=0 の )

2ALU 以下はデータ幅 4ビットの ALU の例 加算, 減算,AND,OR の4つの演算を実行する 実際のプロセッサの ALU は, もっと多種類の演算が可能 リスト 7-2 ALU の VHDL 記述 M use IEEE.STD_LOGIC_1164.ALL; 00 : 加算 use IEE

Microsoft PowerPoint - No6note.ppt

QuartusII SOPC_Builderで利用できるGPIF-AVALONブリッジとは?

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

Microsoft Word - CygwinでPython.docx

Microsoft Word - VBA基礎(6).docx

Microsoft PowerPoint - OS07.pptx

TFTP serverの実装

Microsoft PowerPoint - Sol7 [Compatibility Mode]

Arduino をドリトルから 制御する教材の試行 鈴木裕貴 1

TopSE並行システム はじめに

文字コード略歴 よこやままさふみ社内勉強会 2012/05/18 文字コード略歴 Powered by Rabbit 2.0.6

目次 1 I2Cとは 13 結線写真 2 センサの多くがI2Cに対応 14 WHO_AM_I 3 マイコンでのI2C通信例 15 I2C読込みプログラム 4 とは 16 I2C読込みスクリプト概要① 5 タイミングパラメータ 17 I2C読込みスクリプト概要② 6 書込み 18 センサ読込みプログラ

Microsoft Word Proself-guide4STD+Prof.docx

WAGO / / Modbus/RTU対応 バスカプラ クイックスタートガイド

VLSI工学

User Support Tool 操作ガイド

Microsoft PowerPoint - Chap4 [Compatibility Mode]

メソッドのまとめ

PowerPoint プレゼンテーション

- VHDL 演習 ( 組み合せ論理回路 ) 回路 半加算器 (half adder,fig.-) 全加算器を構成する要素である半加算器を作成する i) リスト - のコードを理解してから, コンパイル, ダウンロードする ii) 実験基板上のスイッチ W, が, の入力,LED, が, の出力とな

ex05_2012.pptx

Microsoft PowerPoint - 7.Arithmetic.ppt

Microsoft PowerPoint - フェリカ通信仕様書_

データ収集用 NIM/CAMAC モジュールマニュアル 2006/5/23 目次 クレート コントローラ CC/ NIM ADC 1821 (Seiko EG&G)...3 ADC インターフェイス U デッドタイム

電子13-06 エネメータ専用ソフト SAVER CAST for EneMeter Ver3.00設定方法.ppt

論文番号 分 2-2 平成 24 年度全国情報技術教育研究会第 41 回全国大会 ( 新潟大会 ) Xbee を活用した無線通信の研究 期日平成 24 年 8 月 9 日 ( 木 )~10 日 ( 金 ) 場所長岡市シティホールプラザ アオーレ長岡 香川県立三豊工業高等学校 電子科 本行

Microsoft Word - XPC4ソフトマニュアル.doc

Windows10の標準機能だけでデータを完全バックアップする方法 | 【ぱそちき】パソコン初心者に教えたい仕事に役立つPC知識

Nios II - PIO を使用した I2C-Bus (2ワイヤ)マスタの実装

回路 7 レジスタ ( 同期イネーブル及び非同期リセット付 ) 入力データを保持するのに用いる記憶素子 使用用途として, マイクロプロセッサ内部で演算や実行状態の保持に用いられる Fig4-2 のレジスタは, クロック信号の立ち上がり時かつ 信号が 1 のときに外部からの 1 ビットデータ R をレ

内容 1. APX-3302 の特長 APX-3312 から APX-3302 へ変更するためには 差分詳細 ハードウェア ハードウェア性能および仕様 ソフトウェア仕様および制限 Ini ファイルの設

SiTCP ユーティリティユーザガイド 2014 年 6 月 18 日 0.73 版 Bee Beans Technologies 1

Transcription:

1

CPU が外部とデータをやり取りするための装置を I/O と呼びます データをやりとりするため 一時的にデータを蓄えておくレジスタを持っています これをバッファと呼ぶ場合があります I/O は繋ぐ対象によって動作が様々なので授業で扱うのが難しいです しかし どの I/O も 1 まず CPU と接続しなければならず 2 外部とデータ転送を行わなければならないです なので この 2 点について押さえておこうと思います 後はあなたの扱う I/O 毎に個別の勉強するしかないです 2

まず CPU から I/O を扱う方法としてメモリマップト I/O とプログラムド I/O があります メモリマップト I/O では データメモリと同じアドレス空間に I/O のレジスタを割り当て メモリを読み書きするのと同じ LD,ST 命令を使ってレジスタを読み書きします どんな CPU にでも接続でき I/O のために特殊な命令やバスを設ける必要がないという利点がある一方 I/O のレジスタの領域は比較的小さいので 使われない領域が無駄になりやすい点が問題です 3

これに対してプログラムド I/O は IN 命令 OUT 命令など専用の命令で I/O に読み書きをします IN 0, OUT 1 など I/O 番号を指定しますが これはすなわちメモリから独立したアドレス ( 番地 ) 空間を持っているということに他ならないです この方式は バスもメモリと独立している Isolate I/O とバスは共通で番地空間だけ分ける Separate I/O を分けて考える人も居ますが あまりこだわらない人も居ます そもそもプログラムド I/O という名前もさほど一般的ではありません ( でも正式にはこう言うらしいです ) この方法は 独立した番号の空間があるので メモリ領域を無駄遣いしない利点がありますが 専用命令が必要です ちなみにバスが独立しているものは メモリのアクセスと I/O のアクセスを同時に行なうことができます 4

両者の特徴をまとめてみましょう どのような CPU でも使えるメモリマップト I/O が最近は標準的に使われます 個別的なバスは標準バスに対応できないためです このため Intel 86 系の CPU はプログラムド I/O 用の命令を持っていても実際にはメモリマップト I/O で動いている場合がほとんどです プログラムド I/O は主として信号処理用プロセッサ DSP や制御用のマイクロコントローラで用いられ 複数のバスを使って I/O 間で高速なデータ転送を行えるものもあります 5

I/O デバイスは データレジスタ コントロールレジスタ ステータスレジスタの三種類のレジスタを持っています データレジスタは CPU が読み書きする場合 一時的にデータを保存しておく場所です 入力用のデータレジスタと出力用のデータレジスタは同じ番地に割り当てられており 書き込むと出力され 読み出すと入力される場合もあります ステータスレジスタは I/O の状態を覚えておく場所で データが到着したり データを送り終わったりしたことを示す情報を持っています 基本的には読み出し専用です コントロールレジスタは I/O に対する指示を記憶する場所です Ethernet コントローラなどの動作が複雑な I/O では 多数のコマンドレジスタを持っています 基本的には書き込み専用です このため ステータスレジスタと同じ番地を割り当て 読むとステータスレジスタ 書くとコマンドレジスタとして使われる場合もあります 6

古典的な I/O として UART 8251 を紹介しましょう この I/O は パラレル / シリアル変換用で CPU からのデータを直列に すなわち時間的に順番に出力し 直列に入力されたデータを CPU の並列データとして受け取ります 5bit-8bit 単位のデータを 10Mbps(bit per second) という遅い転送レートで送ります 昔 データを音に変換して電話で交信するモデムという装置が使われたときの規格である RS232C 用に作られました RS232C は モデムがなくなった後も簡単な端末用のインタフェースとして使われ 今でもその簡便さから遅くも良いインタフェースとして用いられます 8251 は今でも FPGA 内で IP(Intellectual Property: 出来合いの回路 ) として使われます 7

シリアル転送はまず Start bit として一定の時間 0 を送ります 次に順に 5 ビットから 8 ビットのデータを転送し 最後にパリティを送った後にストップビットを一定の時間 1 にして送ります パリティは偶数パリティ 奇数パリティを選択可能で ストップビットも長さを選択可能です 8

この 8251 のコントロールレジスタとステータスレジスタを紹介します コントロールレジスタは パリティの選択 データ長の選択を行ないます パリティ (Parity) とは 1 ビットの誤り検出符号で データ内の 1 の個数を偶数または奇数にそろえることにより 1 ビットエラーの検出を行ないます 偶数パリティを例に取って説明します データ内の 1 の個数が偶数ならば Parity bit を 0 とし 奇数ならば Parity bit を 1 とします Parity bit を含めた全体のデータの 1 の個数は常に 1 になるので 1 の数が奇数のデータを受け取ったら誤りがあったことに気づくことができます 8251 では PEN=1 でパリティを使う設定にし EP=1 ならば偶数パリティ 0 ならば奇数パリティに設定できます ステータスレジスタは フラグを含みます ここでは 0 ビット目が TxRDY でここが 1 ならば 送信用のバッファが空いていて書き込み可能であることを示します 1bit 目は RxRDY でここが 1 ならば 受信が終わって 受信バッファ内に有効なデータがあることを示します これらはハンドシェイクに使います 9

ハンドシェイクとは 送信側と受信側が同期を取って取りこぼしなくデータを転送するのに使われる方法です 送信を例に取って示しましょう CPU がステータスレジスタを読んで TxRDY が 1 ならば バッファが空いているので ここにデータを書き込みます すると TxRDY が 0 になります ( 正確にはダブルバッファなので動きが多少違うのですが ) TxRDY のようにバッファの状態を示す 1 ビットの情報をフラグ ( 旗 ) と呼びます 分岐命令の条件を示すフラグと機能は同じです 10

CPU は TxRDY=0 の時は バッファ内のデータはまだ転送が終わっていないので 待ち状態になります 外部にあるモデム装置 ( あるいは端末 ) は TXRDY=0 でデータが書き込まれたことが分かり 受信状態になりシリアルにデータが転送されます 11

データの転送が終わると TxRDY=1 になります CPU はこれを検出して次のデータを書き込みます このようにして書き潰しを起こすことなく データを転送することができます このような同期操作をフラグを使ったハンドシェイク ( 握手 ) と呼びます 12

受信の時はこの逆になります 外部のモデム装置は RxRDY が 0 であることを確認してバッファにデータを書き込みます CPU は RxRDY が 1 になると データが受信されたことが分かるので バッファからデータを読み出します この操作でフラグは 0 になりますので モデム装置は次のデータを書き込みます 13

フラグを使うことで 読み出し 書き込み間の障害 ( ハザード ) を防ぐことができます 一般的にハザードは 3 種類あります Read After Write(RAW) ハザードは ちゃんと値を書き込まれるのを待って読み出すことで これがおきると同じデータを間違って複数回読んでしまう問題が起きます 一方 Write After Read (WAR) ハザードは 読む前に書いてしまう問題で これは書き潰しを起こしてデータが消失してしまう問題です Write After Write (WAW) ハザードは書き込む順番が狂う問題で 単純な入出力では考えなくてもいいです これらのハザードは パイプライン処理でも起こるのでその際にまた解説します 14

さて ここまでで I/O について紹介しましたが いくつか問題があります I/O データは 8 ビットの ASCII コードや数ビットのフラグが多いので 32 ビットデータのうちの一部しか使っていません これはもったいないので 実は今のコンピュータは 8 ビット単位のバイトアドレッシングを用いています これについて紹介します 次に ビジーウェイト中 CPU は無駄にループを回っていて馬鹿みたいです この問題を解決するための手法として割り込みを紹介します 15

I/O データなどを扱う上での無駄を防ぐために 最近の CPU は 32 ビットではなく 8 ビット単位で番地が振られています すなわち 32 ビットは番地 4 つ分に当たります ここで 桁の大きい方から 0,1 と振っていく方法と小さい方から 0,1 と振っていく方法の二つが考えられます 前者を Big Endian, 後者を Little Endian と呼びます ここでは以降 Big Endian で番号を振ることにします この振り方は統一が取れておらず コンピュータ間でデータを交換する際にトラブルの元となります 最近の CPU は電源投入時の指定でどちらの方法を取ることもできるものが多いです MSB 側から 0 を振っていくと 大きい方で端 (LSB: end) に達することから Big Endian, LSB 側から 0 を振っていくと小さい方で端に達することから Little Endian という名前になっていることが分かります Endian とは奇妙な英語ですが これはこの言葉が ガリバー旅行記の卵の細い方から割る派 (Little Endian) と太い方から割る派 (Big Endian) で内乱が起きる話に由来するためです 16

では バイトデータを扱う命令を定義しましょう lb は指定されたアドレスの 8 ビットを読み出して レジスタの下位 8bit に置きます 上位 24bit は符号拡張されます RISC では CPU の内部ではデータのサイズを統一してしまうのが普通です この場合も読み出す際に 32 ビットに拡張します lb は lw と同じ R 型で定義します ちなみに MIPS では 16 ビットデータを読み出して 32 ビットに拡張する lh(load Halfword) もあります 最近の文字コードは 16 ビットが多いので 案外 16 ビットデータは利用価値が高いためです ただし ここでは実装が面倒なので省略してあります 17

I/O は符号無しのデータを扱うことも多いので ゼロ拡張の 8bit 読み出し命令も用意しておくのが普通です これが lbu(load Byte Unsigned) で 上位 24 ビットには 0 が入ります MIPS には 16 ビットの Load 命令 lhu(load half word unsigned) もありますが ここでは省略します 18

逆にレジスタ中の値を 8 ビット単位でメモリに書き込む命令が sb(store Byte) です この命令はレジスタの下位 8 ビットを指定されたメモリの番地に書き込みます 上位 24 ビットは無視されます 上位の情報がなくなっても困らないようにするのはプログラマの責任です ちなみに sb はデータのサイズが減る方向なので sbu とかを作る必要はありません 19

バイトアドレッシングのメモリを lw,sw 命令で扱った場合 4 の倍数の番地から読めば問題はありません メモリ中のバイトの順番でそのままデータがレジスタに読み込まれます しかし奇数番地から読んだらどうなるでしょう この例では 1 番地の 8 ビットを上位にもってきて 2 番地の 8 ビットを下位にもってきてくっつける必要があります このように 16 ビット 32 ビット 64 ビットのデータがバイトアドレッシングの境界にうまく整列していない問題をミスアラインメントと呼びます 20

ミスアラインメントを許すかどうかは難しい問題です 命令コードでは許さないのが普通です データについては悩ましいです ミスアラインメントは 32 ビットのデータをアクセスするのにメモリを 2 回に分けてアクセスするため 性能面では不利です メモリ周辺のハードウェアも複雑になります 利点はメモリ利用効率が向上することですが ミスアラインメントを許すことによるメモリの容量の効率化は効果がさほど大きくないです ミスアラインメントを許すのは 主として 既に普及してしまったコード ( レガシーコード ) で ミスアラインメントを許す状態でコンパイルしてしまったものをコンパイルしなおさなくても動くようにするため という要求に基づく場合が多いようです このため データについては許す場合と許さない場合があります ここでは両方共許さないことにします 21

では ここで演習用にディスプレイを想定します このディスプレイは ASCII コードを書き込むとその文字が出力されます ASCII コードとは 英数字 記号用の 8 ビットの文字コードで 国際的に広く使われています Linux 端末では man ascii で表示されます ここでは 簡単のため データレジスタを 0xa0000002 番地 ステータスレジスタを 0xa0000003 番地に割り当てます ディスプレイに対してデータは シリアルに転送され 表示には一定の時間が掛かります TxRDY がこの番地の最下位ビットに割り当てられており 送信完了で 1 になります 22

文字コードはコンピュータ上で文字を表すコードです 昔から使われているコードが ASCII コードで 7 ビット (8 ビット ) を使って英数 特殊文字を表現します ここではその一部を示します ここでは man ascii で表示するのがいいでしょう 23

この例題プログラムでは r0 に lui 命令を使って 0xa0000000 を入れてやります ディスプレースメントの機能を使ってデータを読んで (lb) は 0 だったら Loop に戻る (beq) 動作を繰り返します ちなみに andi は最下位 1 ビットのみを判定に使うために他のビットを無視するための操作であり これをマスクと呼びます この操作で TxRDY が 1 になるまで待ってやります このループから抜け出したということは TxRDY が 1 なので データを書き込むことができます ここでは A の文字をディスプレイに出力するために 0x41 をデータレジスタに書き込みます このように フラグが 1 になるまでループしてチェックを繰り返す操作をビジーウエイト (Busy Wait) あるいはポーリング (Polling) と呼びます 24

では今度は 演習用に入力装置を想定します ここでは外部から入力したデータを CPU 内部に読み込む装置を考えます 0a1000003 番地にステータスレジスタを割り当てます この最下位ビットに RxRDY を割り当て データ受信を完了するとここが 1 になるとします このとき 0xa1000002 番地を読むと 8 ビットのデータを読むことができます 25

では 1 文字読み出したデータを出力する例題をやってみましょう 読み出すときと出力するときの 2 回 Busy Wait が必要になっています ここではステータスレジスタの他のビットは 0 になるため マスク操作は省略できます 26

では今まで導入した命令の Verilog 記述を見て行きます 実用的な CPU のメモリ周辺回路はデータの引き回しが必要で面倒です まず 8 ビット単位のデータ書き込みを行うため write enable 信号 (memwrite) が 4 ビット必要です レジスタの下位 8 ビットから それぞれの位置にデータを引き回す必要がある点にご注意ください 27

他の部分は lb,sb は lw,sw と共通です 同様に 符号拡張をしたディスプレースメントとレジスタの値を加算して実効アドレスを求めます lb はレジスタへの書き込みを伴うので regwrite も 1 にする必要があります 28

メモリの所定の位置から アドレスに応じてレジスタの最下位 8 ビットにデータを移動します これは単に面倒なだけで 規則的な操作です 29

インフォ丸が教えてくれる今日のまとめです 今回はいろいろな言葉が出たので意味は理解しましょう 30

31

32