電子趣味の部屋

電子系のガジェットやアプリ開発等の趣味の話題を書いてます

FPGAで遊ぶ 基本編

今回は比較的入手しやすいDE0-CV 開発キットを使用して解説します。
これは INTEL (ALTERA) のFPGAのCyclone Vを搭載した入門用FPGA開発キットで、ボタンやVGA出力等の豊富なI/Oが初めから搭載されています。

ハードウェア記述言語はVerilog HDLを使用します。
今回は機種依存の書き方はしないので、基本的にXILINXや他のFPGAでもそのまま使用できます。
INTEL (ALTERA) のFPGAは開発環境としてQuartusを使用します。ここではQuartusの使用方法やピンの配置方法は説明をしません。

単純な回路の例

まずはVerilog HDLのソース

module sample01(LED, KEY);

    input [3:0] KEY;
    output [3:0] LED;
	 
    assign LED[3] = KEY[3];
    assign LED[2] = KEY[2];
    assign LED[1] = KEY[1];
    assign LED[0] = KEY[0];

endmodule

このソースの意味はKEYを入力に設定、LEDを出力に設定、KEYとLEDをそれぞれ接続しています。

ソフトウェアのプログラム言語に慣れていると「LED[3] = KEY[3]」を実行した後に「LED[2] = KEY[2]」が実行されてるように思いがちですが、このソースの場合はLEDとKEYをそれぞれ論理的に配線をして、リアルタイムに電気が流れます。

DE0-CVの場合のピン配置を下の様に設定してください。

Node Name Location
KEY[3] PIN_M6
KEY[2] PIN_M7
KEY[1] PIN_W9
KEY[0] PIN_U7
LED[3] PIN_Y3
LED[2] PIN_W2
LED[1] PIN_AA1
LED[0] PIN_AA2

これをDE0-CVで実行した場合は4個のLEDが点灯されていて、タクトスイッチを押すと対応するLEDが消えると思います。
タクトスイッチを押してLEDが消えるのは、タクトスイッチがプルアップされているからです。普段は電気が流れていて、ボタンを押すと電気がGNDに流れるのでOFFになります。

ソフトウェアで処理する場合はクロック等を上から順番にトリガーにしてタクトスイッチの状態を順番にLEDに渡すようなイメージですが、ハードウェアで処理する場合は単なる配線なので常に同時に電気が流れてリアルタイムで同時に処理ができます。例えばGPU等の様にソフトウェアで処理できることもあえて専用のハードを使う意味が分かりますね。

YAMAHA MU2000

前にMU1000を持っていることを書きましたが、スマートメディアがあれば単体でMIDIを演奏できるのに憧れて、MU2000を入手してしまいました。

MU1000入手当時は少し安いからと思って選んだのですが、実はずっとモヤモヤしてました。
オークションで15,000円程です。MU1000はそのままオークションに放出して10,000円程で落札されました。手数料と送料を考慮すると8,000円くらいの差額でした。
メディアプレイヤー機能とサンプリング機能が追加されている以外はMU1000を同じです。

MU1000の時と同様にExtended Editionにアップグレードしたので、GSモード時にはGSマークが表示されます。
Windows10 64bitでもMU2000 Extended Edition R1 アップデータ for Windowsでアップデートできました。(自己責任でお願いします。)

MU2000

パート数:64
最大同時発音数:128
音色数:1396
ドラムセット:58
エフェクト:リバーブ18タイプ、コーラス20タイプ、バリエーション97タイプ、インサーション1〜4各97タイプ、EQ4タイプ

作りながら覚える 3日で作曲入門

作りながら覚える 3日で作曲入門

低価格FPGA開発ボード ALTERA Cyclone IV

型番不明。
複数のショップやブランドで同じボードが売られています。
Aliexpressで低価格なFPGA開発ボードを見つけたので買ってみました。

ダウンロードケーブルも付属して、送料込みで3,300円くらいです。

6272LEのCyclone IV (EP4CE6E22C8N)搭載で、8MBのSDRAMVGAPS/2他色々ありLE数の関係でMSXは無理ですが、簡単な実験や遊びはできそうです。
ダウンロードケーブルはUSBブラスター互換なので、色々使えそうです。

ネットで仕様書が見つからなく、売り主に連絡したら送ってくれました。

