7/2 課題(論理回路シミュレータ)
使い方を学ぶ
Webブラウザ上で動く論理回路シミュレータSimcirJSを用いて,条件を満たす回路を作成します.
まずは,論理回路シミュレータ SimcirJS の使い方にしたがって,NAND素子の動作をトグルスイッチとLEDで確かめるところまで進みます.
A. 参考のページの Usage のところに更に詳しい使い方が書かれています.とりあえず,以下は論理回路シミュレータ SimcirJS の使い方に書かれていないのでためしてみてください.
- 「Double-Click a label to edit device name.」部品のラベル(「In」, 「Out」,「AND」などと書かれているところ) をダブルクリックすると,文字列を変更することができます.部品や入出力に名前をつけるのに使います.
- 「Double-Click a library to open the circuit inside.」部品の中で,RS-FFより下の部品は他の部品を組合せて作られています.そのような部品は,部品をダブルクリックすると中の部品の構成をみることができます.
- 「Ctrl+Click(Mac:command+Click) to toggle view (Live circuit or JSON data).」Ctrl+Click(Macの場合は command+Click)で,作成した回路を図で見るモードとテキストファイルで見るモードと切り替えることができます.今回は使いません.
次の図のような1ビット全加算器を作ってみます.(教科書では排他的論理和 (exclusive or) の素子を XOR という名前としていますが,この回路シミュレータでは EOR という名前が使われています.同様に教科書の EQ という素子は,ENOR という名前になっています.)
この動作が以下の真理値表と一致していることを確かめます.
x | y | cin | s | cout |
0 | 0 | 0 | 0 | 0 |
0 | 0 | 1 | 1 | 0 |
0 | 1 | 0 | 1 | 0 |
0 | 1 | 1 | 0 | 1 |
1 | 0 | 0 | 1 | 0 |
1 | 0 | 1 | 0 | 1 |
1 | 1 | 0 | 0 | 1 |
1 | 1 | 1 | 1 | 1 |
この論理回路シミュレータには,1ビット半加算器 HalfAdderという部品が用意されているので,それを使うと以下のように作ることができます.HalfAdderをダブルクリックしてみると,元の回路と同一であることがわかります.
更には,この論理回路シミュレータには,1ビット全加算器 FullAdderという部品が用意されているので,以下のように作っても構いません.
他の部品もダブルクリックして中身を確認したうえで,解答の際に自由に使って構いません..
ToggleスイッチやLEDの部品のラベルをx0や,r0などの名前に置き換えるのならば,In, Outの部品を使わなくても構いません.ただし,入出力のラベル(x0, r0など)は必ず使ってください.
課題
(1), (2)のうちのどちらかを選んで,回路を完成させ,真理値表,説明を加えて提出してください(オプション課題にも解答する人は(1),(2)の両方に解答しても構いません).
(1)2ビット加減算器
- 2ビットで表わされる0-3までの正の整数 xとyの加算,あるいは減算をおこないます.
- 入力は x0(xのビット0), x1(xのビット1), y0(yのビット0), y1(yのビット1), s(減算のとき1, 加算のとき0) の5ビットです.
- 出力は r0, r1, r2 の3ビット(計算結果のビット0, 1, 2)です.
- sが0の時は(正の整数の)加算器として動きます.x1 * 2 + x0 + y1 * 2 + y0 = r2 * 4 + r1 * 2 + r0 となるような出力が生成されます(rは 0-6の範囲の数なので3ビットの正の整数で表現可能です).
- sが1の時は減算器として動き,結果を2の補数で得ます.x1 * 2 + x0 - y1 * 2 - y0 を2の補数表現で表わします.すなわち,結果が正の時は,x1 * 2 + x0 - y1 * 2 - y0= r2 * 4 + r1 * 2 + r0 となるような出力が生成されます(rは 0-3の範囲の数なので3ビットの2の補数で表現可能).結果が正の時は,x1 * 2 + x0 - y1 * 2 - y0 + 4 = r2 * 4 + r1 * 2 + r0 となるような出力が生成されます(rは -3 <= r <= なので3ビットの2の補数で表現可能です).
(注) 受講者から指摘がありましたが,加算器として使ったときには,3ビットの2の補数(-4 <= x <= 3)では表せない範囲の数になることがあります.加算器として使う時は,結果を3ビットの正の数の2進表現を得るものとしてください.
真理値表(空いているところを埋めた表を作成して提出します)
s=0の時
x1 | x0 | y1 | y0 | r2 | r1 | r0 | 説明 |
0 | 0 | 0 | 0 | | | | 0+0 |
0 | 0 | 0 | 1 | | | | 0+1 |
0 | 0 | 1 | 0 | | | | 0+2 |
0 | 0 | 1 | 1 | | | | 0+3 |
0 | 1 | 0 | 0 | | | | 1+0 |
0 | 1 | 0 | 1 | | | | 1+1 |
0 | 1 | 1 | 0 | | | | 1+2 |
0 | 1 | 1 | 1 | | | | 1+3 |
1 | 0 | 0 | 0 | | | | 2+0 |
1 | 0 | 0 | 1 | | | | 2+1 |
1 | 0 | 1 | 0 | | | | 2+2 |
1 | 0 | 1 | 1 | | | | 2+3 |
1 | 1 | 0 | 0 | | | | 3+0 |
1 | 1 | 0 | 1 | | | | 3+1 |
1 | 1 | 1 | 0 | | | | 3+2 |
1 | 1 | 1 | 1 | | | | 3+3 |
s=1の時
x1 | x0 | y1 | y0 | r2 | r1 | r0 | 説明 |
0 | 0 | 0 | 0 | | | | 0-0 |
0 | 0 | 0 | 1 | | | | 0-1 |
0 | 0 | 1 | 0 | | | | 0-2 |
0 | 0 | 1 | 1 | | | | 0-3 |
0 | 1 | 0 | 0 | | | | 1-0 |
0 | 1 | 0 | 1 | | | | 1-1 |
0 | 1 | 1 | 0 | | | | 1-2 |
0 | 1 | 1 | 1 | | | | 1-3 |
1 | 0 | 0 | 0 | | | | 2-0 |
1 | 0 | 0 | 1 | | | | 2-1 |
1 | 0 | 1 | 0 | | | | 2-2 |
1 | 0 | 1 | 1 | | | | 2-3 |
1 | 1 | 0 | 0 | | | | 3-0 |
1 | 1 | 0 | 1 | | | | 3-1 |
1 | 1 | 1 | 0 | | | | 3-2 |
1 | 1 | 1 | 1 | | | | 3-3 |
回路
まずは,以下の図のように部品を配置してから(部品のラベルをIn, Outからs, x0, y0等付け替えるのを忘れないようにしてください),灰色部分を埋めていきます(入力,出力のラベルの順番は入れ替えても構いませんが,このシミュレータではこの順番にすると作りやすいと思います).
ヒント
教科書8.11の加減算器を参考にします.この回路シミュレータでは,1ビットの全加算器をFullAdderという名前で使えるのでそれを使うと少ない部品数で実現できます.
教科書8.11の加減算器では最上位ビットのcoutに何も繋いでいませんが,この課題では3ビットの2の補数表現で結果を得るために,最上位ビットのcoutも使います.最上位ビットのcoutは,加算器(s=0)の時はr2そのものになり,減算器(s=1)の時はNOT(r2)になるので,
となるように,これまでも何度も出てきた部品を1つ使ってcoutとsからr2 を作り出します.
(注) ToggleスイッチやLEDの部品のラベルをx0や,r0などの名前に置き換えるのならば,In, Outの部品を使わなくても構いません.ただし,入出力のラベル(x0, r0など)は必ず使ってください.
(2)2ビット乗算器
- 0-3までの正の整数 xとyの乗算(積)の計算をおこないます.
- 入力は x0(xのビット0), x1(xのビット1), y0(yのビット0), y1(yのビット1)の4ビットです.
- 出力は r0, r1, r2, r3 の4ビット(計算結果のビット0, 1, 2, 3)です.
- x, yは0以上3以下の数なので x * y は 0以上9以下の数になり4ビットで表現可能です.
真理値表(空いているところを埋めた表を作成して提出します)
x1 | x0 | y1 | y0 | r3 | r2 | r1 | r0 | 説明 |
0 | 0 | 0 | 0 | | | | | 0 x 0 |
0 | 0 | 0 | 1 | | | | | 0 x 1 |
0 | 0 | 1 | 0 | | | | | 0 x 2 |
0 | 0 | 1 | 1 | | | | | 0 x 3 |
0 | 1 | 0 | 0 | | | | | 1 x 0 |
0 | 1 | 0 | 1 | | | | | 1 x 1 |
0 | 1 | 1 | 0 | | | | | 1 x 2 |
0 | 1 | 1 | 1 | | | | | 1 x 3 |
1 | 0 | 0 | 0 | | | | | 2 x 0 |
1 | 0 | 0 | 1 | | | | | 2 x 1 |
1 | 0 | 1 | 0 | | | | | 2 x 2 |
1 | 0 | 1 | 1 | | | | | 2 x 3 |
1 | 1 | 0 | 0 | | | | | 3 x 0 |
1 | 1 | 0 | 1 | | | | | 3 x 1 |
1 | 1 | 1 | 0 | | | | | 3 x 2 |
1 | 1 | 1 | 1 | | | | | 3 x 3 |
回路
まずは,以下の図のように部品を配置してから(部品のラベルをIn, Outからx0, y0等付け替えるのを忘れないようにしてください),灰色部分を埋めていきます(入力,出力のラベルの順番は入れ替えても構いませんが,このシミュレータではこの順番にすると作りやすいと思います).
ヒント
nビットの乗算器はnビットの加減算器と比べると複雑な回路になりますが,2ビットならかなり単純な回路になります.
1ビットの数(すなわち0か1) xと yの積rを求める真理値表は以下のようになります.
x | y | r | 説明 |
0 | 0 | 0 | 0 x 0 |
0 | 1 | 0 | 0 x 1 |
1 | 0 | 0 | 1 x 0 |
1 | 1 | 1 | 1 x 1 |
これは,ANDの回路で実現できます.筆算の掛算の要領で,
x0 * y0 + 2 * (x0 * y1 + x1 * y0) + 4 * x1 * y1 = r0 + 2 * r1 + 4 * r2 + 8 * r3
となるように繰り上がりを計算していきます.この回路シミュレータでは,1ビットの半加算器をHalfAdderという名前で使えるのでそれを使うと少ない部品数で実現できます.
オプション課題
時間が余っている人は,(1), (2)の両方を解答したうえで,このシミュレータを使って複雑な面白い回路(教科書に出てきていないもの)を作って同じような形式で解答して構いません.
- シミュレータの画面サイズの関係であまり複雑な回路は作ることはできません.
- 入力が5ビットを超える場合は真理値表は書かなくても構いません.
- 入力,出力には必ずラベルをつけて,「何をする」回路かの説明でそのラベルが何を表わしているかの説明も書いてください.
いくつかの例をあげます.
- 4ビットの2進符号を入力として,4ビットのグレイ符号を出力する回路.
- 4ビットの符号 x0x1x2x3と
別の4ビットの符号 y0y1y2y3があったときに,そのハミング距離z (0-4)をz0z1z2の3ビットで出力する回路
- 1ビット全加算器を部品NANDだけで(動作を確認するためのDC, Toggle, In, Out, LED等は使って良い)実現する回路.
提出方法
ミュレータ上で完成させた回路の画面キャプチャと,それが正しく動くことを確かめるための真理値表,100文字以上の説明を含んだ文書を作成します(図や表が表現できれば Microsoft ワード, Google ドキュメント,Latex等なんでも構いません).それを PDF 形式で出力した上で,そのPDFファイルを1つ提出します.PDFファイルのファイル名は 「学生証番号.pdf」という名前(例 J4-130395.pdf) にしてください.
画面のキャプチャ方法は環境によるのでサポートできませんが,難しいようならばスマートフォン等で,画面を撮影したものを貼っても構いません.macを使う場合は,ハイパーワークブック「21.4 スクリーンショット」が参考になります .
mac用のMicrosoft WordでPDF形式のファイルを作成するには,メニューから「ファイル」->「名前をつけて保存」とした上で,ファイル形式「PDF」を選んだ上で,「エクスポート」を押します.Google DocumentsでPDF形式のファイルを作成するには,「ファイル」->「ダウンロード」->「PDFドキュメント(.pdf)」を選びます.毎年,1-2名は Microsoft Word で保存した拡張子 .docx のファイルをファイルの拡張子を .pdf に変更して提出する人がいますが,ファイルの名前だけでなく,中身をPDF形式で出力する必要があります.
提出期限
7月16日(木) 23:59.期限を過ぎたものは試験実施まで6割を上限に採点します.