場末のソフトウェアエンジニアのブログ

雑多な記事ばっかりのブログ

【Tang Nano 4K】サンプルプロジェクト(Lチカ)を動かしてみた

Tang Nano 4KをLinux(Ubuntu 20.04 LTS)上で動かしてみたという記事です。 ちょっと引っかかった箇所があったので、それについて書いておきます。 あまりスクショとってなかったので、文字ばっかりですがご容赦ください。

Gowin IDEのインストール

www.gowinsemi.com

GowinのWebサイトからダウンロードする必要があります(要ユーザー登録)。 その際、バージョンに注意です。現行のV1.9.8.01ではライセンスサーバーにアクセスすることができません。 したがって、V1.9.8をダウンロードしましょう。

Linux版のGowin IDEはtar.gzファイルなので、任意の場所に展開します。 私は、/opt直下にgowinというディレクトリを作って、そこに展開しました。

それと、シェル起動時にPATHを設定しておくようにすると便利です。 bashだと以下の通り。

export PATH=$PATH:/opt/gowin/IDE/bin

起動

パスを通していると、以下のコマンドでGowin IDEを起動できるはずです。

gw_ide

最初の起動では、ライセンスサーバーへの接続に失敗したというメッセージが表示され、 ライセンスサーバーIPアドレスを入力するよう求められると思います。 その際はIPアドレスとして、45.33.107.56 を入力してください。

入力してOKボタンを押下すると、Gowin IDEは一旦終了するので、 再度起動してみてください。

サンプルプロジェクトを開く

https://github.com/sipeed/TangNano-4K-example をgit cloneします。 TangNano-4K-example/led_test/project/led_test.gprj がGowin IDEのプロジェクトファイルになります。

このファイルをGowin IDEで開きます。

論理合成、配置配線

すでに済んでいると思いますが、念のためRerun Allでビットストリームファイルを作成しておきます。

コンフィギュレーション

Gowin Programmerではうまくいきませんでした。 そのため、有志が作成したopenFPGALoaderというプログラムを使ってコンフィグレーションを行います。

trabucayre.github.io

Ubuntuでのインストール手順は上記のサイトに書かれてあるため割愛します。

TangNano-4K-example/led_test/project/impl/pnr/led_test.fs がビットストリームファイルです。 これをFPGAに書き込むには、以下のコマンドです。

openFPGALoader -b tangnano4k <bit stream file>

書き込みが完了すると、Tang Nano 4KのLEDが点滅しているはずです。 これで一連の作業は完了です。お疲れ様でした。

参考文献

サンプルプロジェクトを動作させるために参考にした記事です。 何か引っかかるところがあれば、参考にしてください。

qiita.com

blog.goo.ne.jp

blueeyes.sakura.ne.jp

qiita.com

github.com

朝からつまらんことをしてしまった件

おはようございます。Happinessfieldです。今日は朝からてんやわんやでした。なぜかというと、昨日書いたはずのUART RXモジュールが微塵もなかったのです。このときショックを隠し切れませんでした。

事の経緯

おそらくgitを使っているとき、UART RXモジュールをgit addし忘れてコミットしてしまったのでしょう。 しかし、それだけなら再度git addすればいいだけの話です。 ここで私は重大なミスを犯してしまいました。git addする前にチェックアウトしてしまったのです。 そのため、編集済みのファイルが消えてしまったわけですね。こわいこわい。

さてどうする?

まずはどうしようか考えました。 ファイルがrmされているのであれば、ファイルシステム上にファイルの実体が残っている可能性が高いです。 ファイルの削除というのは、おそらくテーブルの参照情報を削除しているにすぎませんので。 ということで、ファイルの復元ソフトを使うことにしました。PhotoRecという有名なやつです。

やったこと

PhotoRecはCUIのアプリなのですが、インタラクティブに操作ができます。 そのため、非常に楽でした。 ものの30分程度で対象ディレクトリに存在していたと思しきファイルが復元されてました。

復元すると大量のディレクトリが生成されるので、いちいち1つずつ見ていてはキリがありません。 そこで、てきとーにスクリプトを書いて、てきとーに候補となるファイルを絞り込んでいきました。

find . -type f | xargs grep "module UART_Rx" > result.txt
cat result.txt | sed -e "s/\(.*\): .*/\1/g" > candidates.txt
for FILE in `cat candidates.txt`
do
    echo $FILE >> value.txt
    cat $FILE >> value.txt
    echo "" >> value.txt
done

