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

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

FPGAの部屋

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

仙台に行って来ました

2月24日(木)から2月26日(土)まで、新幹線で仙台に行ってきました。
余りいろんなところは見られなかったのですが、仙台城と仙台博物館に行ってきました。

24日に新幹線で仙台へ。2階建ての新幹線に初めて乗りました。行きは1階、眺めが悪くて残念。2階に乗りたかったです。(帰りは2階でした。やはり眺めが良いです)仙台駅に到着。
sendai_2_110228.jpg

ホテルに荷物を置いてきてから名物の牛たんを食べました。利休の牛たんを食べたかったのですが、ものすごい行列だったので、伊達の牛タンを食べました。牛タンが柔らかく美味しかったです。
sendai_3_110228.jpg

次の日の最初に仙台城に行きました。眺めが良かったです。下から歩いて行ったのですが、かなり登ったので、眺めは最高でした。
sendai_4_110228.jpg

伊達政宗像もありました。馬に乗っていましたよ。
sendai_5_110228.jpg

仙台博物館に行って、ポンペイ展を見てきました。紀元前にこんなモノがあって、こんな豊かな生活をしていたんだ?というのが驚きでした。今の技術水準に照らしても凄いのがありました。秤は良く出来ていましたね。
sendai_6_110228.jpg
  1. 2011年02月28日 05:47 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:2

英国王のスピーチ(映画)を見てきました

昨日、英国王のスピーチを見てきました。
この映画、良かったです。感動しました。本当のことなんですかね?(本当だそうです)
奥さんに連れられて、つまんないのかな?と思って映画館に行ったのですが、良かったです。人によって感じ方はいろいろかもしれませんが、私に取っては今年最良の映画です。
  1. 2011年02月28日 05:23 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

DesignSpark PCB 1.0.3 のチュートリアルを試してみる5(PCB Design3)

DesignSpark PCB 1.0.3 のチュートリアルを試してみる4(PCB Design2)”の続き

55.ラッツネットで右クリックして、Segment ModeをOrthogonalモードからMitterモードに変更すると、斜め45度の配線を引くことができる。
DesignSpark_PCB_57_110227.png

56.R4の配線がSegment ModeをMitterモードに変更したの時の配線だ。
DesignSpark_PCB_58_110227.png

57.次は0Vの銅箔で基板の開いている部分を埋める。AddメニューからCopper Pour Area -> Polygon を選択する。
DesignSpark_PCB_60_110227.png

58.0Vの銅箔で基板を埋めたい領域を書く。
DesignSpark_PCB_61_110227.png

59.上のツールバーの右はじ、矢印のSelect Modeアイコンをクリックする。Copper Pour Areaで右クリックして、右クリックメニューのPour Copperを選択する。Pour Copperダイアログが出てくるので、0Vを選択して、OKボタンをクリックする。
DesignSpark_PCB_62_110227.png

60.部品面が0Vパターンで覆われた。
DesignSpark_PCB_63_110227.png

61.今度は半田面を0Vパターンで覆う。部品面の0V銅箔が邪魔なので、LayersのウインドウのTop Copperのチェックを外して、部品面を非表示にする。AddメニューからCopper Pour Area -> Polygon を選択してから、領域を描く前に、L(l)キーを押して、Bottom Copperに描く領域を変更する。ハンダ面の0V領域を描く。
DesignSpark_PCB_64_110227.png

62.上のツールバーの右はじ、矢印のSelect Modeアイコンをクリックする。Copper Pour Areaで右クリックして、右クリックメニューのPour Copperを選択する。Pour Copperダイアログが出てくるので、0Vを選択して、OKボタンをクリックする。すると、ハンダ面が0Vパターンで覆われた。
DesignSpark_PCB_65_110228.png

63.デザイン・ルール・チェックをする。左のツールバーからDesign Rule Checkアイコンをクリックする。
DesignSpark_PCB_66_110228.png

64.Check Designダイアログが出る。すべての項目にチェックを入れてcheckボタンをクリックする。
DesignSpark_PCB_67_110228.png

65.DRCエラーの内容がメモ帳で表示され、PCB画面にはエラーの場所がピンクで表示される。
DesignSpark_PCB_68_110228.png

DRC結果の表示の内容を下に示す。

Design Rule Check Report
------------------------

Report File    : H:\Documents and Settings\All Users\Documents\DesignSpark PCB\Examples\Design_Tutorial (PCB - Design Rule Check Report).txt
Report Written : Sunday, February 27, 2011
Design Path    : H:\Documents and Settings\All Users\Documents\DesignSpark PCB\Examples\Design_Tutorial.pcb
Design Title   : 
Created        : 2011/02/22 20:21:25
Last Saved     : 2011/02/27 11:37:25
Editing Time   : 6003 min
Units          : mm (precision 1)

Results
-------

Annular ring too small at (205.7,276.9)
    Size is 0.0 should be 0.1.
Pad to Board Error (P-B) between (205.7 278.5) and (205.7 279.4) on Layer "[All]".
    Error between Pad and Board, Gap is 0.9 needs to be 1.3.
Annular ring too small at (205.7,233.7)
    Size is 0.0 should be 0.1.
Pad to Board Error (P-B) between (205.7 232.1) and (205.7 231.1) on Layer "[All]".
    Error between Pad and Board, Gap is 0.9 needs to be 1.3.
Annular ring too small at (276.9,276.9)
    Size is 0.0 should be 0.1.
Pad to Board Error (P-B) between (278.5 276.9) and (279.4 276.9) on Layer "[All]".
    Error between Pad and Board, Gap is 0.9 needs to be 1.3.
Annular ring too small at (276.9,233.7)
    Size is 0.0 should be 0.1.
Pad to Board Error (P-B) between (276.9 232.1) and (276.9 231.1) on Layer "[All]".
    Error between Pad and Board, Gap is 0.9 needs to be 1.3.
Pad to Silkscreen Error (P-S) at (270.8 259.8) on Layer "Top Silkscreen".
    Silkscreen text 'R6' overlaps pad.
Via to Silkscreen Error (V-S) at (262.9 241.3) on Layer "Top Silkscreen".
    Silkscreen text 'R7' overlaps via.

Number of errors found : 10

Settings
--------

Spacings

    Tracks                             Yes
    Pads and Vias                      Yes
    Shapes                             Yes
    Text                               Yes
    Board                              Yes
    Drills                             Yes
    Components                         Yes

Manufacturing

    Drill Breakout                     Yes
    Drill Backoff                      Yes
    Silkscreen Overlap                 Yes
    Copper Text In Board               Yes
    Min Track Width                    Yes
    Min Annular Ring                   Yes
    Min Paste Size                     Yes
    Vias In Pads                       Yes
    Unplated Vias                      Yes
    Unplated Pads With Inner Tracks    Yes

Nets

    Net Completion                     Yes
    Dangling Tracks                    Yes
    Net Track Length Differences       No


End Of Report.



66.Hole32のGAPを1.3にする必要があるのと、R6とR7のシルクがビアにかかってしまっているようだ。それを修正したが、4つのAnnular ring too small at (207.0,275.6) Size is 0.0 should be 0.1.(位置は異なる)が残ってしまった。これはHole32に関することのようなので、取り敢えず、無視しようと思う。
DesignSpark_PCB_69_110228.png

67.DRCと順番が逆になってしまったが、Toolsメニューから Schematics/PCB Checkを選んで、回路図とPCBデザインに間に差がないかを調べた。、差がある場合は、通常であればPCBから回路図へ差をフォワードして修正する。しかし、今回は-5Vと+12VのネットがPCBデザインの方でsignal属性になっていたので、PCBデザインのネットの属性を変更した。

DesignSpark PCB 1.0.3 のチュートリアルを試してみる6(PCB Design4)”に続く。
  1. 2011年02月28日 05:14 |
  2. CADツール
  3. | トラックバック:0
  4. | コメント:0

DesignSpark PCB 1.0.3 のチュートリアルを試してみる4(PCB Design2)

DesignSpark PCB 1.0.3 のチュートリアルを試してみる3(PCB Design1)”の続き。

44.新たに、Layer 2に0V、Layer 3に+5Vを割り当てて、コンポーネントが基板の外に配置されたPCBデザインを使用して、自分で配置してみる。
DesignSpark_PCB_41_110221.png
DesignSpark_PCB_39_110221.png

45.手動で配置していく。ドラックアンドドロップで配置することができる。Rキーで回転したり、Fキーでミラーする。
DesignSpark_PCB_46_110221.png

46.配置し終わった。
DesignSpark_PCB_47_110223.png

47.ラッツネットをダブルクリックすると配線を始めることができる。Lキー(l)を押すとレイヤーを変更することができる。
DesignSpark_PCB_48_110223.png

48.クリックしていくと配線が決定されていく。レイヤーを変えたい場合は、Lキー(l)を押すとビアを打って、レイヤーを変更することができる。
DesignSpark_PCB_49_110223.png
DesignSpark_PCB_50_110223.png

49.一応、手配線が終了した。
DesignSpark_PCB_51_110223.png

50.次に取付用穴を付ける。取付用穴のつけ方は”細々と続ける趣味に関する備忘録”さんの”マウンティングホール 取り付け用穴”の記事にあった内容を参考にさせていただいた。
その記事によると、取付用穴はパッドのスタイルで実現するようだ。最初に、SettingsメニューからUnits...メニューを出して、Unis:をmm、Precisionを1にしておく必要がある。
DesignSpark_PCB_52_110223.png

51.SettingsメニューからDesign Technology...を選択する。Design Technologyダイアログが表示された。Pad Stylesタブで、Add Style...ボタンをクリックする。Add Styleダイアログで、Name:にHole32を指定して、Width:に3.2を指定する。ダイアログを閉じるとPad StylesにHole32が登録される。
DesignSpark_PCB_53_110224.png

52.Design Technologyダイアログを閉じるとHole32が使用できる。左のツールバーのAdd Padアイコンをクリックして、右クリックして、右クリックメニューを出す。メニューからChange Pad...を選択する。
DesignSpark_PCB_54_110224.png

53.Change PadダイアログでHole32を選択して、OKボタンをクリックする。
DesignSpark_PCB_55_110224.png

54.パッドがHole32に変更されるので、4隅に配置した。
DesignSpark_PCB_56_110224.png

DesignSpark PCB 1.0.3 のチュートリアルを試してみる5(PCB Design3)”に続く。
  1. 2011年02月23日 05:57 |
  2. CADツール
  3. | トラックバック:0
  4. | コメント:0

仙台に行ってきます

娘の付き添いで2月24日、25日、26日と2泊3日で仙台に行ってきます。牛タンや笹かまを食べてきたいと思います。楽しみですが、寒そうですね?
寒くなければ、仙台市内をウォーキングしてきたいと思います。東北新幹線乗るの初めてなので楽しみです。2時間程度で着いちゃうんですね。
そういうわけで、その間はブログはお休みとします。
何かお勧めの観光スポットはありますか?
  1. 2011年02月22日 22:02 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:4

DesignSpark PCB 1.0.3 のチュートリアルを試してみる3(PCB Design1)

DesignSpark PCB 1.0.3 のチュートリアルを試してみる2(Schematic Design2)”の続き。

27.PCBデザインにコンバートする。ToolsメニューからTranslate To PCB... を選択する。
DesignSpark_PCB_29_110221.png

28.New PCB Wizardダイアログが開く。I have read and accept the message aboveにチェックを入れて、次へ(N)>をクリックする。(これはチュートリアルに載っていない)
DesignSpark_PCB_30_110221.png

29.Specify your required PCB technolofyでChoose Techhology Fileのラジオボタンをクリックして、2sig2plane.ptfを選択した。これは4層基板のプロファイルのようだ。2つの信号層とGND層と電源層がある。Specify your preffered design unitsで、Precisionを0にした。
DesignSpark_PCB_31_110221.png

30.Specify which layers you requireを設定する。Define Layresのラジオボタンをクリックして自分でレイヤーを細かく指定もできるが、今回は、Use Layres From Chosen Techhology Fileのラジオボタンを選択した。
DesignSpark_PCB_32_110221.png

31.次はボードサイズの指定。Define Board SizeはWidth 3000, Height 2000のデフォルト値のままとした。
DesignSpark_PCB_33_110221.png

32.コンポーネントの配置やネットのルーティングの指定。Component PlacementはAutomatically Postion Position Inside the Boardのラジオボタンをクリックした。
DesignSpark_PCB_34_110221.png

