4.2K Views
September 20, 21
スライド概要
論理回路を自由に作成できる FPGA という装置に焦点を当てます。小型で安価な Tang Nano という FPGA ボードを使って、uchan が作成中の任意波形発生器を題材に、その原理と FPGA での実装を説明しようと思います。FPGA の開発って実際どんな感じなの?と興味のある方に参考になると思います。
論理回路の基本から説明しますので、論理回路って何、という方でも楽しんでいただけると思います。
サイボウズ・ラボ株式会社で教育向けのOSやCPU、コンパイラなどの研究開発をしています。
小型安価なFPGAボード と任意波形発生器 2021年9月12日 @uchan_nos
FPGAとは Field:現場で Programmable:プログラム可能な Gate:論理回路の Array:集まり 論理回路を書き換えられるICチップ 通常のICは工場で回路が作られ、後から 変更できない FPGAで任意の波形を生成できる装置 を作るのが今日のテーマ FPGAボード「Tang Nano」 を使った任意波形発生器
目次 論理回路入門 組み合わせ回路 順序回路 FPGAの仕組み 任意波形発生器 原理 ラダー抵抗回路 LED電流制御回路 FPGAを選択した理由
目次 論理回路入門 組み合わせ回路 順序回路 FPGAの仕組み 任意波形発生器 原理 ラダー抵抗回路 LED電流制御回路 FPGAを選択した理由
論理回路とは デジタル信号を扱う回路 通常、0=0V、1=電源電圧、として扱う 「組み合わせ回路」と「順序回路」に大別 2入力ANDに「1,0」を入力する回路 2入力ANDの真理値表 1(入力) 2(入力) 3(出力) 0 0 0 0 1 0 1 0 0 1 1 1
組み合わせ回路 入力から出力がすぐ決まる回路 入力が変化するとすぐに出力が変化する =情報を記憶しない 2入力AND 例1:ゲート素子 右図 例2:加算器 あとで すぐに出力が変化するといっても、 現実には遅延がある。 TC74HC04APの場合:tpd=6ns 入力 出力 2入力OR NOT ゲート素子の回路図記号 tpd tpd
頭の体操:XORをAND,OR,NOTで作る XOR:eXclusive OR 排他的論理和 基本は論理和 ただし、入力が両方とも1なら出力は0 排他的 クイズ:XORを、AND、OR、NOTだけ を使って実現してみよう XORの真理値表 1(入力) 2(入力) 3(出力) 0 0 0 0 1 1 1 0 1 1 1 0
クイズの答え OR AND = AND NOT NAND 基本はOR 入力が両方1のとき、出力が0→AND+NOT 上記は1つの例。他にも多くの実現方法がある
半加算器 整数の加算を行う組み合わせ回路 2つの整数A、Bを入力すると A+Bが出力される回路 1ビット半加算器 1ビット整数同士を加算 入力A X=A+B 半加算器 入力B C 1ビット半加算器の真理値表 出力は2ビット 加算結果 キャリー(繰り上がり信号) A 入力 B 入力 X 加算結果 C キャリー 0 0 0 0 XORとANDで構成してみよう 0 1 1 0 1 0 1 0 1 1 0 1
クイズの答え 1ビット半加算器の真理値表 XOR AND XORを使うととても簡単! A 入力 B 入力 X 加算結果 C キャリー 0 0 0 0 0 1 1 0 1 0 1 0 1 1 0 1
全加算器 複数ビットの加算をしたい 2桁目以降は、下の桁からの繰り上 がりも加算する必要がある →全加算器 1 1 0 1 + 0 1 1 1 --------1 0 1 0 0 2つの入力0と1の他に 繰り上がり桁をも 足さねばならない A B C 1ビット全加算器 の真理値表 X=A+B+C 全加算器 C’ A B C X C’ 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ビット全加算器の構成 1ビット全加算器の真理値表 A B C X C’ 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
全加算器は組み合わせ回路 入力A、B、Cが変化すると 少しの遅延をもって出力X、Cが変化する 入力が変化すると 信号が 伝播していく
目次 論理回路入門 組み合わせ回路 順序回路 FPGAの仕組み 任意波形発生器 原理 ラダー抵抗回路 LED電流制御回路 FPGAを選択した理由
順序回路 記憶を持つ論理回路 基本要素は「フリップフロップ」 RS型フリップフロップ の真理値表 SET RST Q RS型フリップフロップ 0 0 保持 SET=出力Qを1にする 0 1 0 1 0 1 1 1 禁止 RESET=出力Qを0にする 順序回路の出力を入力に帰還する ことで記憶を実現 RS型フリップフロップのタイミングチャート
D型フリップフロップ 別名「レジスタ」 SRAMを構成する基本単位 CPUの記憶を実現する部品 真理値表 DATA CLK Q 0 0→1 0 1 0→1 1 X 1→0 保持
D型フリップフロップの動作 初期状態:CLK=0、DATA=0とする 0 1 0 0 1 0 1 1/0 1 0 1 0/1
D型フリップフロップの動作 CLK=0のままで、DATAを1にしたとき Qは変化しない 1 0 1 0 1 1 1 1/0 0 0 1 0/1
D型フリップフロップの動作 DATA=0、Q=1のとき、CLKを0→1にする 0 1 0 1 0 1 1 0 0 1 1 0 1 0 1 1 0 0 1 Q:1→0
D型フリップフロップの動作 DATA=1、Q=1のとき、CLKを0→1にする 1 0 1 0 1 1 0 1 1 0 1 0 0 1 1 0 Q:1→1 (変化なし)
D型フリップフロップのまとめ CLKの立ち上がりエッジでDATAを 取り込み、Qから出力 それ以外の期間ではQを保持 真理値表 DATA CLK Q 0 0→1 0 1 0→1 1 X 1→0 保持
T型フリップフロップ Tの立ち上がりエッジでQが反転 真理値表 Q T Q T Q 0 保持 0→1 ~Q 1 保持
バイナリカウンタ T型FFを直列に並べるとクロックを数えられる Texas Instruments SN54HC4040, SN74HC4040 データシート (Rev. D) より
目次 論理回路入門 組み合わせ回路 順序回路 FPGAの仕組み 任意波形発生器 原理 ラダー抵抗回路 LED電流制御回路 FPGAを選択した理由
FPGAは論理回路を組み替え可能 論理回路を組み替える? こんな感じで配線をする? →LUT(ルックアップテーブル)で論理回路を実現する LUT=メモリで実現した真理値表 A0 A1 真理値表で任意の組み合わせ回路を表せる 0 0 右図はXORを実現するLUT 出力 0 0 1 1 1 0 1 1 1 0
LUTの具体的な構成 一般には4入力1出力のLUT 16ビットのSRAM 左図 http://www.kumikomi.net/archives /2009/04/fpgalsifpga.php 「図1 ルックアップ・テーブルの 仕組み」 真理値表をLUTで表現 2入力マルチプレクサで選択
配線の組み替え LUT CLK FPGAの基本構成要素 D Q C ロジックエレメント = LUT + FF =LE(ロジックエレメント) LUTとD-FFから構成されてい るらしい LE間は、任意方向に信号を伝 えられる「パス・トランジス タ」で構成されているらしい 左図 https://www.macnica.co.jp/bu siness/semiconductor/articles /intel/133387/ ロジックエレメント間の配線
目次 論理回路入門 組み合わせ回路 順序回路 FPGAの仕組み 任意波形発生器 原理 ラダー抵抗回路 LED電流制御回路 FPGAを選択した理由
任意波形発生器……の前に発振器 無安定マルチバイブレータ コンデンサと抵抗で決まるCR時定数を利用した発振器 V- OUT V+
任意波形発生器 単純な発振回路では単純な波形し か作れない 矩形波や三角波、正弦波とか 右図のような任意の波形を作るに はどうすれば良いだろうか メモリに波形データを記録し、 DACで再生すれば良さそう! カウンタ アドレス メモリ 波形 データ DAC アナログ 出力
任意波形発生器の原理 カウンタ 0x00 0 0x01 2 0x02 4 …… クロック 0x7e 252 0x7f 254 0x80 252 …… 0xfd 6 0xfe 4 0xff 2 メモリ カウンタ: DAC クロックを数え、アドレス を生成する メモリ: 波形データを出力する 8ビット出力なら0~255 DAC(D/A変換器): 波形データ(数値)を電圧 に変換する 0→0[V] n→3.3*n/256[V]
今回作った装置 Tang Nanoを使った 任意波形発生器 波形の測定結果
目次 論理回路入門 組み合わせ回路 順序回路 FPGAの仕組み 任意波形発生器 原理 ラダー抵抗回路 LED電流制御回路 FPGAを選択した理由
DAC(Digital to analog converter) 左図はラダー抵抗回路方式のDAC 256段階で、0~(255/256)×VDDを出せる 7 6 5 4 出力のオペアンプは、単なるバッファ 増幅率1倍=入力と同じ電圧を出力する 3 2 2種類の抵抗器だけで作れる 1 コンデンサを使ってないので周波数が高くても 0 動きそう 344kHzのsin波は余裕ぽい 注)実際に制作した回路では9ビットのラダー抵抗回路になっています
ラダー抵抗DACの動作1 128=0b10000000を入力したときを考える 最終的な等価回路 OUT=1/2×VDD=2.5V 合成抵抗値の計算 次々と計算すると……
ラダー抵抗DACの動作2 1=0b00000001を入力したときを考える 0.8334V 1.6667V 1.6667V 次々に 電圧を求める 0.4169V 0.8334V まずこの点の 電圧を求めたい 合成抵抗を計算する 最終的に OUT=0.01953V = 1/256×VDD
目次 論理回路入門 組み合わせ回路 順序回路 FPGAの仕組み 任意波形発生器 原理 ラダー抵抗回路 LED電流制御回路 FPGAを選択した理由
任意波形発生器の出力を確認する 任意波形発生器の出力を確認したい →DACの電圧を見れば良い DACの電圧を見る2つの方法 オシロスコープで波形を見る LEDの明るさを変えて可視化する ↑今回はこっち
LEDの明るさは電流に比例 LEDは、電流𝐼𝐹 と明るさがほぼ比例 電流𝐼𝐹 は電圧𝑉𝐹 に比例しない DAC出力電圧に電流𝐼𝐹 を比例させたい 3mm赤色LED OSR5JA3Z74Aデータシートより 𝐼𝐹 :順方向電流 𝑉𝐹 :順方向電圧
LED電流制御回路 DAC出力電圧(DAC_OUT)に D1の電流を比例させたい オペアンプを用いた電流制御 LED_C点の電圧 1.0 𝑉𝐿𝐸𝐷_𝐶 = 𝑉𝐴𝑇𝑇𝐸𝑁 = 𝑉𝐷𝐴𝐶_𝑂𝑈𝑇 10.1 D1の電流 𝑉𝐿𝐸𝐷_𝐶 𝑉𝐷𝐴𝐶_𝑂𝑈𝑇 𝐼𝐷1 = = 330 10.1 × 330 𝐼𝐷1 が𝑉𝐷𝐴𝐶_𝑂𝑈𝑇 に比例! 詳しくは https://elchika.com/article/61fdb513-4e57-4df4-9aa3-07dfc8685c9f/
目次 論理回路入門 組み合わせ回路 順序回路 FPGAの仕組み 任意波形発生器 原理 ラダー抵抗回路 LED電流制御回路 FPGAを選択した理由
PICマイコン SRAM SRAMへ波形 データを書き込む カウンタ FPGAを使う前に 検討していた回路 DAC
SRAM 単品のSRAMが安く売られている アドレスを入力し、8ビットや16ビットずつ読 み書きできる SRM2B256SLMX55 256kbitのSRAMで、1個30円ほど アドレス幅15ビット データ幅8ビット SRAMに波形データを記録し、再生する
カウンタ(アドレス生成) CLKの立ち下がりエッジでインクリメントされる カウンタ 12個のT型フリップフロップ回路から構成される T型フリップフロップ:クロックにより出力が反転 内部等価回路 SN54HC4040, SN74HC4040 12-BIT ASYNCHRONOUS BINARY COUNTERS より引用
FPGAを選んだ理由1 カウンタが秋月でディスコン(discontinue) 最近終売した模様 右図はGoogle のキャッシュから
FPGAを選んだ理由2 SRAMの動作速度が遅い SRM2B256SLMX55のデータシートより 5.5V時のアクセスタイム=55ns 18.2MHzでしか読み出せない
FPGAを選んだ理由3 安価なFPGAを教えてもらった 安価なのに、カウンタとSRAMを両方とも代替可能 安価なのに、動作周波数が個別部品で組むより速い 検証の結果、カウンタ、SRAMとも、120MHzで動作した FPGAはいつか学びたいと思っていた
目次 論理回路入門 組み合わせ回路 順序回路 FPGAの仕組み 任意波形発生器 原理 ラダー抵抗回路 LED電流制御回路 FPGAを選択した理由 おまけ:今回作成した回路の性能測定
どこまで高い周波数を出せるか1 FPGA内蔵クロックで 120MHzまで出せる 120MHzでsin波を再生 →120MHz/360≒333kHz が理論値 左図は101分周 (≒1.2MHz)で再生 ほぼ正確な波形 周波数も計算通り 実測3.4kHz
どこまで高い周波数を出せるか2 左図は21分周 (≒5.7MHz)で再生 実測16.4kHz 信号が少し歪んだ 黄ch1:オペアンプ出力 青ch3:DAC_OUT
どこまで高い周波数を出せるか3 左図は11分周 (≒11MHz)で再生 ただの三角波 実測31.3kHz 青ch3=DAC_OUTは歪ん でいない →オペアンプの影響 オペアンプの性能が足り ず、出力が入力の変化に 追いつかない
どこまで高い周波数を出せるか4 左図は6分周(20MHz) で再生 DAC_OUTの動作周波数 には問題がなさそう スパイクが出てるのは謎
どこまで高い周波数を出せるか5 左図は最速(120MHz) で再生 依然としてDAC_OUTは 正確なsin波 出力周波数は実測で 344kHz 謎スパイクも消えた
今回作成した回路の性能 DAC_OUTは理論値344kHzまで出せた オーディオの実験なら20kHz程度まで出せれば十分な実用性 オペアンプの性能がネック 汎用品だから仕方ない 高性能(かつ高価)なオペアンプを使うと改善できるだろう sin波1周あたり360分割して出力したので理論値は 120MHz / 360 = 333kHz もっと細かく分割すれば、滑らかなsin波になる 1周を6000分割すれば 120MHz / 6000 = 20kHz 逆に、もっと粗くてよいなら、高速な信号が出せる
発表おしまい 論理回路入門 組み合わせ回路 順序回路 FPGAの仕組み 任意波形発生器 原理 ラダー抵抗回路 LED電流制御回路 FPGAを選択した理由 おまけ:どこまで高速な信号を出せるか実験
次回予告 次回(日付未定)の電子回路勉強会では、FPGAを使った任意波形 発生器の製作演習をやろうと思います 内容(予定) FPGAボード(Tang Nano)、ブレッドボード、各種部品を使い、任意波 形発生器を組み立てる Verilogプログラムをビルドし、Tang Nanoに書き込んで動作させる 演習に必要な部品の頒布を企画しました connpassに申し込みフォームのURLがあります 9/13締め切りなのでお早めに 締め切り後、数日以内に確認の連絡をしますので返信してください