うろ覚えなのでなんともですが、こんな感じで書きました。 value.txtからUART_Rxをインスタンシエーションしているファイルを特定し、あとはそのファイルをチェックし、復元するだけ! 非常に簡単です。

みなさんも困ったときはぜひ試してみてくださいね。そもそもそういう事態にならないようにするのが大事ですが…

【忘備録】NSLにおけるgenerate文について

NSLにはgenerate文というものがあり、バレルシフタをgenerate文を使って書き直そうとしていたときの話です。 Verilogのgenerate文と似たようなもので、HDL記述が簡潔になるというメリットがあります。

// バレルシフタ

wire shifted[32];

integer i;
variable v[32];
variable n[5];

v = inp;
n = num;

generate (i = 1; i <= 16; i = i * 2) {
    if (n[0]) {
        if (v[31]) {
            v = {i{1'b1}, (v >> i)[(31 - i):0]};
        } else {
            v = {i{1'b0}, (v >> i)[(31 - i):0]};
        }
    }

    n = n >> 1;
}

shifted = v;

return shifted;

普通にif文が使えると思って、上記のように記述していました。 しかし、シミュレーションでは全く正しい結果と異なる値が出力されました。

正しくは以下のように記述する必要があるようです。 つまり、generate文の中ではif文は使用できないということです。

// バレルシフタ

wire shifted[32];

integer i;
variable v[32];
variable n[5];

v = inp;
n = num;

generate (i = 1; i <= 16; i = i * 2) {
    v = if (n[0])
            if (v[31]) {i{1'b1}, (v >> i)[(31 - i):0]} 
            else {i{1'b0}, (v >> i)[(31 - i):0]}
        else v;
    n = n >> 1;
}

shifted = v;

return shifted;

このバグを見つけるまでに相当時間がかかりました。 みなさんも十分お気を付けください。

【Tang Primer】UARTモジュール完成しました

ようやくようやくUARTモジュールを完成させました。最近全然やる気が出なかったので、全然やってませんでした。外部通信のためのパーツはできたので、次は以前作っていたCPUをmodifyしておきたいところです。

UART

ローデ・シュワルツの解説ページ を参照するといいです(説明がめんどくさいだけw)。

UART自体は非常に簡単なプロトコルで通信が可能です。そのため、組み込み用途ではよく使われています。

【Tang Primer】現在の進捗

本ブログをご覧いただきありがとうございます。 雑多な内容ばっかりですが、よろしくおねがいします。

現時点での開発状況

Lチカ

基板実装されたRGB LEDを任意の色で光らせることができています。 LEDへの出力は、HighかLowの2値になるので、PWM制御を使っています。 これにより、各チャネルごとに256階調の輝度を設定することが可能です。

通信

UARTと呼ばれるシリアル通信のプロトコルを実装中です。 現時点では、送信はできるようになりました。 これができると、PCとデータをやり取りすることができ、 可能性が大きく広がります。

将来の展望

以前NSLで作成したRISC-V(RV32I)のCPUを動かせればいいなぁと 思っています。市販で売っているマイコンを作ってみよう的な話です。

ほかにもSIMD計算機なども作ってみたいですね。妄想が膨らむばかりです。

GitHub

ソースコードGitHubで公開しています。拙いですが、何かしら参考になればと思います。

https://github.com/yasuda0102/tp_tutorial

【Tang Primer】開発環境インストール

とりあえず書き溜めておいた記事を公開することにしました。 わからないところがあれば、適宜ご質問ください。

Tang Primerってなんですか?

Tang Primerとは中華FPGAです。IntelXilinxFPGAよりも ロジック数は少ないですが、おもちゃとしては十分です。 とはいっても、HummingBirdというRISC-VのIPが載るらしいので、 そこまで非力ではないはず。

FPGAってなんですか?

任意の論理回路を構成できるすごいやつ! 主たる構成要素としては、LUT(Look-Up Table)とD-FFとセレクタがあって、 それらをひとまとめにしたものがたくさん並んでます。 以下にWikipediaから借りてきた画像を載せときます。

f:id:happinessfield:20210812081727p:plain
FPGAの構成要素

ローエンドからハイエンドまであって、ローエンドは今回ご紹介する Tang PrimerやIntelのCyclone, XilinxのSpartanが有名です。 主にエッジ側で使われることが多いです。 ハイエンドはデータセンターや通信設備などパフォーマンスが要求される 場所で使われます。1個数百万はするはずなので、庶民には買えないです。

開発環境構築 (Linux)

公式サイトでも見てください。 注意点だけ書いておきます。

#!/bin/bash

sudo /opt/TD_RELEASE_March2020_r4.6.4/bin/td -gui