LogiClover開発ブログ

LogiCloverは、趣味でFPGAを使った電子工作をしているサークルです。主に開発中の出来事や技術メモを投稿します

CP2130でC#からUSB-SPIを実現する

FPGAマイコンでアプリケーションを作成しているときに悩ましい項目としてPCとの通信方法があります。

低速なものであればFT232に代表されるようなUSB-UARTでいいのですが、UARTはRTLと相性がよくありません。

項目 利点 欠点
USB-UART 手軽 遅い
USB-I2C I2C I/Fのデバイスを直接制御できる、マルチスレーブ対応 PC側でアービトレーションを実装する必要があり
USB-SPI SPI I/Fのデバイスを直接制御できる、ある程度速く出来る、実装が簡単

FPGAで実装するにはSPIを使うとかなり簡単にアクセスできそうです。今回はSilicon Laboratory社が販売しているUSB-SPI Bridge IC CP2130を使ってみます。このICは最大12MHzでUSB-SPIを実現することが出来ます。

jp.silabs.com

余談ですが、もっと高速なUSB通信を行う場合Cypress社のEZ-USB FXに代表されるような製品が使われます。

http://japan.cypress.com/products/ez-usb-fx3-superspeed-usb-30-peripheral-controller

評価ツールをダウンロード

評価ボードのダウンロード先がどういうわけかCP210xの別製品のものになっているので*1、サポートページからダウンロードします。

CP2130 Classic USB Bridge | Silicon Labs

上記サイト下側にある「CP2130 Software package for Windows」をダウンロードしてインストールします。Linuxの場合はfor Linuxを使用します。

サンプルアプリケーションを眺める

以後Windowsで解説します。インストールが完了すると “C:\SiliconLabs\MCU\CP2130_SDK\Software"にライブラリとサンプルアプリケーションが追加されています。

CP2130 Demo ApplicationがC#+WPFで記述されたソースコード付きのサンプルになっています。

細かな制御の方法や作例はこちらを眺めると良いでしょう。

動作させてみる

サンプルアプリケーションを読んでみると、SLAB_USB_SPI.csがDllImport経由でSLAB_USB_SPI.dllの関数を呼び出していることがわかります。

このままでは扱いづらいので転送だけ出来るWrapperを作成します。

CSをGPIO経由で手動で上げ下げすることも考慮してIsCSEnableとGPIO制御もつけておきます。

