FC2カウンター FPGAの部屋 2024年02月
fc2ブログ

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

Gowin Analyzer Osciloscope で hdmi プロジェクトの信号を確認する1

Tang Primer 25K で PMOD-DVI を使用する5”で SVGA サイズの画像をディスプレイに表示することができた。Gowin FPGA Designer の Gowin Analyzer Osciloscope を使用して、hdmi プロジェクトの信号を確認してみよう。

hdmi プロジェクトの svo_tcard.v で画像を生成し、svo_enc.v で DVI 信号に変換しているようだ。
svo_tcard.v の out_axis_tuser 信号は画像のスタート・ピクセルを示す 1 ビット長(svo_hdmi.v の vdma_tuser)だが、svo_enc.v の out_axis_tuser は 4 ビット長(svo_hdmi.v の video_enc_tuser)だった。

svo_enc.v の tuser の定義を引用する。

// output stream
// tuser[0] ... start of frame
// tuser[1] ... hsync
// tuser[2] ... vsync
// tuser[3] ... blank


svo_hdmi.v の一部を引用する。
Tang_Primer_25K_221_240228.png

さて、Gowin FPGA Designer で Gowin Analyzer Osciloscope の設定を行う。

Gowin FPGA Designer の File メニューから new... を選択した。
New ダイアログが表示された。
Files から GAO Config File を選択して、OK ボタンをクリックした。

New GAO Wizard ダイアログが表示された。
GAO Settings 画面
デフォルトのままで、Next > ボタンをクリックした。

GAO Configure File 画面
Name はデフォルトの hdmi のままとした。
Next > ボタンをクリックした。

Summary 画面
Finish ボタンをクリックした。

src ディレクトリに hdmi.rao ファイルが生成された。
hdmi.rao をダブルクリックして編集した。
Tang_Primer_25K_205_240228.png

Trigger Options -> Trigger Ports -> Trigger Port0 をダブルクリックして編集する。
Trigger Port ダイアログが表示された。
+ボタンをクリックした。

Search Nets ダイアログが表示された。
Name に ”vdma_” と入力して、Search ボタンをクリックした。
svo_hdmi_inst0 の信号のみを選択し、OK ボタンをクリックした。

もう一度、Trigger Port ダイアログの + ボタンをクリックした。
Search Nets ダイアログが表示された。
Name に ”video_enc_” と入力して、Search ボタンをクリックした。
svo_hdmi_inst0 の信号のみを選択し、OK ボタンをクリックした。

Trigger Port ダイアログの様子を示す。
OK ボタンをクリックした。
Tang_Primer_25K_206_240228.png

Trigger Options -> Trigger Ports -> Trigger Port0 に選択した信号が追加された。
Match Units で MO をダブルクリックした。
Tang_Primer_25K_207_240228.png

Match Unit Config ダイアログが表示された。
On Trigger Port をクリックし、Trigger Port 0 を選択した。
Value で HEX を選択した。
Counter にチェックを入れて、Width を 3、Count を 7 に設定した。
Continuous にチェックを入れた。
OK ボタンをクリックした。
Tang_Primer_25K_208_240228.png

Expressions の中で右クリックし、右クリックメニューから Add を選択した。
Expression ダイアログが表示された。
M0 ボタンをクリックして、M0 を選択した。
OK ボタンをクリックした。
Tang_Primer_25K_209_240228.png

Expressions に M0 が追加された。
Tang_Primer_25K_210_240228.png
  1. 2024年02月29日 05:15 |
  2. Tang_Primer_25K
  3. | トラックバック:0
  4. | コメント:0

Xyloni Development Kit が届いた

EFINIX 社の Xyloni Development Kit この Web サイトで、一昨日注文したところ、昨日届いた。さすが、国内での注文は届くのが早い。

Xyloni Development Kit には、81-ball FBGA package の Efinix® T8F81C2 device が搭載されている。

Xyloni Development Kit は下の紙箱に入っていた。
Xyloni_Dev_Kit_1_240228.jpg

中身は、USB ケーブルとコネクタ類と基板だった。
Xyloni_Dev_Kit_2_240228.jpg

後ではんだ付けしておこう。

基板はとても小さい。ノギスで測ると 51.46 x 33.52 mm だった。
Xyloni_Dev_Kit_3_240228.jpg

裏には Micro SD カード・スロットがあった。
Xyloni_Dev_Kit_4_240228.jpg

Xyloni Development Kit のリソース
EFINIX 社の Xyloni Development Kit ページ
Xyloni Development Kit の github ページ
米国 Efinix社製 FPGAスタータキット “Xyloni”入門[RISC-V編] ソースコード完全公開!オープンソース CPUの組み込みからソフトウェア開発まで
  1. 2024年02月28日 04:04 |
  2. Xyloni Development Kit
  3. | トラックバック:0
  4. | コメント:0

Tang Primer 25K で PMOD-DVI を使用する5

Tang Primer 25K で PMOD-DVI を使用する4”の続き。

Tang Primer 25K に PMOD-DVI ボードを挿して、HDMI コネクタ経由でディスプレイに何らかの画像を出したい。ということで、前回は、PLLA プリミティブの出力周波数が高すぎたので、PLLA のパラメータを調整して、200 MHz つまり、SVGA のピクセル・クロックの 5 倍を出力するようにした。また svo/svo_hdmi.v を修正して、800x600 ピクセルの SVGA モードに変更した。Synthesis と Place & Route を行って、前々回のタイミング制約エラーは回避できたが、Recovery Paths Table にエラーが出ていた。今回は、生成されたビットストリームを FPGA にダウンロードしたところ、HDMI 端子に接続されたディスプレイに画像が表示された。

Tang Primer 25K をホスト・パソコンに USB ケーブルで接続した。
PMOD-DVI を J4 に接続し、HDMI ケーブルでディスプレイと接続した。

ホスト・パソコンの OS は Ubuntu 22.04 なので、Programmer をスーバーユーザー権限で起動した。
sudo /media/masaaki/Ubuntu_Disk/Gowin/Programmer/bin/programmer -family GW5A -device GW5A-25A -fs //media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/impl/pnr/hdmi.fs

Programmer が起動し、USB Debuuger A ケーブルが見つかった。
Save ボタンをクリックした。

Gowin Programmer が起動した。
Programmer の Program/Configure ボタンをクリックした。

Progress Information ダイアログが表示された。
Programming... が進んでいく。

コンフィギュレーションが終了した。
Tang_Primer_25K_202_240227.png

Tang Primer 25K の READY LED と DONE LED が点灯した。
Tang_Primer_25K_203_240227.jpg

ディスプレイに画像が表示された。多分成功だ。。。
Tang_Primer_25K_204_240227.jpg

SVGA (800 x 600 ピクセル)の画像を表示することができた。
  1. 2024年02月27日 04:04 |
  2. Tang_Primer_25K
  3. | トラックバック:0
  4. | コメント:0

Tang Primer 25K で PMOD-DVI を使用する4

Tang Primer 25K で PMOD-DVI を使用する3”の続き。

Tang Primer 25K に PMOD-DVI ボードを挿して、HDMI コネクタ経由でディスプレイに何らかの画像を出したい。ということで、前回は、タイミング制約エラーの原因を Verilog HDL ソースコードから探ってみたところ、PLLA プリミティブの出力周波数が高すぎることが分かった。今回は、PLLA プリミティブの出力周波数が高すぎたので、PLLA のパラメータを調整して、200 MHz つまり、SVGA のピクセル・クロックの 5 倍を出力するようにした。また svo/svo_hdmi.v を修正して、800x600 ピクセルの SVGA モードに変更した。Synthesis と Place & Route を行って、前々回のタイミング制約エラーは回避できたが、Recovery Paths Table にエラーが出ていた。

タイミング制約エラーの原因を Verilog HDL ソースコードから探ってみたところ、PLLA プリミティブの出力周波数が高すぎることが分かった。
それで、画像のサイズを 800x600 ピクセルに変更して、PLLA の出力周波数を 200 MHz にすることにした。200 MHz はピクセル・クロックの 5 倍の周波数なので、実際のピクセル・クロックの周波数は 40 MHz となる。
src/gowin_pll/gowin_pll.v を修正した。
Tang_Primer_25K_196_240226.png

PLLA_inst.CLKFB_SEL と PLLA_inst.MDIV_SEL を以下のように修正した。

defparam PLLA_inst.MDIV_SEL = 16; // Vco : 800 MHz by marsee
defparam PLLA_inst.ODIV0_SEL = 4; // 800 MHz / 4 = 200 MHz = 40 MHz x 5 by marsee


この修正によって Vco の周波数は以下の式より

Fvco = (Fclkin/IDIV) * FBDIV * MDIV


IDIV = 1, FBDIV = 1, 内部フィードバック、MDIV = 16 で、Fvco = 50 x 16 = 800 MHz となる。
なお、Fvco のスペックでは、800 MHz が下限となっている。(GW5A series of FPGA Products Data Sheet の 53 ページの 3.4.6 PLL Switching Characteristics 参照)

クロック出力の出力周波数は VCO in モードの際は、

Fclkoutx=Fvco/ODIVx

だそうだ。
Fvco は 800 MHz で、PLLA_inst.ODIV0_SEL を 4 に設定したので、Fclkout0 は 800 MHz / 4 = 200 MHz となる。
200 MHz はピクセル・クロックの 5 倍なので、実際のピクセル・クロックの周波数は 40 MHz となる。

800x600 ピクセルの画像に設定する必要があるので、以下にように svo/svo_hdmi.v を修正した。

parameter SVO_MODE = "800x600";


Tang_Primer_25K_197_240226.png

これで、Synthesis と Place & Route を行った。
Tang_Primer_25K_198_240226.png

GOWIN FPGA Designer の Process タブをクリックし、Process ウインドウを表示した。
Place & Route -> Place & Route Report を表示した。
Resource -> Resource Usage Summary を表示した。
Logic は 3034 個使用した。2525 個の LUT と 383 個の ALU, 21 個の SSRAM(RAM16), 1614 個の Resister を使用している。
Tang_Primer_25K_199_240226.png

Place & Route -> Timing Analyzer Report をクリックした。
Timing Summaries -> Clock Summary などを表示した。
Max Frequency Summay を見ると、clk_50 の Actual Fmax は 424.845 MHz だったが、Gowin_CLKDIV_inst/clkdiv_inst/CLKOUT.default_gen_clk の constraint が 40 MHz のところ、Actual Fmax は 62.317 MHz でタイミング制約を満たした。
ただし、Recovery Paths Table にエラーが出ているようだ。
Tang_Primer_25K_200_240226.png

Recovery Paths Table を表示する。
SERDES へのリセットのパスなので、大丈夫なのではないのだろうか? とりあえず、やってみよう。
Tang_Primer_25K_201_240226.png
  1. 2024年02月26日 04:45 |
  2. Tang_Primer_25K
  3. | トラックバック:0
  4. | コメント:0

FPGAの部屋のまとめサイトの更新(2024年2月25日)

FPGAの部屋のまとめサイト”を更新しました。
2024年2月25日までの記事をまとめて、”Tang Primer 25K”、”Gowin EDA”、”Bambu”の項目を追加しました。
  1. 2024年02月25日 03:47 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:0

Tang Primer 25K で PMOD-DVI を使用する3

Tang Primer 25K で PMOD-DVI を使用する2”の続き。

Tang Primer 25K に PMOD-DVI ボードを挿して、HDMI コネクタ経由でディスプレイに何らかの画像を出したい。ということで、前回は、配置成約とタイミング制約を見て、論理合成、Place & Route を行ったところ、タイミング制約違反になった。今回は、タイミング制約エラーの原因を Verilog HDL ソースコードから探ってみた。

まずは、なぜ 170 MHz という周波数が出てきたのか? Verilog HDL のソースコードから探ってみよう。
ブログ:【三菱ディスプレイ】第2「ApalisモジュールにおけるLVDS」”を確認すると、”最大1920x1200、60フレーム毎秒(最大170MHzのピクセルクロック周波数)”という記述があるので、1920x1200 60フレーム毎秒の画像なのかもしれない?
しかし、hdmi プロジェクトの svo_hdmi.v を確認すると、どうやら 1920x1080 60フレーム毎秒のようだ? svo_hdmi.v の一部を引用する。
Tang_Primer_25K_194_240223.png

クロックを発生している PLL は gowin_pll.v に記述されている。その PLLA ではピクセルクロックの 5 倍の周波数のクロックを出力し、それを gowin_clkdiv.v で周波数を 1/5 にして、ピクセルクロックとして使用しているようだ。

次に gowin_pll.v に記述されている PLLA の設定を見てみよう。一部を引用する。
Tang_Primer_25K_195_240223.png

PLLA のマニュアルは”Arora V Clock ユーザーガイド UG306-1.0.2J, 2024-02-02”の 36 ページの”5 システムクロック”の 5.2 PLLA -> 5.2.1 プリミティブの紹介に書かれている。
それによると、内部フィードバックの場合の、VCO クロック周波数は、

Fvco = (Fclkin/IDIV) * FBDIV * MDIV

だそうだ。
gowin_pll.v の設定から関連ある設定を拾ってみる。

