応用情報技術者 2014年 秋期 午前2 問21
問題文
図の回路を用いてアドレスバスからCS信号を作る。CS信号がLのときのアドレス範囲はどれか。ここで、アドレスバスはA0〜A15の16本で、A0がLSBとする。また、解答群の数値は16進数である。

選択肢
ア:3B00〜3BFF
イ:8300〜9BFF
ウ:A400〜A4FF
エ:C400〜C4FF(正解)
🔒 解説は解答すると表示されます
アドレスデコーダ【午前2解説】
正解の理由
8入力のNANDゲート出力(出力にバブル=否定)をアクティブローのCS信号としているので、ゲート出力がLになるのは「NANDの入力がすべて1のとき」です。図では入力の一部に入力側のバブル(小丸=その入力が反転)があります。入力側のバブルがある線は、その対応するアドレスビットが0のときにゲートへの入力が1になり、バブルのない線はアドレスビットが1のときにゲートへの入力が1になります。したがって各ビットの条件を並べると
A15=1, A14=1, A13=0, A12=0, A11=0, A10=1, A9=0, A8=0
となり、上位バイト A15〜A8 は 11000100₂ = 0xC4 です。下位8ビット A7〜A0 は判定に使われない(ワイルドカード)ので、アドレス範囲は 0xC400 〜 0xC4FF。よって選択肢のうち エ が該当します。
解法ステップ
- NANDの特性:出力がLになるのは「全ての入力が1」のとき。
- 図のバブルの意味:
- 入力側にバブルがある線:ゲート入力 = NOT(Ai)。従ってゲート入力を1にするには Ai=0 が必要。
- 入力側にバブルがない線:ゲート入力 = Ai。従って Ai=1 が必要。
- 各A15〜A8について条件を決定:
- A15:バブルなし → A15=1
- A14:バブルなし → A14=1
- A13:バブルあり → A13=0
- A12:バブルあり → A12=0
- A11:バブルあり → A11=0
- A10:バブルなし → A10=1
- A9 :バブルあり → A9 =0
- A8 :バブルあり → A8 =0
- 上位バイトを二進数でまとめる:
- A15〜A8 = 1 1 0 0 0 1 0 0 = 11000100₂
- 11000100₂ をニブルごとに区切ると 1100 0100₂ = C4₁₆
- 範囲化:下位8ビットは不問のため、0xC400 〜 0xC4FF が選択される。
補助的に、上位バイトを16ビット表現にすると:
(下位をすべて0にした最小値)
選択肢別の誤答解説
- ア: 3B00〜3BFF
3B₁₆ = 00111011₂ であり、A15〜A8 のパターン(11000100₂)と一致しません。上位ビットの並びが根本的に異なります。 - イ: 8300〜9BFF
範囲が 0x8300 から 0x9BFF と広く、かつ開始上位バイト 0x83(1000 0011₂)や 0x9B(1001 1011₂)は指定されたビット条件(11000100₂)を満たしません。範囲の形が問題のデコーダ回路の「1つの固定上位バイトを選ぶ」構造と合いません。 - ウ: A400〜A4FF
A4₁₆ = 10100100₂ で、A15〜A8 の上位ビット最上位ニブル(A15〜A12)が 1010 であり、正しい 1100(C)とは異なります。A15=1かつA14=1という条件が満たされていません。 - エ: C400〜C4FF
C4₁₆ = 11000100₂ は前述の各ビット条件(A15=1,A14=1,A13=0,...,A8=0)にぴったり一致します。下位8ビットは不問のため 0xC400〜0xC4FF が正解です。
よくある誤解
- 入力側のバブルと出力側のバブルを混同する:入力バブルはその入力を反転してゲートに入れることを意味し、出力バブルはゲートの出力が反転されることを意味します。今回「ゲートの出力がLとなる条件」を求めるには「ゲート内部へ入る(=入力側)信号がすべて1であること」を考えます。
- ビットの並びと桁位置の取り違え:A15 を最上位(左端)とし、A0 を最下位(右端/LSB)とすることを忘れると誤った16進変換をしてしまいます。
- 上位バイトと下位バイトの取り扱い:デコーダが A15〜A8 のみを見ている場合、A7〜A0 は“don't care(任意)”であるため範囲は 0xXX00 〜 0xXXFF の形になる点を見落としやすいです。
補足コラム
論理回路で特定のアドレス範囲を選択するデコーダは、アドレスバスの一部を固定値(マッチ)させる形で実現されます。入力側にバブルを付けることで「0でマッチさせる」入力を簡潔に表現でき、NANDやNORなどの否定付きゲートを使うと回路の入出力の極性を調整しやすくなります。今回のように上位バイトだけを使うデコーダは、下位アドレスを内部レジスタやメモリ内のオフセットとして自由に使える利点があります。
小さな実務的メモ:デバッグ時は上位バイトの二進数をニブルごと(4ビット)に分けて16進に変換すると誤りが少ないです。
FAQ
Q1: 「入力側のバブルがある=そのビットが1のとき選択される」と思っていたが違いますか?
A1: 番号を反転して考える必要があります。入力側バブルはゲート内部に入る信号を反転するので、ゲート入力を1にするには元のビットが0である必要があります。
A1: 番号を反転して考える必要があります。入力側バブルはゲート内部に入る信号を反転するので、ゲート入力を1にするには元のビットが0である必要があります。
Q2: なぜ下位8ビットを0〜FFで表すのですか?
A2: 回路は A15〜A8 のみを評価しているため、A7〜A0 の組合せ(256通り)はすべて許容されます。したがって範囲は 0xC400(下位すべて0)から 0xC4FF(下位すべて1)になります。
A2: 回路は A15〜A8 のみを評価しているため、A7〜A0 の組合せ(256通り)はすべて許容されます。したがって範囲は 0xC400(下位すべて0)から 0xC4FF(下位すべて1)になります。
Q3: 二進→16進への変換での確実な手順は?
A3: 上位から4ビットずつ区切ってニブル化し、それぞれを16進に置き換える方法が確実で速いです(例:11000100₂ → 1100 0100₂ → C4₁₆)。
A3: 上位から4ビットずつ区切ってニブル化し、それぞれを16進に置き換える方法が確実で速いです(例:11000100₂ → 1100 0100₂ → C4₁₆)。
関連キーワード: アドレスデコーダ、NAND論理、バブル入力、ビットマスク、2進→16進変換

\ せっかくなら /
応用情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