using SLAB_USB_SPI_DLL;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace LogiClover.Lib {
    class CP2130SPI : IDisposable {
        private IntPtr deviceHandle = IntPtr.Zero;
        public bool IsAvailable => deviceHandle != IntPtr.Zero;

        #region Static Method
        /// <summary>
        /// 現在接続されているデバイス数を返します
        /// </summary>
        /// <returns></returns>
        public static int GetNumDevices() {
            uint n = 0;
            SLAB_USB_SPI.CP213x_GetNumDevices(ref n);
            return (int)n;
        }
        /// <summary>
        /// デバイス名のリストを返します
        /// </summary>
        /// <returns></returns>
        public static IEnumerable<string> GetDeviceNames() {
            var n = GetNumDevices();
            for (uint i = 0; i < n; ++i) {
                var sb = new StringBuilder(SLAB_USB_SPI.MAX_PATH);
                SLAB_USB_SPI.CP213x_GetDevicePath(i, sb);
                yield return sb.ToString();
            }
        }
        #endregion

        #region Device Connection

        /// <summary>
        /// デバイスと接続します
        /// </summary>
        /// <param name="index"></param>
        /// <returns>正常に接続できた場合true</returns>
        public bool Open(int index) {
            if (index < 0) return false;
            this.Close();
            var result = SLAB_USB_SPI.CP213x_OpenByIndex((uint)index, ref deviceHandle);
            if (result == SLAB_USB_SPI.USB_SPI_ERRCODE_SUCCESS) {
                return true;
            } else {
                Debug.WriteLine($"#Exception Errorcode:{result}");
                Close();
                return false;
            }
        }

        /// <summary>
        /// デバイスを切断します
        /// </summary>
        public void Close() {
            if (IsAvailable) {
                SLAB_USB_SPI.CP213x_Close(deviceHandle);
                deviceHandle = IntPtr.Zero;
            }
        }

        #endregion

        #region Parameters
        public enum ClockRate {
            F12M = SLAB_USB_SPI.SPICTL_CLKRATE_12M,
            F6M = SLAB_USB_SPI.SPICTL_CLKRATE_6M,
            F3M = SLAB_USB_SPI.SPICTL_CLKRATE_3M,
            F1M5 = SLAB_USB_SPI.SPICTL_CLKRATE_1M5,
            F750K = SLAB_USB_SPI.SPICTL_CLKRATE_750K,
            F375K = SLAB_USB_SPI.SPICTL_CLKRATE_375K,
            F187K5 = SLAB_USB_SPI.SPICTL_CLKRATE_187K5,
            F93K75 = SLAB_USB_SPI.SPICTL_CLKRATE_93K75,
        };
        /// <summary>
        /// 転送周波数
        /// </summary>
        public ClockRate SCKRate { get; set; } = ClockRate.F12M;
        /// <summary>
        /// CS番号
        /// </summary>
        public int CSIndex { get; set; } = 0;
        /// <summary>
        /// CSを駆動するか
        /// </summary>
        public bool IsCSEnable { get; set; } = true;

        /// <summary>
        /// タイムアウト時間[ms]
        /// </summary>
        public uint TimeOutMS { get; set; } = 1000;

        #endregion

        public bool Configuration() {
            if (!IsAvailable) return false;
            if (IsCSEnable) {
                SLAB_USB_SPI.CP213x_SetChipSelect(deviceHandle, (byte)CSIndex, SLAB_USB_SPI.CSMODE_ACTIVE_OTHERS_IDLE);
            } else {
                //CS無効化
                SLAB_USB_SPI.CP213x_SetChipSelect(deviceHandle, (byte)CSIndex, SLAB_USB_SPI.CSMODE_IDLE);
            }

            return true;
        }

        /// <summary>
        /// SPI通信を行います
        /// </summary>
        /// <param name="srcData">転送したいデータ、受信だけ行う場合はダミーデータを渡す</param>
        /// <returns>受信したデータ、データ長はsrcDataと同じ</returns>
        public byte[] Transfer(params byte[] srcData) {
            if (!IsAvailable) return new byte[] { };
            uint bytesTransferred = 0;
            var dstData = new byte[srcData.Length];

            SLAB_USB_SPI.CP213x_TransferWriteRead(
                deviceHandle,
                srcData,
                dstData,
                (uint)srcData.Length,
                true,
                TimeOutMS,
                ref bytesTransferred);

            return dstData;
        }

        /// <summary>
        /// GPIOに値を書き込みます
        /// </summary>
        /// <param name="index">制御するGPIO番号</param>
        /// <param name="value"></param>
        public void WriteIO(int index, bool value) {
            if (IsAvailable) {
                SLAB_USB_SPI.CP213x_SetGpioModeAndLevel(deviceHandle, (byte)index, SLAB_USB_SPI.GPIO_MODE_OUTPUT_PP, (byte)(value ? 0x1 : 0x0));
            }
        }
        /// <summary>
        /// GPIOの値を読み込みます
        /// </summary>
        /// <param name="index"></param>
        /// <returns></returns>
        public bool? ReadIO(int index) {
            if (!IsAvailable) return null;
            byte mode = 0;
            byte level = 0;

            SLAB_USB_SPI.CP213x_GetGpioModeAndLevel(deviceHandle, (byte)index, ref mode, ref level);
            return level != 0x0;
        }

        public void Dispose() {
            this.Close();
        }
    }
}