defparam PLLA_inst.FCLKIN = "50";
defparam PLLA_inst.IDIV_SEL = 1;
defparam PLLA_inst.FBDIV_SEL = 1;
defparam PLLA_inst.CLKFB_SEL = "INTERNAL";
defparam PLLA_inst.MDIV_SEL = 17;


つまり IDIV = 1, FBDIV = 1, 内部フィードバック、MDIV = 17 で、Fvco = 50 x 17 = 850 MHz となる。

クロック出力の出力周波数は VCO in モードの際は、Fclkoutx=Fvco/ODIVx だそうだ。
gowin_pll.v の設定から関連ある設定を拾ってみる。なお、CLKOUT0 のみがピクセルクロックx5 倍の周波数で出力されている。

defparam PLLA_inst.CLK0_IN_SEL = 1'b0;
defparam PLLA_inst.CLK0_OUT_SEL = 1'b0;


この設定は、CLK0_IN_SEL が ODIV0 入力クロックソースの選択 を示し、1'b0 が VCO の出力を示している。
CLK0_OUT_SEL はチャンネル 0 出力クロックソースの選択を示し、1'b0 が ODIV0 の出力を示している。

defparam PLLA_inst.ODIV0_SEL = 1;
defparam PLLA_inst.ODIV0_FRAC_SEL = 0;


ODIV0_SEL は割り算する数の整数部、ODIV0_FRAC_SEL は割り算する数の少数部(3ビット)を示す。
つまり、CLKOUT0 には VCO の出力クロック 850 MHz のクロックが出ていることになる。
それが、gowin_clkdiv.v で周波数が 1/5 になるので、170 MHz ということになり、ここで 170 MHz のクロックのタイミング制約エラーが出る理由が分かった。

これじゃ、動作周波数が早すぎるので、VGA もしくは SVGA 程度にしたい。

なお、この FPGA も OSER10 と10:1 のいうシリアライザを持っていて、HDMI(DVI) の出力にそれを使用しているようだ。
  1. 2024年02月24日 03:55 |
  2. Tang_Primer_25K
  3. | トラックバック:0
  4. | コメント:0

Tang Primer 25K で PMOD-DVI を使用する2

Tang Primer 25K で PMOD-DVI を使用する1”の続き。

Tang Primer 25K に PMOD-DVI ボードを挿して、HDMI コネクタ経由でディスプレイに何らかの画像を出したい。ということで、前回は、TangPrimer-25K-example/hdmi のプロジェクトを起動した。今回は、配置成約とタイミング制約を見て、論理合成、Place & Route を行ったところ、タイミング制約違反になった。

配置成約の hdmi.cst を確認した。
Tang_Primer_25K_188_240223.png

Tang Primer 25K DockのPMODの信号名とピン番号表と見比べると、tmds_d_p_2 が PMOD の J6, tmds_d_p_1 が J5, tmds_d_p_0 が J4 のようだ。
Tang_Primer_25K_62_240204.png

Synthesis ボタンをクリックして、論理合成を行った。
Tang_Primer_25K_189_240223.png

ログを示す。

GowinSynthesis start
Running parser ...
Analyzing Verilog file '/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/gowin_clkdiv/gowin_clkdiv.v'
Analyzing Verilog file '/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/gowin_pll/gowin_pll.v'
Analyzing Verilog file '/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/hdmi/svo_defines.vh'
Analyzing Verilog file '/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/hdmi/svo_enc.v'
Analyzing included file '/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/hdmi/svo_defines.vh'("/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/hdmi/svo_enc.v":21)
Back to file '/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/hdmi/svo_enc.v'("/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/hdmi/svo_enc.v":21)
Analyzing Verilog file '/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/hdmi/svo_openldi.v'
Analyzing included file '/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/hdmi/svo_defines.vh'("/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/hdmi/svo_openldi.v":21)
Back to file '/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/hdmi/svo_openldi.v'("/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/hdmi/svo_openldi.v":21)
Analyzing Verilog file '/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/hdmi/svo_pong.v'
Analyzing included file '/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/hdmi/svo_defines.vh'("/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/hdmi/svo_pong.v":21)
Back to file '/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/hdmi/svo_pong.v'("/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/hdmi/svo_pong.v":21)
Analyzing Verilog file '/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/hdmi/svo_tcard.v'
Analyzing included file '/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/hdmi/svo_defines.vh'("/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/hdmi/svo_tcard.v":21)
Back to file '/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/hdmi/svo_tcard.v'("/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/hdmi/svo_tcard.v":21)
Analyzing Verilog file '/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/hdmi/svo_term.v'
Analyzing included file '/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/hdmi/svo_defines.vh'("/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/hdmi/svo_term.v":21)
Back to file '/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/hdmi/svo_term.v'("/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/hdmi/svo_term.v":21)
Analyzing Verilog file '/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/hdmi/svo_tmds.v'
Analyzing included file '/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/hdmi/svo_defines.vh'("/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/hdmi/svo_tmds.v":21)
Back to file '/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/hdmi/svo_tmds.v'("/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/hdmi/svo_tmds.v":21)
Analyzing Verilog file '/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/hdmi/svo_utils.v'
Analyzing included file '/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/hdmi/svo_defines.vh'("/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/hdmi/svo_utils.v":21)
Back to file '/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/hdmi/svo_utils.v'("/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/hdmi/svo_utils.v":21)
Analyzing Verilog file '/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/hdmi/svo_vdma.v'
Analyzing included file '/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/hdmi/svo_defines.vh'("/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/hdmi/svo_vdma.v":21)
Back to file '/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/hdmi/svo_vdma.v'("/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/hdmi/svo_vdma.v":21)
Analyzing Verilog file '/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/svo_hdmi.v'
Analyzing included file '/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/hdmi/svo_defines.vh'("/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/svo_hdmi.v":21)
Back to file '/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/svo_hdmi.v'("/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/svo_hdmi.v":21)
Analyzing Verilog file '/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/top.v'
Undeclared symbol 'pll_lock', assumed default net type 'wire'("/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/top.v":24)
Undeclared symbol 'clk_p5', assumed default net type 'wire'("/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/top.v":25)
Undeclared symbol 'clk_p', assumed default net type 'wire'("/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/top.v":30)
Undeclared symbol 'sys_resetn', assumed default net type 'wire'("/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/top.v":42)
Compiling module 'top'("/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/top.v":1)
Compiling module 'Gowin_PLL'("/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/gowin_pll/gowin_pll.v":10)
Compiling module 'Gowin_CLKDIV'("/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/gowin_clkdiv/gowin_clkdiv.v":10)
Compiling module 'Reset_Sync'("/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/top.v":109)
Compiling module 'svo_hdmi'("/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/svo_hdmi.v":23)
WARN  (EX3791) : Expression size 5 truncated to fit in target size 4("/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/svo_hdmi.v":86)
WARN  (EX3791) : Expression size 5 truncated to fit in target size 4("/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/svo_hdmi.v":89)
Compiling module 'svo_tcard(SVO_MODE="1920x1080")'("/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/hdmi/svo_tcard.v":23)
WARN  (EX3045) : Case equality operator always evaluates to false due to comparison with 'x' or 'z'("/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/hdmi/svo_tcard.v":33)
WARN  (EX3791) : Expression size 32 truncated to fit in target size 24("/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/hdmi/svo_tcard.v":237)
WARN  (EX3791) : Expression size 15 truncated to fit in target size 14("/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/hdmi/svo_tcard.v":251)
WARN  (EX3791) : Expression size 10 truncated to fit in target size 9("/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/hdmi/svo_tcard.v":253)
WARN  (EX3791) : Expression size 6 truncated to fit in target size 5("/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/hdmi/svo_tcard.v":254)
WARN  (EX3791) : Expression size 15 truncated to fit in target size 14("/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/hdmi/svo_tcard.v":257)
WARN  (EX3791) : Expression size 10 truncated to fit in target size 9("/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/hdmi/svo_tcard.v":259)
WARN  (EX3791) : Expression size 6 truncated to fit in target size 5("/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/hdmi/svo_tcard.v":260)
Compiling module 'svo_enc(SVO_MODE="1920x1080")'("/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/hdmi/svo_enc.v":23)
Extracting RAM for identifier 'ctrl_fifo'("/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/hdmi/svo_enc.v":48)
Extracting RAM for identifier 'pixel_fifo'("/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/hdmi/svo_enc.v":51)
Extracting RAM for identifier 'out_fifo'("/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/hdmi/svo_enc.v":54)
WARN  (EX3045) : Case equality operator always evaluates to false due to comparison with 'x' or 'z'("/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/hdmi/svo_enc.v":43)
WARN  (EX3791) : Expression size 3 truncated to fit in target size 2("/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/hdmi/svo_enc.v":92)
WARN  (EX3791) : Expression size 15 truncated to fit in target size 14("/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/hdmi/svo_enc.v":96)
WARN  (EX3791) : Expression size 15 truncated to fit in target size 14("/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/hdmi/svo_enc.v":98)
WARN  (EX3791) : Expression size 4 truncated to fit in target size 3("/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/hdmi/svo_enc.v":110)
WARN  (EX3791) : Expression size 4 truncated to fit in target size 3("/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/hdmi/svo_enc.v":125)
WARN  (EX3791) : Expression size 3 truncated to fit in target size 2("/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/hdmi/svo_enc.v":129)
WARN  (EX3791) : Expression size 3 truncated to fit in target size 2("/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/hdmi/svo_enc.v":130)
WARN  (EX3791) : Expression size 3 truncated to fit in target size 2("/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/hdmi/svo_enc.v":133)
WARN  (EX3791) : Expression size 3 truncated to fit in target size 2("/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/hdmi/svo_enc.v":134)
WARN  (EX3791) : Expression size 4 truncated to fit in target size 3("/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/hdmi/svo_enc.v":135)
WARN  (EX3791) : Expression size 3 truncated to fit in target size 2("/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/hdmi/svo_enc.v":155)
WARN  (EX3791) : Expression size 3 truncated to fit in target size 2("/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/hdmi/svo_enc.v":159)
Compiling module 'svo_tmds'("/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/hdmi/svo_tmds.v":23)
WARN  (EX3791) : Expression size 25 truncated to fit in target size 24("/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/top.v":102)
NOTE  (EX0101) : Current top module is "top"
[5%] Running netlist conversion ...
Running device independent optimization ...
[10%] Optimizing Phase 0 completed
[15%] Optimizing Phase 1 completed
[25%] Optimizing Phase 2 completed
Running inference ...
[30%] Inferring Phase 0 completed
[40%] Inferring Phase 1 completed
[50%] Inferring Phase 2 completed
[55%] Inferring Phase 3 completed
Running technical mapping ...
[60%] Tech-Mapping Phase 0 completed
[65%] Tech-Mapping Phase 1 completed
[75%] Tech-Mapping Phase 2 completed
[80%] Tech-Mapping Phase 3 completed
[90%] Tech-Mapping Phase 4 completed
[95%] Generate netlist file "/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/impl/gwsynthesis/hdmi.vg" completed
[100%] Generate report file "/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/impl/gwsynthesis/hdmi_syn.rpt.html" completed
GowinSynthesis finish


タイミング制約を確認した。
クロックが 50 MHz という成約だった。
Place & Route ボタンをクリックした。
Tang_Primer_25K_190_240223.png

Process タブをクリックし、Process ウインドウを表示した。
Place & Route -> Place & Route Report を表示した。
Resource -> Resource Usage Summary を表示した。
Logic は 2913 個使用して、その内訳は 2530 が 18 個、ALU が 383 個、ROM16 が 0 個だそうだ。
Tang_Primer_25K_191_240223.png

ログを示す。タイミング制約エラーでもエラーにはなっていない。

Reading netlist file: "/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/impl/gwsynthesis/hdmi.vg"
Parsing netlist file "/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/impl/gwsynthesis/hdmi.vg" completed
Processing netlist completed
Reading constraint file: "/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/src/hdmi.cst"
Physical Constraint parsed completed
Running placement......
[10%] Placement Phase 0 completed
[20%] Placement Phase 1 completed
[30%] Placement Phase 2 completed
[50%] Placement Phase 3 completed
Running routing......
[60%] Routing Phase 0 completed
[70%] Routing Phase 1 completed
[80%] Routing Phase 2 completed
[90%] Routing Phase 3 completed
Running timing analysis......
[95%] Timing analysis completed
Placement and routing completed
Bitstream generation in progress......
Bitstream generation completed
Generate file "/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/impl/pnr/hdmi.pin.html" completed
Generate file "/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/impl/pnr/hdmi.rpt.html" completed
Generate file "/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/impl/pnr/hdmi.rpt.txt" completed
Generate file "/media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/hdmi/svo/impl/pnr/hdmi.tr.html" completed
Fri Feb 23 05:01:16 2024


Place & Route -> Timing Analyzer Report をクリックした。
Timing Summaries -> Clock Summary などを表示した。
Max Frequency Summay を見ると、clk_50 の Actual Fmax は 424.845 MHz だったが、Gowin_CLKDIV_inst/clkdiv_inst/CLKOUT.default_gen_clk の constraint が 170 MHz のところ、Actual Fmax は 73.769 MHz で完全にタイミング制約エラーだった。
Tang_Primer_25K_192_240223.png

