NES(ファミコン)のノイズジェネレーターを設計しよう クロック編

基本仕様

  • NTSC クロック周波数: 3.579545 MHzの半分の1.7897725 MHz。入手は3.5MHzのほうが入手しやすい。

  • 目標分周比: 4, 8, 16, 32, 64, 96, 128, 160, 202, 254, 380, 508, 762, 1016, 2034, 4068

https://akizukidenshi.com/catalog/g/g101685/ 

https://akizukidenshi.com/catalog/g/g112492/

分周比の実現方法

  • バイナリーカウンターを動かして特定条件をNAND回路で拾ってその信号をフリップフロップに与えて50%なクロックとして使う。 
  • 16あるリセット信号のどれをフリップフロップに与えるかで16種類のクロックを切り替える。この仕組みも必要。  

 バイナリーカウンターTC74HC4040APの仕様(CD4040B)

  • 12ビットバイナリカウンタ (Q1-Q12)

  • 分周範囲: 2~4096

  • 出力: Q1(2^1), Q2(2^2), ..., Q12(2^12=4096)


リセット回路の仕様

96, 160, 202, 254分周以降にはNANDゲートを使ったリセット回路を追加:

  • 所望のカウント値でリセット信号を生成。

     例: 96分周 = 96(10進) = 1100000(2進) → Q6とQ5がHIGHの時にリセット
    分周比2進数値使用ビットRESET信号の取り出し方
    40000 0000 0000 0100Q3RESET_4 = Q3
    80000 0000 0000 1000Q4RESET_8 = Q4
    160000 0000 0001 0000Q5RESET_16 = Q5
    320000 0000 0010 0000Q6RESET_32 = Q6
    640000 0000 0100 0000Q7RESET_64 = Q7
    960000 0000 0110 0000Q6, Q5RESET_96 = NAND(Q6, Q5)
    1280000 0000 1000 0000Q8RESET_128 = Q8
    1600000 0000 1010 0000Q8, Q6RESET_160 = NAND(Q8, Q6)
    2020000 0000 1100 1010Q8, Q7, Q4, Q2RESET_202 = NAND(Q8, Q7, Q4, Q2)
    2540000 0000 1111 1110Q8-Q2RESET_254 = NAND(Q8, Q7, Q6, Q5, Q4, Q3, Q2)
    3800000 0001 0111 1100Q9, Q7-Q3RESET_380 = NAND(Q9, Q7, Q6, Q5, Q4, Q3)
    5080000 0001 1111 1100Q9, Q8-Q3RESET_508 = NAND(Q9, Q8, Q7, Q6, Q5, Q4, Q3)
    7620000 0010 1111 1010Q10, Q8-Q2RESET_762 = NAND(Q10, Q8, Q7, Q6, Q5, Q4, Q3, Q2)
    10160000 0011 1111 1000Q10, Q9-Q4RESET_1016 = NAND(Q10, Q9, Q8, Q7, Q6, Q5, Q4)
    20340000 0111 1111 0010Q11-Q5, Q2RESET_2034 = NAND(Q11, Q10, Q9, Q8, Q7, Q6, Q5, Q2)
    40680000 1111 1110 0100Q12-Q6,Q3RESET_4068 = NAND(Q12, Q11, Q10, Q9, Q8, Q7, Q6, Q3)
    NAND回路のオンパレードだな・・・
74HC00 (NAND×4) 
74HC10 (3入力NAND×2) 
74HC20 (4入力NAND×2) 
74HC30 (8入力NAND

8入力NANDなんて使ったことないな。最適化をAIにお願いしました。
 
// 共通パターンの定義
PATTERN_A = NAND(Q8, Q7, Q6, Q5, Q4, Q3, Q2)  // 254用
PATTERN_B = NAND(Q9, Q8, Q7, Q6, Q5, Q4, Q3)  // 508用

// 最適化リセット式
RESET_96  = NAND(Q7, Q6)
RESET_160 = NAND(Q8, Q6) 
RESET_202 = NAND(PATTERN_A, Q4)    // 254からQ4(16)を除外
RESET_254 = PATTERN_A
RESET_380 = NAND(Q9, PATTERN_A)    // 254 + 256
RESET_508 = PATTERN_B
RESET_762 = NAND(Q10, PATTERN_A)   // 254 + 512
RESET_1016 = NAND(Q10, Q9, PATTERN_A) // 254 + 512 + 256
RESET_2034 = NAND(Q11, Q10, Q9, Q8, Q7, Q6, Q5, Q2)
RESET_4068 = NAND(Q12, Q11, Q10, Q9, Q8, Q7, Q6, Q3) 
 
8入力NANDx4,2入力NANDx5,3入力NANDx1,
このまま作るとNANDだけでICが6つは必要ですね。私はこの構成で作り続けてもよいのですが想像以上に面積をとってしまうので考えを変更します。同じ面積で値段も変わらないのであればより多機能で柔軟なMCU化を選択します。80年代ならPAL/GALですね。
学習目的であれば上の表がほぼ答えなので作れるでしょう。 
 
コスト比較
方式IC数柔軟性コスト
基本NAND方式8-10個低い高い
PAL/GAL方式3-4個中程度中程度
MCU方式2-3個高い安い
CPLD方式2個最高中程度
 精密でなければNE555で抵抗をスイッチで変える方法もあります。
12KHz以上は精密でなくとも問題ありません。

水晶振動子

せっかくのクロック設計なので基本部分は紹介しましょう。
2本足の水晶振動子が基本です。


リンクはこちら

水晶振動子の周波数で33pFや6.8KΩの部分が変わります。1MΩはバイアス抵抗といいます。
水晶振動子は強烈なタンク回路なので上のインバーターが動くアナログ動作な環境で発信してくれます。
つまりCを変えても周波数が殆ど動くことがありません。
気を付けるとしたらインバーターはUB(アンバッファー)型番を使いましょう。型番にUかUBが付いています。
バッファードは内部でしきい値が急峻 → 線形性が悪く発振開始しにくいので適しません。
CMOSならCD4009UBとかTTLなら74HCU04です。
UBならNAND回路でも構いません。
アナログの領域なので回路自体の配線は短くしないと発振しない可能性もあります。


周波数C1,C2(pF)R(Ω)
1 MHz336.8k
2 MHz333.3k
4 MHz332.2k
8 MHz221k
12 MHz22470
16 MHz15470
20 MHz15330
24 MHz10330

あまったインバーターはこう処理します。
ファミリ(例) 未使用入力の処理 出力
CMOS74HC**, 74HCU**, 74AC** など) High か Low に直接接続(または他の入力にリンク) オープン
TTL / LS74LS**, 74ALS** 等) Low に落とすと電流が流れて無駄な消費 → Highにプルアップが安全 オープン

ちなみにインバーターの並列接続は電流が増えますので意図的にそうする事もあります。
オープンにすることで電流は増えません。
あと発振するという事はノイズ源でもあります。音関係の回路のそばには置きたくないです。

基本の2本足の次はTTL出力の4本足ですが多くを語らずとも電源をつなげば苦も無く出力が得られるので特に説明も要らないでしょう。

コメント