あとはこのクラスの利用例ですが

ユーザーにデバイスを選ばせる

コンボボックスなどで表示しておくとわかりやすいかもしれません。

var numofDevice = CP2130SPI.GetNumDevices();//デバイス数を取得
var deviceNames = CP2130SPI.GetDeviceNames();//デバイス名一覧を取得

バイスと通信を行う

開いて保持したままにしてもいいのですが、常時SPIを送り続けるアプリケーションではないので今回はお行儀良く送ったらCloseする制御にします。

//送る
int index = 0;//通信に使うデバイスインデックス
using (var spiBridge = new CP2130SPI()) {
    try {
        if (!spiBridge.Open(index)) {
            //デバイスオープンに失敗
            return;
        }
    } catch (Exception ex) {
        //ほかの例外
        return;
    }

    //SPIの設定
    spiBridge.CSIndex = 0x0;//CSとして駆動させるピン番号
    spiBridge.IsCSEnable = true;//CSは転送時に自動駆動させる
    spiBridge.SCKRate = CP2130SPI.ClockRate.F375K;//転送周波数
    spiBridge.TimeOutMS = 1000;//タイムアウト時間
    spiBridge.Configuration();

    //適当なデータを作る
    var sendData = Enumerable.Range(0, 0xff).ToArray();
    //データ転送
    var recvData = spiBridge.Transfer(sendData);//byte[]が返ってくる
}

動作させる

SLAB_USB_SPI.dllが実行ディレクトリに無いとDllImportに失敗するのでプロジェクトに入れて、プロパティを出力ディレクトリに新しい場合はコピーするようにします。

スクリーンショットはComet*2に使われているエフェクトの検証ツールで使用している例です。

f:id:logiclover:20170612013548p:plain

終わりに

これでc#から直接SPIデバイスを制御できるようになりました!最高ですね!

SPI FlashやSPI DAC/ADCなどを繋いでも良いですし、FPGAの自作ペリフェラル検証に使用してもいいと思います。

KiCadでピン数の多い回路シンボルを作成する

KiCadで回路を引くときに厄介な作業として回路シンボルの作成があります。

近頃はライブラリのOSS化が進んでいますが、自分が使うデバイスがない場合自作する必要があります。しかしピン数が100や200を超えてくると自力でやるには限度があります。

シンボルの中身はテキストなので自前で生成してもいいですが、今回はQuick KICAD Library Component Builder(以下コンポーネントビルダー)を使って作成します。

kicad.rohrbacher.net

例としてXilinx社のXC7Z015-1CLG485という22×22のBGAのシンボルを作成してみます。

ピンリストの入手

多くのメーカはバウンダリスキャン用のBSDLファイルやピン配置のcsvやテキストファイルを公開しています。

Xilinx社Zynqの場合、UG865に記載があります。

https://japan.xilinx.com/support/documentation/user_guides/j_ug865-Zynq-7000-Pkg-Pinout.pdf

f:id:logiclover:20170501133405p:plain

Intel(Altera)の場合、各デバイスごとにまとめてあります

www.altera.co.jp

自分が使いたいデバイスのメーカサイトを探して、テキスト形式のピン配置ファイルを入手します。

ピンリストの加工

あとで説明しますが、コンポーネントビルダーはスペース区切りでピン番号、ピン名が並んだファイルをインポートできるので加工します。

スペースが複数あったり、後ろに余計な文字がくっついているとうまくピン名がインポートできませんでした。

編集前 xc7z015clg485pkg.txt

Device/Package xc7z015clg485 10/16/2013 16:15:27                                                                                              
                                                                                                    
Pin   Pin Name                 Memory Byte Group  Bank  VCCAUX Group  Super Logic Region  I/O Type  No-Connect
T10   DONE_0                   NA                 0     NA            NA                  CONFIG    NA
N12   DXP_0                    NA                 0     NA            NA                  CONFIG    NA
K11   GNDADC_0                 NA                 0     NA            NA                  CONFIG    NA
...