Timing Details -> Path Slacks Table -> Setup Paths Table を見ると真っ赤だった。orz
Tang_Primer_25K_193_240223.png

これは動かないだろうか?
でもなんで 170 MHz なのだろう? VGA x 5 = 125 MHz くらいだろうし、合う周波数がないような?
Verilog HDL コードを見てみようか?
  1. 2024年02月23日 08:31 |
  2. Tang_Primer_25K
  3. | トラックバック:0
  4. | コメント:0

Tang Primer 25K で PMOD-DVI を使用する1

Tang Primer 25K に PMOD-DVI ボードを挿して、HDMI コネクタ経由でディスプレイに何らかの画像を出したい。ということで、TangPrimer-25K-example/hdmi のプロジェクトを起動したが、どうやら Tang Primer 25K 用ではないらしい?

PMOD-DVI ボードの写真を示す。
Tang_Primer_25K_183_240222.jpg
Tang_Primer_25K_184_240222.jpg

PMOD-DVI ボードの回路図が/TANG/PMOD にある。PMOD_DVI_Schematic.pdf がPMOD-DVI ボードの回路図になる。

Tang Primer 25K に PMOD-DVI ボードを挿して使用する予定だ。

TangPrimer-25K-example の hdmi/svo ディレクトリに hdmi プロジェクトがあるので、GOWIN FPGA Designer でプロジェクトを開いた。
やはり FPGA の型番が指定されていなかった。
top.v を見ると HDMI ポートが 3 ポート実装されている? 1 ポートのみ使えば良いかな?
Tang_Primer_25K_185_240222.jpg

FPGA をダブルクリックして、型番を設定する。
Select Device ダイアログが開いた。
Series に GW5A を設定し、下のウインドウでGW5A-LV25MG121NC1/10 を指定して、OK ボタンをクリックした。
Tang_Primer_25K_186_240222.jpg

GW5A-LV25MG121NC1/10 が指定できた。
Tang_Primer_25K_187_240222.jpg
  1. 2024年02月22日 06:45 |
  2. Tang_Primer_25K
  3. | トラックバック:0
  4. | コメント:0

TangPrimer-25K-example の pmod_digitalTube-2bit をやってみよう2

TangPrimer-25K-example の pmod_digitalTube-2bit をやってみよう1”の続き。

TangPrimer-25K-example の pmod_digitalTube-2bit をやってみようということで、前回は、pmod_digitalTube-2bit を確認した。今回は、Programmer を立ち上げて、pmod_digitalTube-2bit.fs をダウンロードして、動作を確認した。

Tang Primer 25K を USB ケーブルでホスト・パソコンに接続した。

ホスト・パソコンの OS は Ubuntu 22.04 なので、Programmer をスーバーユーザー権限で起動した。
sudo /media/masaaki/Ubuntu_Disk/Gowin/Programmer/bin/programmer -family GW5A -device GW5A-25A -fs /media/masaaki/Ubuntu_Disk/Gowin/TangPrimer-25K-example/pmod_digitalTube-2bit/impl/pnr/pmod_digitalTube-2bit.fs

Programmer が起動し、USB Debuuger A ケーブルが見つかった。
Save ボタンをクリックした。

Gowin Programmer が起動した。
Programmer の Program/Configure ボタンをクリックした。
Tang_Primer_25K_179_240221.png

Progress Information ダイアログが表示された。
Programming... が進んでいく。

コンフィギュレーションが終了した。
Tang_Primer_25K_180_240221.png

Tang Primer 25K では、右の 7 セグメント LED に 0 が表示された。
PMOD-BTN4+4 のプッシュ SW は右から +1, +2, +4, +8 を 7 セグメント LED の値に対して行う。
DIP SW はどれを ON にしても、PMOD-LEDx8 の LED が 1 個のみ点灯し、左に点灯する LED が移動し、左端まで行ったら、一番右の LED に戻るようだ。ただし、どの DIP SW を ON にするかで、最初に点灯する LED が変わる。
Tang_Primer_25K_181_240221.jpg

プッシュ SW をすべて押すと、15 が 7 セグメント LED に表示された。
Tang_Primer_25K_182_240221.jpg
  1. 2024年02月21日 04:20 |
  2. Tang_Primer_25K
  3. | トラックバック:0
  4. | コメント:0

TangPrimer-25K-example の pmod_digitalTube-2bit をやってみよう1

TangPrimer-25K-example をダウンロードした”で TangPrimer-25K-example を git clone した。examples の中の pmod_digitalTube-2bit をやってみよう。

GOWIN FPGA Designer を起動して、Start Page の Open Project... をクリックした。
Tang_Primer_25K_168_240218.png

Open Project ダイアログが開いた。
pmod_digitalTube-2bit/pmod_digitalTube-2bit.gprj を選択し、Open ボタンをクリックした。
Tang_Primer_25K_169_240218.png

pmod_digitalTube-2bit プロジェクトが開いた。
FPGA の種類が入ってなかったので、ダブルクリックして設定する。
Tang_Primer_25K_170_240218.png

Select Device ダイアログが開いた。
Series に GW5A、Device に GW5A-25 を選択肢、下のウインドウから GW5A-LV25MG121NC1/10 を選択し、OK ボタンをクリックした。
Tang_Primer_25K_171_240218.png

pmod_digitalTube-2bit プロジェクトに FPGA の種類が表示された。
Tang_Primer_25K_172_240218.png

GOWIN FPGA Designer で Project メニューから Configuration を選択した。
Configuration ダイアログが開いた。
Synthesis -> General を選択した。
Top Module/Entry に top_demo が入っていた。
Verilog Language は Verilog 2001 だった。
Tang_Primer_25K_177_240218.png

Place & Route -> Dual-Pupose Pin は Use READY as regular IO, Use DONE as regular IO, Use I2C as regular IO, Use CPU as regular IO にチェックが入っていた。
Tang_Primer_25K_178_240218.png

このプロジェクトはすでに、論理合成、Place & Route が実行されていて、ダウンロード・ファイルなども生成されていた。

GOWIN FPGA Designer の Process タブをクリックし、Process ウインドウを表示した。
Place & Route -> Place & Route Report を表示した。
Resource -> Resource Usage Summary を表示した。
Logic は 369 個使用した。364 個の LUT と 5 個の ALU を使用している。
Tang_Primer_25K_175_240218.png

Place & Route -> Timing Analyzer Report をクリックした。
Timing Summaries -> Clock Summary などを表示した。
Max Frequency Summay を見ると、Actual Fmax は 191.663 MHz だった。クロック周波数の 50 MHz を十分に上回っているのだが、この pmod_digitalTube-2bit プロジェクトには、タイミング制約が無かった。タイミング制約無しでもタイミングを満たしていれば良いのだと思うが、どうも落ち着かない。。。
Tang_Primer_25K_176_240218.png
  1. 2024年02月19日 03:40 |
  2. Tang_Primer_25K
  3. | トラックバック:0
  4. | コメント:0

TangPrimer-25K-example をダウンロードした

TangPrimer-25K-example が Github にあるので、これをダウンロードして、いくつかやってみようと思う。

TangPrimer-25K-example を git clone した。
git clone --recursive https://github.com/sipeed/TangPrimer-25K-example
Tang_Primer_25K_166_240218.png

TangPrimer-25K-example ディレクトリが生成された。ディレクトリの内容を示す。
Tang_Primer_25K_167_240218.png

Risc-V とかサンプルがあるが、最初は、PMOD-BTN4+4 と PMOD-DTx2 と PMOD-LEDx8 を使用した pmod_digitalTube-2bit を最初にやってみよう。
Tang_Primer_25K_174_240218.jpg

pmod_digitalTube-2bit のディレクトリを示す。
Tang_Primer_25K_173_240218.png
  1. 2024年02月18日 07:13 |
  2. Tang_Primer_25K
  3. | トラックバック:0
  4. | コメント:0

Tang Primer 25K の PMOD-LED モジュールを使って L チカする3

Tang Primer 25K の PMOD-LED モジュールを使って L チカする2”の続き。

PMOD LED モジュールを使って L チカしてみようということで、前回は、配置制約とタイミング制約を作成し、Place & Route を行った。今回は、配置結果とタイミングを確認して、Tang Primer 25K をプログラミングして、PMOD-LED での L チカを実行することができた。

GOWIN FPGA Designer の Process タブをクリックし、Process ウインドウを表示した。
Place & Route -> Place & Route Report を表示した。
Resource -> Resource Usage Summary を表示した。
Logic は 49 個使用して、その内訳は LUT が 18 個、ALU が 31 個、ROM16 が 0 個だそうだ。これはPMOD-LED を追加しない前と同じだった。
Tang_Primer_25K_161_240217.png

Place & Route -> Timing Analyzer Report をクリックした。
Timing Summaries -> Clock Summary などを表示した。
Max Frequency Summay を見ると、Actual Fmax は 259.686 MHz だった。
Tang_Primer_25K_162_240217.png

PMOD-LED を追加しない前は Actual Fmax は 181.911 MHz だったので、向上している。

さて、Tang Primer 25K をプログラミングして、PMOD-LED での L チカが実行できるかどうか?確かめてみよう。
Tang Primer 25K を USB ケーブルに接続し、USB ケーブルをパソコンに接続した。
Gowin Programmer をスーパーユーザー・モードで起動した。
sudo /media/masaaki/Ubuntu_Disk/Gowin/Programmer/bin/programmer -family GW5A -device GW5A-25A -fs /media/masaaki/Ubuntu_Disk/Gowin/HDL/blink2/impl/pnr/blink2.fs

USB Debuuger A ケーブルが見つかった。
Save ボタンをクリックした。
Tang_Primer_25K_163_240217.png

Gowin Programmer の Program/Configure ボタンをクリックした。
Tang_Primer_25K_164_240217.png

Progress Information ダイアログが表示された。
Programming... が進んでいく。

コンフィギュレーションが終了した。
Tang_Primer_25K_165_240217.png

Tang Primer 25K では、READY の LED が点滅し、J6 の PMOD-LED は全点灯ー前照灯、J4 の PMOD-LED は半分点灯ー残りの半分点灯を繰り返した。
  1. 2024年02月17日 18:26 |
  2. Tang_Primer_25K
  3. | トラックバック:0
  4. | コメント:0

新しいお仕事を探しています、ご紹介ください。

2024 年 3 月 31 日で、40年間勤務してきた職場から 65 歳で定年退職します。
2024 年 4 月からの新しいお仕事を探しています。もし良さそうな FPGA のお仕事がありそうでしたらご紹介ください。よろしくお願いいたします。
なにか良い情報がありましたら、この記事のコメントで”非公開コメント”で”管理者にだけ表示を許可する”のチェックボックスにチェックを入れてお知らせください。よろしくお願いいたします。

(2024年2月17日13:30)
皆さん、いろいろとありがとうございます。
1件、オファーをいただきました。ありがとうございます。他のお仕事も募集しております。よろしくお願いします。

(2024年3月3日 11:00)
4月からの新しいお仕事が決まりました。皆様、ご心配いただいて、ありがとうございました。
  1. 2024年02月16日 03:52 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:1

Tang Primer 25K の PMOD-LED モジュールを使って L チカする2

Tang Primer 25K の PMOD-LED モジュールを使って L チカする1”の続き。

PMOD LED モジュールを使って L チカしてみようということで、前回は、GOWIN FPGA Designer で Tang Primer 25K 用の blink2 プロジェクトを作成し、blink2.sv ファイルを追加した。論理合成 を行って、ネットを RTL Design Viewer で確認した。今回は、配置制約とタイミング制約を作成し、Place & Route を行った。

GOWIN FPGA Designer で FloorPlanner ボタンをクリックした。

Constraint File ダイアログが表示された。
CST file (*.cst) を作成するとのことだ。
OK ボタンをクリックした。

FloorPlanner が起動した。
Package View タブをクリックした。

Tang Primer 25K Dock の PMOD のピン番号と信号名対応表を作成した”の”Tang Primer 25K DockのPMODの信号名とピン番号表”に従って、ピンの配置を行った。
Tang_Primer_25K_154_240215.png

Save Contraints to /media/masaaki/Ubuntu_Disk/Gowin/HDL/blink2/src/blink2.cst ボタンをクリックして、blink2.cst にセーブした。
GOWIN FPGA Designer に戻ると、blink2.cst ファイルが生成されていた。
/

/Copyright (C)2014-2023 Gowin Semiconductor Corporation.
//All rights reserved. 
//File Title: Physical Constraints file
//GOWIN Version: 1.9.9 Beta-4 Education
//Part Number: GW5A-LV25MG121NC1/I0
//Device: GW5A-25
//Device Version: A
//Created Time: Thu 02 15 20:47:45 2024