自分のメモも兼ねてピン番号を書いておきます。

RESET button 25
FPGA_CLK 23

Keys

KEY1 88
KEY2 89
KEY3 90
KEY4 91

Buzzer

beep 110

Dial switch

ckey1 88
ckey2 89
ckey3 90
ckey4 91

LED

led1 84
led2 85
led3 86
led4 87

UART

UART_TXD 114
UART_RXD 115

IIC

SCL 112
SDA 113
I2C_SCL 99
I2C_SDA 98

PS2

PS_CLOCK 119
PS_DATA 120

IR

IR 100

VGA

VGA_HSYNC 101
VGA_VSYNC 103
VGA_B 104
VGA_G 105
VGA_R 106

LCD 1602 12864

LCD1 RS 141
LCD2 RW 138
LCD3 E 143
LCD4 D0 142
LCD5 D1 1
LCD6 D2 144
LCD7 D3 3
LCD8 D4 2
LCD9 D5 10
LCD10 D6 7
LCD11 D7 11

Digital tube

DIG1 133
DIG2 135
DIG3 136
DIG4 137
SEG0 128
SEG1 121
SEG2 125
SEG3 129
SEG4 132
SEG5 126
SEG6 124
SEG7 127

SDRAM

S DQ0 28
S DQ1 30
S DQ2 31
S DQ3 32
S DQ4 33
S DQ5 34
S DQ6 38
S DQ7 39
S DQ8 54
S DQ9 53
S DQ10 52
S DQ11 51
S DQ12 50
S DQ13 49
S DQ14 46
S DQ15 44
S A0 76
S A1 77
S A2 80
S A3 83
S A4 68
S A5 67
S A6 66
S A7 65
S A8 64
S A9 60
S A10 75
S A11 59
SD BS0 73
SD BS1 74
SD LDQM 42
SD UDQM 55
SD CKE 58
SD CLK 43
SD CS 72
SD RAS 71
SD CAS 70
SD WE 69

MSX パーフェクトカタログ買いました

パーフェクトカタログシリーズは全て持ってるのですが、一番待ち望んだものが発売されました。
MSXパーフェクトカタログです。

ゲーム機のゲームは他にもカタログ的な書籍はあったのですが、MSXは初めてではないでしょうか?

ハードとソフト両方が全部掲載しており、非常に満足できる内容です。

MSXパーフェクトカタログ (G-MOOK)

MSXパーフェクトカタログ (G-MOOK)

  • 発売日: 2020/05/28
  • メディア: ムック

Wio Terminalで軽く遊んでみました Wi-fi編

発売されて人気のあるWio Terminalで遊んでみました。
M5Stackがあれば良いと思ってたのですが、結構話題になっているようでつい買ってしまいました。

自分用のメモも兼ねて、Wi-fiに接続するサンプルを書きます。

Wi-fiのコントローラはESP32と違いSoCとは別にRealtek RTL8720が使用されています。
まずはRTL8720のファームウェアのアップデートとArduinoのライブラリの追加をします。

手順は公式サイトを参照してください
Wio Terminal Network Overview
https://wiki.seeedstudio.com/Wio-Terminal-Network-Overview/

Wi-fiに接続するサンプル
#include "AtWiFi.h"
#include "TFT_eSPI.h"

const char* ssid = "(WI-fiアクセスポイントのSSID)";
const char* password =  "(WI-fiアクセスポイントのパスワード)";

TFT_eSPI tft = TFT_eSPI();

void setup() {

  WiFi.mode(WIFI_STA);  // ステーション(子機)モードに設定

  tft.begin();
  tft.setRotation(1);
  tft.setTextColor(TFT_WHITE, TFT_BLACK);
  tft.fillScreen(TFT_BLACK);
  tft.setTextSize(2);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    tft.setCursor(10, 10);
    tft.printf("Connecting to WiFi...");
  }

  tft.printf(" OK");
  tft.setCursor(10, 30);
  tft.println(WiFi.localIP());

  WiFi.disconnect();
}

void loop() {

}

実行結果
f:id:uosoft:20200526144753j:plain

M5Stackで軽く遊んでみました 時計編

今回はM5Stackで遊んでみました。
これも前にM5StickCと一緒に買って積みハードになっていました。

サンプルスケッチを簡単にまとめただけですが、自分用のメモも兼ねてシンプルなソースを書きました。