編集後

T10 DONE_0
N12 DXP_0
K11 GNDADC_0
...

やる作業としては

  • 余計な行を削除する(#がコメントアウトとして扱われるような記載があるような気がしますが試していません)

  • 行の後ろ側の余計な情報を削除する

  • ピン番号とピン名をスペース1つ区切りにする(余計なスペースの削除、タブやカンマ区切りの場合は置換)

マルチカーソルや矩形選択のような機能を有するテキストエディタか、Excelで編集したものをCSVで出して置換を書けるといいと思います。*1

コンポーネントビルダーを使う

まずはサイトにアクセスします。

http://kicad.rohrbacher.net/quicklib.php

f:id:logiclover:20170501134841p:plain

バイス名とシンボルの形状を選びます。今回はBGAなので一番右下にグリッドの大きさを入力しています。

準備が出来たらAssign Pinsをクリックしてピン一覧編集に移ります。

f:id:logiclover:20170501135046p:plain

ピン数が少なければ手入力でもいいですがなかなか骨が折れる作業ですので、ページ一番下にあるImport pin listをクリックします。

ここで先ほど作成したピンリストを読み込ませると

f:id:logiclover:20170501135217p:plain

f:id:logiclover:20170501135230p:plain

すべてのピン名とピン名から推論した属性まで設定してくれます。最高です。

あとはページ一番下のBuild Library Componentをクリックすると完成した.libがダウンロードできるのでKiCadで読み込みます。

f:id:logiclover:20170501135441p:plain

成功です。これでピンがたくさんあっても怖くありません。

*1:私は過去にMAX10のシンボルを作ったときはExcel、今回はVSCodeでやっています。

マルチエフェクター製作

以前FPGA基板を使って作ったマルチエフェクターを、1枚の基板にしました。
名前はComet Audio Effectorです。
f:id:logiclover:20170429154115j:plain
画面はコーラスの調整画面です。
エフェクトはFPGAでデジタル音声処理をして作っています。
AD変換した音声をFPGAで音声処理し、DA変換して出力します。
イコライザー、ディレイ、コーラス、ディストーションの4種類を実装しています。

内部構成

中身は5枚の基板で構成しています。
基板はすべてKiCADを使って自分たちで設計しています。

ベースボード、LCD制御部、UI部に分かれています。
液晶はパラレルI/F、ボタンやLCDはI2Cで接続しています。
画面の表示や操作子の制御にはAtmelのARMマイコンを使っています。
f:id:logiclover:20170429154226j:plain

画面

各エフェクトの画面はこんな感じ。
f:id:logiclover:20170429160824j:plain

動作

音楽をかけて簡単に動作テストしてみました。


まだまだFPGAの処理能力に余裕があるので、いろんなエフェクトを増やしていこうと思います。

SPI Flashの使い方

組み込み工作でデータを格納したいときはFlashメモリを使うと便利です。

Flashメモリと言っても様々な種類があり、ざっくり以下のような分類ができます。

各社*1開発を行っており、微妙な違いで様々な製品があります。 例外もありますが型番の多くがメーカー名+数字で構成されておりカッコ内の示してあります。

  • NAND Flash
    • Parallel (_29)
      • Address/Data組み合わせのコマンド方式
  • NOR Flash
    • Parallel (_29)
      • Address/Data組み合わせのコマンド方式
    • Serial
      • SPI/QSPI/DSPI (_25)
      • I2C (_24)

大容量のNAND Flashはお馴染みのUSBメモリなど、本当に大容量なデータの格納に使われています。 中・小規模なその他のFlashはプログラムの格納(外付けの場合)やFPGAのコンフィグデータの格納、ログデータやリソースの格納などに使われています。

LogiCloverでは

  • FPGA(Xilinx社 Spartan6)のコンフィグデータの格納
  • マイコン(NXP社 LPC4330)を使ったボードのプログラム格納先
  • SPDIF出力する音声データの格納先

などで使用しました。

f:id:logiclover:20170402023957j:plain

FPGAのコンフィグROMをPCから書き換える実験。

今回はSPIで制御するSerial NOR Flash(以下SPI Flash)の最低限の使い方について、FPGAのコンフィグで使用しているMicron社M25P40を例に説明します。 用意されているコマンドの種類やニーモニックが異なるだけで、基本的な使い方は各社同じです。

パッケージ

殆どのSPI FlashはSOIC8かSOIC16のようです。(1.27mmピッチ)

ピンアサイン

SOIC8のピンアサインは以下のとおりです (M25P40は対応していませんが、QSPIも含めた解説もしておきます。)

f:id:logiclover:20170402000153p:plain

ピン名 方向 SPI時 QSPI時
S# 入力 チップセレクト(CS) チップセレクト(CS)
C 入力 クロック入力(SCK) クロック入力(SCK)
DQ0 双方向 データ入力(MOSI) データ線0
DQ1 双方向 データ出力(MISO) データ線1
W#/DQ2 双方向 書き込み保護(使わなければH固定) データ線2
HOLD#/DQ3 双方向 通信一時停止(使わなければH固定) データ線3

SPIで使うときはW#/HOLD#はHigh固定で問題ないです。 QSPI時は帯域を増やすためにこの2つの信号線も通信に使用します。

インターフェース

電圧 : 2.3V ~ 3.6V

バイスによっては1.8Vなど低い電圧までサポートしているものがありますが、5Vはほぼサポートしていないと見ていいでしょう。

もしArduinoの5V I/Oなどから使用する場合は必ずレベル変換してください。

通信周波数 : コマンドと電源電圧による

これがSPI Flashの厄介なところで、殆どのデバイスがコマンドと電源電圧によって最大周波数が異なります。 多くの場合Read命令とRead Fast命令が別れています。

Read Fastはダミーサイクルを挿入する代わりに(コマンドについては後述)最大周波数を上げています。 最近のデバイスでは100MHz超えも当たり前になっています。

M25P40を3.3Vで使った場合、下の表のとおりになります。

条件 周波数[MHz]
Read 33
Read Fast 75
それ以外 75

通信フォーマット

Master側のペリフェラル設定については割愛します。特殊なことは必要ありません。

クロック極性

立ち上がりエッジでキャプチャできるようにしてあれば大丈夫です。

CPHA,CPOLが(0, 0)か(1, 1)

ビットオーダー

MSBファーストで転送します。([D7, D6, D5, D4 … D0]の順に送る。)

送り方

命令によってデータの付け方が異なります。殆どの場合、データシートにまとめた表がだいたいあります。

送る順としては命令 + アドレス + モード + ダミー + データになっています。*2

アドレス、モード、ダミーなどは命令によって省略されるのでデータシートを確認してください。また最近のデバイスではアドレスに32bit指定可能なもの、ダミーサイクル数が指定可能なものなどもあります。

f:id:logiclover:20170402010527p:plain

命令のみの場合

Write Enable, Write Disable, Bulk Erase, Deep Power-down など

命令1byte

例えば書き込み有効化のWrite Enableは、0x06を1byte送れば実行できます。

f:id:logiclover:20170402011235p:plain

ステータス読み出しの場合

Read Identification, Read Status Register, Release from Deep Power-downなど

命令1byte + 読み出すデータ(IO1に出力される)

Masterから送るデータは最初の1byteに命令、あとは適当なダミーデータを送り、IO1のデータを読み取れば大丈夫です。

f:id:logiclover:20170402023207p:plain

データ書き込みの場合

Page Programなど

命令1byte + 読み出しアドレス3byte + 書き込むデータ

指定したアドレスから順にデータを書き込んでいきます。

注意すべき点としては読み出しが一度に全部読み出せるのに対し、書き込みはページ単位(256byte)ごとに処理する必要があります。

f:id:logiclover:20170402012114p:plain

データ読み出しの場合

Read Data Bytes, Read Data Bytes at Higher Speed など

命令1byte + 読み出しアドレス3byte + 読み出されたデータ(IO1に出力される。)

読み出したいデータ分だけ転送バイト数を増やすだけで大丈夫です。

通信速度を上げたい場合、代わりにat Higher Speed命令を送り、アドレスの後1byteは適当なデータを送っておけば大丈夫です。

f:id:logiclover:20170402011553p:plain


制御方法

あとはコマンドをどう使うかだけ確認します。ここまでくれば後は送るだけです。

データ読み出し

Read Data Bytesで読み取りたい長さ分のSPI転送を行えば大丈夫です。

アドレス指定が出来るので任意アドレスのデータを読み出せます。

データ消去

消去命令は全領域消去を行うBulk Eraseと、特定セクター*3の消去を行うSector Eraseがあります。

Erase/Program系の命令他の命令と異なり別のコマンドと組み合わせが必要です。

  • 実行前にWrite Enableを行う必要があります
  • コマンド発行から完了まで時間がかかるためRead Status Registerでステータスを1byte読み出し、最下位ビットのWrite in Progress(WIP)が0になるまで待つ必要があります。

以下にフローを示します。

f:id:logiclover:20170402021200p:plain

データ書き込み

PROGRAM命令を使って書き込み先を指定して書き込みます。

読み出しと異なりデータ長はページごと(M25P40の場合は256byteごと)に行います。

データ消去同様、Write Enableを事前に実行し書き込み後にWIPを待つ必要があります。

これは補足ですが一般的に書き込む前に事前にデータ消去を行います。

既にデータが書かれている場所にもう一度書き込んだ場合に正しく書き込めるかは保証されません。


終わりに

今回はSPI Flashの基本的な使い方についてまとめました。

PCからFlashFPGAのコンフィグを行う実験のまとめになります。

後々需要があればツールは公開予定ですが、ご要望があれば優先度は考えます。

Arduinoでの制御例

2017/08/15 書きました、とりあえず動かしたい方はどうぞ。

logiclover.hatenablog.jp

※ Micron社 M25P40データシートより引用 https://www.micron.com/~/media/documents/products/data-sheet/nor-flash/serial-nor/m25p/m25p40.pdf

*1:2017年4月時点だとCypress/Micron/Macronix/Winbond/ESMT/Microchipなど

*2:モードはM25P40には実装されていない

*3:M25P40の場合 0x10000ごとセクターが別れている

ISE Webpackでchipscopeが使えるようになっていたので試してみた

FPGA開発ツールには、実機でデバッグできるロジアナがついていることがありますが、Xilinxのオンチップロジアナ「Chipscope」はライセンスを購入しないと使用することができませんでした。
Xilinxの新しいツールのVivadoでは、ILAといわれるロジアナがフリーで使えるようになっています。
先日、ISEのライセンスを取り直したところ、WebpackのライセンスでChipscopeが使えるようにシレっと変更されていたため、試しに使ってみました。

Chipscopeの詳しい使い方はほかにも詳しいサイトがあるため、適宜割愛します。

1.プロジェクトにchipscopeを組み込むファイルを追加する。
ファイルマネージャーで右クリックし、New fileを選択します。
f:id:logiclover:20170331220523p:plain

通常のIPを追加するときと同様にファイルを作っていきます。
特に必要な設定はありません。
f:id:logiclover:20170331220525p:plain

次に、作成したchipscopeのファイルをダブルクリックすると、Core Inserterが起動します。
この画面で見たい信号を選択します。
f:id:logiclover:20170331220528p:plain

この画面で見る信号を選択します。
詳細は割愛します。
f:id:logiclover:20170331220532p:plain

設定をしたあと、ビットストリームファイルを生成します。
FPGAにbitファイルを書き込めば、FPGA内にロジアナが組み込まれます。
書き込んだ後、iMPACTを閉じないとJTAGが解放されないようなので注意しましょう。

書き込みが完了したら、Processesの一番下にある「Analyze Design Using Chipscope」を起動するとchipscopeが起動します。
f:id:logiclover:20170331221349p:plain
このように、FPGA内の信号を見ることができます。
これはオーディオの波形を観測しています。

というわけでISE webpackでもchipscopeが使えるようになりました。
VivadoやAlteraのツールではすでに無料で使えるため、やっとという感じです。

シルバーウィーク開発合宿

2016年 9/22~9/25にLogiClover開発合宿を行いました。
作業はhastech、ぽよ氏と私kamiyaの3人で、基板テストからソフト実装まで様々なことをやりました。概要を下記に記します。

Comet Audio Effectorの機能拡張

MFT2016で展示していたFPGAを使ったオーディオエフェクタのEQバンド数を拡張しました。
FPGA内でパラメトリックイコライザを直列に接続して実現しています。
また、周波数応答もすべての応答を加算することで最終的な応答を描画しています。
f:id:logiclover:20170429165252j:plain

高速ADCボードの試作

f:id:logiclover:20170429165253j:plain
FPGAで高速信号処理を行うアプリケーションを作成するために、高速ADCを載せたボードの試作を行いました。
ユニバーサル基板に回路一式を実装してSirius Spartan6ボードでHDLを書いてデータを確認するところまでぽよ氏が実装しました(すごい)

LogiClover名刺のSW実装

光オーディオ出力をする名刺を作っています。USB経由での音声データ転送のための通信と、SPIFlashの実装を行いました。
SPI Flashへのデータの転送は、Tera Termからxmodemで行います。

新基板の動作確認

その他改版を行った基板の実装とテストを行いました。ある程度改版を行って設計的にもある程度煮詰まりつつあります。
またこれから基板を作るに当たってのライブラリ等設計ルールの検討など改めて再考慮する箇所を検討しました。

まとめ

正式に新規メンバとして参加したぽよ氏が基板を作ってHDLを書いてADCを動かしたことが何と言ってもすごいところでした。
FPGA開発特にHDLはだいぶ難しいところがあり、ほとんど勉強会のようになっていました。

ちなみにhastech氏は明日から海外出張だそうです。。

KICADの他のプロジェクトから回路をコピーする

KiCADでは、普通のコピーペーストを使って異なるプロジェクトから回路をコピーすることができません。
ほかのプロジェクトから回路をコピーする方法をまとめました。

使用したKiCADは4.0.1です。

1.回路をペーストしたいプロジェクトのフォルダにコピー元の回路図を入れる。
f:id:logiclover:20170331215318j:plain

ちなみに、コピーしただけではKiCAD上で回路図は見えません。

2.ペーストするプロジェクトの回路図で階層シートを作成する

右側にある「階層シートの作成」ボタンで階層シートを作成します。
f:id:logiclover:20170331215324p:plain

階層シートを回路図上に書くと、作成するシートの名前を聞いてきますので、先ほどフォルダ内にコピーしたファイルのファイル名を入力します。
f:id:logiclover:20170331215325j:plain


回路図が既に存在しているといわれますが、OKを押します。
f:id:logiclover:20170331215326j:plain


この作業をすることで、コピーした回路図を同じプロジェクトの回路図階層として扱うことができます。
f:id:logiclover:20170331215327j:plain


3.回路をコピー&ペーストする

ここまで来ればあとは通常のコピー&ペーストと同様です。

回路図ブロックを選択し、「ブロックを保存」を押します。

ブロックのコピーではないので注意が必要です。
f:id:logiclover:20170331215328p:plain


階層ナビゲータで張り付けたい回路図に移り、画面上部の貼り付けボタンを押せば回路図がペーストできます。
f:id:logiclover:20170331215329p:plain