GOWIN GW1N-UV4LQ144C6/I5を動かす

秋月で販売し始めた 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%になるとダウンロードされて動作します。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)