FC2カウンター FPGAの部屋 Tang_Primer_25K
fc2ブログ

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

FPGAの部屋

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

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

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
»