秋月で販売し始めた Gowin RUMBER FPGA Development Boardを動かしてみました。
環境はLinuxMint20です。基本的な手順はTang Nanoの時とほぼ同じです。
GOWIN EDAのダウンロード
開発に使用するGOWIN EDAはこちらからダウンロードできました。ダウンロードにあたってはログインが必要で、前回ユーザー登録していたので、それでログインしました。ログインすると、「Gowin EDA」のダウンロードのところからダウンロードできるようになっています。
そして今回は Gowin V1.9.8 linux をダウンロードしました。
GOWIN EDAのインストール
ダウンロードしたファイルをディレクトリを作って展開して起動します。
~$ mkdir gowin1.9.8
~/gowin1.9.8$ cd gowin1.9.8/
~/gowin1.9.8$ tar xvfz ~/ダウンロード/Gowin_V1.9.8_linux.tar.gz
~/gowin1.9.8$ IDE/bin/gw_ide
起動するとライセンスエラーになりますので、ライセンスサーバーを設定して、Test ConnectionをクリックしてからSaveします。
注)しばらくは動いていたのですが、しばらくしたらFloorPlannerが動かなくなってしまいました。
一般ユーザーでもProgrammerを使えるようにする
前回やったので今回はやっていませんが、Programmerを一般ユーザーでも使えるように設定しておきます。
~$ cd /etc/udev/rules.d/
/etc/udev/rules.d$ cat 50-tang-nano.rules
SUBSYSTEMS=="usb", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6010", ATTRS{product}=="Sipeed-Debug", GROUP="users", MODE="0666"
/etc/udev/rules.d$ sudo udevadm control --reload
/etc/udev/rules.d$ sudo modprobe -r ftdi_sio
Lチカプロジェクトの作成とソースコードの作成
Saveした後、再起動して、新規プロジェクトを作成します。
プロジェクトに名前をつけて、保存ディレクトリを指定して、先に進めます。
次に、デバイスを選択します。あとでプログラマーで見ると、デバイスはGW1N-4BとGW1N-4Dの他に3つくらい出てくるのですが、まずはGW1N-4Bを選んで、その中から搭載されているGW1N-UV4LQ144C6/I5を選択します。
サマリとしては以下のようになりました。
プロジェクトを右クリックしてNew FileでVerilog Fileを作成します。
ファイル名としてled.vを指定してファイルを作成します。
ソースコードウインドウが開くので、以前作成したソースを修正して貼り付けます(以下)。
/* デバイスは GW1N-4B(GW1N-UV4LQ144C6/I5) */
module led
(
input wire CLK_IN,
input wire RST_N,
input wire SW,
output wire [2:0]RGB_LED
);
parameter time1 = 10'd1000 - 1'd1;
// parameter time2 = 10'd1000 - 1'd1; // 1秒周期
parameter time2 = 10'd500 - 1'd1; // 0.5秒周期
reg [2:0] rled;
reg [2:0] rledout;
reg [9:0] count1; // PWM DUTY用(1ms周期)
reg [9:0] count2; // PWM レベル用(1s周期)
reg [4:0] ckec;
reg cke; // 1us周期イネーブル
reg dir;
reg [3:0] dsw;
reg [9:0] duty;
initial
begin
count1=10'b0;
count2=10'b0;
rled=3'b110;
cke = 1'b1;
ckec <= 5'b0 ;
dir = 1'b0;
dsw = 4'b1111;
end
// 1MHz周期のイネーブル信号生成
always @(posedge CLK_IN)begin
if(RST_N==0)begin
cke = 1'b1;
end
if(ckec == 5'd11)
begin
ckec <= 5'b0 ;
cke <= 1'b1;
end
else begin
ckec <= ckec + 1'b1;
cke <= 1'b0;
end
end
always @(posedge CLK_IN)begin
if(cke == 1'b1 & RST_N==0)begin
count1 <= 10'b0;
count2 <= 10'b0;
rled <= 3'b110;
dir <= 1'b0;
end
// 1usクロックで0〜999(time1)までカウント
if(cke == 1'b1)
begin
if(count1 == time1)
begin
count1<= 10'd0;
end
else begin
count1 <= count1 + 1'b1;
end
end
// count1の1周期で0〜999(time2)までカウント
if(cke == 1'b1 & count1 == time1)
begin
if(count2 == time2)
begin
count2<= 10'd0;
rled <= dir ? {rled[1:0],rled[2]} : {rled[0],rled[2:1]} ;
end
else
count2 <= count2 + 1'b1;
end
// SWのチャタリング除去
if( cke == 1'b1 & count1 == time1 )
begin
dsw[3:1] <= dsw[2:0];
dsw[0] <= SW;
end
// SWが押されているときにはdirを反転
if( cke == 1'b1 & count1 == time1 )
begin
if( dsw == 4'b1100 )
dir <= dir ? 1'b0 : 1'b1 ;
else
dir <= dir ;
end
// LEDを駆動するPWM信号生成
if(cke == 1'b1)
begin
if(count2 < time2/2)
duty = count2 * 2;
else
duty = (time2 - count2) * 2;
if(count1 < duty)
rledout = rled;
else
rledout = 3'b111;
end
end
assign RGB_LED[0] = rledout[0];
assign RGB_LED[1] = rledout[1];
assign RGB_LED[2] = rledout[2];
endmodule
論理合成と配置配線
保存して、ProcessタブでSynthesizeを右クリックしてConfigurationを選択します。
ライセンスをしていないと、合成ツールは GowinSynthesis になるようです。
そのままOKして、Synthesizeを右クリックしてRunを選択すると、論理合成されます。
ProcessタブのUser Constraintsの中のFloorPlannerをダブルクリックして起動します。端子制約ファイル.cstがないので作るか聞いてくるので、作成する。
チップ内のレイアウトが開くので、Package Viewタブをクリック、下のペインでI/O Constraintsをクリックして端子を割り当てる画面になります。
関係する端子をボードのマニュアルから確認して設定していきます。
4ピンに12MHzのクロックが入力されているので、PortのリストからCLK_INを4ピンにドラッグ&ドロップします。I/OタイプをLVCMOS33に変更します。
RGB_LED[0]、RGB_LED[1]、RGB_LED[2]をそれぞれ、112-114ピンにドラッグ&ドロップして、LVCMOS33に変更、RGBのLEDはアノードコモンなのでオープンドレインに変更します。
入力信号のRST_N(リセット信号)とSW(スイッチ)を58,59ピンにドラッグ&ドロップして、LVCMOS33に変更します。
設定したら、フロッピーのアイコンで保存して閉じて、Processタブの中でPlace & Routeを右クリックしてRunを選択して配置配線を実行します。
コンフィグレーションのダウンロード
ボードを接続するとFTDI2232CとしてUSBシリアルとして認識されてしまうので、ドライバをremoveします。
$ sudo modprobe -r ftdi_sio
ProcessタブのProgram DeviceをダブルクリックしてGowin Programmerを起動します。
虫眼鏡のアイコンをダブルクリックしてチェーンをスキャンしてデバイスを検出します。検出されたデバイスの中からGW1N-4Bを選択します。
Operationの箇所のRead Device Codecsをダブルクリックして、OperationをSRAM Programに変更、Programming OptionでFile Nameに生成したコンフィグレーション用のファイルを設定します。ファイルはプロジェクトフォルダの下の impl/pnr の下に拡張子 fs で存在しています。設定したらSaveで保存します。
保存したら、右向きの三角マークのアイコンでプログラムを開始します。
動き出すまで時間がかかりますが、動き出して100%になるとダウンロードされて動作します。