IO_LOC "pmod_led[2][7]" J5;
IO_PORT "pmod_led[2][7]" PULL_MODE=NONE DRIVE=8 BANK_VCCIO=3.3;
IO_LOC "pmod_led[2][6]" H5;
IO_PORT "pmod_led[2][6]" PULL_MODE=NONE DRIVE=8 BANK_VCCIO=3.3;
IO_LOC "pmod_led[2][5]" H7;
IO_PORT "pmod_led[2][5]" PULL_MODE=NONE DRIVE=8 BANK_VCCIO=3.3;
IO_LOC "pmod_led[2][4]" H8;
IO_PORT "pmod_led[2][4]" PULL_MODE=NONE DRIVE=8 BANK_VCCIO=3.3;
IO_LOC "pmod_led[2][3]" G8;
IO_PORT "pmod_led[2][3]" PULL_MODE=NONE DRIVE=8 BANK_VCCIO=3.3;
IO_LOC "pmod_led[2][2]" G7;
IO_PORT "pmod_led[2][2]" PULL_MODE=NONE DRIVE=8 BANK_VCCIO=3.3;
IO_LOC "pmod_led[2][1]" G5;
IO_PORT "pmod_led[2][1]" PULL_MODE=NONE DRIVE=8 BANK_VCCIO=3.3;
IO_LOC "pmod_led[2][0]" F5;
IO_PORT "pmod_led[2][0]" PULL_MODE=NONE DRIVE=8 BANK_VCCIO=3.3;
IO_LOC "pmod_led[1][7]" K5;
IO_PORT "pmod_led[1][7]" PULL_MODE=NONE DRIVE=8 BANK_VCCIO=3.3;
IO_LOC "pmod_led[1][6]" L5;
IO_PORT "pmod_led[1][6]" PULL_MODE=NONE DRIVE=8 BANK_VCCIO=3.3;
IO_LOC "pmod_led[1][5]" L11;
IO_PORT "pmod_led[1][5]" PULL_MODE=NONE DRIVE=8 BANK_VCCIO=3.3;
IO_LOC "pmod_led[1][4]" K11;
IO_PORT "pmod_led[1][4]" PULL_MODE=NONE DRIVE=8 BANK_VCCIO=3.3;
IO_LOC "pmod_led[1][3]" E10;
IO_PORT "pmod_led[1][3]" PULL_MODE=NONE DRIVE=8 BANK_VCCIO=3.3;
IO_LOC "pmod_led[1][2]" E11;
IO_PORT "pmod_led[1][2]" PULL_MODE=NONE DRIVE=8 BANK_VCCIO=3.3;
IO_LOC "pmod_led[1][1]" A10;
IO_PORT "pmod_led[1][1]" PULL_MODE=NONE DRIVE=8 BANK_VCCIO=3.3;
IO_LOC "pmod_led[1][0]" A11;
IO_PORT "pmod_led[1][0]" PULL_MODE=NONE DRIVE=8 BANK_VCCIO=3.3;
IO_LOC "pmod_led[0][7]" C10;
IO_PORT "pmod_led[0][7]" PULL_MODE=NONE DRIVE=8 BANK_VCCIO=3.3;
IO_LOC "pmod_led[0][6]" C11;
IO_PORT "pmod_led[0][6]" PULL_MODE=NONE DRIVE=8 BANK_VCCIO=3.3;
IO_LOC "pmod_led[0][5]" B10;
IO_PORT "pmod_led[0][5]" PULL_MODE=NONE DRIVE=8 BANK_VCCIO=3.3;
IO_LOC "pmod_led[0][4]" B11;
IO_PORT "pmod_led[0][4]" PULL_MODE=NONE DRIVE=8 BANK_VCCIO=3.3;
IO_LOC "pmod_led[0][3]" D10;
IO_PORT "pmod_led[0][3]" PULL_MODE=NONE DRIVE=8 BANK_VCCIO=3.3;
IO_LOC "pmod_led[0][2]" D11;
IO_PORT "pmod_led[0][2]" PULL_MODE=NONE DRIVE=8 BANK_VCCIO=3.3;
IO_LOC "pmod_led[0][1]" G10;
IO_PORT "pmod_led[0][1]" PULL_MODE=NONE DRIVE=8 BANK_VCCIO=3.3;
IO_LOC "pmod_led[0][0]" G11;
IO_PORT "pmod_led[0][0]" PULL_MODE=NONE DRIVE=8 BANK_VCCIO=3.3;
IO_LOC "led" E8;
IO_PORT "led" PULL_MODE=NONE DRIVE=8 BANK_VCCIO=3.3;
IO_LOC "clk" E2;
IO_PORT "clk" PULL_MODE=NONE DRIVE=OFF BANK_VCCIO=3.3;


Tang_Primer_25K_155_240215.png

次に、Timing Constraints Editor ボタンをクリックし、タイミング制約を作成する。

Constraint File ダイアログが表示された。
SDC file (*.sdc) を作成するとのことだ。
OK ボタンをクリックした。

Gowin Timing Constraints Editor が開いた。
Netlist Tree ウインドウの blink2 -> Ports (26) -> clk を右クリックし、右クリックメニューから Add Clock を選択した。

Create Clock ダイアログが開いた。
Clock name に clk を入力し、Waveform の Period を 20 ns に、Rising を 0 ns、Falling を 10 ns に設定した。
OK ボタンをクリックした。
Tang_Primer_25K_156_240215.png

clk タイミング制約が追加された。
Save ボタンをクリックして、セーブした。
Tang_Primer_25K_157_240215.png

GOWIN FPGA Designer に戻ると、blink2.sdc ファイルが生成されていた。

//Copyright (C)2014-2024 GOWIN Semiconductor Corporation.
//All rights reserved.
//File Title: Timing Constraints file
//GOWIN Version: 1.9.9 Beta-4 Education
//Created Time: 2024-02-15 20:51:54
create_clock -name clk -period 20 -waveform {0 10} [get_ports {clk}]


Tang_Primer_25K_158_240215.png

GOWIN FPGA Designer で Project メニューから Configuration をクリックした。
Configuration ダイアログが表示された。
エラーのログから READY と CPU だったので、Use READY as regular IO と Use CPU as regular IO にチェックを入れて、OK ボタンをクリックした。
Tang_Primer_25K_159_240215.png

Run Place & Routte ボタンをクリックして、Place & Route を行った。成功した。
Tang_Primer_25K_160_240215.png

ログを示す。

Reading netlist file: "/media/masaaki/Ubuntu_Disk/Gowin/HDL/blink2/impl/gwsynthesis/blink2.vg"
Parsing netlist file "/media/masaaki/Ubuntu_Disk/Gowin/HDL/blink2/impl/gwsynthesis/blink2.vg" completed
Processing netlist completed
Reading constraint file: "/media/masaaki/Ubuntu_Disk/Gowin/HDL/blink2/src/blink2.cst"
Physical Constraint parsed completed
Running placement......
[10%] Placement Phase 0 completed
[20%] Placement Phase 1 completed
[30%] Placement Phase 2 completed
[50%] Placement Phase 3 completed
Running routing......
[60%] Routing Phase 0 completed
[70%] Routing Phase 1 completed
[80%] Routing Phase 2 completed
[90%] Routing Phase 3 completed
Running timing analysis......
[95%] Timing analysis completed
Placement and routing completed
Bitstream generation in progress......
Bitstream generation completed
Generate file "/media/masaaki/Ubuntu_Disk/Gowin/HDL/blink2/impl/pnr/blink2.pin.html" completed
Generate file "/media/masaaki/Ubuntu_Disk/Gowin/HDL/blink2/impl/pnr/blink2.rpt.html" completed
Generate file "/media/masaaki/Ubuntu_Disk/Gowin/HDL/blink2/impl/pnr/blink2.rpt.txt" completed
Generate file "/media/masaaki/Ubuntu_Disk/Gowin/HDL/blink2/impl/pnr/blink2.tr.html" completed
Thu Feb 15 20:53:34 2024

  1. 2024年02月16日 03:39 |
  2. Tang_Primer_25K
  3. | トラックバック:0
  4. | コメント:0

Tang Primer 25K の PMOD-LED モジュールを使って L チカする1

今まで、Tang Primer 25K Dock ボード上の LED を使用して、L チカをしてきたが、PMOD-LED モジュールも 2 個購入したので、この PMOD LED モジュールを使って L チカしてみよう。

PMOD-LED モジュールを示す。
Tang_Primer_25K_151_240215.jpgTang_Primer_25K_152_240215.jpg

Tang Primer 25K Dock ボードに 2 個の PMOD-LED モジュールを挿入した。
Tang_Primer_25K_153_240215.jpg

Tang Primer 25K で Lチカする2(シミュレーション2)”の blink.sv を PMOD-LED モジュールを使って L チカするために blink2.sv を作成した。
blink2.sv を示す。

// blink2.sv
// 2024/02/14 by marsee

module blink2 #(
    parameter COUNT_LIMINT = 32'd12500000 // 50MHz / 4
) (
    input clk,
    output led,
    output pmod_led
);
    //wire clk;
    logic led = 0;
    logic [7:0] pmod_led[0:2];
    logic [31:0] count = 0;
    integer i;

    always_ff @( posedge clk ) begin : COUNTER
        if(count < COUNT_LIMINT-1) begin
            count <= count + 32'd1;
        end else begin
            count <= 32'd0;
        end
    end

    always_ff @( posedge clk ) begin : LED_OUTPUT
        if(count == COUNT_LIMINT-1) begin
            led <= ~led;
        end
    end

    always_comb begin
        for(i=0; i<3; i=i+1) begin
            if(led) begin
                if(i == 0)
                    pmod_led[i] = 8'h55;
                else
                    pmod_led[i] = 8'hff;
            end else begin
                if(i == 0)
                    pmod_led[i] = 8'haa;
                else
                    pmod_led[i] = 8'h00;
            end
        end
    end

endmodule


IDE/bin/gw_ide をダブルクリックして、GOWIN FPGA Designer を起動した。
File メニューから New... を選択して、プロジェクトを新規作成した。

New ダイアログが開いた。
Projects の FPGA Design Project を選択して、OK ボタンをクリックした。

Project Wizard ダイアログが表示された。
Project Name 画面で、Name に blink2 と入力し、Create in に /media/masaaki/Ubuntu_Disk/Gowin/HDL を指定した。
Next > ボタンをクリックした。

Slelect Device 画面
GW5A-LV25MG121NC1/10 を選択した。
Next > ボタンをクリックした。

Summary 画面
Finish ボタンをクリックした。

blink2 プロジェクトが作成できた。

blink2.sv を新規作成する。
File メニューから New... を選択した。

New ダイアログが開いた。
Files の Verilog File を選択した。
OK ボタンをクリックした。

New Verilog file ダイアログが開いた。
Name に blink2 を入力し .sv を選択した。
OK ボタンをクリックした。

blink2.sv ファイルが生成された。
blink2.sv のコードを用意した。
Tang_Primer_25K_146_240215.png

System Verilog を使えるように設定する。
Project メニューから Configration を選択した。
Configuration ダイアログが開いた。
Synthesis -> General をクリックし、GowinSynthesis の Verilog Language で System Verilog 2017 を選択した。
OK ボタンをクリックした。
Tang_Primer_25K_147_240215.png

Run Synthesis ボタンをクリックし、論理合成を行った。
Tang_Primer_25K_148_240215.png

ログを示す。

GowinSynthesis start
Running parser ...
Analyzing Verilog file '/media/masaaki/Ubuntu_Disk/Gowin/HDL/blink2/src/blink2.sv'
WARN  (EX3628) : Redeclaration of ANSI port 'led' is not allowed("/media/masaaki/Ubuntu_Disk/Gowin/HDL/blink2/src/blink2.sv":12)
WARN  (EX3628) : Redeclaration of ANSI port 'pmod_led' is not allowed("/media/masaaki/Ubuntu_Disk/Gowin/HDL/blink2/src/blink2.sv":13)
Compiling module 'blink2'("/media/masaaki/Ubuntu_Disk/Gowin/HDL/blink2/src/blink2.sv":4)
NOTE  (EX0101) : Current top module is "blink2"
[5%] Running netlist conversion ...
Running device independent optimization ...
[10%] Optimizing Phase 0 completed
[15%] Optimizing Phase 1 completed
[25%] Optimizing Phase 2 completed
Running inference ...
[30%] Inferring Phase 0 completed
[40%] Inferring Phase 1 completed
[50%] Inferring Phase 2 completed
[55%] Inferring Phase 3 completed
Running technical mapping ...
[60%] Tech-Mapping Phase 0 completed
[65%] Tech-Mapping Phase 1 completed
[75%] Tech-Mapping Phase 2 completed
[80%] Tech-Mapping Phase 3 completed
[90%] Tech-Mapping Phase 4 completed
[95%] Generate netlist file "/media/masaaki/Ubuntu_Disk/Gowin/HDL/blink2/impl/gwsynthesis/blink2.vg" completed
[100%] Generate report file "/media/masaaki/Ubuntu_Disk/Gowin/HDL/blink2/impl/gwsynthesis/blink2_syn.rpt.html" completed
GowinSynthesis finish


RTL Design Viewer でポートなどを見てみよう。

Gowin FPGA Designer の Tools メニューから Schematic Viewer -> RTL Design Viewer を選択した。
RTL Design Viewer が起動した。
Tang_Primer_25K_149_240215.png