33.PCBデザインをファイルにセーブして、完了ボタンをクリックした。
DesignSpark_PCB_35_110221.png

34.PCBデザインができた。ラッツネットが配線されていて、部品が基板内に配置されている。
DesignSpark_PCB_36_110221.png

35.コンポーネントの配置やネットのルーティングの指定で、32.ではAutomatically Postion Position Inside the Boardのラジオボタンをクリックしただけだったが、Allow Component Rotation、Allow SMD Component to Swap Sideにチェックを入れて、オートルーティングを行うため、Net RoutingのAutomatically Add Tracks Between Componentsにチェックを入れて、次のダイアログでセーブして完了させた。
DesignSpark_PCB_37_110221.png

36.35.の設定では、次の図に示すPCBデザインが生成された。基板に部品が自由に回転されて配置されていて、配線も完了している。
DesignSpark_PCB_38_110221.png

37.コンポーネントの配置やネットのルーティングの指定。Component PlacementのArrange Outside the Boardのラジオボタンをクリックして、次のダイアログでセーブして完了させた。
DesignSpark_PCB_39_110221.png

38.37.の設定だと、コンポーネントは基板の外に配置されたPCBデザインが生成された。
DesignSpark_PCB_40_110221.png

39.Specify which layers you requireでDefine Layersのラジオボタンをクリックして、4 Layer Boardを選び、Powerplane LayersのLayer 2に0V、Layer 3に+5Vを選ぶ。
DesignSpark_PCB_41_110221.png

40.39.の様に選択すると下の図のPCBデザインになった。(Automatically Postion Position Inside the Boardのラジオボタンをクリックして、Allow Component Rotation、Allow SMD Component to Swap Sideにチェックを入れて、オートルーティングを行うため、Net RoutingのAutomatically Add Tracks Between Componentsにチェックを入れた状態)
DesignSpark_PCB_42_110221.png

41.ViewメニューからPowerplane -> show... を選択する。
DesignSpark_PCB_43_110221.png

42.Show Powerplaneで0V Plane [0V] を選択する。
DesignSpark_PCB_44_110221.png

43.0V Planeが緑色で表示された。サーマルが付いているのが見えた。
DesignSpark_PCB_45_110221.png

この辺は、Kicadでレイヤを選択するとPowerplaneも見えるので、Kicadの方が素直な気もする。
後、取付穴はどうやって作るのだろうか?(追記:わかりました。次の記事を御覧ください)

DesignSpark PCB 1.0.3 のチュートリアルを試してみる4(PCB Design2)”に続く。

  1. 2011年02月22日 05:39 |
  2. CADツール
  3. | トラックバック:0
  4. | コメント:0

DesignSpark PCB 1.0.3 のチュートリアルを試してみる2(Schematic Design2)

DesignSpark PCB 1.0.3 のチュートリアルを試してみる1(Schematic Design1)”の続き。