Wi-fi経由でNTPサーバから時間を取得して日時を表示するまでのサンプルです。


#include <time.h>
#include <M5Stack.h>
#include <WiFi.h>

const char* ssid       = "(Wi-fiアクセスポイントのSSID)";  
const char* password   = "(Wi-fiアクセスポイントのパスワード)";

// NTPサーバのURL
const char* ntpServer =  "ntp.jst.mfeed.ad.jp";
//  GMT+9(日本時間)
const long  gmtOffset_sec = 9 * 3600;
// サマータイム時差(無し)
const int   daylightOffset_sec = 0;

void setup() {
  M5.begin();
  
  M5.Lcd.clear(TFT_BLACK);
  M5.Lcd.setTextColor(TFT_WHITE, TFT_BLACK);
  M5.Lcd.setTextSize(4);

  WiFi.begin(ssid, password);

  // 500ms*120回なので、1分でタイムアウト
  for (int i = 0; i < 120 && WiFi.status() != WL_CONNECTED; i++) {
    delay(500);
  }
  if (WiFi.status() != WL_CONNECTED) {
    // Wifi接続エラー
  }

  if (WiFi.status() == WL_CONNECTED) {
    configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
    struct tm t;
    if (!getLocalTime(&t)) {
      // NTPサーバ接続エラー
    }
  }
  WiFi.disconnect(true);
  WiFi.mode(WIFI_OFF);

}

void loop() {
  struct tm t;
  if (getLocalTime(&t)) {
    M5.Lcd.setCursor(0, 0);
    M5.Lcd.printf("%04d/%02d/%02d", (1900 + t.tm_year), (t.tm_mon + 1), t.tm_mday);
    M5.Lcd.setCursor(0, 40);
    M5.Lcd.printf("%02d:%02d:%02d", t.tm_hour, t.tm_min, t.tm_sec);
  }
  
  delay(100);

}

M5StickCで軽く遊んでみました2 UIFlow編

前回紹介したM5StickCですが、今回はUIFlowで遊んでみました。

UIFlowはWEB版とデスクトップ版があるのですが、今回は手軽そうなWEB版を使いました。
WEB版を使用するには、ネットにつながったWifi環境が必要です

準備

ダウンロードページ

Download – m5stack-store
https://m5stack.com/pages/download

ここから M5Burner をダウンロードします。
デスクトップ版(UIFlow-Desktop-IDE)もここでダウンロードします。

M5Bunner

ダウンロードした M5Bunner でファームウェアM5StickCに書き込みます。
2020年5月14日の時点でM5StickCに対応しているファームウェアはUIFlow-v1.4.5.1です。

UIFlow-v1.4.5.1でを押してファームウェアをダウンロードした後で各設定をして[Burn]ボタンを押すとファームウェアM5StickCへ書き込まれます。

COM: M5StickCが接続されたCOMポートを選択
Baudrate: Series設定時に変更されたデフォルトの値のままでOK
Series: StickCを選択
SSID: WifiアクセスポイントのSSID
Password: Wifiアクセスポイントのパスワード

ファームウェアが書き込まれると、M5StickCに下の画像のような画面が表示されます。
f:id:uosoft:20200302165016j:plain
丸いマークが緑ならネット接続に成功しています。それ以外の場合はSSID等のネットの設定を見直してください。
で隠してある部分にAPIキーが表示されます。

UIFlow

ブラウザでUIFlowのページを開きます。

設定

起動時に下のような画面が表示されるので、APIキー等の設定をします。

Api key M5StickCに表示されたAPIキー
Language 日本語も選択できます
Device Stick-c

遊んでみる

前回 と同じように簡単なカウンターを作ってみました。

ソース?
f:id:uosoft:20200514111814p:plain
表示の部分は本来テキストを表示するブロックがあるのですが、数値の0埋め表示が無かった(わからなかった)ので、コード実行ブロックを使用して直接Pythonのコードを書きました。
内部的にはMicroPythonで動かしているようで、Pyhonに置き換えられたコードも見ることができます。
f:id:uosoft:20200514112836p:plain

プログラムできる人はArduinoIDEで普通にコードを書くのが圧倒的にやりやすいと思いますが。
ちょっと遊んだりプログラムの勉強をするのには面白いと思います。