pmod_led ポートは 1 次元配列となって、pmod_led[23:0] になっていた。上位のビットが pmod_led[0] なのだろうか?
Nets の pmod_led[0][7:0] をダブルクリックすると pmod_led[23:16] の色が赤になった。
pmod_led[0][7:0] が pmod_led[23:16] だった。
Tang_Primer_25K_150_240215.png
  1. 2024年02月15日 04:55 |
  2. Tang_Primer_25K
  3. | トラックバック:0
  4. | コメント:0

Gowin FPGA Designer の Gowin Analyzer Osciloscope を試す3

Gowin FPGA Designer の Gowin Analyzer Osciloscope を試す2”の続き。

Gowin FPGA Designer の Gowin Analyzer Osciloscope を試してみよう、ということで前回は、Capture Option の設定を行って、スーバーユーザー・モードで Gowion Analyzer Oscilloscope を起動して、波形を観測できた。今回は、Gowin Analyzer Osciloscope 使用時のリソース使用量、増えたネット、タイミングを見ていこう。

Gowin FPGA Designer の Process タブをクリックし、Process ウインドウを表示した。
Place & Route -> Place & Route Report を表示した。
Resource -> Resource Usage Summary を表示した。
Tang_Primer_25K_139_240214.png

Logic は 550 個使用して、その内訳は LUT が 504 個、ALU が 46 個、ROM16 が 0 個だそうだ。
CLS を 476 個、BSRAM を SDPX9B として 2 個使用している。

Gowin Analyzer Osciloscope を入れていないときは、Logic は 49 個使用して、その内訳は LUT が 18 個、ALU が 31 個、ROM16 が 0 個だった。CLS は 28 個だった。
Tang_Primer_25K_97_240208.png

blink プロジェクトで Gowin Analyzer Osciloscope を入れたときは Logic が 500 個程度増えるようだ。

なお、CLS は Configurable Logic Section の略だそうだ。日本語では、コンフィギャラブル論理セクション。
CLS については、”GW5AT シリーズ FPGA 製品 データシート DS981-1.0J, 2024-02-02”に書いてある。
GW5AT シリーズ FPGA 製品 データシート DS981-1.0J, 2024-02-02”の 19 ページの”2.2 コンフィギャラブル機能ユニット”を引用する。
CFU(Configurable Function Unit) の中に CLS が入っているそうだ。
Tang_Primer_25K_143_240214.png

BSRAM プリミティブの SDPX9B に関しては、”Gowin BSRAM & SSRAM ユーザーガイド UG285-1.3.6J, 2023-05-25”に記述があった。
Gowin BSRAM & SSRAM ユーザーガイド UG285-1.3.6J, 2023-05-25”の 32 ページの”表 3-7 SDPB/SDPX9B データ幅とアドレス深さの対応関係”を引用する。
Tang_Primer_25K_144_240214.png

Gowin Analyzer Osciloscope では、1024 状態をキャプチャできるので、2 の 10 乗ということで、データ幅が 18 ビットで、アドレス深さが 10 ビットになっているのだと思う。

SDPX9B のポート図が”Gowin BSRAM & SSRAM ユーザーガイド UG285-1.3.6J, 2023-05-25”の 33 ページの”図 3-11 SDPB/SDPX9B のポート図”に載っていたので、引用する。
Tang_Primer_25K_145_240214.png

次に、タイミングの結果を見ていこう。
Place & Route -> Timing Analyzer Report をクリックした。
Timing Summaries -> Clock Summary などを表示した。
Max Frequency Summay を見ると、clk の Actual Fmax は 218.866 MHz となっていて、Gowin Analyzer Osciloscope の 181.911 MHz よりも性能が良くなっている。
更に、たぶん Gowin Analyzer Osciloscope で使用するクロックの tck_pad_i が追加されている。tck_pad_i のタイミング制約は 20 MHz だが、Actual Fmax は 92.028 MHz だった。
Tang_Primer_25K_140_240214.png

Gowin Analyzer Osciloscope を入れていないときのClock Summary などを示す。
Tang_Primer_25K_98_240208.png

Gowin Analyzer Osciloscope で使用している Primitive や Net は PloorPlanner で見ることができるようだ。
PloorPlanner を起動して、Gowin Analyzer Osciloscope で使用している Primitives の一部を確認した。
Tang_Primer_25K_141_240214.png

Gowin Analyzer Osciloscope で使用している Nets の一部を確認した。
Tang_Primer_25K_142_240214.png
  1. 2024年02月14日 05:12 |
  2. Gowin EDA
  3. | トラックバック:0
  4. | コメント:0

Gowin FPGA Designer の Gowin Analyzer Osciloscope を試す2

Gowin FPGA Designer の Gowin Analyzer Osciloscope を試す1”の続き。

Gowin FPGA Designer の Gowin Analyzer Osciloscope を試してみよう、ということで前回は、GAO Config File の blink.rao ファイルを作成し、Trigger Option のセットアップを行った。今回は、Capture Option の設定を行って、スーバーユーザー・モードで Gowion Analyzer Oscilloscope を起動して、波形を観測できた。

Gowin FPGA Designer で blink.rao を編集中に Capture Option タブをクリックした。
Sample Clock -> Clock の ... ボタンをクリックした。
Tang_Primer_25K_126_240213.png

Search Nets ダイアログが表示された。
Name に clk と入力し、Search ボタンをクリックした。
clk が表示されたので、選択して、OK ボタンをクリックした。
Tang_Primer_25K_127_240213.png

Trigger Position を 512 に設定し、Capture Signals の Add From Tigger ボタンをクリックした。
Tang_Primer_25K_128_240213.png

Add From Tigger ダイアログが表示された。
Trigger Port 0 にチェックを入れて、OK ボタンをクリックした。
Tang_Primer_25K_129_240213.png

CTRL+s キーを押して、blink.rao を セーブした。
Run All ボタンをクリックして、論理合成と Place & Route を行った。
Tang_Primer_25K_130_240213.png

論理合成と Place & Route が終了した。
Tang_Primer_25K_131_240213.png

ログを示す。

GowinSynthesis start
Running parser ...
Analyzing Verilog file '/media/masaaki/Ubuntu_Disk/Gowin/HDL/blink/src/blink.sv'
WARN  (EX3628) : Redeclaration of ANSI port 'led' is not allowed("/media/masaaki/Ubuntu_Disk/Gowin/HDL/blink/src/blink.sv":11)
Analyzing Verilog file '/media/masaaki/Ubuntu_Disk/Gowin/IDE/data/ipcores/GAO/GW_AO_0/gw_ao_crc32.v'
Analyzing Verilog file '/media/masaaki/Ubuntu_Disk/Gowin/IDE/data/ipcores/GAO/GW_AO_0/gw_ao_match.v'
Analyzing included file '/media/masaaki/Ubuntu_Disk/Gowin/IDE/data/ipcores/GAO/GW_AO_0/gw_ao_define.v'("/media/masaaki/Ubuntu_Disk/Gowin/IDE/data/ipcores/GAO/GW_AO_0/gw_ao_match.v":327)
Back to file '/media/masaaki/Ubuntu_Disk/Gowin/IDE/data/ipcores/GAO/GW_AO_0/gw_ao_match.v'("/media/masaaki/Ubuntu_Disk/Gowin/IDE/data/ipcores/GAO/GW_AO_0/gw_ao_match.v":327)
Analyzing Verilog file '/media/masaaki/Ubuntu_Disk/Gowin/IDE/data/ipcores/GAO/GW_AO_0/gw_ao_mem_ctrl.v'
Analyzing included file '/media/masaaki/Ubuntu_Disk/Gowin/HDL/blink/impl/gwsynthesis/RTL_GAO/ao_0/gw_ao_top_define.v'("/media/masaaki/Ubuntu_Disk/Gowin/IDE/data/ipcores/GAO/GW_AO_0/gw_ao_mem_ctrl.v":150)
Back to file '/media/masaaki/Ubuntu_Disk/Gowin/IDE/data/ipcores/GAO/GW_AO_0/gw_ao_mem_ctrl.v'("/media/masaaki/Ubuntu_Disk/Gowin/IDE/data/ipcores/GAO/GW_AO_0/gw_ao_mem_ctrl.v":150)
Analyzing Verilog file '/media/masaaki/Ubuntu_Disk/Gowin/IDE/data/ipcores/GAO/GW_AO_0/gw_ao_top.v'
Analyzing included file '/media/masaaki/Ubuntu_Disk/Gowin/IDE/data/ipcores/GAO/GW_AO_0/gw_ao_define.v'("/media/masaaki/Ubuntu_Disk/Gowin/IDE/data/ipcores/GAO/GW_AO_0/gw_ao_top.v":2738)
Back to file '/media/masaaki/Ubuntu_Disk/Gowin/IDE/data/ipcores/GAO/GW_AO_0/gw_ao_top.v'("/media/masaaki/Ubuntu_Disk/Gowin/IDE/data/ipcores/GAO/GW_AO_0/gw_ao_top.v":2738)
Analyzing included file '/media/masaaki/Ubuntu_Disk/Gowin/HDL/blink/impl/gwsynthesis/RTL_GAO/ao_0/gw_ao_top_define.v'("/media/masaaki/Ubuntu_Disk/Gowin/IDE/data/ipcores/GAO/GW_AO_0/gw_ao_top.v":2738)
Back to file '/media/masaaki/Ubuntu_Disk/Gowin/IDE/data/ipcores/GAO/GW_AO_0/gw_ao_top.v'("/media/masaaki/Ubuntu_Disk/Gowin/IDE/data/ipcores/GAO/GW_AO_0/gw_ao_top.v":2738)
Analyzing included file '/media/masaaki/Ubuntu_Disk/Gowin/HDL/blink/impl/gwsynthesis/RTL_GAO/ao_0/gw_ao_expression.v'("/media/masaaki/Ubuntu_Disk/Gowin/IDE/data/ipcores/GAO/GW_AO_0/gw_ao_top.v":2738)
Back to file '/media/masaaki/Ubuntu_Disk/Gowin/IDE/data/ipcores/GAO/GW_AO_0/gw_ao_top.v'("/media/masaaki/Ubuntu_Disk/Gowin/IDE/data/ipcores/GAO/GW_AO_0/gw_ao_top.v":2738)
Analyzing included file '/media/masaaki/Ubuntu_Disk/Gowin/HDL/blink/impl/gwsynthesis/RTL_GAO/ao_0/gw_ao_parameter.v'("/media/masaaki/Ubuntu_Disk/Gowin/IDE/data/ipcores/GAO/GW_AO_0/gw_ao_top.v":2738)
Back to file '/media/masaaki/Ubuntu_Disk/Gowin/IDE/data/ipcores/GAO/GW_AO_0/gw_ao_top.v'("/media/masaaki/Ubuntu_Disk/Gowin/IDE/data/ipcores/GAO/GW_AO_0/gw_ao_top.v":2738)
Analyzing Verilog file '/media/masaaki/Ubuntu_Disk/Gowin/IDE/data/ipcores/GAO/GW_CON/gw_con_top.v'
Analyzing included file '/media/masaaki/Ubuntu_Disk/Gowin/HDL/blink/impl/gwsynthesis/RTL_GAO/ao_control/gw_con_top_define.v'("/media/masaaki/Ubuntu_Disk/Gowin/IDE/data/ipcores/GAO/GW_CON/gw_con_top.v":377)
Back to file '/media/masaaki/Ubuntu_Disk/Gowin/IDE/data/ipcores/GAO/GW_CON/gw_con_top.v'("/media/masaaki/Ubuntu_Disk/Gowin/IDE/data/ipcores/GAO/GW_CON/gw_con_top.v":377)
Analyzing included file '/media/masaaki/Ubuntu_Disk/Gowin/HDL/blink/impl/gwsynthesis/RTL_GAO/ao_control/gw_con_parameter.v'("/media/masaaki/Ubuntu_Disk/Gowin/IDE/data/ipcores/GAO/GW_CON/gw_con_top.v":377)
Back to file '/media/masaaki/Ubuntu_Disk/Gowin/IDE/data/ipcores/GAO/GW_CON/gw_con_top.v'("/media/masaaki/Ubuntu_Disk/Gowin/IDE/data/ipcores/GAO/GW_CON/gw_con_top.v":377)
Analyzing Verilog file '/media/masaaki/Ubuntu_Disk/Gowin/IDE/data/ipcores/gw_jtag.v'
Analyzing Verilog file '/media/masaaki/Ubuntu_Disk/Gowin/HDL/blink/impl/gwsynthesis/RTL_GAO/gw_gao_top.v'
Compiling module 'blink'("/media/masaaki/Ubuntu_Disk/Gowin/HDL/blink/src/blink.sv":4)
Compiling module '**'("/media/masaaki/Ubuntu_Disk/Gowin/IDE/data/ipcores/GAO/GW_AO_0/gw_ao_crc32.v":0)
Compiling module '**'("/media/masaaki/Ubuntu_Disk/Gowin/IDE/data/ipcores/GAO/GW_AO_0/gw_ao_match.v":0)
Compiling module '**'("/media/masaaki/Ubuntu_Disk/Gowin/IDE/data/ipcores/GAO/GW_AO_0/gw_ao_mem_ctrl.v":0)
Extracting RAM for identifier '**'("/media/masaaki/Ubuntu_Disk/Gowin/IDE/data/ipcores/GAO/GW_AO_0/gw_ao_mem_ctrl.v":0)
Compiling module '**'("/media/masaaki/Ubuntu_Disk/Gowin/IDE/data/ipcores/GAO/GW_AO_0/gw_ao_top.v":0)
Compiling module '**'("/media/masaaki/Ubuntu_Disk/Gowin/IDE/data/ipcores/GAO/GW_AO_0/gw_ao_mem_ctrl.v":0)
Extracting RAM for identifier '**'("/media/masaaki/Ubuntu_Disk/Gowin/IDE/data/ipcores/GAO/GW_AO_0/gw_ao_mem_ctrl.v":0)
Compiling module '**'("/media/masaaki/Ubuntu_Disk/Gowin/IDE/data/ipcores/GAO/GW_AO_0/gw_ao_match.v":0)
Compiling module '**'("/media/masaaki/Ubuntu_Disk/Gowin/IDE/data/ipcores/GAO/GW_CON/gw_con_top.v":0)
Compiling module 'GW_JTAG'("/media/masaaki/Ubuntu_Disk/Gowin/IDE/data/ipcores/gw_jtag.v":1)
Compiling module 'gw_gao'("/media/masaaki/Ubuntu_Disk/Gowin/HDL/blink/impl/gwsynthesis/RTL_GAO/gw_gao_top.v":1)
Trying to combine GAO to RTL design
NOTE  (EX0101) : Current top module is "blink"
[5%] Running netlist conversion ...
Running device independent optimization ...
[10%] Optimizing Phase 0 completed
[15%] Optimizing Phase 1 completed
[25%] Optimizing Phase 2 completed
Running inference ...
[30%] Inferring Phase 0 completed
[40%] Inferring Phase 1 completed
[50%] Inferring Phase 2 completed
[55%] Inferring Phase 3 completed
Running technical mapping ...
[60%] Tech-Mapping Phase 0 completed
[65%] Tech-Mapping Phase 1 completed
[75%] Tech-Mapping Phase 2 completed
[80%] Tech-Mapping Phase 3 completed
[90%] Tech-Mapping Phase 4 completed
[95%] Generate netlist file "/media/masaaki/Ubuntu_Disk/Gowin/HDL/blink/impl/gwsynthesis/blink.vg" completed
[100%] Generate report file "/media/masaaki/Ubuntu_Disk/Gowin/HDL/blink/impl/gwsynthesis/blink_syn.rpt.html" completed
GowinSynthesis finish
Reading netlist file: "/media/masaaki/Ubuntu_Disk/Gowin/HDL/blink/impl/gwsynthesis/blink.vg"
Parsing netlist file "/media/masaaki/Ubuntu_Disk/Gowin/HDL/blink/impl/gwsynthesis/blink.vg" completed
Processing netlist completed
Reading constraint file: "/media/masaaki/Ubuntu_Disk/Gowin/HDL/blink/src/blink.cst"
Physical Constraint parsed completed
Running placement......
[10%] Placement Phase 0 completed
[20%] Placement Phase 1 completed
[30%] Placement Phase 2 completed
[50%] Placement Phase 3 completed
Running routing......
[60%] Routing Phase 0 completed
[70%] Routing Phase 1 completed
[80%] Routing Phase 2 completed
[90%] Routing Phase 3 completed
Running timing analysis......
[95%] Timing analysis completed
Placement and routing completed
Bitstream generation in progress......
Bitstream generation completed
Generate file "/media/masaaki/Ubuntu_Disk/Gowin/HDL/blink/impl/pnr/blink.pin.html" completed
Generate file "/media/masaaki/Ubuntu_Disk/Gowin/HDL/blink/impl/pnr/blink.rpt.html" completed
Generate file "/media/masaaki/Ubuntu_Disk/Gowin/HDL/blink/impl/pnr/blink.rpt.txt" completed
Generate file "/media/masaaki/Ubuntu_Disk/Gowin/HDL/blink/impl/pnr/blink.tr.html" completed
Tue Feb 13 03:46:08 2024