18.チュートリアルに従って、回路図の位置に部品を配置した。(部品の回転は選択した状態でRキーを押す
DesignSpark_PCB_19_110220.png

19.部品の端のX印をクリックすると線が引ける。しかし、左のツールバーのAdd Schematic Connectionアイコンをクリックして線を引いたほうが良いみたいだ。
DesignSpark_PCB_20_110220.png

20.部品を追加していく。ダイオードの1N4148は、D{discrete}という部品を挿入して名前を編集した。電解コンデンサはCP{Descrete}を使用した。コネクタはD9F{Connector}をFキーを使用してミラーして使用した。電源のレギュレータは7805{Hybrid}を使用した。(注:{}内はライブラリ名)
DesignSpark_PCB_21_110221.png

21.電源シンボルを追加する。Schemaライブラリの+5V、-5V、0V(GND)シンボルを追加する。+5Vのシンボルの例をやってみると、+5VのシンボルをSchematic Design Editorにドラックアンドドロップする。connection(信号線)の所に+5Vシンボルを置いただけではだめで必ずconnection(信号線)で結ぶ必要がある。信号線を結ぶとJoin Netダイアログが出て、Netを+5Vのネットにするという警告するので、OKボタンをクリックする。
DesignSpark_PCB_22_110221.png

22.+5Vシンボルに接続されているネットもPowerの+5Vに変更された。
DesignSpark_PCB_23_110221.png

23.最後にネット名でネットを接続する。OPアンプの出力を離れたコネクタの出力ピンに接続する。最初にSchemaライブラリのTOシンボルをSchematic Design Editorにドラックアンドドロップして、connectionを接続した。
DesignSpark_PCB_24_110221.png

24.TOシンボルを選択して、右クリックメニューからChange Net...を選択する。Change Netダイアログで、Net NameにSIN_OUTと入力して、OKボタンをクリックする。
DesignSpark_PCB_25_110221.png

25.チュートリアルではTOシンボルを選択して、右クリックメニューからDisplay Net Nameを選択すると書いてあるが、TOシンボルを選択しては、Display Net Nameは出てこなかった。TOシンボルが接続されているネットを選択して、Display Net Nameを選んだ。
DesignSpark_PCB_26_110221.png

26.OPアンプの出力を同様にSIN_OUTネットに接続した。
DesignSpark_PCB_27_110221.png

これで回路図は完成した。
DesignSpark_PCB_28_110221.png

DesignSpark PCB 1.0.3 のチュートリアルを試してみる3(PCB Design1)”に続く。
  1. 2011年02月21日 05:57 |
  2. CADツール
  3. | トラックバック:0
  4. | コメント:0

DesignSpark PCB 1.0.3 のチュートリアルを試してみる1(Schematic Design1)

DesignSpark PCBという、基板CADツールを以前教えていただいたのだが、登録する必要があるとのことで、放ったらかしになっていた。今回登録して、試してみる気になったので、試してみようと思う。
無料のCADツールとしては、Kicadがあって、自分でも以前試しに基板を作ってみたが、どっちが良いのかな?ということで、DesignSpark PCBも試してみることにした。
作りたい基板はあるのだが、あせらずに雰囲気をつかむために、チュートリアルをやってみようと思う。まずはデザインのチュートリアルから初めてみる。チュートリアルにやり方が詳しく書いてあるので、このブログでは要所々々でウインドウを貼りつけていこうと思っている。

さてそれでは、DesignSpark PCBを起動した。DesignSpark PCBを起動すると下のようなウインドウが出る。
DesignSpark_PCB_1_110220.png

デザインのチュートリアルはHelpメニューからTutorials -> Design Tutorial を選択すると出てくる。
DesignSpark_PCB_2_110220.png

まずは、Schematic Design Tutorialを行う。
このチュートリアルでは、タイマーIC555を使って、サイン波のオシレーターをつくるみたいだ。その回路図を下に示す。
DesignSpark_PCB_28_110221.png

1.最初にFileメニューからNewを選択する。
2.New Design ダイアログでSchematic Designを選択する。(デフォルト)
3.新しいSchematic Design のウインドウが開く。右下のAdd componentを選択すると部品のシンボルが見える。かなりの部品のシンボルが入っているようだ。Add componentはF9キーで出したり消したりすることができる
DesignSpark_PCB_4_110220.png

4.Discreteライブラリを選択する。
DesignSpark_PCB_5_110220.png

5.Rを選択して、Schematic Symbolをドラックアンドドロップすると、Designのウインドウに持ってくれるようだ。
DesignSpark_PCB_6_110220.png

6.マウスのホイールを回すと、ズームイン、ズームアウト、ホイルをクリックするとパンする。
7.抵抗を7個とコンデンサを7個挿入した。その場合にCTRL-Cでコピーして、CTRL-Vでペーストすると良いとのことだった。
DesignSpark_PCB_7_110220.png

7.左のツールバーのAdd componentアイコンをクリックすると、Add componentダイアログがでる。Find...ボタンをクリックしてコンポーネントを検索する。
DesignSpark_PCB_8_110220.png

8.Findダイアログで、Containsを選択して、ne555と入力し、FindボタンをクリックするとNE555のリストが下に表示されるので、NE555P、DIPパッケージをダブルクリックする。
DesignSpark_PCB_9_110220.png

9.NE555PがSchematic Design Editorに表示されるので、移動してクリックして確定する。クリックしてもまだシンボルを追加するモードになっているので、ESCを押してキャンセルする。
DesignSpark_PCB_10_110220.png

10.次にOPアンプのtl072を同様にシンボルを追加した。
DesignSpark_PCB_11_110220.png

11.抵抗の値を変更する。R1の1Kをダブルクリックすると、Propertiesダイアログが開く。Valuesタブをクリックし、Value=1Kをクリックすると、Edit...ボタンが有効になるので、それをクリックする。
DesignSpark_PCB_12_110220.png

12.Valueダイアログで100Kに変更して、OKボタンをクリックする。
DesignSpark_PCB_13_110220.png

13.Value=100Kになっているのを確認してOKボタンをクリックする。
DesignSpark_PCB_14_110220.png

14.抵抗値が100Kに変更された。
DesignSpark_PCB_15_110220.png

15.チュートリアルに沿って、すべてのRとCの値を同様に変更した。(いちいちダイアログを開いて値を変更するのが面倒。テキストを直接修正させてくれれば良いのだが。。。)
DesignSpark_PCB_16_110220.png

16.右のAdd componentドックウインドウから、Schemaライブラリを選択して、A4パーツを選択して、ドラックアンドドロップする。
DesignSpark_PCB_17_110220.png

17.回路図の枠(なんていう名前でしたか?)が挿入される。Aキーを押すと全体が表示される。Zキーで1つズーム。
DesignSpark_PCB_18_110220.png

今日はここまで。

DesignSpark PCB 1.0.3 のチュートリアルを試してみる2(Schematic Design2)”に続く。
  1. 2011年02月20日 10:53 |
  2. CADツール
  3. | トラックバック:0
  4. | コメント:0

キャラクタ・ディスプレイ・コントローラをNSLで書こう6(Spartan-3A Starter Kitにダウンロード)

キャラクタ・ディスプレイ・コントローラをNSLで書こう5(シミュレーション1)”の続きなのだが、やったことは、”PlanAhead12.4でCreate New Projectしてみる3(Program and Debug)”に書いてしまった。
まだバグがあって、下の写真の様に、字がおかしくなっている。
PlanAhead124_40_110218.jpg

これをデバックしてみた。これは、キャラクタ・ジェネレータのキャラクタ・パターンをRGB値に直すところでおかしいはずなので、NSLファイルと以前書いたVerilogファイルを見比べてみた。下にNSLの問題の部分を示す。

        any {
            u_disp_timing.h_addr[2:0] == 3'd2 : {
                char_data_node := char_data[7:1];
                temp_color := display_dout[RED_DOT_POS : BLUE_DOT_POS]; 
                if (char_data[0] && display_on_d2) {
                    red_node := display_dout[RED_DOT_POS];
                    green_node := display_dout[GREEN_DOT_POS];
                    blue_node := display_dout[BLUE_DOT_POS];
                } else {
                    red_node := 1'b0;
                    green_node := 1'b0;
                    blue_node := 1'b0;
                }
            }
            else : {
                char_data_node := { 1'b0, char_data_node[6:1] };
                // if (char_data_node && display_on_d2) {
                if (char_data_node[0] && display_on_d2) {
                    red_node := temp_color[2];
                    green_node := temp_color[1];
                    blue_node := temp_color[0];
                } else {
                    red_node := 1'b0;
                    green_node := 1'b0;
                    blue_node := 1'b0;
                }
            }
        }            


上のNSLソースで、コメントしてある、// if (char_data_node && display_on_d2) { の部分が間違っていたところだ。これはキャラクタ・ジェネレータから出てきたキャラクタ・パターンをシフトレジスタに入れて、LSBの0晩ビットの値でRGB値を決めるところなので、char_data_node[0]でなければおかしい。その後、キャラクタ・パターンは1ビット右シフトされる。
これを修正して、論理合成、Implement、実機にダウンロードしたところ、下の写真のように動作した。
PlanAhead124_41_110218.jpg

なんか、少し、ちらついている感があるのだが、これで終了とする。
キャラクタ・ディスプレイ・コントローラとかはIPとしてVerilogやVHDLで書いて、NSLは、もう少し上のレベルを書いたほうが良い気がした。

最後にNSLの全ソースを載せておく。

// UML2NSL converter Ver. 2010-03-28 Copyright (c) 2009-2010 IP ARCH, Inc. All rights reserved.
// xmi  --- version 2.1 --- 

#define    C200MS_SECOND    ( 23'd230000 - 23'd1)
#define    H_ACTIVE_VIDEO 640
#define    H_FRONT_PORCH 16
#define    H_SYNC_PULSE 96
#define    H_BACK_PORCH 48
#define    H_SUM H_ACTIVE_VIDEO+H_FRONT_PORCH+H_SYNC_PULSE+H_BACK_PORCH

#define    V_ACTIVE_VIDEO 480
#define    V_FRONT_PORCH 11
#define    V_SYNC_PULSE 2
#define    V_BACK_PORCH 31
#define    V_SUM V_ACTIVE_VIDEO+V_FRONT_PORCH+V_SYNC_PULSE+V_BACK_PORCH

#define    H_DISPLAY_SIZE H_ACTIVE_VIDEO/8 // 横80桁
#define    V_DISPLAY_SIZE V_ACTIVE_VIDEO/8 // 縦60行
    
#define    RED_DOT_POS 9 // 9ビット目がRED
#define    GREEN_DOT_POS 8 // 8ビット目がGREEN
#define    BLUE_DOT_POS 7 // 7ビット目がBLUE

declare    CharDispCtrlerTest interface {
    
    input    m_clock;
    input    p_reset;
    
    // -- CharDispCtrlerTest  --
    output    VGA_RED[4];
    output    VGA_GREEN[4];
    output    VGA_BLUE[4];
    output    VGA_HSYNC;
    output    VGA_VSYNC;
    
}

declare    CharDispCtrler  {
    
    // -- CharDispCtrler  --
    output    VGA_RED[4];
    output    VGA_GREEN[4];
    output    VGA_BLUE[4];
    output    VGA_HSYNC;
    output    VGA_VSYNC;
    input    char_addr[13];
    input    char_din[10];
    
    // -- CharDispCtrler  --
    func_in    char_write(char_addr,char_din);

}

declare    Top_wDCM  {
    
    // -- Top_wDCM  --
    output    VGA_RED[4];
    output    VGA_GREEN[4];
    output    VGA_BLUE[4];
    output    VGA_HSYNC;
    output    VGA_VSYNC;
    
}

declare    frame_buffer  {
    
    // -- frame_buffer  --
    input    char_addr[13];
    input    char_din[10];
    input    char_we;
    input    display_addr[13];
    output    display_dout[10];
    
    // -- frame_buffer  --
    func_in fb_write(char_addr, char_din);
    func_in    fb_read(display_addr) ;

}

declare    disp_timing  {
    
    // -- disp_timing  --
    output    page_start;
    output    display_on;
    output    h_addr[10];
    output    v_addr[10];
    output    h_sync;
    output    h_sync_pulse;
    output    v_sync;
    
}

declare dcm_inst interface {
    input clkin;
    input reset;
    output clkout;
    output clkfx;
    output clkdv;
    output locked;
}

declare char_gen_rom interface {
    input clk;
    input reset;
    input char_addr[7];
    input row_addr[3];
    output dout[8];
}

module    CharDispCtrlerTest {
    
    // -- CharDispCtrlerTest  --
    reg    char_addr[13] = 0;
    reg    count_200ms[23] = 0;
    reg    char_code[7] = 7'h21;
    reg color_data[3] = 1;
    wire    char_data[10];
    
    func_self    char_addr_inc();
    func_self    char_code_inc();
    func_self    color_data_inc();
    
    CharDispCtrler    u_charDispCtrler;

    /* common operations */
    {
        VGA_RED = u_charDispCtrler.VGA_RED;
        VGA_GREEN = u_charDispCtrler.VGA_GREEN;
        VGA_BLUE = u_charDispCtrler.VGA_BLUE;
        VGA_HSYNC = u_charDispCtrler.VGA_HSYNC;
        VGA_VSYNC = u_charDispCtrler.VGA_VSYNC;
        
        char_data = { color_data, char_code };
        
        any {
            count_200ms == C200MS_SECOND : {
                count_200ms := 0;
                u_charDispCtrler.char_write(char_addr, char_data); // キャラクタを描画
                char_addr_inc(); // キャラクタのアドレスをインクリメント
                char_code_inc(); // キャラクタをインクリメント
                color_data_inc(); // カラーをインクリメント
            } else : {
                count_200ms++;
            }
        }
                
    }
    
    function char_addr_inc {
        if (char_addr == 13'd4799) { // 終了
            char_addr := 0;
        } else {
            char_addr++;
        }
    }

    function char_code_inc {
        if (char_code == 7'h7E) {
            char_code := 7'h21;
        } else {
            char_code++;
        }
    }
    
    function color_data_inc {
        if (color_data == 3'h7) {
            color_data := 3'h1;
        } else {
            color_data ++;
        }
    }
        
}

module    CharDispCtrler {
    
    // -- CharDispCtrler  --
    wire    h_sync_pulse;
    reg    char_data_node[7] = 0;
    reg    temp_pointer[13] = 0;
    reg    page_start = 0;
    reg    display_addr[13] = 0;
    wire    char_data[8];
    wire    display_out[10];
    reg display_on_d1 = 0, display_on_d2 = 0;
    reg h_sync_1 = 0, v_sync_1 = 0;
    reg h_sync_2 = 0, v_sync_2 = 0;
    reg h_sync_3 = 0, v_sync_3 = 0;
    wire    display_dout[10];
    reg    temp_color[3] = 0;
    reg red_node = 0, green_node = 0, blue_node = 0;
    frame_buffer    u_frame_buffer;
    char_gen_rom    u_char_gen_rom;
    disp_timing    u_disp_timing;

    /* common operations */
    {
        u_char_gen_rom.clk    = m_clock;
        u_char_gen_rom.reset = p_reset;
        u_char_gen_rom.char_addr = u_frame_buffer.display_dout[6:0];
        u_char_gen_rom.row_addr = u_disp_timing.v_addr[2:0];
        
        char_data = u_char_gen_rom.dout;
        display_dout = u_frame_buffer.fb_read(display_addr).display_dout;
        
        any {
            u_disp_timing.display_on : {
                if (u_disp_timing.h_addr[2:0] == 3'd7) {
                    display_addr++;
                }
            }
            u_disp_timing.v_sync : {
                display_addr := 0;
                temp_pointer := 0;
            }
            u_disp_timing.h_sync_pulse : {
                if (u_disp_timing.v_addr[2:0] == 3'd7)
                    temp_pointer := display_addr;
                else
                    display_addr := temp_pointer;
            }
        }
    
        any {
            u_disp_timing.h_addr[2:0] == 3'd2 : {
                char_data_node := char_data[7:1];
                temp_color := display_dout[RED_DOT_POS : BLUE_DOT_POS]; 
                if (char_data[0] && display_on_d2) {
                    red_node := display_dout[RED_DOT_POS];
                    green_node := display_dout[GREEN_DOT_POS];
                    blue_node := display_dout[BLUE_DOT_POS];
                } else {
                    red_node := 1'b0;
                    green_node := 1'b0;
                    blue_node := 1'b0;
                }
            }
            else : {
                char_data_node := { 1'b0, char_data_node[6:1] };
                // if (char_data_node && display_on_d2) {
                if (char_data_node[0] && display_on_d2) {
                    red_node := temp_color[2];
                    green_node := temp_color[1];
                    blue_node := temp_color[0];
                } else {
                    red_node := 1'b0;
                    green_node := 1'b0;
                    blue_node := 1'b0;
                }
            }
        }            
        VGA_RED = {4{red_node}};
        VGA_GREEN = {4{green_node}};
        VGA_BLUE = {4{blue_node}};
        
        display_on_d1 := u_disp_timing.display_on;
        display_on_d2 := display_on_d1;
        
        h_sync_1 := u_disp_timing.h_sync;
        v_sync_1 := u_disp_timing.v_sync;
        h_sync_2 := h_sync_1;
        v_sync_2 := v_sync_1;
        h_sync_3 := h_sync_2;
        v_sync_3 := v_sync_2;
        
        VGA_HSYNC = ~h_sync_3;
        VGA_VSYNC = ~v_sync_3;
    }

    
    /* func_in char_write(char_addr,char_dout) operation */
    function    char_write {
        u_frame_buffer.fb_write(char_addr, char_din);
    }
        
}

module    Top_wDCM {
    dcm_inst    u_dcm_inst;
    CharDispCtrlerTest    u_charDispCtrlerTest;
    wire    clkdv;
    wire    locked;
    
    u_dcm_inst.clkin = m_clock;
    u_dcm_inst.reset = p_reset;
    clkdv = u_dcm_inst.clkdv;
    locked = u_dcm_inst.locked;
    
    u_charDispCtrlerTest.m_clock = clkdv;
    u_charDispCtrlerTest.p_reset = ~locked;
    VGA_RED = u_charDispCtrlerTest.VGA_RED;
    VGA_GREEN = u_charDispCtrlerTest.VGA_GREEN;
    VGA_BLUE = u_charDispCtrlerTest.VGA_BLUE;
    VGA_HSYNC = u_charDispCtrlerTest.VGA_HSYNC;
    VGA_VSYNC = u_charDispCtrlerTest.VGA_VSYNC;
    
}

module    frame_buffer {
    mem m[8192][10] ;
    reg ReadData[10];
    
    /* common operations */
    {
        display_dout = ReadData;    
    }

    /* func_in fb_read(display_addr) operation */
    function    fb_read {
        ReadData := m[display_addr] ;
    }
        
    /* function fb_write(char_addr,char_din) operation */
    function    fb_write {
        m[char_addr] := char_din ;
    }
        
}
        
module    disp_timing {
    reg h_point[11] = 0, h_addr_node[11] = 0; // 1024までOK
    reg v_point[11] = 0, v_addr_node[11] = 0; // 1024までOK
    reg page_start_node = 0;
    reg display_on_node = 0;
    reg h_sync_node = 0;
    reg v_sync_node = 0;
    reg h_sync_pulse_node = 0;
    
    any {
        h_point == H_SUM-1 :
            h_point := 0;
        else :
            h_point++;
    }
    h_addr_node := h_point;
    h_addr = h_addr_node[9:0];
    
    any {
        v_point == V_SUM-1 :
            v_point := 0;
        else : {
            if (h_point == H_SUM-1)
                v_point++;
        }
    }
    v_addr_node := v_point;
    v_addr = v_addr_node[9:0];
    
    any {
        h_point<H_ACTIVE_VIDEO && v_point<V_ACTIVE_VIDEO :
            display_on_node := 1'b1;
        else : 
            display_on_node := 1'b0;
    }
    display_on = display_on_node;
    
    any {
        h_point==0 : 
            page_start_node := 1'b1;
        else :
            page_start_node := 1'b0;
    }
    page_start = page_start_node;

    any {
        (h_point>=(H_ACTIVE_VIDEO + H_FRONT_PORCH)) && (h_point < (H_SUM-H_BACK_PORCH)) :
            h_sync_node := 1'b1;
        else :
            h_sync_node := 1'b0;
    }
    h_sync = h_sync_node;
    
    any {
        h_point==(H_ACTIVE_VIDEO+H_FRONT_PORCH) :
            h_sync_pulse_node := 1'b1;
        else :
            h_sync_pulse_node := 1'b0;
    }
    h_sync_pulse = h_sync_pulse_node;
    
    any {
        (v_point>=(V_ACTIVE_VIDEO + V_FRONT_PORCH)) && (v_point<(V_SUM-V_BACK_PORCH)) :
            v_sync_node := 1'b1;
        else :
            v_sync_node := 1'b0;
    }
    v_sync = v_sync_node;
    
}


  1. 2011年02月18日 05:56 |
  2. NSL
  3. | トラックバック:0
  4. | コメント:0

PlanAhead12.4でCreate New Projectしてみる3(Program and Debug)

PlanAhead12.4でCreate New Projectしてみる2(論理合成、インプリメント)”の続き。

前回でImplementまで終了したので、今度はビットストリートを生成して、実機にダウンロードする。
PlanAhead Project Manager の左のProgram and Debugをクリックすると、プルダウンメニューが出る。そこからGenerate Bitstream...を選択する。
PlanAhead124_35_110217.png

Generate Bitstream ダイアログが表示されて、オプションを選択する。(このオプションも少ない。Project Navigatorだともっと色々なオプションがある)
PlanAhead124_36_110217.png

Generate Bitstream Completedダイアログが表示されるので、OKボタンをクリックする。
PlanAhead124_37_110217.png

これでビットファイルが、PA_proj_124\PA_proj_124.runs\impl_1の下に生成された。(top_wdcm.bit)
次にiMPACTを起動して実機にビットファイルをダウンロードする。
左のウインドウのProgram and Debugをクリックして、Launch iMPACT...を選択する。
PlanAhead124_37_110218.png

実機の電源を入れて、ダウンロードケーブルを接続しておくと、iMPACTが起動して設定まで終わってしまっている。(設定ファイルは、PA_proj_124\PA_proj_124.data\impactファルダのimpactdefaultproj.ipf)この辺りはProject Navigatorより便利だ。次に起動すると自動的にimpactdefaultproj.ipfファイルを読んで、起動する。
PlanAhead124_38_110218.png

後は、xc3s700aをクリックして、iMPACT ProcessesウインドウのProgramをダブルクリックする。
PlanAhead124_39_110218.png

ダイアログが表示されるので、OKボタンをクリックすると実機にダウンロードする。これで動作したはずだ。
キャラクタは表示されているのだが、文字がおかしい?なぜだろう?
PlanAhead124_40_110218.jpg

デバックすることにする。

(追記)
Notepad++でPlanAheadのProject Manager に入っているVerilogファイルを更新しても、Project Manager は更新を検出しないようだ。(これは面倒だと思う)
  1. 2011年02月18日 04:18 |
  2. PlanAheadについて
  3. | トラックバック:0
  4. | コメント:0

TED プログラマブル ソリューション2011

昨日は、TED プログラマブル ソリューション2011に行ってきました。

最初のセミナは、ARMプロセッサコアで広がるソリューション。
ARMコアの紹介だった。間違えたりしていたので、やる気が余り無いような感じがした。ARMにとっては、Xilinxとの協業も余り重要でないのかな?

・ザイリンクス 28nm FPGAイノベーション
Virtex-6, Spartan-6の説明から、7シリーズの説明、スタックド・シリコン・インターコネクト・テクノロジの紹介。エクステンシブル・プロセッシング・プラットフォームは、本当にARMのSoCのペリフェラルとしてFPGAが載っているという構造らしい。もしかして、XilinxがAutoESLを買収したのって、この辺のコデザインに使うからなのか?(推測です)
その後はISE12の説明だった。(早くISE13を使ってみたい)

・インテル・アーキテクチャーとFPGAで加速するBeyond PC
前半はインテルの方が、主にAtomのロードマップや特徴を説明した。Atom E6XXシリーズだとCPU1チップに主要なインターフェースがついていて、PCI Express X1が出ているので、そこにFPGAを接続できるそうだ。それはわかるが、AtomにはAlteraのFPGAが入ったStellarton、E600Cがあるんじゃなかったか?外付けのSpartan-6を付けるよりもそれを使ったほうが良いに決まっているんじゃないだろうか?ブースで聞いてみようと思ったが、お話ができなかった。

・AXI4を使ったFPGA内部システムの構築について
最初に、AXI4バスの説明があった。256バーストができるそう。しかもアウトオブオーダー、高性能のようだ。AXI4Liteはシングル転送だけだそうだ。ReadとWriteは独立でどちらも同時に出来る。
途中にインターコネクトを入れる必要があり、マスタ、スレーブが1対1の場合は配線だけになるそうだ。多対多の場合は、アドレスにはアービタとルータが入り、データはクロスバ接続だそうだ。データのクロスバーで同時にブロードキャスト出来るかどうか聞いてみたかった。

・Spartan-6FPGA搭載基板のDDR3メモリおよびFPGA実機検証手法
~シミュレーションと実測の融合~
アジレントの菊池さんが講演された。ET2010の時にお話させていただいた方だった。Infiniisimというオシロスコープに搭載されているシミュレータがあって、それでシミュレーションできるとのことだった。凄い。。。Sパラメータを入れていってシミュレーションし、どんどんSパラメータを入れていくと精度が上がっていくそうだ。この辺の測定にはネットワークアナライザが必須か?うちの基板は伝送線路シミュレーションして、基板を作って、実測していないが、売り物の基板はそれじゃ許されないんだろう?
でも、測定パッドを出すと波形が劣化しやすいのではないだろうか?大丈夫だろうか?プローブの影響はシミュレーションで取り除いた波形を見ることができるそうだ。

・DMPグラフィックスIPソリューション
DMP社って、新しい任天堂DS3のグラフィックIPの会社なんだ。。。NV7のデモを見せてもらったけど、凄い。。。シャドーもテクスチャも付いていて、組み込みグラフィクスじゃないみたいだった。データはどうやって何でもっているのだろうか?そこが気になった。こんなすごい会社が日本にあるんだ?

お昼も美味しいバイキングをごちそうになってしまって、ありがとうございました。
有意義な一日でした。
最後にUSB3.0のボードが展示されていた。Spartan-6だったと思うのだが、Spartan-6のトランシーバーは最大3.125Gbpsだったと思ったのだが、USB3.0は5Gbpsじゃなかったか?聞いてみたのだが、ソフトウェアの方の方だったので、わからないとのことだった。もしかして、Virtex-6だったのかな?
(追記)”TEDら、USB3.0対応のFPGAメザニンカードを開発”によるとTIのPHYチップ、「TUSB1310A」を搭載しているそうです。おおきさん情報ありがとうございました。
  1. 2011年02月17日 05:54 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:2

キャラクタ・ディスプレイ・コントローラをNSLで書こう5(シミュレーション1)

PlanAhead12.4でCharDispCtler のNSLコードのデバック”の続き。

前回、PlanAheadのプロジェクトを作成して、ある程度のデバックができた。今回はISimでシミュレーションを行う。Top_wDCM_tb.vというテストベンチを用意した。このテストベンチは、”キャラクタ・ディスプレイ・コントローラのシミュレーション”のテストベンチを改造して使った。*キャラクタを使用して文字を描画するテストベンチだ。テストベンチを下に示す。

// Top Module is Top_wDCM

`timescale 1ns/1ps

module Top_wDCM_tb;
    `include "disp_timing_parameters.vh"

    reg m_clock = 1'b0;
    reg p_reset = 1'b1;
    wire [3:0] VGA_RED;
    wire [3:0] VGA_GREEN;
    wire [3:0] VGA_BLUE;
    wire VGA_HSYNC;
    wire VGA_VSYNC;
    integer i, j, k, m, n;

    parameter PERIOD = 20;
    parameter real DUTY_CYCLE = 0.5;
    parameter OFFSET = 0;

    initial    // Clock process for m_clock
    begin
        #OFFSET;
        forever
        begin
            m_clock = 1'b0;
            #(PERIOD-(PERIOD*DUTY_CYCLE)) m_clock = 1'b1;
            #(PERIOD*DUTY_CYCLE);
        end
    end

    Top_wDCM UUT (
        .m_clock(m_clock),
        .p_reset(p_reset),
        .VGA_RED(VGA_RED),
        .VGA_GREEN(VGA_GREEN),
        .VGA_BLUE(VGA_BLUE),
        .VGA_HSYNC(VGA_HSYNC),
        .VGA_VSYNC(VGA_VSYNC));

    initial begin // キャラクタを*で表示する
        
        #(PERIOD*10);
        p_reset = 1'b0;
        
        @(posedge VGA_VSYNC); // 垂直同期の立ち上がりまでWAIT
        
        for(i=0; i<= V_FRONT_PORCH-1-10; i=i+1) // V_FRONT_PORCHの10ライン前まで数える(表示範囲を広げるため)
            @(posedge VGA_HSYNC); // 水平同期の立ち上がりまでWAIT
            
        for(j=0; j<= H_FRONT_PORCH-1-10; j=j+1) // H_FRONT_PORCHの10ピクセルクロック前まで数える(表示範囲を広げるため)
            @(posedge m_clock);
            
        for(k=0; k<(8*5); k=k+1) begin // 8行(1キャラクタ)*5行
            for(m=0; m<(8*12); m=m+1) begin // 8ピクセル(1キャラクタ)*12列
                #1; // wait
                if(VGA_RED>0 || VGA_GREEN>0 || VGA_BLUE>0)
                    $write("*");
                else
                    $write(" ");
                @(posedge m_clock); // 次のクロックへ
            end
            $write("\n");
            
            @(posedge VGA_HSYNC) ; // 水平同期の立ち上がりまでWAIT
            for(n=0; n<= H_FRONT_PORCH-1-10; n=n+1) // H_FRONT_PORCHの10ピクセルクロック前まで数える(表示範囲を広げるため)
                @(posedge m_clock);
        end
        $stop; // 終了
    end

endmodule


次に、ISim用のプロジェクトファイルを作成した。下に示す。

verilog work ../char_gen_rom.v
verilog work ../dcm_inst.v
verilog work ../Papyrus_work/CharDispCntrler/CharDispCntrler.v
verilog work Top_wDCM_tb.v
verilog work K:\HDL\Xilinx\12.4\ISE_DS\ISE\verilog\src\glbl.v


最後に、ISimシミュレーション用のバッチファイルを下に示す。

del Top_wDCM_tb.exe
K:\HDL\Xilinx\12.4\ISE_DS\ISE\bin\nt\fuse work.Top_wDCM_tb work.glbl -incremental -L unisims_ver=K:\HDL\Xilinx\12.4\ISE_DS\ISE\verilog\hdp\nt\unisims_ver -o Top_wDCM_tb.exe -prj Top_wDCM_tb.prj
Top_wDCM_tb.exe -gui


バッチファイルを実行して、ISimが起動したので、信号を波形ウインドウに入れて、シミュレーションを試みた。下の波形は少しデバックをしたところなのだが、まだ'X'の信号が多い。
CDCont_NSL_10_110215.png

シミュレーションでデバックを進めていくことにする。

(追加)
NSLはmodule内でregを宣言するが、リセットの記述を書かないので、regのところで初期化しないと初期化されない。分かってみると当たり前のことだけど気がつかなかった。

regtemp_pointer[13];


と宣言すると、NSLからVerilogに変換したコードは、

always @(posedge m_clock)
  begin
if ((_u_disp_timing_v_sync)|(_net_12)) 
      temp_pointer <= ((_u_disp_timing_v_sync) ?13'b0000000000000:13'b0)|
    ((_net_12) ?display_addr:13'b0);

end


で、p_resetの記述が入っていない。

regtemp_pointer[13] = 0;


と宣言すると、NSLからVerilogに変換したコードは、

always @(posedge m_clock or posedge p_reset)
  begin
if (p_reset)
     temp_pointer <= 13'b0000000000000;
else if ((_u_disp_timing_v_sync)|(_net_12)) 
      temp_pointer <= ((_u_disp_timing_v_sync) ?13'b0000000000000:13'b0)|
    ((_net_12) ?display_addr:13'b0);

end


で、p_resetの記述が入っている。regの値は初期化する必要があるようだ。初期値が0で実機動作だったら動くと思うが、少なくともシミュレーションの時には初期化は必須だ。

<教訓> NSLでregを宣言したら初期化を忘れないこと。

  1. 2011年02月15日 05:06 |
  2. NSL
  3. | トラックバック:0
  4. | コメント:0

PlanAhead12.4でCreate New Projectしてみる2(論理合成、インプリメント)

PlanAhead12.4でCreate New Projectしてみる1(プロジェクトを作るまで)”の続き。
途中まで、”PlanAhead12.4でCharDispCtler のNSLコードのデバック”の記事をコピペします。

さて前回で、プロジェクトが完成したが、UCFファイルは生成しただけで、まだピンの配置や動作周波数を設定してない。PlanAheadのプロジェクトからどうやってConstraints Editorやピン配置用の設定画面(これは、PlanAheadでやるのだが。。。)を出すかが良くわからない?

とりあえず、論理合成はUCFが必要ないので、論理合成をしてみよう。FlowメニューからSynthesis Settings を選択するとSynthesis Settings ダイアログが表示される。
PlanAhead124_13_110212.png

Options の... ボタンをクリックして、オプションを見てみる。
PlanAhead124_14_110212.png

-netlist_hierarchy はrebuiltになっている。
ダイアログをすべて閉じて、Project ManagerのSynthesizeをクリックして、論理合成を行う。
PlanAhead124_15_110211.png

Top Module Nameを尋ねるダイアログがでる。トップモジュールの名前。Top_wDCMを入れて、OKボタンをクリックする。
PlanAhead124_16_110211.png

論理合成が終了して、Synthesis Completed ダイアログが表示される。取り敢えず、レポートをみるため、View Reportsのラジオボタンをクリックして、OKボタンをクリックする。(追記:Synthesis Completed ダイアログで、Open Netlist Designを選ぶとI/Oピンの位置が設定できました。詳しくは最後の追記を参照ください)
PlanAhead124_22_110211.png

Project Manager の下のウインドウにReportsウインドウが追加される。ReportsウインドウのSynthesisの下のXST Reportsをダブルクリックするとリポートが表示される。Warnningが強調表示されることもないようだ。テキストのレポートファイルを表示している感じだ。
PlanAhead124_23_110211.png

Project Summaryには、Resourcesの使用状況がグラフで示されている。これは見やすい。
次に左のウインドウのImplementをクリックしてImplementを行う。ここでUCFが空だが、取り敢えずImplementを行うことにする。この時点でUCFをグラフィカルに設定する設定方法が見つからない。
PlanAhead124_24_110211.png

Implementが終了すると、Implementation Completedダイアログが開く。デフォルトのOpen Implemented Desginにラジオボタンを設定して、OKボタンをクリックする。
PlanAhead124_21_110211.png

Implemented Desginダイアログが開くので、OKボタンをクリックする。するとDesign Plannerが表示されて、FPGA内部でのリソースのアサインが見える。
PlanAhead124_25_110211.png

IO Plannerをクリックして、IOのフロアプランを行う。
まずは、p_resetをIOピンに割りつける。左のIOポートからp_resetを右のPackageウインドウのT15にドラックアンドドロップする。これは、Spartan-3A Starter Kitの押しボタンスイッチのBTN_SOUTHのIOピン番号だ。
PlanAhead124_26_110211.png

更に、下のPackage Pinウインドウで、I/O StdをLVTTLに設定する。
PlanAhead124_27_110211.png

次に、Package PinウインドウのT15で右クリックして、右クリックメニューからConfigure I/O Ports...を選択する。
PlanAhead124_28_110211.png

Configure Portsダイアログが出る。Pull Type:をNONEからPULLDOWNに変更する。OKボタンをクリックする。
PlanAhead124_29_110211.png

順次、IOピンを割り当てる。1つのIOピンをLVTTLにすると、デフォルトでLVCMOS25のピンはIOバンク電圧が違うのでドラックアンドドロップでI/Oピンを割り当てられない。そこで、ドラックアンドドロップする前に、IO電圧をLVTTLに変更する必要がある。これは先ほど同様に右上のI/O Portsウインドウ上で、右クリックして、右クリックメニューからConfigure I/O Ports...を選択して、I/O Standardを変更する。こうしたほうが良いと思う。この、I/O Portsの属性は複数のI/Oピンを選択して、変更することができる。
I/Oピンの割り当てが終了すると、Top_wDCM.ucfは以下のようになった。

NET "p_reset" IOSTANDARD = LVTTL;
NET "p_reset" PULLDOWN;
NET "m_clock" IOSTANDARD = LVCMOS33;
NET "VGA_VSYNC" DRIVE = 8;
NET "VGA_VSYNC" SLEW = FAST;
NET "VGA_VSYNC" IOSTANDARD = LVTTL;
INST "u_dcm_inst/IBUFG_inst" LOC = E12;
INST "VGA_VSYNC_OBUF" LOC = B11;
NET "p_reset" LOC = T15;
NET "VGA_VSYNC" LOC = B11;
NET "u_dcm_inst/clkin" LOC = E12;
NET "VGA_BLUE[0]" LOC = C7;
NET "VGA_BLUE[1]" LOC = D7;
NET "VGA_BLUE[2]" LOC = B9;
NET "VGA_BLUE[3]" LOC = C9;
NET "VGA_GREEN[0]" LOC = C5;
NET "VGA_GREEN[1]" LOC = D5;
NET "VGA_GREEN[2]" LOC = C6;
NET "VGA_GREEN[3]" LOC = D6;
NET "VGA_HSYNC" LOC = C11;
NET "VGA_RED[0]" LOC = A3;
NET "VGA_RED[1]" LOC = B3;
NET "VGA_RED[2]" LOC = B8;
NET "VGA_RED[3]" LOC = C8;
NET "VGA_BLUE[0]" IOSTANDARD = LVTTL;
NET "VGA_BLUE[1]" IOSTANDARD = LVTTL;
NET "VGA_BLUE[2]" IOSTANDARD = LVTTL;
NET "VGA_BLUE[3]" IOSTANDARD = LVTTL;
NET "VGA_GREEN[0]" IOSTANDARD = LVTTL;
NET "VGA_GREEN[1]" IOSTANDARD = LVTTL;
NET "VGA_GREEN[2]" IOSTANDARD = LVTTL;
NET "VGA_GREEN[3]" IOSTANDARD = LVTTL;
NET "VGA_HSYNC" IOSTANDARD = LVTTL;
NET "VGA_RED[0]" IOSTANDARD = LVTTL;
NET "VGA_RED[1]" IOSTANDARD = LVTTL;
NET "VGA_RED[2]" IOSTANDARD = LVTTL;
NET "VGA_RED[3]" IOSTANDARD = LVTTL;
NET "VGA_BLUE[0]" DRIVE = 8;
NET "VGA_BLUE[1]" DRIVE = 8;
NET "VGA_BLUE[2]" DRIVE = 8;
NET "VGA_BLUE[3]" DRIVE = 8;
NET "VGA_GREEN[0]" DRIVE = 8;
NET "VGA_GREEN[1]" DRIVE = 8;
NET "VGA_GREEN[2]" DRIVE = 8;
NET "VGA_GREEN[3]" DRIVE = 8;
NET "VGA_HSYNC" DRIVE = 8;
NET "VGA_RED[0]" DRIVE = 8;
NET "VGA_RED[1]" DRIVE = 8;
NET "VGA_RED[2]" DRIVE = 8;
NET "VGA_RED[3]" DRIVE = 8;
NET "VGA_BLUE[0]" SLEW = FAST;
NET "VGA_BLUE[1]" SLEW = FAST;
NET "VGA_BLUE[2]" SLEW = FAST;
NET "VGA_BLUE[3]" SLEW = FAST;
NET "VGA_GREEN[0]" SLEW = FAST;
NET "VGA_GREEN[1]" SLEW = FAST;
NET "VGA_GREEN[2]" SLEW = FAST;
NET "VGA_GREEN[3]" SLEW = FAST;
NET "VGA_HSYNC" SLEW = FAST;
NET "VGA_RED[0]" SLEW = FAST;
NET "VGA_RED[1]" SLEW = FAST;
NET "VGA_RED[2]" SLEW = FAST;
NET "VGA_RED[3]" SLEW = FAST;


このPlanAheadプロジェクトから、Constraints Editorの起動方法がわからなかったので、このI/Oピンの配置に、タイミング制約をテキストエディタで追加した。

もう一度左のウインドウのImplementボタンをクリックして、インプリメントを行った。その結果、制約はすべて満たされた。
PlanAhead124_30_110211.png

途中で、I/OピンをGUIで設定する方法があるのかもしれないが、よくわからなかった。今回はインプリメントしても幾らも時間がかからなかったので、インプリメントしてI/OピンをGUIで設定したが、Constraints Editorを起動したり、自分でテキストで書いてUCFを作ったほうが良いかもしれない?

(2011/02/16:追記)
論理合成の後で、I/Oピンの位置をGUIで指定することが出来ました。”PlanAhead ソフトウェア チュートリアル クイック フロー概要”の21ページを参照しました。

論理合成後のSynthesis Completed ダイアログでOpen Netlist Designラジオボタンを選択してクリックする。
PlanAhead124_31_110216.png

Netlist Designが開く。右上のNetlist Designで、I/O Plannerをクリックする。
PlanAhead124_32_110216.png

I/O PlannerでI/Oピンの位置を設定できるようになる。現在はすでにI/Oピンの位置を設定してある状態である。
PlanAhead124_33_110216.png

(もう1つ追記)
論理合成が終了した後で、FlowメニューからNetlist Designを選択しても、同様のウインドウが出てきます。

(さらに追加)
デフォルトのImplementオプションです。
PlanAhead124_34_110216.png

”PlanAhead12.4でCreate New Projectしてみる3(Program and Debug)”に続く。
  1. 2011年02月13日 04:40 |
  2. PlanAheadについて
  3. | トラックバック:0
  4. | コメント:2

太平洋の奇跡 フォックスと呼ばれた男(映画)を見てきた

昨日のあしたのジョーに続いて、今日は、太平洋の奇跡 フォックスと呼ばれた男を見てきました。
やはり戦争は悲惨ですね。今、生きている人がバタバタと死んでいくのは悲惨です。戦闘や戦略に優れた人というのは、より多く敵を殺した人ということができると思います。
でも、小説も読んでみたいと思って、タッポーチョ 太平洋の奇跡「敵ながら天晴」玉砕の島サイパンで本当にあった感動の物語 (祥伝社黄金文庫)を注文しました。
  1. 2011年02月12日 18:45 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

PlanAhead12.4でCharDispCtler のNSLコードのデバック

今回の目的は、NSLで作ったCharDispCtler.vがきちんと論理合成出来て、インプリメントすることができるか?を確かめることだ。インプリメント出来たら、シミュレーションをしてうまく動いていることを確認してから、ビットファイルをSpartan-3A Starter Kitにダウンロードして動作させてみようと思っている。

さて前回で、プロジェクトが完成したが、UCFファイルは生成しただけで、まだピンの配置や動作周波数を設定してない。PlanAheadのプロジェクトからどうやってConstraints Editorやピン配置用の設定画面(これは、PlanAheadでやるのだが。。。)を出すかが良くわからない?

とりあえず、論理合成はUCFが必要ないので、論理合成をしてみよう。FlowメニューからSynthesis Settings を選択するとSynthesis Settings ダイアログが表示される。
PlanAhead124_13_110212.png

Options の... ボタンをクリックして、オプションを見てみる。
PlanAhead124_14_110212.png

-netlist_hierarchy はrebuiltになっている。
ダイアログをすべて閉じて、Project ManagerのSynthesizeをクリックして、論理合成を行う。
PlanAhead124_15_110211.png

Top Module Nameを尋ねるダイアログがでる。トップモジュールの名前。Top_wDCMを入れて、OKボタンをクリックする。
PlanAhead124_16_110211.png

そうすると、しまった。。。エラーが出てしまった。PlanAheadのチュートリアルのつもりだったのに。。。
PlanAhead124_17_110211.png

エラーを見てみると、temp_colorのレンジを超えているそうだ。temp_colorは、temp_color[3]で宣言している。temp_color[9]は当然ながら、インデックス値がout of rangeだ。Verilogを見ながら直したので、Verilogのこの部分がどうなっているかを見ると、

parameter RED_DOT_POS = 9; // 9ビット目がRED
parameter GREEN_DOT_POS = 8; // 8ビット目がGREEN
parameter BLUE_DOT_POS = 7; // 7ビット目がBLUE

に対して、

reg [RED_DOT_POS:BLUE_DOT_POS] temp_color;


で宣言しているので、reg[9:7] temp_color; で宣言していた。これではエラーですね。
元のNSLの下の部分を

if (char_data_node && display_on_d2) {
  red_node := temp_color[RED_DOT_POS];
  green_node := temp_color[GREEN_DOT_POS];
  blue_node := temp_color[BLUE_DOT_POS];


これに変更した。

if (char_data_node && display_on_d2) {
  red_node := temp_color[2];
  green_node := temp_color[1];
  blue_node := temp_color[0];



これで、もう一度、Project ManagerのSynthesizeをクリックして、論理合成を行ったところ、m_clockでエラー発生。
PlanAhead124_18_110211.png

今回、Top_wDCMがトップモジュールで、Verilog ソースファイルのdcm_inst.vをinterface文で接続して、クロックを入力し、そのクロックを下のモジュールに供給している。
これは、NSLから変換したVerilogファイルを見ると、下のように、u_charDispCtrlerTestのm_clockにm_clockが入っている。これは、clkdvが入っているはずなのだ。
PlanAhead124_19_110211.png

対応するNSLソースを下に示す。

module    Top_wDCM {
    dcm_inst    u_dcm_inst;
    CharDispCtrlerTest    u_charDispCtrlerTest;
    wire    clkdv;
    wire    locked;
    
    u_dcm_inst.clkin = m_clock;
    u_dcm_inst.reset = p_reset;
    clkdv = u_dcm_inst.clkdv;
    locked = u_dcm_inst.locked;
    
    u_charDispCtrlerTest.m_clock = clkdv;
    u_charDispCtrlerTest.p_reset = ~locked;
    VGA_RED = u_charDispCtrlerTest.VGA_RED;
    VGA_GREEN = u_charDispCtrlerTest.VGA_GREEN;
    VGA_BLUE = u_charDispCtrlerTest.VGA_BLUE;
    VGA_HSYNC = u_charDispCtrlerTest.VGA_HSYNC;
    VGA_VSYNC = u_charDispCtrlerTest.VGA_VSYNC;
    
}


u_charDispCtrlerTest.m_clock = clkdv;と書いてあるが、そうなっていない。これはどれが原因かというと、

declare    CharDispCtrlerTest {
    
    // -- CharDispCtrlerTest  --
    output    VGA_RED[4];
    output    VGA_GREEN[4];
    output    VGA_BLUE[4];
    output    VGA_HSYNC;
    output    VGA_VSYNC;
    
}


にinterfaceが入っていないのが問題だと思う。また、m_clock, m_reset入力定義も追加して、下の記述に変更した。

declareCharDispCtrlerTest interface {

inputm_clock;
inputp_reset;

// -- CharDispCtrlerTest --
outputVGA_RED[4];
outputVGA_GREEN[4];
outputVGA_BLUE[4];
outputVGA_HSYNC;
outputVGA_VSYNC;

}


これで、Verilog ソースに変換し、もう一度Project Manager で論理合成してみた。論理合成は正常終了した。これで取り敢えず大丈夫みたいだ。
PlanAhead124_20_110211.png
  1. 2011年02月12日 14:17 |
  2. NSL
  3. | トラックバック:0
  4. | コメント:0

あしたのジョー(映画)を見てきた

今日はあしたのジョーを見てきました。あしたのジョーの漫画を見て育った世代です。あの有名な漫画の映画が公開されるということで見てきました。印象はつまんないかな?と思って見に行ったのですが、面白いと思いました。丹下段平役、はまっています。流石、香川さん。。。剣岳でもいい演技していました。なお、ジョーよりも力石の方がイメージに近い感じでした。
最近本当に映画に見ていますが、明日は、太平洋の奇跡 フォックスと呼ばれた男を観に行こうということになっています。映画を大分見ているので、4人分ただで見られるくらいポイントが溜まっています。
  1. 2011年02月11日 22:25 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

Kicad-2011-01-25

Kicadを使って、ボードをつくろうと思っているので、今日新しいKicadがないかどうか調べた。そうするとKicad-2011-01-25があったので、早速ダウンロード、インストールしてみた。
何処が変わったのかな?と思って見ていると、最初は気がつかなかったがメニューが日本語になっていた。えー、これいつから日本語メニューになったんだ?
以前は英語だったよな?”KicadでSpartan3ボードを試作4(Spartan3ボードの設計データを公開)”を見ると、メニューは英語だ。。。メニューが英語でも日本語でも、そんなに違いはないと思うが、やはり日本語化は嬉しい。。。
Kicad_1_110211.png

Kicad_2_110211.png

Kicad_3_110211.png
  1. 2011年02月11日 05:48 |
  2. CADツール
  3. | トラックバック:0
  4. | コメント:6

PlanAhead12.4でCreate New Projectしてみる1(プロジェクトを作るまで)

以前、”PlanAhead12.3でCreate New Projectしてみる1(プロジェクトを作るまで)”、”PlanAhead12.3でCreate New Projectしてみる2(一時休止)”でPlanAheadのプロジェクトを試してみたが、インクルードファイルの.vhの処理がうまくなくて断念してしまった。今回はNSL Coreで変換できたVerilogファイルをPlanAheadのプロジェクトでインプリメントして、みることにした。(文章は”PlanAhead12.3でCreate New Projectしてみる1(プロジェクトを作るまで)”のコピペ修正です)

さて、PlanAhead12.4を立ち上げて、Create New Projectをクリックする。すると、New Projectダイアログが立ち上がるので、Next>をクリックする。
PlanAhead124_1_110210.png

Project NameとProject locationを指定する。Next>をクリックする。
PlanAhead124_2_110210.png

Design Sourceを選択する。RTLやネットリスト、I/OプランニングやP&R後の結果をプロジェクトにすることもできるみたいだ。私はSpecify RTL Sourcesを選択した。Next>をクリックする。
PlanAhead124_3_110210.png

Add/Create Sourcesダイアログが開く。Add File...ボタンをクリックする。
PlanAhead124_4_110210.png

char_gen_rom.v、dcm_inst.v、CharDispCtler.v をAdd Sources Filesダイアログで選択して開く。
PlanAhead124_5_110210.png

Add/Create Sourcesダイアログに戻ったら、Copy Sources into Projectのチェックを消す。(ローカルにソースファイルをコピーされないように、ただし、コピーしたい人はそのまま) Next>をクリックする。
PlanAhead124_6_110210.png

次は、Add/Create Constraintsダイアログで制約ファイルを追加するか、作成するかだが、今回はSpartan-3A Starter Kit用に新たにつくることにする。Create File...ボタンをクリックする。
PlanAhead124_7_110210.png

Create UCF constraints fileダイアログが開く。File nameにTop_wDCM を入力してOKボタンをクリックする。
PlanAhead124_8_110210.png

Add/Create Constraintsダイアログに、Local to ProjectにTop_wDCM.ucf が生成された。Next>をクリックする。
PlanAhead124_9_110210.png

次はFPGAを選ぶダイアログだ。Filterに選択して、Spartan-3A Starter Kitのxc3s700afg484-4を選択する。Next>をクリックする。
PlanAhead124_10_110211.png

New Project Summaryが出るので、Finishボタンをクリックする。
PlanAhead124_11_110211.png

PlanAheadのプロジェクトが作成されて、PlanAheadが立ち上がった。
PlanAhead124_12_110211.png

今日はこの辺で終了。

PlanAhead12.4でCreate New Projectしてみる2(論理合成、インプリメント)”に続く。
  1. 2011年02月11日 04:42 |
  2. PlanAheadについて
  3. | トラックバック:0
  4. | コメント:0

キャラクタ・ディスプレイ・コントローラをNSLで書こう4(NSLを書いたがエラーだったがVerilogに変換)

キャラクタ・ディスプレイ・コントローラをNSLで書いているが、エラーが出ている。原因が良くわからない。 (Verilogに変換できました。(2011/2/10:追記)を参照)
NSL Coreのエラー表示は200行と320行。(他にもエラーがあると思う)
CDCont_NSL_9_110209.png

(NSL Coreもエラーの行が見えない部分があるが、見る方法がないのが残念だ。スクロールも出来ないし、ウインドウの拡大もできない)

200行目を下に示す。

display_dout = u_frame_buffer.fb_read(display_address).display_dout;


display_addr はないのだが? fb_read(display_addr)の定義の方を言っているのかな?
320行目のrom_addrも定義してあるはず?(でも、ちょっとした間違いの可能性があるね?)

とりあえず、全部のソースを貼っておく。

// UML2NSL converter Ver. 2010-03-28 Copyright (c) 2009-2010 IP ARCH, Inc. All rights reserved.
// xmi  --- version 2.1 --- 

#define    C200MS_SECOND    ( 23'd230000 - 23'd1)
#define    H_ACTIVE_VIDEO 640
#define    H_FRONT_PORCH 16
#define    H_SYNC_PULSE 96
#define    H_BACK_PORCH 48
#define    H_SUM H_ACTIVE_VIDEO+H_FRONT_PORCH+H_SYNC_PULSE+H_BACK_PORCH

#define    V_ACTIVE_VIDEO 480
#define    V_FRONT_PORCH 11
#define    V_SYNC_PULSE 2
#define    V_BACK_PORCH 31
#define    V_SUM V_ACTIVE_VIDEO+V_FRONT_PORCH+V_SYNC_PULSE+V_BACK_PORCH

#define    H_DISPLAY_SIZE H_ACTIVE_VIDEO/8 // 横80桁
#define    V_DISPLAY_SIZE V_ACTIVE_VIDEO/8 // 縦60行
    
#define    RED_DOT_POS 9 // 9ビット目がRED
#define    GREEN_DOT_POS 8 // 8ビット目がGREEN
#define    BLUE_DOT_POS 7 // 7ビット目がBLUE

declare    CharDispCtrlerTest  {
    
    // -- CharDispCtrlerTest  --
    output    VGA_RED[4];
    output    VGA_GREEN[4];
    output    VGA_BLUE[4];
    output    VGA_HSYNC;
    output    VGA_VSYNC;
    
}

declare    CharDispCtrler  {
    
    // -- CharDispCtrler  --
    output    VGA_RED[4];
    output    VGA_GREEN[4];
    output    VGA_BLUE[4];
    output    VGA_HSYNC;
    output    VGA_VSYNC;
    input    char_addr[13];
    input    char_din[10];
    
    // -- CharDispCtrler  --
    func_in    char_write(char_addr,char_din);

}

declare    Top_wDCM  {
    
    // -- Top_wDCM  --
    output    VGA_RED[4];
    output    VGA_GREEN[4];
    output    VGA_BLUE[4];
    output    VGA_HSYNC;
    output    VGA_VSYNC;
    
}

declare    frame_buffer  {
    
    // -- frame_buffer  --
    input    char_addr[13];
    input    char_din[10];
    input    char_we;
    input    display_addr[13];
    output    display_dout[10];
    
    // -- frame_buffer  --
    func_in fb_write(char_addr, char_din);
    func_in    fb_read(display_addr) ;

}

declare    char_gen_rom_nsl  {
    
    // -- char_gen_rom_nsl  --
    input    char_addr[7];
    input    row_addr[3];
    output    dout[8];
}

declare    disp_timing  {
    
    // -- disp_timing  --
    output    page_start;
    output    display_on;
    output    h_addr[10];
    output    v_addr[10];
    output    h_sync;
    output    h_sync_pulse;
    output    v_sync;
    
}

declare dcm_inst interface {
    input clkin;
    input reset;
    output clkout;
    output clkfx;
    output clkdv;
    output locked;
}

declare char_gen_rom interface {
    input clk;
    input reset;
    input char_addr[7];
    input rom_addr[3];
    output dout[8];
}

module    CharDispCtrlerTest {
    
    // -- CharDispCtrlerTest  --
    reg    char_addr[13];
    reg    char_we;
    reg    count_200ms[23];
    reg    char_code[7] = 7'h21;
    reg color_data[3] = 1;
    wire    char_data[10];
    
    func_self    char_code_inc();
    func_self    color_data_inc();
    
    CharDispCtrler    u_charDispCtrler;

    /* common operations */
    {
        VGA_RED = u_charDispCtrler.VGA_RED;
        VGA_GREEN = u_charDispCtrler.VGA_GREEN;
        VGA_BLUE = u_charDispCtrler.VGA_BLUE;
        VGA_HSYNC = u_charDispCtrler.VGA_HSYNC;
        VGA_VSYNC = u_charDispCtrler.VGA_VSYNC;
        
        char_data = { color_data, char_code };
        
        any {
            count_200ms == C200MS_SECOND : {
                count_200ms := 0;
                u_charDispCtrler.char_write(char_addr, char_data); // キャラクタを描画
                char_code_inc(); // キャラクタをインクリメント
                color_data_inc(); // カラーをインクリメント
            } else : {
                count_200ms++;
            }
        }
                
    }

    function char_code_inc {
        if (char_code == 7'h7E) {
            char_code := 7'h21;
        } else {
            char_code++;
        }
    }
    
    function color_data_inc {
        if (color_data == 3'h7) {
            color_data := 3'h1;
        } else {
            color_data ++;
        }
    }
        
}

module    CharDispCtrler {
    
    // -- CharDispCtrler  --
    wire    h_sync_pulse;
    reg    char_data_node[7];
    reg    temp_pointer[13];
    reg    page_start;
    reg    display_address[13];
    wire    char_data[8];
    wire    display_out[10];
    reg display_on_d1, display_on_d2;
    reg h_sync_1, v_sync_1;
    reg h_sync_2, v_sync_2;
    reg h_sync_3, v_sync_3;
    wire    display_dout[10];
    reg    temp_color[3];
    reg red_node, green_node, blue_node;
    frame_buffer    u_frame_buffer;
    char_gen_rom_nsl    u_char_gen_rom_nsl;
    disp_timing    u_disp_timing;

    /* common operations */
    {
        u_frame_buffer.display_addr = display_address;
        
        u_char_gen_rom_nsl.char_addr = u_frame_buffer.display_dout[6:0];
        u_char_gen_rom_nsl.row_addr = u_disp_timing.v_addr[2:0];
        
        char_data = u_char_gen_rom_nsl.dout;
        display_dout = u_frame_buffer.fb_read(display_address).display_dout;
        
        any {
            u_disp_timing.display_on : {
                if (u_disp_timing.h_addr[2:0] == 3'd7) {
                    display_address++;
                }
            }
            u_disp_timing.v_sync : {
                display_address := 0;
                temp_pointer := 0;
            }
            u_disp_timing.h_sync_pulse : {
                if (u_disp_timing.v_addr[2:0] == 3'd7)
                    temp_pointer := display_address;
                else
                    display_address := temp_pointer;
            }
        }
    
        any {
            u_disp_timing.h_addr[2:0] == 3'd2 : {
                char_data_node := char_data[7:1];
                temp_color := display_dout[RED_DOT_POS : BLUE_DOT_POS]; 
                if (char_data[0] && display_on_d2) {
                    red_node := display_dout[RED_DOT_POS];
                    green_node := display_dout[GREEN_DOT_POS];
                    blue_node := display_dout[BLUE_DOT_POS];
                } else {
                    red_node := 1'b0;
                    green_node := 1'b0;
                    blue_node := 1'b0;
                }
            }
            else : {
                char_data_node := { 1'b0, char_data_node[6:1] };
                if (char_data_node && display_on_d2) {
                    red_node := temp_color[RED_DOT_POS];
                    green_node := temp_color[GREEN_DOT_POS];
                    blue_node := temp_color[BLUE_DOT_POS];
                } else {
                    red_node := 1'b0;
                    green_node := 1'b0;
                    blue_node := 1'b0;
                }
            }
        }            
        VGA_RED = {4{red_node}};
        VGA_GREEN = {4{green_node}};
        VGA_BLUE = {4{blue_node}};
        
        display_on_d1 := u_disp_timing.display_on;
        display_on_d2 := display_on_d1;
        
        h_sync_1 := u_disp_timing.h_sync;
        v_sync_1 := u_disp_timing.v_sync;
        h_sync_2 := h_sync_1;
        v_sync_2 := v_sync_1;
        h_sync_3 := h_sync_2;
        v_sync_3 := v_sync_3;
        
        VGA_HSYNC = ~h_sync_3;
        VGA_VSYNC = ~v_sync_3;
    }

    
    /* func_in char_write(char_addr,char_dout) operation */
    function    char_write {
        u_frame_buffer.fb_write(char_addr, char_data);
    }
        
}

module    Top_wDCM {
    dcm_inst    u_dcm_inst;
    CharDispCtrlerTest    u_charDispCtrlerTest;
    wire    clkdv;
    wire    locked;
    
    u_dcm_inst.clkin = m_clock;
    u_dcm_inst.reset = p_reset;
    clkdv = u_dcm_inst.clkdv;
    locked = u_dcm_inst.locked;
    
    u_charDispCtrlerTest.m_clock = clkdv;
    u_charDispCtrlerTest.p_reset = ~locked;
    VGA_RED = u_charDispCtrlerTest.VGA_RED;
    VGA_GREEN = u_charDispCtrlerTest.VGA_GREEN;
    VGA_BLUE = u_charDispCtrlerTest.VGA_BLUE;
    VGA_HSYNC = u_charDispCtrlerTest.VGA_HSYNC;
    VGA_VSYNC = u_charDispCtrlerTest.VGA_VSYNC;
    
}

module    frame_buffer {
    mem m[8192][10] ;
    reg ReadData[10];
    
    /* common operations */
    {
        display_dout = ReadData;    
    }

    /* func_in fb_read(display_addr) operation */
    function    fb_read {
        ReadData := m[display_addr] ;
    }
        
    /* function fb_write(char_addr,char_din) operation */
    function    fb_write {
        m[char_addr] := char_din ;
    }
        
}
module    char_gen_rom_nsl {
    char_gen_rom u_char_gen_rom;

    u_char_gen_rom.clk    = m_clock;
    u_char_gen_rom.reset = p_reset;
    u_char_gen_rom.char_addr = char_addr;
    u_char_gen_rom.row_addr = row_addr;
    dout = u_char_gen_rom.dout;
        
}
module    disp_timing {
    reg h_point, h_addr_node[11]; // 1024までOK
    reg v_point, v_addr_node[11]; // 1024までOK
    reg page_start_node;
    reg display_on_node;
    reg h_sync_node;
    reg v_sync_node;
    reg h_sync_pulse_node;
    
    any {
        h_point == H_SUM-1 :
            h_point := 0;
        else :
            h_point++;
    }
    h_addr_node := h_point;
    h_addr = h_addr_node[9:0];
    
    any {
        v_point == V_SUM-1 :
            v_point := 0;
        else :
            v_point++;
    }
    v_addr_node := v_point;
    v_addr = v_addr_node[9:0];
    
    any {
        h_point<H_ACTIVE_VIDEO && v_point<V_ACTIVE_VIDEO :
            display_on_node := 1'b1;
        else : 
            display_on_node := 1'b0;
    }
    display_on = display_on_node;
    
    any {
        h_point==0 : 
            page_start_node := 1'b1;
        else :
            page_start_node := 1'b0;
    }
    page_start = page_start_node;

    any {
        (h_point>=(H_ACTIVE_VIDEO + H_FRONT_PORCH)) && (h_point < (H_SUM-H_BACK_PORCH)) :
            h_sync_node := 1'b1;
        else :
            h_sync_node := 1'b0;
    }
    h_sync = h_sync_node;
    
    any {
        h_point==(H_ACTIVE_VIDEO+H_FRONT_PORCH) :
            h_sync_pulse_node := 1'b1;
        else :
            h_sync_pulse_node := 1'b0;
    }
    h_sync_pulse = h_sync_pulse_node;
    
    any {
        (v_point>=(V_ACTIVE_VIDEO + V_FRONT_PORCH)) && (v_point<(V_SUM-V_BACK_PORCH)) :
            v_sync_node := 1'b1;
        else :
            v_sync_node := 1'b0;
    }
    v_sync = v_sync_node;
    
}


かなり元のVerilogに近くなってしまった。それが反省点だ。でもまだ、Verilogにコンバートが出来ない。
大分デバックで疲れたが、こんな時は、別のテーマにチャレンジしてから、もう一度やってみるのが良いと思う。
という訳で、次はSpartan-3A Starter Kitの拡張コネクタに接続する基板をKicadで書いて、作ってみたい。

忘れていたがdcm_inst.v とchar_gen_rom.vを載せておく。
まずは、dcm_inst.v。

// DCM module

`default_nettype none
`timescale 1ns / 1ps

module dcm_inst(clkin, reset, clkout, clkfx, clkdv, locked);
    input clkin;
    input reset;
    output clkout;
    output clkfx;
    output clkdv;
    output locked;
    
    wire clkin;
    wire reset;
    wire clkout;
    wire clkfx;
    wire clkdv;
    wire locked;
    
    wire clk_ibuf;
    wire clkfb, clkfx_node;
    wire gnd, clk_node;
    wire clkdv_node, clkdv_bufg;
    
    assign gnd = 1'b0;
    
    IBUFG IBUFG_inst (
        .I(clkin),
        .O(clk_ibuf)
    );
    
    DCM DCM_INST1 (
        .CLKIN(clk_ibuf),
        .CLKFB(clkfb),
        .DSSEN(gnd),
        .PSINCDEC(gnd),
        .PSEN(gnd),
        .PSCLK(gnd),
        .RST(gnd), // リセットごとにDCMのロックが外れないようにgndにしておく
        .CLK0(clk_node),
        .CLK90(),
        .CLK180(),
        .CLK270(),
        .CLK2X(),
        .CLK2X180(),
        .CLKDV(clkdv_node),
        .CLKFX(clkfx_node),
        .CLKFX180(),
        .LOCKED(locked),
        .PSDONE(),
        .STATUS()
    );
    defparam DCM_INST1.CLKIN_PERIOD = 20.0;
    defparam DCM_INST1.DLL_FREQUENCY_MODE = "LOW";
    defparam DCM_INST1.DUTY_CYCLE_CORRECTION = "TRUE";
    defparam DCM_INST1.CLKDV_DIVIDE = 2.0;
    defparam DCM_INST1.PHASE_SHIFT = 0;
    defparam DCM_INST1.CLKOUT_PHASE_SHIFT = "NONE";
    defparam DCM_INST1.STARTUP_WAIT = "FALSE";
    defparam DCM_INST1.FACTORY_JF = 16'hFFFF;
    
    BUFG BUFG_inst(
        .I(clk_node),
        .O(clkfb)
    );
    
    BUFG BUFG_clkfx(
        .I(clkfx_node),
        .O(clkfx)
    );
    
    BUFG BUFG_clkdv(
        .I(clkdv_node),
        .O(clkdv_bufg)
    );
    assign clkout = clkdv_bufg;
    assign clkdv = clkdv_bufg;
endmodule


次に、char_gen_rom.vを示す。

// キャラクタジェネレータ用ROM

`default_nettype none
`timescale 1ns / 1ps

module char_gen_rom(clk, reset, char_addr, row_addr, dout);
    input clk;
    input reset;
    input [6:0] char_addr;
    input [2:0] row_addr;
    output [7:0] dout;
    
    wire clk;
    wire reset;
    wire [6:0] char_addr;
    wire [2:0] row_addr;
    wire [7:0] dout;
    
    wire [10:0] addr;
    
    assign addr = {1'b0, char_addr, row_addr};
    
    RAMB16_S9 #(
        .INIT_00(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INIT_01(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INIT_02(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INIT_03(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INIT_04(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INIT_05(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INIT_06(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INIT_07(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INIT_08(256'h0014147F147F1414000000000012243600080008080808080000000000000000), // #,",!, 
        .INIT_09(256'h0000000000081018004C322254081408002152240812254200083E483E093E08), // ',&,%,$
        .INIT_0A(256'h000808087F08080800492A1C7F1C2A4900040810101008040020100808081020), // +,*,),(
        .INIT_0B(256'h00010204081020400006060000000000000000007F0000000002040600000000), // /,.,-,,
        .INIT_0C(256'h001C22201820221C003E02041820221C001C080808080C080018244242422418), // 3,2,1,0
        .INIT_0D(256'h001010202040407E003C42423E02423C001E20201E02023E0020207E22242830), // 7,6,5,4
        .INIT_0E(256'h0004080C00000C000000000C00000C00003C42407C42423C003C42423C42423C), // ;,:,9,8
        .INIT_0F(256'h000800081020221C00040810201008040000003E003E00000020100804081020), // ?,>,=,<
        .INIT_10(256'h001C22010101221C003F41413F41413F0041417F2236141C005C2A155549221E), // C,B,A,@
        .INIT_11(256'h001C22710101221C000101013F01017F007F01013F01017F001F21414141211F), // G,F,E,D
        .INIT_12(256'h0022120A060A1222000E11101010103E001C08080808081C004141417F414141), // K,J,I,H
        .INIT_13(256'h001C22414141221C00416151494543410041414149556341003E020202020202),// O,N,M,L
        .INIT_14(256'h003C42403C02423C002111093F41413F005C26594141221C000101013F41413F), // S,R,Q,P
        .INIT_15(256'h00225555554949490008141422224141001C224141414141000808080808087F), // W,V,U,T
        .INIT_16(256'h0038080808080838003F02040810203F00080808081422410041221408142241), // [,Z,Y,X
        .INIT_17(256'h007F0000000000000000000000221408001C10101010101C0008083E083E1422), // _,^,],\
        .INIT_18(256'h0038040438000000001E22221E020200003C223C201C00000000000000180810), // c,b,a,`
        .INIT_19(256'h001C221C0C122C00000808081C081000001C021E221C0000003C22223C202000), // g,f,e,d
        .INIT_1A(256'h0024140C14240400000C1210100010000008080800080000002424241C040400), // k,j,i,h
        .INIT_1B(256'h0018242424180000002828282814000000545454542A00000018080808080800), // o,n,m,l
        .INIT_1C(256'h0018201804180000000404040C34000000202038243800000004041C241C0000), // s,r,q,p
        .INIT_1D(256'h00142A2A2A2200000008141422220000001824242424000000180808081C0800), // w,v,u,t
        .INIT_1E(256'h001008080C080810003E0408103E000000020408142200000022140814220000), // {,z,y,x
        .INIT_1F(256'h0000000000000000000000000000142800040808180808040008080808080808), //  ,~,},|
        .INIT_20(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INIT_21(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INIT_22(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INIT_23(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INIT_24(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INIT_25(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INIT_26(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INIT_27(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INIT_28(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INIT_29(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INIT_2A(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INIT_2B(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INIT_2C(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INIT_2D(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INIT_2E(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INIT_2F(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INIT_31(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INIT_32(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INIT_33(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INIT_34(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INIT_35(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INIT_36(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INIT_37(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INIT_38(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INIT_39(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INIT_3A(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INIT_3B(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INIT_3C(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INIT_3D(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INIT_3E(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INIT_3F(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INITP_00(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INITP_01(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INITP_02(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INITP_03(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INITP_04(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INITP_05(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INITP_06(256'h0000000000000000000000000000000000000000000000000000000000000000),
        .INITP_07(256'h0000000000000000000000000000000000000000000000000000000000000000)
    ) CHAR_GEN_ROM_INST (
        .DO(dout),
        .DOP(),
        .ADDR(addr),
        .CLK(clk),
        .DI(8'd0),
        .DIP(1'b0),
        .EN(1'b1),
        .SSR(reset),
        .WE(1'b0)
    );
endmodule



なお、”Notepad++でNSLのキーワードの色を変える”のNSL_define.xmlはちょこちょこ書き換えているので、もし使っている方がいらっしゃったら、もう一度コピペしてImportしてください。

(2011/2/10:追記)
Verilogに変換できました!!嬉しいです。ここ2,3日NSLが書けなくてストレスを貯めていましたが、一挙に解放されました。ヤッター!
display_addrのコンフリクトの問題がわからなかったのですが、

u_frame_buffer.display_addr = display_address;



display_dout = u_frame_buffer.fb_read(display_address).display_dout


がコンフリクトしていました。上の文とfb_readで同じdisplay_addrに値を入れています。NSLだとこういう間違いが多くなるような気がします。安易にインスタンスの下のメンバを使わずにfunctionで呼び出すということに徹した方が良い気がします。

reg h_point, h_addr_node[11];


もだめでした。

reg h_point[11], h_addr_node[11];


が正解みたいです。

続けてやってみることにします。おおきさんありがとうございました。
  1. 2011年02月09日 05:40 |
  2. NSL
  3. | トラックバック:0
  4. | コメント:2

キャラクタ・ディスプレイ・コントローラをNSLで書こう3(NSLを作成中)

キャラクタ・ディスプレイ・コントローラをNSLで書こう2(Papyrusでクラス図を作成)”でクラス図が書けて、NSLのスケルトンが出力できたので、今度はNSLを書いている。
元のVerilogファイルを見ながら、NSLに書きなおしているのだが、フレーム・バッファもキャラクタ・ジェネレータもBlockRAMで実装していて、BlockRAMのアドレスに入れてもデータが出てくるには1クロックかかるといった条件が気になって、うまく高位言語に変換が難しい。どうしてもクロックを考える必要が出てきて、泥臭くなってしまう。特にピクセルを出力するReadがやはりクロックを考える必要が出てきてしまう。キャラクタを0.2secごとに書きこむWriteはメソッドで素直に書くことができた。
色々迷いながら書いている。新しい言語を勉強するときはいつもこんなもんだと思う。本当はこの辺りはIPとしてVerilogで作っておいて、もっと上の層をNSLで作るのが良さそうだ。
キャラクタ・ディスプレイ・コントローラのNSLを書き上げるのにもう少し時間がかかりそうだ。下が書いている様子だ。
CDCont_NSL_8_110207.png

  1. 2011年02月07日 05:08 |
  2. NSL
  3. | トラックバック:0
  4. | コメント:0

XUPV5-LX110T Development SystemでMIGを試す

Digilent社のVirtex-5 OpenSPARC Evaluation PlatformでMIGを試してみた。その覚書。

1. XUPV5-LX110T Reference Designs のページのMIG Design CreationはISE10.1対応だが、ML505 MIG Design CreationはISE12.1対応なので、これを見ながら、ISE12.4のCoregen でMIGを起動して、DDR2 SDRAM SODIMM用のコントローラを生成した。
2. mig_v3_61\example_design\rtlのmgi_v3_61.vをマニュアル通りにChipScope を入れた。
3. mig_v3_61\example_design\parのmig_v3_61.ucfをMIG Design zipのxupv5_mig_design\mig_23\example_design\parのddr_sdram.ucf を参照しながら、Location Constraintsをコピーし、INST "*/gen_dqs[0].u_iob_dqs/u_iddr_dq_ce"からINST "*/u_phy_calib/gen_gate[7].u_en_dqs_ff"までの配置制約をコピーした。
4. icon.xco, ila.xco関連のファイルをMIG Design zipのxupv5_mig_design\mig_23\example_design\parフォルダからmig_v3_61\example_design\parフォルダへコピーした。
5. Windowsのコマンドプロンプトを動かして、それ上でmig_v3_61\example_design\par\ise_flow.batを走らせた。
6. ISEフローが終了して、mig_v3_61.bitが生成された。
ML509_MIG_3_110204.png

7. ChipScope Pro Analyzer を起動して、エラーがないかを確かめ、波形を観察した。下図に波形とSystem Monitor Consoleを示す。
ML509_MIG_1_110204.png
ML509_MIG_2_110204.png

このMIGサンプルを動作させると、V5-LX110TのDie Temperatureは83度程度(ファン無しの35mm X 35mm X 10mmのヒートシンク付きです)。

8. 次に、mig_v3_61\example_design\par\create_ise.batを起動して、ISEのプロジェクトを生成した。
9. Project Navigator を起動して、プロジェクトを読み込み、インプリメントをした。(下図)
ML509_MIG_4_110204.png

Number of occupied Slices は8%。

10. XPowerを起動して、消費電力を見た。
ML509_MIG_5_110204.png

4.8W消費。かなり電力を消費している。ファンが必要か?

なお、MIGの標準のピン配置ダイアログでは、このボードのDDR2 SDRAMのピンは配置ができない。それは、WE#がIOバンク15のVREFに割り当てられているからだ。バンク15はDDR2 SDRAMへの出力ピンだけが集められているので、VREFは必要ない。それでWE#に割り当てられているが、MIGではVREFピンは割り当てられない。よってサンプルのUCFを使う必要がある。
  1. 2011年02月04日 12:54 |
  2. XUPV5-LX110T
  3. | トラックバック:0
  4. | コメント:0

キャラクタ・ディスプレイ・コントローラをNSLで書こう2(Papyrusでクラス図を作成)

キャラクタ・ディスプレイ・コントローラのクラス図をPapyrusで書いている。
下の図が書きかけのクラス図だ。Top_wDCMのトップ階層を新たに設けた(VerilogとVHDLバージョには無い)が、これは、CharDispCtrlerTestには、CharDispCtrlerを動作させるためのロジックが入っている。ロジックが入っていると、同じ階層でDCMでクロックを変換することが出来ないと思ったからだ。
CDCont_NSL_3_110203.png

CharDispCtrlerTestはすべてreg やwireを書いたのだが、CharDispCtler はinput, outputは全て書いたが、reg やwire は途中でやめてしまった。Verilogで書けばコピペが出来るし、いちいちtypeをダイアログを出して選択するのが面倒だ。やはりここはNSLのスケルトンを生成するのだから、input, outputだけを書いたクラス図で良い気がする。
CharDispCtrlerTestとCharDispCtler のreg, wireはすべて削除したのが、下の図だ。
CDCont_NSL_4_110203.png

クラス図としては、これのほうが良い気がする。NSLのスケルトンを生成するしてから、reg, wire は作ることにする。
Top_wDCMを設けたのは、CharDispCtrlerTestではロジックが入っているので、DCMを接続してクロックを帰るので、トップにクロックを使用するロジックがあってはまずいのでは?と思ったからだ。dcm_instはinterface文を使うか?して、クロックを明示して接続するつもりだ。

そうかメソッドを作成する場合に、reg, wire がないとだめなのかな?早速やってみた。
メソッドを作成していく。
CDCont_NSL_5_110203.png

次はインスタンスだが、これは迷うところ。順当に行けば、CharDispCtler からframe_buffer, char_gen_rom, disp_timing がインスタンスされるんだろうと思う。だが、下のブロック図を見ると、イベント駆動と考えると、disp_timingがタイミングを管理しているので、そこからframe_bufferを駆動して、char_gen_romを駆動するというのが自然のような気がする。しかし、frame_bufferは、キャラクタを書きこむのに、CharDispCtrlerからも駆動されるので、やはり、順当にインスタンスすることになるのだろか?しかし、他のインスタンスのメソッドも使えるんだろうか?考えていても、わからないので、やってることにする。
char_disp_ctler_3_070524.png

色々と構成を考えてみたが、結局、クラス図は下図になった。
CDCont_NSL_6_110204.png

dcm_instは空だが、後で、Verilogファイルを接続するつもりだ。
次に、UMLtoNSLでUMLをNSLのスケルトンに変換した。NSLのスケルトンを下図に示す。
CDCont_NSL_7_110204.png

後は、NSLを書いていくことにする。
  1. 2011年02月03日 05:45 |
  2. NSL
  3. | トラックバック:0
  4. | コメント:0

ISimでLintしてみた

Verilatorは設定が大変そうなので、それじゃ何でLintしたら良いのか?というと、やはり、ISimじゃないだろうか?ということで、Lintにだけ使えるかやってみることにした。
Spartan-3A Starter KitでCMOSカメラ・ディスプレイ回路のSCCB回路追加時のシミュレーション”でOV7670のシミュレーションはやってあるので、OV7670モデルをそのまま使って、(Lintだけなので)ISimでコンパイルしてみることにした。ただし、ISE12.2からISE12.4 に変更した。
わざと、CamDisp_Cntrler_DDR2.vのcamc_addrのビット幅を変更した。

// wire [20:0] camc_addr;
wire [18:0] camc_addr;


これで、ISimのコンパイルスクリプトを走らせたら、Size mismatch in connection portのWARNINGが出ていた。
ISim_Lint_110201.png

これで少なくともビット幅に関してはISimでLintすることができるようだ。
  1. 2011年02月01日 05:32 |
  2. ISim
  3. | トラックバック:0
  4. | コメント:0

VerilatorでLint

twitterで@Vengineerさんから、VerilogのLintツールとしてVerilatorを教えていただいた。更にブログにも書いていただいた
それじゃやってみようということで、Verilatorの事が詳しく書いてある武内さんの”電気回路/HDL/Verilator の導入(C++モード)”を参照して、Cygwinを使用してVerilatorをインストールした。書いたある通りにやると、Verilatorがインストール出来て、使用可能となった。(ただ、なぜかwget が使えなかったので、ブラウザでダウンロードして、Cygwinのhomeディレクトリに置いた)
Verilatorのバージョンは3.810。
Verilator_1_110131.png

早速、試しにSW_Controller.vをLintしてみた。
Verilator_2_110201.png

サブモジュールのSWDiv.v が無いのでエラーになった。
次に、SW_Controller.vとSWDiv.v をLintしてみた。
Verilator_3_110201.png

これは通った。
次に、VGA_Display_Controller.vをLintしてみた。
Verilator_4_110201.png

エラー多数。そうか、OVLが入っているんだっけ。インクルードパスに追加すれば良いのかな?それともライブラリ化する必要があるのか?ライブラリ化はどうやるんだろう?
とりあえず、std_ovlフォルダをコピーして、インクルードパスを設定したが、std_ovl_defines.hを見つけてくれないようだ。
Verilator_5_110201.png

結局、うまく行かない。OVLがクリアされても、XilinxCoreLibをリンクする必要があるがどうやるんだろう?

現在はLintのみだが、VHDLのファイルもあるので、Verilatorでシミュレーションをすることは出来ない。
  1. 2011年02月01日 05:02 |
  2. シミュレーション
  3. | トラックバック:0
  4. | コメント:7