電子ガジェットいろいろ

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

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日で作曲入門

謎のメガドライブ互換機を買いました。

f:id:uosoft:20200604171355j:plain
一見本物に見えますが、互換機なんです。

良くある中華OEMのようで同じものと思われるものが多数のブランドで販売されています。
Aliexpressで5千円くらいでしたが、Amazonで販売されているものと同じものだと思います。


デザインやサイズも本物とほとんど同じです。精巧にコピーされています。

これの特徴はビデオ端子に加えてHDMIにも対応しています。
f:id:uosoft:20200604171832j:plain
残念ながらアスペクト比の設定が無く、ワイド画面の場合は引き延ばされてしまいますが、滲みも色合いも問題ありません。
ビデオ端子の出力は結構滲みますが、元々メガドライブは滲む方なので、本物と比較してもそんなに変わらないくらいです。

箱はこんな感じです。
f:id:uosoft:20200604171926j:plain

付属品も豊富です。

f:id:uosoft:20200604172024j:plain

無線のコントローラーも意外と使えます。

ACアダプタは選択できたのですが、USを選んだのにEU仕様のアダプタが入ってました。

f:id:uosoft:20200604171938j:plain

箱にはちゃんとUSと書いてあります。
普段メガドライブで使用しているアダプタがそのまま使えたので、特に気にしないことにします。

f:id:uosoft:20200604171813j:plain

全面はこんな感じです。
コントローラの端子は、純正品がそのまま使用できました。
ヘッドホン端子はステレオで聴こえるし、ボリュームも効きますが、テレ部側の出力がミュートされません。
また音質もそんなによくありません。

手持ちのゲームをいくつか試したところ、アドバンスド大戦略で画面が白くなる部分でちらついたり、提督の決断が起動しなかったりと互換性は良くある低価格の互換機と同程度だと思います。

EVERDRIVE MD は使用できました。

この機種の特徴は外見とHDMI出力だと思います。

低価格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, 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);

}

みんなのM5Stack入門

みんなのM5Stack入門