Gowion Analyzer Oscilloscope ボタンをクリックして、Gowion Analyzer Oscilloscope を起動した。
Tang_Primer_25K_132_240213.png

Gowion Analyzer Oscilloscope はユーザー・モードで起動しているので、FPGA のコンフィギュレーションができなかった。
そこで、スーパーユーザー・モードでコマンドラインから Gowion Analyzer Oscilloscope を起動した。(使用しているパソコンの OS は Ubutnu 22.04)
sudo /media/masaaki/Ubuntu_Disk/Gowin/IDE/bin/gao_analyzer -family GW5A -device GW5A-25A -dir /media/masaaki/Ubuntu_Disk/Gowin/HDL/blink/src -gao /media/masaaki/Ubuntu_Disk/Gowin/HDL/blink/src/blink.rao -fs /media/masaaki/Ubuntu_Disk/Gowin/HDL/blink/impl/pnr/ao_0.fs

スーパーユーザー・モードの Gowion Analyzer Oscilloscope が起動した。
Cable を Gowin USB Cable (FT2CH) に変更し、Programmer の Enable Programmer にチェックを入れた。Program/Configure ボタンをクリックして、FPGA にプログラムをダウンロードして、成功した。READY LED が点滅を開始した。
Tang_Primer_25K_133_240213.png

Start ボタンをクリックすると Gowion Analyzer Oscilloscope のキャプチャが開始した。
Tang_Primer_25K_138_240213.png

波形が表示された。
Tang_Primer_25K_134_240213.png

Zoom Fit ボタンをクリックして、全体を表示した。
led が 1 から 0 に変化しているのが見えた。
Tang_Primer_25K_135_240213.png

led が 1 から 0 に変化している辺りを拡大した。
count が 16 進数で見にくいので、10 進数に変更する。
count を右クリックし、右クリックメニューから Format -> Unsigned Decmal を選択した。
Tang_Primer_25K_136_240213.png

count が 12499999 から 0 に変わるときに led も 1 から 0 になっているのが分かる。
Tang_Primer_25K_137_240213.png
  1. 2024年02月13日 05:05 |
  2. Gowin EDA
  3. | トラックバック:0
  4. | コメント:0

Gowin FPGA Designer の Gowin Analyzer Osciloscope を試す1

Gowin FPGA Designer の Gowin Analyzer Osciloscope を試してみよう。

Tang-NanoでAnalyzer Oscilloscopeを使ってみる”を参考にさせていただいた。

Gowin FPGA Designer の File メニューから new... を選択した。
New ダイアログが表示された。
Files から GAO Config File を選択して、OK ボタンをクリックした。
Tang_Primer_25K_114_240211.png

New GAO Wizard ダイアログが表示された。
GAO Settings 画面
デフォルトのままで、Next > ボタンをクリックした。
Tang_Primer_25K_115_240211.png

GAO Configure File 画面
Name はデフォルトの blink のままとした。
Next > ボタンをクリックした。
Tang_Primer_25K_116_240211.png

Summary 画面
Finish ボタンをクリックした。
Tang_Primer_25K_117_240211.png

src ディレクトリに blink.rao ファイルが生成された。
blink.rao をダブルクリックして編集した。
Tang_Primer_25K_118_240211.png

Trigger Options -> Trigger Ports -> Trigger Port0 をダブルクリックして編集する。
Trigger Port ダイアログが表示された。
+ボタンをクリックした。
Tang_Primer_25K_119_240211.png

Search Nets ダイアログが表示された。
Name に count と入力して、Search ボタンをクリックした。
下のウインドウに count[31:0] が表示された。
count[31:0] を選択し、OK ボタンをクリックした。
Tang_Primer_25K_120_240211.png

count[31:0] が追加された Trigger Port ダイアログに戻った。
もう位置、+ボタンをクリックした。
Tang_Primer_25K_121_240211.png

もう一度、Search Nets ダイアログが表示された。
Name に led と入力して、Search ボタンをクリックした。
下のウインドウに led が表示された。
led を選択し、OK ボタンをクリックした。
Tang_Primer_25K_122_240211.png

Trigger Port ダイアログの count[31:0] の下に led が追加された。
OK ボタンをクリックした。
Tang_Primer_25K_123_240211.png

Trigger Options -> Trigger Ports -> Trigger Port0 に count[31:0] と led が追加された。
Match Units で MO をダブルクリックした。
Tang_Primer_25K_124_240211.png

Match Unit Config ダイアログが表示された。
On Trigger Port をクリックし、Trigger Port 0 を選択した。
Value で HEX を選択した。
後はデフォルトで OK ボタンをクリックした。
Tang_Primer_25K_125_240211.png

Expressions の中で右クリックし、右クリックメニューから Add を選択した。
Tang_Primer_25K_126_240211.png

Expression ダイアログが表示された。
M0 ボタンをクリックして、M0 を選択した。
OK ボタンをクリックした。
Tang_Primer_25K_127_240211.png

Expressions に M0 が追加された。
Tang_Primer_25K_128_240211.png
  1. 2024年02月12日 04:34 |
  2. Gowin EDA
  3. | トラックバック:0
  4. | コメント:0

Gowin FPGA Designer の RTL Design Viewer を試す

Tang Primer 25K で Lチカする6(GOWIN Programmer で L チカ)”の続きなのだが、趣向を変えて Gowin FPGA Designer の RTL Design Viewer を試してみよう。

Gowin FPGA Designer の Tools メニューから Schematic Viewer -> RTL Design Viewer を選択した。
Tang_Primer_25K_107_240211.png

RTL Design Viewer が起動した。
Nets と Primitives, Ports などが見られるようだ。
Tang_Primer_25K_108_240211.png

Primitives を開いて、couter[0](dff) をクリックすると、counter[0] が表示された。
Tang_Primer_25K_109_240211.png

Zoom Out していくと、couter[0] が他の Primitive にどのように接続されているかが見える。
Tang_Primer_25K_110_240211.png

配線をクリックするとどの Net かがハイライトされるようだ。この場合のネットは n70 だった。
Tang_Primer_25K_111_240211.png

Ports の内の led をクリックした。
Tang_Primer_25K_112_240211.png

Zoom Out していくと led ポートが led という dff 出力なのが分かる。予定通りだ。。。
Tang_Primer_25K_113_240211.png
  1. 2024年02月11日 08:08 |
  2. Gowin EDA
  3. | トラックバック:0
  4. | コメント:0

Tang Primer 25K で Lチカする6(GOWIN Programmer で L チカ)

Tang Primer 25K で Lチカする5(GOWIN FPGA Designer で Synthesis、Place & Route を行った)”の続き。

Tang Primer 25K で Lチカしてみようということで、前回は、エラーを解消して Place & Route を行って成功した。今回は、Gowin Programmer を起動したが、コンフィギュレーション・ケーブルが見つからなかった。root 権限で Gowin Programmer を起動したところ、コンフィギュレーション・ケーブルが見つかって、コンフィギュレーションが成功し、L チカができた。

GOWIN FPGA Designer から Programmer ボタンをクリックした。
Tang_Primer_25K_104_240209.png

Gowin Programmer が起動したが、No USB Cable Connection だった。
Tang_Primer_25K_98_240209.png

この状態が解消できなかった。
諦めて、root 権限で Gowin Programmer を起動してみよう。

Gowin Programmer のアプリケーションは Gowin/Programmer/bin/programmer だった。
Tang_Primer_25K_105_240209.png

cd /media/masaaki/Ubuntu_Disk/Gowin/Programmer/bin
sudo ./programmer

Tang_Primer_25K_99_240209.png

Gowin Programmer が root 権限で起動した。
今度は USB Debuuger A ケーブルが見つかった。
Tang_Primer_25K_100_240209.png

1 回 GOWIN FPGA Designer の blink プロジェクトから Gowin Programmer を起動したからか? Gowin/HDL/blink/impl/pnr/blink.fs ファイルが選択されている。
Gowin/HDL/blink/impl/pnr/blink.fs ファイルを示す。
Tang_Primer_25K_106_240209.png

Tang Primer 25K を USB ケーブルで Ubuntu 22.04 のパソコンに接続した。
POWER LED だけが点灯している。
Tang_Primer_25K_107_240209.jpg

Gowin Programmer の Program/Configure ボタンをクリックする。
Tang_Primer_25K_101_240209.png

Progress Information ダイアログが表示された。
Programming... が進んでいく。
Tang_Primer_25K_102_240209.png

コンフィギュレーションが終了した。
Tang_Primer_25K_103_240209.png

Tang Primer 25K では、POWER LED と DONE LED が点灯し、READY LED が点滅した。
L チカ完成だ。
Tang_Primer_25K_108_240209.jpg

L チカの動画を示す。
なお、縦のままだが、横にする方法が分からなかった。orz
  1. 2024年02月10日 04:46 |
  2. Tang_Primer_25K
  3. | トラックバック:0
  4. | コメント:0

Tang Primer 25K で Lチカする5(GOWIN FPGA Designer で Synthesis、Place & Route を行った)

Tang Primer 25K で Lチカする4(GOWIN FPGA Designer で Synthesis、Place & Route をするがエラー)”の続き。

Tang Primer 25K で Lチカしてみようということで、前回は、Synthesis を行って、FloorPlanner で配置制約を作成した。また、Timing Constraints Editor でタイミング制約を作成し、Place & Route を行ったところ、エラーになった。今回は、エラーを解消して Place & Route を行って成功した。

エラーをインターネットで検索すると、”can't use pin 27-34 as IO #5”が検索できた。
can't use pin 27-34 as IO #5”によると、Dual-Purpose pin は FPGA ロジックで使うと明確に宣言しないとエラーになるそうだ。

GOWIN FPGA Designer で Project メニューから Configuration をクリックした。
Configuration ダイアログが表示された。
エラーのログから READY と CPU だったので、Use READY as regular IO と Use CPU as regular IO にチェックを入れて、OK ボタンをクリックした。
Tang_Primer_25K_95_240208.png

再度、Run Place & Routte ボタンをクリックして、Place & Route を行った。今度は成功した。
Tang_Primer_25K_96_240208.png

ログを示す。

Reading netlist file: "/media/masaaki/Ubuntu_Disk/Gowin/HDL/blink/impl/gwsynthesis/blink.vg"
Parsing netlist file "/media/masaaki/Ubuntu_Disk/Gowin/HDL/blink/impl/gwsynthesis/blink.vg" completed
Processing netlist completed
Reading constraint file: "/media/masaaki/Ubuntu_Disk/Gowin/HDL/blink/src/blink.cst"
Physical Constraint parsed completed
Running placement......
[10%] Placement Phase 0 completed
[20%] Placement Phase 1 completed
[30%] Placement Phase 2 completed
[50%] Placement Phase 3 completed
Running routing......
[60%] Routing Phase 0 completed
[70%] Routing Phase 1 completed
[80%] Routing Phase 2 completed
[90%] Routing Phase 3 completed
Running timing analysis......
[95%] Timing analysis completed
Placement and routing completed
Bitstream generation in progress......
Bitstream generation completed
Generate file "/media/masaaki/Ubuntu_Disk/Gowin/HDL/blink/impl/pnr/blink.pin.html" completed
Generate file "/media/masaaki/Ubuntu_Disk/Gowin/HDL/blink/impl/pnr/blink.rpt.html" completed
Generate file "/media/masaaki/Ubuntu_Disk/Gowin/HDL/blink/impl/pnr/blink.rpt.txt" completed
Generate file "/media/masaaki/Ubuntu_Disk/Gowin/HDL/blink/impl/pnr/blink.tr.html" completed
Thu Feb  8 20:59:31 2024


Process タブをクリックし、Process ウインドウを表示した。
Place & Route -> Place & Route Report を表示した。
Resource -> Resource Usage Summary を表示した。
Logic は 49 個使用して、その内訳は LUT が 18 個、ALU が 31 個、ROM16 が 0 個だそうだ。
Tang_Primer_25K_97_240208.png

Place & Route -> Timing Analyzer Report をクリックした。
Timing Summaries -> Clock Summary などを表示した。
Max Frequency Summay を見ると、Actual Fmax は 181.911 MHz となっていて、十分にタイミング制約を満たしていることが分かった。
Tang_Primer_25K_98_240208.png
  1. 2024年02月09日 05:24 |
  2. Tang_Primer_25K
  3. | トラックバック:0
  4. | コメント:0

Tang Primer 25K で Lチカする4(GOWIN FPGA Designer で Synthesis、Place & Route をするがエラー)

Tang Primer 25K で Lチカする3(GOWIN FPGA Designer でプロジェクトを作成する1)”の続き。

Tang Primer 25K で Lチカしてみようということで、前回は、GOWIN FPGA Designer で blink プロジェクトを作成しようとしたところ、ディレクトリを作成できないというエラーになった。どうやら、作成するディレクトリとプロジェクト名が同じだとエラーになるのかもしれない?他のディレクトリに blink プロジェクトを作成した。blink.sv ファイルを blink プロジェクトに追加した。今回は、Synthesis を行って、FloorPlanner で配置制約を作成した。また、Timing Constraints Editor でタイミング制約を作成し、Place & Route を行ったところ、エラーになった。

Run Synthesis ボタンをクリックし、論理合成を行った。
Tang_Primer_25K_82_240208.png

ログを示す。

GowinSynthesis start
Running parser ...
Analyzing Verilog file '/media/masaaki/Ubuntu_Disk/Gowin/HDL/blink/src/blink.sv'
WARN  (EX3628) : Redeclaration of ANSI port 'clk' is not allowed("/media/masaaki/Ubuntu_Disk/Gowin/HDL/blink/src/blink.sv":10)
WARN  (EX3628) : Redeclaration of ANSI port 'led' is not allowed("/media/masaaki/Ubuntu_Disk/Gowin/HDL/blink/src/blink.sv":11)
Compiling module 'blink'("/media/masaaki/Ubuntu_Disk/Gowin/HDL/blink/src/blink.sv":4)
NOTE  (EX0101) : Current top module is "blink"
[5%] Running netlist conversion ...
Running device independent optimization ...
[10%] Optimizing Phase 0 completed
[15%] Optimizing Phase 1 completed
[25%] Optimizing Phase 2 completed
Running inference ...
[30%] Inferring Phase 0 completed
[40%] Inferring Phase 1 completed
[50%] Inferring Phase 2 completed
[55%] Inferring Phase 3 completed
Running technical mapping ...
[60%] Tech-Mapping Phase 0 completed
[65%] Tech-Mapping Phase 1 completed
[75%] Tech-Mapping Phase 2 completed
[80%] Tech-Mapping Phase 3 completed
[90%] Tech-Mapping Phase 4 completed
[95%] Generate netlist file "/media/masaaki/Ubuntu_Disk/Gowin/HDL/blink/impl/gwsynthesis/blink.vg" completed
[100%] Generate report file "/media/masaaki/Ubuntu_Disk/Gowin/HDL/blink/impl/gwsynthesis/blink_syn.rpt.html" completed
GowinSynthesis finish


FloorPlanner ボタンをクリックした。
Tang_Primer_25K_83_240208.png

Constraint File ダイアログが表示された。
CST file (*.cst) を作成するとのことだ。
OK ボタンをクリックした。
Tang_Primer_25K_84_240208.png

FloorPlanner が起動した。
Package View タブをクリックした。
Tang_Primer_25K_85_240208.png

左の Netlist ウインドウの blink -> Ports (2) を展開して、clk を E2 にドラック&ドロップする。
Tang_Primer_25K_86_240208.png

同様に led も E8 にドラック&ドロップした。
Tang_Primer_25K_87_240208.png

Save Contraints to /media/masaaki/Ubuntu_Disk/Gowin/HDL/blink/src/blink.cst ボタンをクリックして、blink.cst にセーブした。
GOWIN FPGA Designer に戻ると、blink.cst ファイルが生成されていた。

//Copyright (C)2014-2023 Gowin Semiconductor Corporation.
//All rights reserved. 
//File Title: Physical Constraints file
//GOWIN Version: 1.9.9 Beta-4 Education
//Part Number: GW5A-LV25MG121NC1/I0
//Device: GW5A-25
//Device Version: A
//Created Time: Thu 02 08 04:10:09 2024

IO_LOC "led" E8;
IO_PORT "led" PULL_MODE=NONE DRIVE=8 BANK_VCCIO=3.3;
IO_LOC "clk" E2;
IO_PORT "clk" PULL_MODE=NONE DRIVE=OFF BANK_VCCIO=3.3;


Tang_Primer_25K_88_240208.png

次に、Timing Constraints Editor ボタンをクリックし、タイミング制約を作成する。

Constraint File ダイアログが表示された。
SDC file (*.sdc) を作成するとのことだ。
OK ボタンをクリックした。
Tang_Primer_25K_89_240208.png

Gowin Timing Constraints Editor が開いた。
Netlist Tree ウインドウの blink -> Ports (2) -> clk を右クリックし、右クリックメニューから Add Clock を選択した。
Tang_Primer_25K_90_240208.png

Create Clock ダイアログが開いた。
Clock name に clk を入力し、Waveform の Period を 20 ns に、Rising を 0 ns、Falling を 10 ns に設定した。
OK ボタンをクリックした。
Tang_Primer_25K_91_240208.png

clk タイミング制約が追加された。
Save ボタンをクリックして、セーブした。
Tang_Primer_25K_92_240208.png

GOWIN FPGA Designer に戻ると、blink.sdc ファイルが生成されていた。

//Copyright (C)2014-2024 GOWIN Semiconductor Corporation.
//All rights reserved.
//File Title: Timing Constraints file
//GOWIN Version: 1.9.9 Beta-4 Education
//Created Time: 2024-02-08 04:16:47
create_clock -name clk -period 20 -waveform {0 10} [get_ports {clk}]


Tang_Primer_25K_93_240208.png

Run Place & Route ボタンをクリックし、Place & Route を行った。
エラーが発生した。
ログを示す。

Reading netlist file: "/media/masaaki/Ubuntu_Disk/Gowin/HDL/blink/impl/gwsynthesis/blink.vg"
Parsing netlist file "/media/masaaki/Ubuntu_Disk/Gowin/HDL/blink/impl/gwsynthesis/blink.vg" completed
Processing netlist completed
Reading constraint file: "/media/masaaki/Ubuntu_Disk/Gowin/HDL/blink/src/blink.cst"
Physical Constraint parsed completed
Running placement......
ERROR  (PR2028) : The constrained location is useless in current package
ERROR  (PR2017) : 'led' cannot be placed according to constraint, for the location is a dedicated pin (READY)
ERROR  (PR2028) : The constrained location is useless in current package
ERROR  (PR2017) : 'clk' cannot be placed according to constraint, for the location is a dedicated pin (CPU/SSPI)
Generate file "/media/masaaki/Ubuntu_Disk/Gowin/HDL/blink/impl/pnr/blink.pin.html" completed
Generate file "/media/masaaki/Ubuntu_Disk/Gowin/HDL/blink/impl/pnr/blink.rpt.html" completed
Generate file "/media/masaaki/Ubuntu_Disk/Gowin/HDL/blink/impl/pnr/blink.rpt.txt" completed
Thu Feb  8 04:18:35 2024


Tang_Primer_25K_94_240208.png
  1. 2024年02月08日 04:55 |
  2. Tang_Primer_25K
  3. | トラックバック:0
  4. | コメント:0

Tang Primer 25K で Lチカする3(GOWIN FPGA Designer でプロジェクトを作成する1)

Tang Primer 25K で Lチカする2(シミュレーション2)”の続き。

Tang Primer 25K で Lチカしてみようということで、前回は、blink.sv のカウントが 1 つ多いのを修正した。blink_tb.sv もスペルミスがあったので、修正し、もう一度、Icarus Verilog でシミュレーションした。今回は、GOWIN FPGA Designer で blink プロジェクトを作成しようとしたところ、ディレクトリを作成できないというエラーになった。どうやら、作成するディレクトリとプロジェクト名が同じだとエラーになるのかもしれない?他のディレクトリに blink プロジェクトを作成した。blink.sv ファイルを blink プロジェクトに追加した。

GOWIN FPGA Designer が起動しているので、File メニューから New... を選択して、プロジェクトを新規作成する。
Tang_Primer_25K_69_240205.png

New ダイアログが開いた。
Projects の FPGA Design Project を選択して、OK ボタンをクリックした。
Tang_Primer_25K_70_240205.png

Project Wizard ダイアログが表示された。
Project Name 画面で、Name に blink と入力し、Create in に /media/masaaki/Ubuntu_Disk/Gowin/HDL/Examples/blink を指定した。
Next > ボタンをクリックした。
Tang_Primer_25K_71_240205.png

Slelect Device 画面
下図のように指定して、GW5A-LV25MG121NC1/10 を選択した。
Next > ボタンをクリックした。
Tang_Primer_25K_72_240205.png

Summary 画面
Finish ボタンをクリックした。
Tang_Primer_25K_73_240205.png

Error ダイアログが表示された。
Tang_Primer_25K_74_240205.png

ディレクトリを作成できないというエラーだが、blink ディレクトリの下に blink プロジェクトを作るのがまずいのか?と思って、Project Wizard ダイアログの Project Name 画面で Create in に /media/masaaki/Ubuntu_Disk/Gowin/HDL ディレクトリを指定したところ、blink プロジェクトが作成できた。
Tang_Primer_25K_75_240205.png

/media/masaaki/Ubuntu_Disk/Gowin/HDL/blink ディレクトリを示す。
Tang_Primer_25K_76_240205.png

blink.sv を新規作成する。
File メニューから New... を選択した。
Tang_Primer_25K_77_240205.png

New ダイアログが開いた。
Files の Verilog File を選択した。
OK ボタンをクリックした。
Tang_Primer_25K_78_240205.png

New Verilog file ダイアログが開いた。
Name に blink を入力し .sv を選択した。
OK ボタンをクリックした。
Tang_Primer_25K_79_240205.png

blink.sv ファイルが生成された。
前回の blink.sv ファイルのコードをコピーした。
Tang_Primer_25K_80_240205.png

blink.sv は System Verilog ファイルなので System Verilog を指定する必要があるようだ。X で windy さんに教えてていただいた。
Project メニューから Configration を選択した。
Tang_Primer_25K_81_240205.png

Configuration ダイアログが開いた。
Synthesis -> General をクリックし、GowinSynthesis の Verilog Language で System Verilog 2017 を選択した。
OK ボタンをクリックした。
Tang_Primer_25K_82_240205.png
  1. 2024年02月07日 05:40 |
  2. Tang_Primer_25K
  3. | トラックバック:0
  4. | コメント:0

Tang Primer 25K で Lチカする2(シミュレーション2)

Tang Primer 25K で Lチカする1(シミュレーション)”の続き。

Tang Primer 25K で Lチカしてみようということで、前回は、blink.sv と blink_tb.sv を作成し、Icarus Verilog でシミュレーションしたが、カウントが 1 つ多かった。今回は、blink.sv のカウントが 1 つ多いのを修正した。blink_tb.sv もスペルミスがあったので、修正し、もう一度、Icarus Verilog でシミュレーションした。

修正した blink.sv を示す。

// blink.sv
// 2024/02/05 by marsee

module blink #(
    parameter COUNT_LIMINT = 32'd12500000 // 50MHz / 4
) (
    input clk,
    output led
);
    wire clk;
    logic led = 0;
    logic [31:0] count = 0;

    always_ff @( posedge clk ) begin : COUNTER
        if(count < COUNT_LIMINT-1) begin
            count <= count + 32'd1;
        end else begin
            count <= 32'd0;
        end
    end

    always_ff @( posedge clk ) begin : LED_OUTPUT
        if(count == COUNT_LIMINT-1) begin
            led <= ~led;
        end
    end
endmodule


テストベンチの blink_tb.sv を示す。

// blink_tb.sv
// 2024/02/05 by marsee

`timescale 1ns / 1ns

module blink_tb;
    logic clk;
    logic led;
    
    task gen_clk;
        forever begin
            #10 clk = ~clk; // 10 単位時間ごとに反転
        end
    endtask
    
    initial begin
        #10 fork
            gen_clk;
        join_none
    end

    initial begin // 一回のみ順番に実行される
        clk <= 1'b0;
        #510000000;
        $finish;
    end
    
    blink blink_inst(
        .clk(clk),
        .led(led)
    );

    // シミュレーション時に blink.vcd を出力する
    initial begin
        $dumpfile("blink.vcd");
        $dumpvars (0, blink_inst);
        #1;
    end
endmodule


Gowin/HDL/Examples/blink ディレクトリの blink.sv と blink_tb.sv を上のソースコードに修正した。

Icarus Verilog でコンパイルした。
iverilog -o blink *.sv -g 2012
blink 実行ファイルが生成された。
シミュレーションを行った。
vpp blink
blink.vcd ファイルが生成された。

blink.vcd ファイルを GTKWave で開いて、波形を確認した。
Tang_Primer_25K_68_240205.png

led 出力が 250 ms で 1 になって、500 ms で 0 に戻っている。よって、LED が 1 秒間に 2 回の点滅をするはずだ。
250 ms 付近を拡大した。
Tang_Primer_25K_67_240205.png

12499999 から 0 に戻っている。これで問題なさそうだ。
  1. 2024年02月06日 04:21 |
  2. Tang_Primer_25K
  3. | トラックバック:0
  4. | コメント:0

Tang Primer 25K で Lチカする1(シミュレーション)

Tang Primer 25K で Lチカしてみよう。
今回は blink.sv と blink_tb.sv を作成し、Icarus Verilog でシミュレーションした。

blink.sv を示す。

module blink #(
    parameter COUNT_LIMINT = 32'd12500000 // 50MHz / 4
) (
    input clk,
    output led
);
    wire clk;
    logic led = 0;
    logic [31:0] count = 0;

    always_ff @( posedge clk ) begin : COUNTER
        if(count < COUNT_LIMINT) begin
            count <= count + 32'd1;
        end else begin
            count <= 32'd0;
        end
    end

    always_ff @( posedge clk ) begin : LED_OUTPUT
        if(count == COUNT_LIMINT-1) begin
            led <= ~led;
        end
    end
endmodule


テストベンチの blink_tb.sv を示す。

`timescale 1ns / 1ns

module blink_tb;
    logic clk;
    logic led;
    
    task gen_clk;
        forever begin
            #10 clk = ~clk; // 10 単位時間ごとに反転
        end
    endtask
    
    initial begin
        #10 fork
            gen_clk;
        join_none
    end

    initial begin // 一回のみ順番に実行される
        clk <= 1'b0;
        #510000000;
        $finish;
    end
    
    blink blint_inst(
        .clk(clk),
        .led(led)
    );

    // シミュレーション時に blink.vcd を出力する
    initial begin
        $dumpfile("blink.vcd");
        $dumpvars (0, blint_inst);
        #1;
    end
endmodule


Gowin/HDL/Examples/blink ディレクトリを作成し、blink.sv と blink_tb.sv を入れた。
Tang_Primer_25K_63_240205.png

Icarus Verilog でコンパイルした。
iverilog -o blink *.sv -g 2012
blink 実行ファイルが生成された。
シミュレーションを行った。
vpp blink
blink.vcd ファイルが生成された。
Tang_Primer_25K_64_240205.png

blink.vcd ファイルを GTKWave で開いて、波形を確認した。
Tang_Primer_25K_65_240205.png

led 出力が 250 ms で 1 になって、500 ms で 0 に戻っている。よって、LED が 1 秒間に 2 回の点滅をするはずだ。
250 ms 付近を拡大した。
Tang_Primer_25K_66_240205.png

しまった。。。12500000 までカウントしてしまって 1 多いが、どのみち LED の点滅なので、ここのままにしよう。
久しぶりに Verilog 書いた。
  1. 2024年02月05日 04:59 |
  2. Tang_Primer_25K
  3. | トラックバック:0
  4. | コメント:0

Tang Primer 25K Dock の PMOD のピン番号と信号名対応表を作成した

Tang Primer 25K を Dock ごと使用していくために、PMOD のピン番号と信号名の対応表を作った。
Tang Primer 25K Dock の回路図の Tang_Primer_25K_Dock_60033_Schematic.pdf を見ると、PMOD は J4, J5, J6 のようだ。
J4, J5, J6 の位置を示す。
Tang_Primer_25K_61_240204.jpg

Tang Primer 25K Dock はウラ面に FPGA のピン番号が書いてある。
Tang_Primer_25K_6_231122.jpg

Tang_Primer_25K_Dock_60033_Schematic.pdf の信号名も FPGA のピン番号を信号名の最初に含めているようだ。
とってもわかりやすい。自分でこうしよう。。。

Tang Primer 25K DockのPMODの信号名とピン番号表を作った。
また、Digilent 社のPMOD のピン番号になれているので、対応を項目に追加した。
Tang_Primer_25K_62_240204.png
  1. 2024年02月04日 10:36 |
  2. Tang_Primer_25K
  3. | トラックバック:0
  4. | コメント:0

Gowin EDA のダウンロードとインストール2(Gowin Programmer のドライバをインストール)

Gowin EDA のダウンロードとインストール”の続き。

前回は、GOWIN FPGA Designer と Gowin Programmer をダウンロードして、展開した。今回は、Gowin Programmer のドライバをインストールする。

Gowin Programmer のドライバのインストールの仕方は、Programmer/doc/JPN/SUG502-1.5J_Gowin Programmerユーザーガイド.pdf の 15 ページの”2.5 Linux OS におけるケーブルの権限の構成”に書いてあったので、インストールを行う。
なお、現在使用しているパソコンの OS は Ubuntu 22.04 を使っている。

必要なファイルは、50-programmer_usb.rules, Gowin_USB_Cable_Installer.sh, Makefile だそうだ。
これらのファイルは、Programmer/bin ディレクトリに入っていた。
Tang_Primer_25K_56_240203.png

Programmer/bin ディレクトリに行って、make を行った。
cd /media/masaaki/Ubuntu_Disk/Gowin/Programmer/bin
sudo make

Tang_Primer_25K_57_240203.png

次に、Gowin_USB_Cable_Installer.sh を実行する。
su を実行して行うとマニュアルに書いてあったが、su のパスワードを忘れてしまったので、sudo でやることにした。
sudo chmod +x Gowin_USB_Cable_Installer.sh
sudo ./Gowin_USB_Cable_Installer.sh

Tang_Primer_25K_58_240203.png

GOWIN FPGA Designer の Process タブの Program Device をダブルクリックして、Gowin Programmer を起動した。
Tang_Primer_25K_59_240203.png

Tang_Primer_25K_60_240203.png
  1. 2024年02月03日 04:37 |
  2. Gowin EDA
  3. | トラックバック:0
  4. | コメント:0

Gowin EDA のサンプル・プロジェクトの内の CAN プロジェクトをやってみる4

Gowin EDA のサンプル・プロジェクトの内の CAN プロジェクトをやってみる3”の続き。

前回は、Place & Route のログの Place & Route Report と Timing Analysis Report を確認した。今回は、Place & Route のログの Ports & Pins Report と Power Analysis Report を確認した。

Place & Route のログの Ports & Pins Report を開いた。
Tang_Primer_25K_48_240201.png

Pin Details -> Pinout by Port Name をクリックした。
Port Name とその情報が表になっていた。
Tang_Primer_25K_49_240201.png

Pin Details -> All Package Pins をクリックした。
ピン番号順に信号名が表にしてあった。
Tang_Primer_25K_50_240201.png

Place & Route のログの Power Analysis Report を開いた。
Power Summary の Power Information とThermal Information も見えていた。
総消費電力は 115.234 mW だった。低い。静的消費電力は 91.757 mW で、動的消費電力は 23.467 mW だった。この消費電力見積もりは I/O も含めてこの消費電力なのだろうか?
Tang_Primer_25K_51_240201.png

Power Summary -> Power Configuration Information をクリックした。
Supply Information も見えている。
VCC は 1.000 V で 動的な電流は 16.744 mA だそうだ。
Tang_Primer_25K_52_240201.png

Power Details -> Power By Block Type をクリックした。
IO と PLL の消費電力が案外多い。
Tang_Primer_25K_53_240201.png

Power Details -> Power By Hierarchy をクリックした。
各階層ごとの消費電力が示されている。
Tang_Primer_25K_54_240201.png

Power Details -> Power By Clock Domain をクリックした。
クロックごとの動的消費電力が示されている。
Tang_Primer_25K_55_240201.png
  1. 2024年02月02日 04:40 |
  2. Gowin EDA
  3. | トラックバック:0
  4. | コメント:0

Gowin EDA のサンプル・プロジェクトの内の CAN プロジェクトをやってみる3

Gowin EDA のサンプル・プロジェクトの内の CAN プロジェクトをやってみる2"の続き。

前回は、CAN サンプル・プロジェクトの Synthesis と Place & Route をやってみた。論理合成のログを確認した。今回は、Place & Route のログに内の Place & Route Report と Timing Analysis Report を確認した。

最初に Synthesis 後の Netlist File を確認した。
Netlist File は暗号化されているようだ。CAN の Verilog HDL ファイルが暗号化されているからだろうか?
Tang_Primer_25K_34_240130.png

Place & Route -> Place & Route Report をダブルクリックして、表示した。
PnR Message と PnR Details が確認できる。
Tang_Primer_25K_35_240201.png

Resource -> Resource Usage Summary を表示した。
Tang_Primer_25K_36_240201.png

Resource -> GAO Resource Usage Summary と I/O Bank Usage Summary を表示した。
Tang_Primer_25K_37_240201.png

Resource -> Global Clock Summary と Global Clock Signals を表示した。
Tang_Primer_25K_38_240201.png

Resource -> Pinout by Port Name を表示した。
Tang_Primer_25K_39_240201.png

Resource -> All Package Pins を表示した。
Tang_Primer_25K_40_240201.png

Place & Route -> Timing Analysis Report をダブルクリックして、表示した。すごくたくさんの項目がある。
Timig Message と Timing Summaries が表示されている。
Tang_Primer_25K_41_240201.png

Timing Summaries -> Clock Summary 、Max Freqency Summary、Total Negative Summary を表示した。
myclk は FPGA に入力される sysclk で、myclk1 は sysclk を入力された PLL の出力となっている。
myclk1 はクロック波形のデューティ比が 1 対 1 だが、myclk は 1 の幅が 4 ns の 50 MHz のクロックとしてタイミング制約ファイルに規定されている。
タイミング制約ファイルで規定された制約は守られている。
Tang_Primer_25K_42_240201.png

Timing Details -> Path Slack Table -> Setup Paths Table を表示した。
Tang_Primer_25K_43_240201.png

Timing Details -> Path Slack Table -> Hold Paths Table を表示した。
Tang_Primer_25K_44_240201.png

Timing Details -> Timing Report By Analysis Type -> Setup Analysis Report を表示した。
パスごとの解析結果が見られるようだ。
Tang_Primer_25K_45_240201.png

Timing Details -> Timing Report By Analysis Type -> Hold Analysis Report を表示した。
Tang_Primer_25K_46_240201.png

Timing Details -> Timing Report By Analysis Type -> High Fanout Nets Report を表示した。
Tang_Primer_25K_47_240201.png

後の Timing Details は省略。たくさんの項目があった。
  1. 2024年02月01日 04:45 |
  2. Gowin EDA
  3. | トラックバック:0
  4. | コメント:0