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

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

FPGAの部屋

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

ZedBoard AXI4 Lite Slave 演習10(Verilog版演習マニュアルの続き4)

ZedBoard AXI4 Lite Slave 演習9(Verilog版演習マニュアルの続き3)”の続き。

5. Project Navigatorで論理合成、インプリメント、ビットストリーム生成

53. Project Navigatorに戻って、トップファイルにLED8bitのポートが無いので、生成します。
54. DesignのHierarchyウインドウのsystem_iをクリックします。
55. ProcessesウインドウのGenerate Top HDL Sourceをダブルクリックします。
AXI4_practice_54_131231.png

56. ダイアログが表示されるので、Yesボタンをクリックします。
AXI4_practice_55_131231.png

57. LED8bitが追加されました
AXI4_practice_56_131231.png

58. UCFファイル(system_top.ucf)の内容にLED8bitを追加します。
59. DesignのHierarchyウインドウのsystem_top.ucfをダブルクリックして、開きます。
AXI4_practice_57_131231.png

60.すべて下の内容に書き換えるか、もしくは、LED8bitの部分だけ書き加えます。


NET "axi_gpio_0_GPIO_IO_pin" LOC = T18;
NET "axi_gpio_0_GPIO_IO_pin" IOSTANDARD = LVCMOS25;
NET "processing_system7_0_GPIO_pin" LOC = R18;
NET "processing_system7_0_GPIO_pin" IOSTANDARD = LVCMOS25;

NET "LED8bit[7]" IOSTANDARD = LVCMOS33;
NET "LED8bit[6]" IOSTANDARD = LVCMOS33;
NET "LED8bit[5]" IOSTANDARD = LVCMOS33;
NET "LED8bit[4]" IOSTANDARD = LVCMOS33;
NET "LED8bit[3]" IOSTANDARD = LVCMOS33;
NET "LED8bit[2]" IOSTANDARD = LVCMOS33;
NET "LED8bit[1]" IOSTANDARD = LVCMOS33;
NET "LED8bit[0]" IOSTANDARD = LVCMOS33;

NET "LED8bit[0]" LOC = T22;
NET "LED8bit[1]" LOC = T21;
NET "LED8bit[2]" LOC = U22;
NET "LED8bit[3]" LOC = U21;
NET "LED8bit[4]" LOC = V22;
NET "LED8bit[5]" LOC = W22;
NET "LED8bit[6]" LOC = U19;
NET "LED8bit[7]" LOC = U14;


AXI4_practice_58_131231.png

61. system_top.ucfをセーブします。
62. DesignのHierarchyウインドウのSystem_topをクリックします。
63. ProcessesウインドウのGenerate Programming Fileをダブルクリックして、論理合成、インプリメント、ビットストリームの生成を行います。
AXI4_practice_59_131231.png

・ビットストリームの生成まで完了しました。
AXI4_practice_60_131231.png

6. SDK

64. 最初にISEからのハードウェア・エクスポートが成功しない場合があるので、PS_PL_Tutorial\system\SDK\SDK_Exportの下を削除しておきます。
AXI4_practice_61_131231.png

65. DesignのHierarchyウインドウのsystem_iをクリックします。
66. ProcessesウインドウのExport Hardware Design To SDK with Bitstreamをダブルクリックします。
AXI4_practice_62_131231.png

67. ハードウェア構成とビットストリームをエクスポートして、SDKが起動します。Workspace Launcherが起動するので、PS_PL_Tutorial\system\SDK\SDK_Exportを指定します。(自分のフォルダ構造の下のPS_PL_Tutorial…を選択して下さい)
AXI4_practice_63_131231.png

68. OKボタンをクリックします。
69. SDKが立ち上がります。
AXI4_practice_64_131231.png

70. led8_axi_lite_slaveカスタムIP用のソフトウェアを作製します。
71. FileメニューからNew -> Application Projectを選択します。
AXI4_practice_65_131231.png

72. New Projectダイアログで、Project nameにled8_axi_lite_slaveと入力し、Next >ボタンをクリックします。
AXI4_practice_66_131231.png

73. TemplatesでEmpty Applicationを選択します。
74. Finishボタンをクリックします。
AXI4_practice_67_131231.png

75. led8_axi_lite_slaveとled8_axi_lite_slave_bspができました。
AXI4_practice_68_131231.png

76. Project Explorerのled8_axi_lite_slaveを展開して、srcフォルダで右クリックし、右クリックメニューから、New -> Source Fileを選択します。
AXI4_practice_69_131231.png

77. Source fileにled8_axi_lite_slave.cと入れてFinishボタンをクリックします。
AXI4_practice_75_131231.png

78. 空のled8_axi_lite_slave.cが作製されました。
AXI4_practice_70_131231.png

79. 用意されているled8_axi_lite_slave.cを今新規作成したled8_axi_lite_slave.cにコピーしてセーブします。
AXI4_practice_71_131231.png

80. led8_axi_lite_slave.cのコンパイルは成功したのですが、led8_axi_lite_slave_bspにエラーが表示されているので、リコンパイルします。
81. ProjectメニューからClean…を選択します。
AXI4_practice_72_131231.png

82. Clean all projectsのラジオボタンにチェックが入っていることを確認して、OKボタンをクリックします。
AXI4_practice_73_131231.png

83. エラーが無くなりました。
AXI4_practice_74_131231.png
  1. 2013年12月31日 20:49 |
  2. AXI4バスの演習資料
  3. | トラックバック:0
  4. | コメント:0

ハンターマウンテン塩原スキー場に行ってきました

昨日は、ハンターマウンテン塩原スキー場に奥さんと上の娘と私で、スキーに行ってきました。
とっても良い天気でスキー日和でした。雪も降ったようでアイスバーンはほとんど無く、とっても良い雪でした。
眺めはこんな感じです。とっても素敵な眺めでした。
hunter_ski_1_131231.jpg

ゲレンデも下の写真のように最高のコンディションでしたよ。
hunter_ski_2_131231.jpg

思う存分滑ってきました。8時30分ころ滑り始めて、2時ころには上がって帰ってきました。もうこのくらいが調度良い所です。あまり滑り過ぎても足が持ちません。良い所で怪我をしない内に切り上げました。

お昼の食堂は混んでましたが、リフト待ちはそれほどでもありませんでした。食堂は手袋などを置いて場所取りしているんですが、お昼を買うのに並んでいる人はそんなにいません。滑っている人が席を確保するのにおいているようでした。やめて欲しいです。席が見つかりませんでした。

2時30分ころスキー場を出て、家には6時30分ころ着きました。家で夕食を食べることが出来ました。
  1. 2013年12月31日 06:28 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

マラソン・トレーニング日記2013年11月分

「今月の目標」胸を張って走る
猫背なので、普通に走ると僧帽筋を過剰に使って肩から首が痛くなるようだ。
胸を張って走ると僧帽筋が動いていないのが実感できたので、肩が疲れないと思う。教えてもらったことを忘れていたので、肝に銘じたい。

(1日)
3時20分起床
朝、筋トレ
昼、3.02km、6:00/km、1kmラップ、6:44, 5:35, 5:38
今日は胸を張って走ったので、肩の痛みはなかった。今度は成田さんのアドバイスに従って走ってみます。
10時20分就寝
(2日)
3時10分起床
午後、10km走ってみました。肩は走り方に気を付けたので、大丈夫だったんですが、8.5kmくらいから左の股関節が痛くなって、やっと10kmはしれました。1:11:43、7:08 min/km
10時25分就寝
(3日)
3時15分起床
今日は、Maker Faire Tokyo 2013に参加
10時25分就寝
(4日)
3時30分起床
今日も、Maker Faire Tokyo 2013に参加
10時10分就寝
(5日)
3時30分起床
朝、筋トレ
昼、3.02km走、6:05min/km, 6:33, 5:57, 5:43
10時40分就寝
(6日)
3時30分起床
朝、軽くストレッチ
昼、3.02km走、6:04min/km, 6:44, 5:40, 5:49
10時10分就寝
(7日)
3時起床
朝、筋トレ
10時10分就寝
(8日)
3時25分起床
10時50分就寝
(9日)
3時30分起床
9時50分就寝
(10日)
3時30分起床
今日は、坂東マラソンに出ます。
5kmに出場して、29分48秒でした。途中で給水所があったので、どうしても1度給水を取ってみたかったので、給水して、15秒程度ロスしてしまいました。でも給水を取って、少し飲めたので満足です。
12時就寝
(11日)
4時30分起床
結構、疲れました。
10時10分就寝
(12日)
3時30分起床
朝、筋トレ
昼、3Km走、6:21/km
10時就寝
(13日)
3時30分起床
朝、ストレッチ&トレーニング
1.3kmウォーキング
9時30分就寝
(14日)
3時30分起床
朝、筋トレ
10時就寝
(15日)
3時30分起床
朝、ストレッチ&トレーニング
9時40分就寝
(16日)
4時起床
昼、5km走。6:55/km、今日は、ペースを体で覚えるために8:00/kmから1kmに付き30秒ずつペースを上げていった。7:56 7:21 7:00 6:36 5:47
9時30分就寝
(17日)
4時起床
昼、5km走。6:38/km
10時就寝
(18日)
3時30分起床
朝、筋トレ
9時50分就寝
(19日)
3時30分起床
朝、ストレッチ
昼、1.75kmウォーキング
10時30分就寝
(20日)
3時30分起床
朝、筋トレ
10時10分就寝
(21日)
3時30分起床
朝、ストレッチ&トレーニング
10時10分就寝
(22日)
3時起床
朝、筋トレ
10時30分就寝
(23日)
3時30分起床
朝、ストレッチ&トレーニング
10時10分就寝
(24日)
3時20分起床
今日はつくばマラソンです。
10km完走しました。グロスで63分53秒、ネットで61分50秒、1323位でした。
9時就寝
(25日)
3時30分起床
昼、歩こうとしたが、右足裏が痛くて断念
10時25分就寝
(26日)
3時25分起床
朝、筋トレ
昼、2.9km走、6:34/km、まだ疲れが残っている。右足裏が痛い。ふくらはぎの下のほうが張っているようだ。
10時10分就寝
(27日)
4時10分起床
朝、ストレッチ
10時就寝
(28日)
3時30分起床
朝、筋トレ1セット
夕、首、肩が凝ったので、マッサージに行った。
10時就寝
(29日)
3時起床
朝、軽くストレッチ
10時就寝
(30日)
3時50分起床
  1. 2013年12月29日 04:46 |
  2. マラソン・トレーニング日記
  3. | トラックバック:0
  4. | コメント:0

マラソン・トレーニング日記2013年10月分

<今月の目標>
10kmを走る

(1日)
2時20分起床、血圧93/64 脈拍63
朝、筋トレ
10時就寝
(2日)
3時15分起床、血圧107/65 脈拍61
朝、ストレッチ&トレーニング
夕、自転車マシン20分
9時30分就寝
(3日)
4時20分起床、血圧107/67 脈拍60
朝、筋トレ
10時就寝
(4日)
3時10分起床
朝、ストレッチ&トレーニング
10時10分就寝
(5日)
3時40分起床
井手コーチと走ろうセミナに参加、足のマッサージ
9時50分就寝
(6日)
4時起床
朝、筋トレ
午後、5km走、6:20/km
10時就寝
(7日)
3時10分起床
10時15分就寝
(8日)
3時30分起床
人間ドック
10時就寝
(9日)
3時起床
朝、筋トレ
10時20分就寝
(10日)
3時30分起床
朝、2.5km走、6:20/km
10時15分就寝
(11日)
3時10分起床
朝、筋トレ
10時30分就寝
(12日)
3時40分起床
朝、3.8km走、6:15/km
9時45分就寝
(13日)
3時25分起床
朝、2.5km走、6:30/km
午前、約7kmLSD、ロハス 1時間走
9時30分就寝
(14日)
3時30分起床
朝、筋トレ
9時40分就寝
(15日)
3時起床
10時就寝
(16日)
台風、2時50分起床
朝、筋トレ
10時30分就寝
(17日)
4時20分起床
昼、3km走、5:51/km
10時就寝
(18日)
3時30分起床
朝、筋トレ
10時50分就寝
(19日)
3時40分起床
午後、9.1km 走、7:04/km、10km走ろうと思ったが、左内ももが痛くなって断念。来週は10km走りたい。
9時50分就寝
(20日)
3時起床
朝、筋トレ
9時50分就寝
(21日)
3時25分起床
昼、3kmランニング、5:50/km
10時20分就寝
(22日)
3時10分起床
朝、筋トレ
昼、2.94 km走、6:12 min/km
10時15分就寝
(23日)
3時45分起床
昼、3.01km走、6:21min/km
10時10分就寝
(24日)
3時40分起床
10時10分就寝
(25日)
3時20分起床
朝、筋トレ
9時10分就寝
(26日)
2時55分起床、2時11分の地震は大きかった。
夕、1.07kmウォーキング
夕、2.87kmランニング、8:58/km
10時就寝
(27日)
3時30分起床
朝、筋トレ
昼、5.21km走、7:18min/km
10時就寝
(28日)
3時30分起床
10時就寝
(29日)
3時起床
朝、筋トレ
9時30分就寝
(30日)
3時20分起床
朝、ストレッチ&トレーニング
昼、
距離: 3.03 km
タイム: 18:21
平均ペース: 6:03 min/km
高度上昇値: 14 m
カロリー: 194 C
10時就寝
(31日)
3時起床
朝、軽く筋トレ
10時10分就寝
  1. 2013年12月29日 04:44 |
  2. マラソン・トレーニング日記
  3. | トラックバック:0
  4. | コメント:0

マラソン・トレーニング日記2013年9月分

(今月の目標)
長い距離(10km)を走ってみる。

(1日)
3時起床、体温35.4度
朝、筋トレ
10時就寝
(2日)
3時20分起床、体温35.6度
昼、2.2km走、6:49/km、今日は疲れ気味だったので、ゆっくり走った。
9時50分就寝
(3日)
3時50分起床、体温35.4度
朝、筋トレ
10時10分就寝
(4日)
3時10分起床、体温35.8度
朝、ストレッチ&トレーニング1セット、やはり疲れ気味。
9時20分就寝
(5日)
3時20分起床、体温35.5度
朝、筋トレ
夕、2.1km走、6:14/km
10時10分就寝
(6日)
3時10分起床、体温35.6度
朝、ストレッチ&トレーニング
昼、1.5kmウォーキング
10時10分就寝
(7日)
3時30分就寝、体温35.7度
朝、筋トレ
井手コーチと走ろう参加、7.8km、6:18/km
10時就寝
(8日)
4時30分起床、体温35.3度
朝、ストレッチ&トレーニング1セット
10時就寝
(9日)
3時10分起床、体温35.0度
朝、筋トレ
昼、2.5km走、5:58/km、今日は調子が悪く、スピードを上げていくと走り方が悪いのが自覚できた。案の定、足裏が痛くなってきたのでやめた。
9時40分就寝
(10日)
3時10分起床、体温35.4度
右足ふくらはぎが張っているのがわかったので、足裏と一緒に湿布をはった。
花粉が来ているのを感じる。秋の花粉症を発症した。体がだるい。
昼、1.5kmウォーキング
10時5分就寝
(11日)
3時44分起床、体温35.6度
朝、筋トレ、
昼、2.9km走、6:30/km、今日は昨日よりゆっくり走りだしてみた。一昨日は調子悪いのに早く走ろうとして足裏へのショックが大きい走りになってしまったが、今日は楽に走れた。足裏も大丈夫。
特に調子が悪い時はロハスでフォームをよく調整してから、だんだんと上げていった方が良さそうだ。昨日は下を向いてしまって、体が突っ込んでしまったが、今日は前を向いて体の軸が立っていたのがわかった。
11時就寝
(12日)
4時10分起床、体温35.6度
夕、2kmウォーキング
9時30分就寝
(13日)
4時30分起床
夜、2.2km走、6:57/km、夜は凸凹が見えなくて危ない。ペースもわからなかった。
10時10分就寝
(14日)
3時10分起床
朝、筋トレ
今日は中学校の運動会で疲れました。走るのはお休みです。
9時30分就寝
(15日)
3時40分起床
10時40分就寝
(16日)
3時40分起床
朝、筋トレ
11時10分就寝
(17日)
4時起床
昼、3km走、7:06/km
10時30分就寝
(18日)
4時起床
朝、筋トレ
夕、4.2km走、6:44/km
10時10分就寝
(19日)
3時40分起床
10時20分就寝
(20日)
3時40分起床
2時20分ころ、大きな地震があり目が覚めた。
朝、筋トレ
昼、3km走、6:31/km
10時20分就寝
(21日)
3時20分起床
午後、プール40分ウォーキング、ランニングマシンなどの講習を受けた。これで次から使える。
10時30分就寝
(22日)
3時30分起床
朝、筋トレ
午前、1時間程度LSD、6.5km
9時30分就寝
(23日)
3時起床
8km自転車走
9時就寝
(24日)
3時20分起床
朝、筋トレ1セット
今日は、体が疲れているのでお休み
10時20分就寝
(25日)
3時10分起床
朝、筋トレ1セット
今日も雨で走れなかった。
9時就寝
(26日)
2時45分起床
朝、筋トレ1セット
昼、2Km走、6:13/km
10時就寝
(27日)
3時30分起床、血圧 111/78 脈拍 65
朝、ストレッチ&トレーニング2セット
11時50分就寝
(28日)
5時起床
朝、筋トレ
午前、トレーニングマシンで筋トレ、50分ラン、8:00/km位?
トレーニング前血圧131/84 脈拍76
9時30分就寝
(29日)
3時30分起床、血圧104/68 脈拍65
朝、ストレッチ
午前、60分、7.1kmLSD、8:29/km
9時15分就寝
(30日)
3時35分起床、血圧96/64 脈拍66
朝、ストレッチ
9時就寝
  1. 2013年12月29日 04:43 |
  2. マラソン・トレーニング日記
  3. | トラックバック:0
  4. | コメント:0

マラソン・トレーニング日記2013年8月分

(今月の目標)
足裏筋膜炎になってしまって走れないので、プール歩行でトレーニングを週に2回行う。

(1日)
3時5分起床、体温35.4度
プール歩行 40分
9時40分就寝
(2日)
3時10分起床、体温35.5度
足裏の鋭い痛みは消えて、鈍痛になってきた。
ストレッチ&トレーニング
10時15分就寝
(3日)
3時10分起床、体温35.7度
朝、筋トレ
プール歩行 25分、ハードに歩いたので疲れた。
今日の仕事で立っていたので、足裏の痛みが出てきた。
9時就寝
(4日)
3時起床、体温35.5度
朝、ストレッチ&トレーニング
9時40分就寝
(5日)
3時25分起床、体温35.7度
朝、筋トレ
9時40分就寝
(6日)
3時35分起床、体温35.4度
朝、ストレッチ&トレーニング
9時20分就寝
(7日)
3時15分起床、体温35.5度
朝、筋トレ
9時30分就寝
(8日)
3時30分起床、体温35.5度
昼過ぎ、プール歩行65分
9時20分就寝
(9日)
3時40分起床、体温35.7度
朝、筋トレ、スクワットすると足裏が痛いので無しにした。
夕、足裏にリハビリに整形外科に行った。リハビリすると少しは良さそう。
10時15分就寝
(10日)
3時15分起床、体温35.6度、今朝はとっても暑い
昼、プール歩行35分間
11時就寝
(11日)
3時30分起床、寝苦しくて寝不足気味なのだが起きてしまった。
10時10分就寝
(12日)
4時15分起床、体温35.8度
朝、筋トレ
今日は横浜観光
21時50分就寝
(13日)
3時50分起床、体温35.8度
朝、ストレッチ&トレーニング
プール歩行45分
9時30分就寝
(14日)
3時30分起床、体温35.8度
朝、筋トレ
夕、リハビリに2Km歩行
9時50分就寝
(15日)
4時20分起床、体温35.6度
朝、ストレッチ&トレーニング
夕、プール歩行45分
そろそろ走り始められそうなので、足のアーチサポート付きインソールを購入
9時30分就寝
(16日)
3時40分起床、体温35.8度
昼、新しいインソールで1km程度、LSDをしてみたが、最後に足が痛くなった。
10時就寝
(17日)
3時15分起床、体温35.5度
朝、筋トレ
夕、1.5kmウォーキング、足は痛くなかった。
10時就寝
(18日)
5時15分起床、体温35.6度
朝、ストレッチ&トレーニング
夕、ロハスで2.5km, 10:57分/km, 合計27:34 最後は足裏に違和感を感じたが、だいぶ走れるようになってきた。
10時30分就寝
(19日)
3時15分起床、体温35.9度
朝、筋トレ
夕、2.5kmウォーキング
10時10分就寝
(20日)
3時10分起床、体温35.5度
朝、ストレッチ&トレーニング
昼、1.5kmウォーキング
10時就寝
(21日)
4時起床、体温35.2度
夕、2.3kmジョグ、8:06/km、18:40 だいぶ足が治ってきた。
10時20分就寝
(22日)
4時35分起床、体温35.5度
朝、筋トレ
少し右足裏が痛かった。
9時30分就寝
(23日)
4時起床、体温35.7度
ストレッチ&トレーニング
10時20分就寝
(24日)
4時10分起床、体温35.2度
朝、筋トレ1セット
夕、2.5Km、多分6:30/kmくらい?足裏は問題無さそうです。
9時40分就寝
(25日)
3時40分起床、体温35.7度
足裏痛くない。
ストレッチ&トレーニング
2.5Kmロハス、8分/km程度
10時20分就寝
(26日)
3時50分起床、体温35.4度
朝、筋トレ
昼、1.5kmウォーキング
9時55分就寝
(27日)
3時15分起床、体温35.1度
昼、2.6km走、6:11/km
9時50分就寝
(28日)
3時起床、体温35.3度
昼、1.5kmウォーキング
9時50分就寝
(29日)
3時20分起床、体温35.2度
朝、筋トレ
今日は東京に行ってきた。かなり歩いた。
9時50分就寝
(30日)
4時40分起床、体温35.5度
朝、ストレッチ&トレーニング
昼、2.6km走、多分、6:20/kmくらい
10時就寝
(31日)
3時30分起床、体温35.7度
夕、3km走、7:20/km、昨日走って疲れ気味だったので、ゆっくり走った
9時30分就寝
  1. 2013年12月29日 04:41 |
  2. マラソン・トレーニング日記
  3. | トラックバック:0
  4. | コメント:0

マラソン・トレーニング日記2013年7月分

マラソン・トレーニング日記を書いているのですが、ブログにも上げておこうと思います。

超朝型です。朝3時半ころ起きて、夜10時ころ寝ちゃいます。

朝、ブログを書いています。マニアックな内容で、一般人向きじゃないですが、たまに日記も書いています。
http://marsee101.blog19.fc2.com/blog-category-1.html

基本的に朝食事の前に筋トレ(腹筋30回(通常と斜め)、幅広ゆっくり腕立て10回、スクワット50回、腹筋30回(通常と斜め)、幅狭ゆっくり腕立て10回、股割り20~30回)とストレッチ&トレーニング(井手コーチと走ろう第1回で教えてもらったメニューを2セット)を1日毎に交互にやっています。

昼休みに週2回くらい3km走っています。今月は3回程度走れるかもしれません。

週末に適当に走ります。10kmをゆっくり走ってみたいと思っています。走っている時間が勿体無いのであまり長い距離は走りたくありません。(3時間とか)

走っていると、左のアキレス腱の周りの筋肉が痛くなります。
走っていると左の肩の後ろが痛くなってくるので、走りながら首を傾けてストレッチしながら走っています。ひどくなると頭が痛くなります。

<今月の目標>
胸を意識して走る。井手コーチが言ってらしたように、胸を張って走るようにしようと思います。左の肩の後ろが痛くならない気がして来ました。

<今後の目標>
Kinect+Open NI でモーションキャプチャして、自分の走るフォームをチェックしてみたい。
http://kgxpx834.blog58.fc2.com/blog-entry-22.html

(6日)
朝、ストレッチ&トレーニング(井手コーチと走ろう第1回で教えてもらったメニューを2セット)
井手コーチと走ろうで、合計8km、48:48走りました。
(7日)
3時24分起床、今日は蒸し暑い。
例によって、左足のふくらはぎが痛いので、シップを貼る。
筋トレ
夕方走ったのですが、足が痛くなったので、1.9km で走るのを止めました。13:37
10時6分就寝
(8日)
3時10分起床
5時10分 ストレッチ&トレーニング
お昼に走ろうとしたら右腰が痛いので止めました。
身長 約172cm、体重61.1kg、体脂肪率15.1%
10時8分就寝
(9日)
3時40分起床
朝、筋トレ
昼、2.8km 走りました。6:30min/km とっても暑く気温は35度くらいです。胸を張って走ると良い感じでした。頭も痛くありません。
10時35分就寝
(10日)
3時55分起床
ストレッチ&トレーニング
昼、2.9km, 6:24min/sec とっても暑いが慣れてきた。胸を張ると良い感じだ。
10時20分就寝
(11日)
3時20分起床
朝、筋トレ
昼走ろうと思ったのですが、慣れないのに胸を張って走ったためか?背中が痛くなったので、止めました。
10時就寝
(12日)
3時10分起床
朝、ストレッチ&トレーニング
昼、3km, 6:13min/km、背中の痛みは軽減した。あまり極端に胸を貼らないようにした。
暑気払い
12時就寝
(13日)
5時15分起床
今日はトレーニング休み
9時30分就寝
(14日)
4時5分起床、体温35度5分。今日は2時30分に目がさめたので、寝直した。
朝、筋トレ
残念ながら、お祭の準備で走れなかった。残念です。
9時40分就寝
(15日)
3時15分起床 体温35.5度 寝苦しくてよく眠れませんでした。
朝、ストレッチ&トレーニング
夕方、2.6km 6:14min/km 調子良かった
10時10分就寝
(16日)
3時45分起床、体温35.1度、涼しく良く眠れた。
朝、筋トレ
健康診断の結果が来た。心電図正常範囲、レントゲンの所見は側湾、HbA1cが5.8 血圧 110/72 走っても大丈夫だと思う。
昼、3km, 5:57min/km 初めて6分/km を切れた。最初の600mくらいは6分30秒/km位なので、最後は5分40秒/km位だった。
夕、背中が痛いので、マッサージへ。僧帽筋が相当凝っているとのこと。
10時25分就寝
(17日)
3時25分起床、体温35.6度、涼しい
朝、ストレッチ&トレーニング
昼、3km, 6:09min/km 少々疲れ気味。明日は休もう。
10時就寝
(18日)
4時18分起床、体温35.6度、涼しい
朝、筋トレ
10時20分就寝
(19日)
3時20分起床、体温35.3度
朝、犬の散歩、ストレッチ&トレーニング1回
昼、3km, 5:42min/km, 調子が良かった。これで、今は限界のようだ。
明日からお祭り
就寝12時
(20日)
3時40分起床
お祭り
11時20分就寝
(21日)
4時20分起床、寝ていて寒かった。体温35.2度
朝、筋トレ
昼前、2.6km, 約10min/km のLSD もっと長く走ってみたかった。今日もお祭り。
12時就寝
(22日)
5時起床、35.6度、神輿を担いで肩が痛い
朝、ストレッチ&トレーニング1回
夕、3.1km, 9:39min/km, 30:24のLSD、右足の裏が痛くなった。
9時40分就寝
(23日)
4時30分起床、体温35.7度、朝起きたら、歩くとズキッと右足の裏が痛くなった。貼り薬を貼った。
右足裏が痛くて、歩くことままならなくなったので、練習は休み
10時就寝
(24日)
3時30分起床、体温35.2度
右足裏はだいぶ良くなった。まだ、歩き出すときにピリッと痛いが普通に歩く分には大丈夫
朝、筋トレ
9時就寝
(25日)
2時50分起床、体温35.1度
やはり歩くと右足裏が痛い。ネットで検索すると、足底腱膜炎に症状が似ています。良い対策があったら教えて下さい。
ストレッチ&トレーニング1セット
9時50分就寝
(26日)
3時15分起床、体温35.6度
朝、筋トレ、幅広腕立て伏せをしたら、頭が痛くなったので終了。神輿の後遺症のようだ。
夕、マッサージへ、少しは頭の痛みも軽減した。
9時30分就寝
(27日)
3時30分起床
朝、ストレッチ&トレーニング1セット
整形外科に行って、足のレントゲンを撮ってきたが、骨折はないそうだ。やはり、足裏筋膜炎っぽい。シップをもらった。
夕、足裏が痛いので、プールで歩行35分、かなり疲れた。
9時就寝
(28日)
4時起床、体温35.6度
朝、筋トレ
10時40分就寝
(29日)
3時30分起床、体温35.4度
9時10分就寝
(30日)
3時起床
朝、筋トレ、まだ神輿の後遺症で肩が痛いが腕立て伏せができるようになってきた。まだ、足裏は痛いので走れなさそうだ。
10時20分就寝
(31日)
3時40分起床
9時40分就寝
  1. 2013年12月29日 04:39 |
  2. マラソン・トレーニング日記
  3. | トラックバック:0
  4. | コメント:0

2013年を振り返る3(10月~12月)

10月
Vivado HLSで作ったラプラシアン・フィルタIPを使ってみる1、"Vivado HLSでラプラシアン・フィルタ式のみをaxi lite slaveモジュールにする2"でラプラシアン・フィルタの式のみをEDKの pcore として出力したので、XPSのプロジェクトに入れてハードウェア化してLinuxのソフトウェアから使ってみようと思う。
Vivado HLSで作ったラプラシアン・フィルタIPを使ってみる3、これで、ISEに戻って、インプリメント、ビットストリームの生成を行って、SDKでBOOT.bin を再生成して、SDカードに入れてブートしてみたが、問題なくブートできた。ソフトウェアを作って動作させたら、約1.94秒となった。完全にソフトウェアで実行した前回の 1.94 / 0.39 ≒ 5 倍になった。
Vivado HLSでラプラシアン・フィルタ関数をaxi masterモジュールにする1、今回は、ラプラシアン・フィルタ関数自体をVivado HLSで、AXI4 Master を使用したIPとして生成して見ようと思う。
Vivado HLSでラプラシアン・フィルタ関数をaxi masterモジュールにする2、前回、Vivado HLS の Export RTL で EDK用の pcore を作ってみたが、カメラ画像フレーム・バッファ読み込み用アドレスとラプラシアン・フィルタの結果を書き出すフレーム・バッファのアドレスは、parameter 指定の固定アドレスだったので、AXI4 Lite Slave でAXI4 Master のRead/Writeするアドレスを渡す仕様に変更した。結局、動作しなかった。
自分の写真を彫った光るアクリルサインを作りました、Make用です。
ガーミンのランナー用GPSトレーナーForeAthlete 10Jを購入しました、走っている時の瞬間タイムが見たくて、アマゾンでガーミンのランナー用GPSトレーナーForeAthlete 10Jを購入しました。走るのが好きになってきました。
ラプラシアン・フィルタのAXI4 Master IPを作製する1(仕様の検討)、Vivado HLSでラプラシアン・フィルタをAXI Master で構成するC言語のソースを書いて、IPとしてZedBoardのLinux用ハードウェアに実装してみたが、動作しなかった。そこで、Vivado HLSが出力したIPのトップファイルのポート構成はそのままで、自分でHDLを書いて、ラプラシアン・フィルタのAXI4 Master IPを完成させてみることにした。
AXI4 Master Interfaceモジュールの作製1(仕様の検討)、今までのカメラ・コントローラやビットマップ・ディスプレイ・コントローラは、複数のアドレス転送を許さなかったので、今回は複数のアドレス転送を許す汎用AXI4 Master Interfaceモジュールを作製することにした。

11月
Sublime Text3 エディタ、このエディタをメインに使うことにした。
Maker Faire Tokyo 2013 に出展します
Maker Faire Tokyo 2013 に出展しました
シミュレーション用 同期FIFO IP、axi_slave_BFM.v を変更して、ネストされたアドレス転送を受け付けることにした。そのためには、ネストされたReadアドレス転送を溜めておくためにFIFOが必要となる。それで、シミュレーションに使用するために汎用の同期FIFO を作ることにした。
坂東ハーフマラソン、FPGAXに参加
AXI4 Slave Bus Functional Model (axi_slave_BFM.vhd)、AXI4 Slave Bus Functional Model (axi_slave_BFM.vhd) を貼っておく。今回のBFMは今まで公開したBFMをアドレス転送をネストできるように変更したものだ。よりXilinx社のAXI Interconnect に近くなったと思う。但し、ネストできるアドレス転送は15なので、より多いと思う。
AXI4 Master Interfaceモジュールの作製4(axi4_master_inf.v のHDLソース)、AXI4 Masterアクセスをする汎用モジュール axi4_master_inf.v を貼っておく。
AXI4 Master アクセスのラプラシアン・フィルタ IP1(構想)、以前にもラプラシアン・フィルタをFPGAのハードウェアで作ったことがあるが、それは、1連のパイプラインされた構造だった。1ピクセルの画像データが入ってきて、パイプラインにデータが満たされていれば、ラプラシアン・フィルタ後のデータが出てくる構造だ。今回はわざとこの構造は取らずに、C言語からHLSで合成したようにシリアライズしてみようと思うのだが、なかなかわざと遅くしようと作ったことがなので、戸惑っている。ともかくC言語からHDLを合成したようにメモリベースで、ある程度シリアライズされた構成で作ってみようと思う。
つくばマラソンに出てきました

12月
AXI4 Master アクセスのラプラシアン・フィルタ IP9(できた。完成)、うまく表示されました。完成。。。トータルの実行時間は 23.6msec 程度だったが、ハードウェア処理のラプラシアン・フィルタ部分のみの経過時間を計測したところ、10.1msecとなった。
Verilog HDL で unsigned, signed の演算をする1、今までは、厳密な言語仕様のVHDLで演算をしてきた。math_realパッケージをuse すれば、log2 も sin() も cos() も使用することができる。演算を本格的に使う場合は、VHDLを使って来たが、Verilog HDL も簡単な演算は使ってみようということでやってみることにした。
Zynq勉強会用AXI4バスの演習資料の作製、今、Zynq勉強会をやっている。その勉強会用にAXI4バスの演習資料を作成しようとしている。ブログに書きながら作っていこうと思う。
ZedBoard AXI4 Lite Slave 演習1、以前、実習したZynq用ツールのチュートリアル1,2,3を元に実習を行う。使用するISEのバージョンはISE14.7とする。
AXI4 Lite Master BFM の Verilog HDL コード、AXI4 Lite Master BFM の Verilog HDL コードを貼っておく。AXI4 Lite Master BFM は、AXI4 Master BFM のラッパーとして作られている。
ZedBoard AXI4 Lite Slave 演習3(実機テスト)、前回、インプリメントが終了した。今回は、ハードウェアをSDKにエクスポートして、SDKを立ちあげソフトウェアを作製した。そして、ZedBoardにビットストリームをダウンロードし、ソフトウェアを実行して実行した。
ISE14.5以降の ISE で SDK と ChipScope Pro の協調デバックをする方法、ISE14.5以降でSDKとChipScope Pro(以下、ChipScope)を同時に使えなかったので、それを使う方法を書いた。

AXI4 Lite Slave遠州の文章を公開している。


今年は、 Zynq, AXI4バスに始まって、Zynq, AXI4バスに終わる年だった。来年も同様に追いかけて行きたい。Vivado や Vivado HLS, IP Integrator も試してみたいと思っている。
  1. 2013年12月28日 22:34 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:0

2013年を振り返る2(7月~9月)

7月~12月までを振り返ってみよう。

7月
お神輿用LED配線基板を一部実装した
AXI VDMAのシミュレーション1、AXI VDMAシミュレーションをするために、今まで、いろいろとXPSプロジェクトのカスタムIPを作ってきた。いよいよAXI VDMAの動作を調べるために、シミュレーション環境を整えてシミュレーションを行う。
インプリメントとシミュレーションでのRAM及びROMの初期値
VHDLのmath_realパッケージを使用した sin() と cos() の計算
Vivado IP Integrator のチュートリアル(Lab1)1(Vivado プロジェクトの生成)、Vivado 2013.2でチュートリアルをやってみた。
電飾お神輿、電飾お神輿の写真を撮って来ました。中学生が担ぐお神輿です。
Parallella-16 ボードを購入、Parallella-16ボードと電源アダプタ、ケーブルを購入しました。10月に来るそうです。(まだ来ていません。来月の2月だそうです)
Raspberry Pi にCamera を付けてOpenCVで顔認識、残念ながらうまく行かなかった。

Vivado IP Integrator のチュートリアルをずっとやっている

AXI VDMAのシミュレーション10(シミュレーション成功)、ISimでシミュレーションできたと思ったが、v_axi4s_vid_out IP の video_... の信号が出て無かった。
Vivado チュートリアル Designing with IP Lab1 1(FIFOコアの生成)

8月
Vivado チュートリアル Designing with IP Labをずっとやっている。

Vivado チュートリアル Designing with IP Lab3 (IP Packager)1、Xilinxのサイトからダウンロードすることができるデザインファイル(ug939-design-files.zip) は、ライセンスの懸念から使用しない。以前、AXI VDMAの検証用に使用した custom_vtc を使用する。
HelioボードでLinuxをブート、ここからHelioボードは使い方がわからずに、そのまま放置だ。
AXI4 Master, AXI4 Lite Slaveバスを持つプロジェクトをVivado IP Packager でIPにする1、前回、custom_vtc を Vivado 2013.2 の IP Packager で IP にすることが出来た。今回は、AXI4 Master, AXI4 Slave Liteバスを持つISEプロジェクトをVivado のプロジェクトとしてインポートして、そのプロジェクトをIPとして登録してみる。その場合にAXI4バスをグループ化する。
横浜に行ってきました、今日は横浜に、娘2人と奥さんと私で行って来ました。
AXI VDMAのシミュレーション11(シミュレーション成功2)、前回、シミュレーションが成功したと書いたが、v_axi4s_vid_out IP の video_... の信号が出て無かった。従って、HDMIの信号が出力されていない。そこで、v_axi4s_vid_out IP と互換(あくまで私が想定する用途ではということです)のカスタムIPを自分で作ることにした。名前は、custom_axi4s_video とした。13msecほどシミュレーションすると、ISimが落ちてしまうので、VSYNCが出るところまでシミュレーションすることが出来ないのが残念だ。
VivadoでAXI VDMAのシミュレーション1(IP Integrator)、Vivado で IP Integrator を使用してIPを接続して、Vivado Simulator でシミュレーションしてみようと思った。(自作カスタムIPをIP Packager でIPとしてパッケージして、そのIPをIP Integrator で接続したが、エラーが出て論理合成することが出来なかった。)
custom_vtc IP をテストする1、チュートリアルに使用した custom_vtc IP をIP Integrator でインスタンスして、論理合成、インプリメント、シミュレーションできるかどうか?を調べてみることにした。(問題なくできた)
mt9d111_inf_axis IP をテストする、簡単な1つだけのVerilog HDLファイルで構成されたIPをIP Integrator でインスタンスした時は、問題なくシミュレーション、論理合成、インプリメントまで行うことが出来た。今回は、NGCファイル、つまり、CoreGen で生成したFIFO IPが含まれているIPをIP Integrator でインスタンスして、問題なくシミュレーション、論理合成、インプリメントできるかどうかを確認する。(エラーが出てうまく行かなかった)
Vivado HLSのExampleを試してみる1(axi_lite の生成)、Vivado HLSを試しにやってみたい。試してみるのは、Vivado HLSのExample Project だ。
Vivado HLSのAXI Master Exampleを試す1、前回は、AXI Lite Slave を試してみたので、今回は、AXI Master の Example を試してみようと思う。
AXI VDMAのシミュレーション13(Questaでシミュレーション)、Questaでシミュレーションすると数フレーム、シミュレーションすることが出来て、AXI VDMAの動作がわかった。
Vivado 2013.2 の IP Packager でAXI4-Stream にクロックを関連付ける、今まで、Vivado 2013.2 の IP Packager では、AXI4-Stream Interface を作った時にクロックが無いと言われてIP Interface にワーニングが発生していた。それを回避する方法を ikwzm さんに教えて頂いたので、書いておこうと思う。
Vivado HLSで作ったaxi_lite IPをテストしたVivado HLSのExample として試した axi_lite IP をテストしてみた。単独でインプリメントを行った。
Vivadoで配置されたロジックと配線を見る1、Vivado では、FPGA Editor が無くなってしまった。今まで、配置されたロジックや配線遅延を見てきたのだが、無くなってしまうととっても困る。今日は、Vivado で、FPGA Editor と同様に配置配線の結果を見る方法を探ってみることにした。Vivado 2013.2 使用。

9月
Vivado Design Suite のチュートリアルをやってみた1(Tclスクリプト)、Vivado のIP Integrator やIP Packager はとりあえず次のバージョンを待ちたいが、Vivado はチュートリアルをやってみてやり方を学びたいと思った。そこで、”Vivado Design Suite チュートリアル デザイン フローの概要 UG888 (v2013.2) 2013 年 6 月 19 日”をやってみることにした。使用するVivado のバージョンは、2013.2
MFT2013落選、メールで通知が来て、MFT2013に落選しました。とっても残念でした。
2 Mega pixel Camera Module MT9D111 JPEG Out + HQ lens、eBay で注文した”2 Mega pixel Camera Module MT9D111 JPEG Out + HQ lens”が今日届きました。このカメラでディスプレイに表示した。
ZedBoard Linux上でカメラの画像を処理する1(準備編)、ZedBoard Linux上でカメラ画像を処理しようと思う。まずは現状確認と手段の検討をしようと思う。
ZedBoard Linux上でカメラの画像を処理する2(準備編2)、今回は、フレーム・バッファのアドレスをファイルに書いておくようにするのが目的だ。ZedBoardのLinux起動時に、Linuxのペンギンが写っている既存のフレームバッファをアドレスを取得して、カメラ・インターフェイスIPとビットマップ・ディスプレイ・コントローラIPのフレームバッファ・スタート・アドレス・レジスタにWrite するようなCソフトウェアを実行している。そのソフトウェアでフレーム・バッファの開始アドレスをfb_start_addr.txt というファイルに書いておくようにしようと思う。そのために起動時のCソフトウェアを変更した。
ZedBoard Linux上でカメラの画像を処理する3(ラプラシアンフィルタ1)、ラプラシアンフィルタを実行するCのソフトウェア(Laplacian_Filter.c)を作製した。動作を下に示す。
ZedBoard Linux上でカメラの画像を処理する6(ラプラシアンフィルタ4)、Digilent Linux 上でのラプラシアン・フィルタのCソフトウエア完成しました。やった~~~。嬉しいですね。。。
ZedBoard Linux上でカメラの画像を処理する7(ラプラシアンフィルタ5)、mmap() で同時に領域を取らないようにしてみた。つまり、ReadとWriteで同時に mmap() して領域を確保していたが、Readで mmap() を使用して、領域を確保したら、一度、munmap() してから、Write用に mmap() で領域を確保するように書き換えた。
ソフトウエアのプロファイリング2(mmap(), munmap() の時間計測2)、Digilent Linux の起動時に、カメラ・コントローラやビットマップ・ディスプレイ・コントローラにフレーム・バッファの開始アドレスを指定する cam_disp3_linux.c プログラムを修正して、フレーム・バッファを4Kバイト境界から始まるように修正した。mmapの時間を計測した。map time = 29 usec
ソフトウエアのプロファイリング3(最適化)、ラプラシアン・フィルタの実行時間を139秒から37秒に最適化してきた。更に最適化して0.44秒になった。
ソフトウエアのプロファイリング4(ハードウェアと同じ方式)、ハードウェアの実装と近い形にしてきたが、更にハードウェアの実装に近づけることにする。ラプラシアン・フィルタの実行時間は0.39秒。
ラプラシアン・フィルタのCソフトをVivado HLSで、”ソフトウエアのプロファイリング4(ハードウェアと同じ方式)”のラプラシアン・フィルタのCソフトウェアをVivado HLSでコンパイルしてHDLコードの落として使ってみたい。そのため、Cプログラムを修正してVivado HLSでプロジェクトを作製してコンパイルしてみた。そのまま試したので、エラーだった。
Vivado HLSでラプラシアン・フィルタ式のみをaxi lite slaveモジュールにする1、今回は、3x3のラプラシアン・フィルタの式のみを、以前Vivado HLSのサンプルしてやってみた axi lite を元に変更してみようと思う。多分、計算式がとっても簡単なので、ハードウェア化のメリットは無いどころか、ソフトウェアよりも遅くなるかもしれないがやってみようと思う。
  1. 2013年12月28日 05:03 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:0

2013年を振り返る1(1月~6月まで)

2013年を振り返ってみよう。

去年のまとめでもZynqとAXI4バスを中心にブログを書いてきたとあるが、やはり今年も同じだった。そしてVivado IP Integrator や Vivado HLSを使ってみた。来年もこれらを追っていきたいと思っている。
また、Zynq勉強会の資料を作って勉強会をする予定だ。これは2日間程度の内容になると思う。
今年を振り返ってみて、来年につなげるのは重要なことだと思っています。

1月
ZedBoard用CMOSカメラ回路の作製1(単体シミュレーション)、実質的な今年はじめての記事では、CMOSカメラ表示回路のシミュレーションを行っていたのか。。。
筑波山に登って来ました
みやぎ蔵王えぼしスキー場に行って来ました
ZedBoard用CMOSカメラ回路の作製4(XPSプロジェクトの作製)、ZedBoard用CMOSカメラ回路の作製を進めている。もう、今思い返していると、遠い昔のようだ。。。
ZedBoard用CMOSカメラ回路の作製9(ともかく写った)、ともかく写ったのだが、上下が反対に表示されてしまった。カメラの上下を間違えていた。最上位アドレスから減算して表示することにした。
ZedBoard用CMOSカメラボードの作製6(カメラボード改)、正常に表示するには、カメラのインターフェースボードを作り直す必要があったので、作りなおすことにした。
カメラの表示回路及びソフトウェアをSDカードからブートする
ZedBoard Linux のフレームバッファにカメラ画像を表示1(ChipScopeで観察1)、ZedBoard Linux のフレームバッファにカメラ画像を表示するために模索中

2月
ZedBoard用CMOSカメラ回路の作製14(カメラボード改2)、CMOSカメラを正常な向きに取り付けるカメラ・インターフェース・ボードが届いて、テストすると正常に表示された。
ZedBoard用CMOSカメラ回路の作製15(ビットマップ・ディスプレイ・コントローラIPの変更)、 前回は、ZedBoard Linux回路を使用して、Linuxを起動しない状態でカメラ回路が動作するかどうかを確かめてみたがカメラ画像を表示できなかった。原因は、PlanAhead14.4 からハードウェアをエクスポートする際に、エクスポートするフォルダが違っていた。それで動作しなかった。結構これで悩まされた。
ZedBoard Linux のフレームバッファにカメラ画像を表示12(SDカードのイメージ変更)、SDカードのイメージにカメラレジスタ設定プログラムを追加して、Linuxのブート時に自動的に起動するように設定した。まだ、フレーム・バッファのアドレスは固定されている。
ZedBoard Linux のフレームバッファにカメラ画像を表示13(未完成)、現在のSDカードでカメラ表示回路を生かしている状態でも、確率的に動作する状態と、Linuxが死んでしまう状態になってしまうことがわかった。これは、フレーム・バッファがLinuxで動的に取れらているのであたりまえだと今だったらわかっている。
ハンターマウンテン塩原スキー場に行きました
Windows XP 32ビット版からWindows 7 64ビット版に移行
LinuxでISEを使う1(VirtualBox上のUbuntuを使ってISE14.4をインストール)、Linux上でやることなので、ツールもLinxuのを使おうという試みを始めた。
Linux のSDK14.4 からZedBoard をコンフィグレーションし、ソフトを起動した、ソフトウェアが動作して、カメラ画像がディスプレイに出力された。成功だ。

3月
ZedBoardのLinuxカーネルコンパイルのテスト、引き続きUbuntu上でLinuxを使っている。起動時にフレーム・バッファのアドレスを出力するためのカーネルコンパイルのテストをしている。
ZedBoard用Digilent Linuxの解析1(フレームバッファの領域確保)
SDKでDevice Treeを生成する1(Device Tree の概要)デバイス・ツリーの生成をやってみた。
ZedBoard用Digilent LinuxのSysfs、ウィキペディアのSysfs によると、”Sysfs は Linuxカーネル 2.6 によって提供される仮想ファイルシステムである。”だそうだ。
AX4 Master IPにAXI4 Lite Slave インターフェースを追加1(仕様の検討)、CMOSカメラ・インターフェース回路とビットマップ・ディスプレイ・コントローラにフレームバッファのスタートアドレスを指定するためのレジスタを付けようと思っている。これは、ZedBaordのLinux で確保されたフレームバッファ (FB) のスタートアドレスが変わるので、そのアドレスをLinuxから、CMOSカメラ・インターフェース回路とビットマップ・ディスプレイ・コントローラのレジスタに書き込んでおく。そして、その2つのAXI4 Master IPは、レジスタに書かれたFBスタートアドレスからFBを使用する。そうすれば、必ず領域を確保したFBを使用できて、他のLinuxプログラムを破壊することが無くなる。
息子の引越し、息子が大学に合格したので、八王子のアパートに引っ越した。
農林団地の花見、つくば市の農林関係の研究所が集まっている辺りは桜の名所です。今日は上の娘が仙台に帰る日なので、午前中の30分間休暇を取って、久しぶりに家族5人で花見をして来ました。
カメラ・インターフェースIPにAXI4 Lite Slave インターフェースを追加2(シミュレーション)、シミュレーション成功。

4月
AXI4 Master IP にAXI4 Lite Slave を追加1(インプリメント)、カメラ・インターフェイスIP (CamInf IP) とビットマップ・ディスプレイ・コントローラIP (BDC IP) にAXI4 Lite Slave を追加した。
息子の大学入学式

ずっと、Linux上でカメラ画像を写す努力をしていた。

AXI4 Master IP にAXI4 Lite Slave を追加10(ハードウェア完成)、カメラの画像がVGAモニタに表示された。成功だ。。。
かすみがうらマラソン5キロの部に出場
XORShiftを試してみた1(XORShift.vhd)、なひたふさんの月刊 特電技術 第2号に載っている擬似乱数発生回路XORShift を試してみた。
AXI4-Stream のお勉強、AXI VDMA をやるには、AXI4-Stream が避けて通れない。そこで概要を勉強することにした。

5月
画像のフレームバッファ、トリプル・バッファのライフサイクルをシミュレーションすることにした。
Triple Frame Buffer Controller の追加1(仕様の検討)、”画像のフレームバッファ”と”画像のフレームバッファ2(ライフサイクルをシミュレーション)”で分かったことを、実際のZedBoard カメラ回路で確かめてみることにした。
さくらんぼ収穫、さくらんぼジャム、上の娘の小学校卒業記念の記念樹のさくらんぼの木は毎年すごい数のさくらんぼの実を付けます。昨日と今日とさくらんぼを収穫しました。
Triple Frame Buffer Controller の追加5(インプリメント、実機検証)、ディスプレイに表示してみると、正常に表示された。手を画面上で動かしても横筋は見えない。但し、バグがある気がする?画像のフレームレートは 15fps だということがわかった。
AXI VDMAを使ったカメラ表示回路の作製1(構想)、今度は、トリプルバッファリングを行うことができるAXI VDMAを使って、現在、ZedBoardでカメラ画像を表示ているシステムを構成してみようと思う。(そうだ、これはシミュレーションまではやったのだが、FPGA上に実装していない。来年は実装してみたい)
AXI VDMAのお勉強2(Register Direct Mode)、AXI VDMAの勉強を始めた。
チャレンジ筑波に参加しました、今日は中学校から一路、徒歩で筑波山神社を目指し、そこから筑波山の登山道を登って、筑波山の御幸ヶ原へ、そこから女体山の頂上の直下を通って、ロープウェイのつつじケ丘駅に降りて中学校へ帰って来ました。中学校の行事です。
カメラ、ビデオ表示カスタムIPを AX4-Stream に変更1(使用するIPの検討)、現在、AXI4 Master バスを使用して、PS部のDDR3 コントローラにAXI HPポート経由で画像データを書き込んでいたカメラ・インターフェイスIPを、AXI4-Streamバス対応に変更しようと思う。これは、AXI VDMAを使用して、画像データをDMAしようと思っているからだ。
カメラ・インターフェース用AXI4-Stream IPの作製1(仕様の検討)、”カメラ、ビデオ表示カスタムIPを AX4-Stream に変更2(カメラ・インターフェースIP)”で仕様を検討したカメラ・インターフェース用のAXI4-Stream IPを作製しようと思う。(カテゴリをAXI4-Stream IPの作製に変更しました)

6月
Custom Video Timing Controller の作製1(仕様の検討)、AXI4-Stream to Video Outを使用するために、VTC(Video Timing Controller)の代わりになるものとして、Custom Video Timing Controller を作ろうと思う。
Raspberry Pi Camera が来ました
ZedBoard用画像出力IPの作製1(仕様の検討)、前回、”Custom Video Timing Controller の作製3(XPSにAdd IP)”で、custom_vtc が完成したので、今度は、ZedBoardのVGAコネクタと、HDMIコネクタに画像信号を出力するIP (video_out_zed) を作製する。
お祭の神輿用LED配線基板の作製、子供みこしの配線をLED化して、重い鉛バッテリーをモバイルバッテリー化しようということで基板を作っていましたが、一応完成しました。
KiCad 2013-05-31 BZR 4019 でFusionPCBに基板を注文
Rubyスクリプトを Ocra-1.3.0rc1 でEXE化
AXI VDMAのレジスタ設定用AXI Lite Master IPの作製1(仕様の検討)、AXI VDMAのレジスタを設定するコントローラを AXI Lite Master として作製する。MicroBlaze でも良いのだが、MicroBlaze を実装すると大げさになってしまうし、ソフトウェアを初期値としてRAMにロードする手間も必要になる。AXI VDMAのレジスタを設定するだけの AXI Lite Master インターフェースを有した簡単なコントローラを自作することにする。
PlanAheadプロジェクトでUCF を XDC 制約/コマンドに変換する方法
Verilog HDLでの log2 の求め方(Constant Functions in Verilog 2001)
AXI4 Slave インターフェースのメモリ・シミュレーション用 IP の作製1、AXI VDMAをシミュレーションするために何が足りないかというと、メモリのシミュレーション・モデルということになる。これを作った。
ISim で OVL Ver. 2.7 のOVLライブラリのコンパイルと登録
ISim で OVL Ver. 2.7 のOVLライブラリを使用したシミュレーション
さくらんぼ狩りと美味しいお蕎麦、山形市に行ってさくらんぼ狩りをして来ました。その後美味しいお蕎麦を食べて来ました。蔵王の露天風呂に行きました。やはり、川のそばの野趣あふれる露天風呂は最高です。泉質も硫黄の匂いが漂っていて、とっても温泉らしいです。
  1. 2013年12月27日 05:38 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:0

ZedBoard AXI4 Lite Slave 演習9(Verilog版演習マニュアルの続き3)

ZedBoard AXI4 Lite Slave 演習8(Verilog版演習マニュアルの続き2)”の続き。

4. XPSプロジェクトにAXI4 Lite SlaveカスタムIPコアを追加

31. Project NavigatorのFileメニューからOpen Project…を選択して、PS_PL_Tutorialフォルダの下のPS_PL_Tutorial.xiseを選択します。
AXI4_practice_33_131226.png

32. Project Navigatorが起動します。
33. Design -> Hierarchyウインドウのsystem_iをダブルクリックして、XPSプロジェクトを開きます。
AXI4_practice_34_131226.png

34. XPSプロジェクトが開きました。
AXI4_practice_35_131226.png

35. Bus Interfacesタブをクリックします。
AXI4_practice_36_131226.png

36. 次は、Explorerで、parctices\practices_1\kadai\Verilog\led8_axi_lite_slave_v1_00_aフォルダをPS_PL_Tutorial \system\pcoresフォルダにコピーします。
AXI4_practice_37_131226.png

37. XPSプロジェクトに戻って、ProjectメニューからRescan User Repositoriesを選択します。
AXI4_practice_38_131226.png

38. IP CatalogのProject Local PCoresにLED8 AXI Lite Slaveコアが入ったのが見えます。
AXI4_practice_39_131226.png

39. LED8 AXI Lite Slaveコアを右クリックし、右クリックメニューから、Add IPを選択します。
AXI4_practice_40_131226.png

40. Add IP Instance to Designダイアログが出るので、Yesボタンをクリックします。
AXI4_practice_41_131226.png

41. XPS Core Configダイアログが表示されます。User、System、Interconnect Setting for BUFIFの各タブをクリックしてみましょう。OKボタンをクリックします。
AXI4_practice_42_131226.png

42. Instantiate and Connect IP – led8_axi_lite_slave_0ダイアログが表示されます。processing_system7_0にラジオボタンを選択した状態で、OKボタンをクリックします。
AXI4_practice_43_131226.png

43. led8_axi_lite_slave_0がXPSプロジェクトに追加されました。
AXI4_practice_44_131226.png

44. chiscope_axi_monitor_0のMON_AXIのBus Nameをクリックして、led8_axi_lite_slave_0.S_AXIに変更します。(ChipScopeが入ってない人はchiscope_axi_monitor_0の右クリックメニューからDelete Instanceします。ChipScopeが入ってない時は、chipscope_icon_0も右クリックメニューからDelete Instanceして下さい)
AXI4_practice_45_131226.png

45. ポートを接続します。Portsタブをクリックします。
AXI4_practice_46_131226.png

46. LED8bitを外部ポートに接続します。LED8bitを右クリックして、右クリックメニューからMake Externalを選択します。
AXI4_practice_47_131226.png

47. 外部ポートに接続されましたが、名前が長過ぎます。
AXI4_practice_48_131226.png

48. 外部ポートの名前を変更するために、画面を一番上にスクロールします。External Portsの下の、led8_axi_lite_slave_0_LED8bit_pinをクリックすると名前を変更することができます。
AXI4_practice_49_131226.png

49. 名前をLED8bitに変更します。
AXI4_practice_50_131226.png

50. Addressesタブをクリックします。led8_axi_lite_slave_0にアドレスが割り当てられているのが見えます。
AXI4_practice_51_131226.png

51. 接続漏れが無いかどうかを調べます。ProjectメニューからDesign Rule Checkを選択します。
AXI4_practice_52_131226.png

52. エラーが無ければ、XPSプロジェクトは終了です。XPSプロジェクトを閉じて下さい。
AXI4_practice_53_131226.png
  1. 2013年12月26日 07:37 |
  2. AXI4バスの演習資料
  3. | トラックバック:0
  4. | コメント:0

ZedBoard AXI4 Lite Slave 演習8(Verilog版演習マニュアルの続き2)

このカテゴリの前の記事は、”ZedBoard AXI4 Lite Slave 演習7(VHDLバージョンの作製)

ZedBoard AXI4 Lite Slave 演習1”の続き。AXI4 Lite Slave カスタムIPの作り方の演習資料です。

(注)Verilog版とVHDL版に分けた。

2.2 実習回路カスタムIP led8_axi_lite_slave_v1_00_a の追加
10. 用意されているled8_axi_lite_slave_v1_00_aをPS_PL_Tutorial\system\pcoresフォルダに追加します。(Verilog HDL版とVHDL版があるので、好みの方をご使用下さい)
Verilog版はparctices\practices_1\kadai\Verilog の下にあります。
VHDL版はparctices\practices_1\kadai\VHDLの下にあります。
AXI4_practice_25_131225.png

11. ar37425のaxi_lite_slave_v1_00_aフォルダと同様に、led8_axi_lite_slave_v1_00_a フォルダの下のdataフォルダ、docフォルダ、hdlフォルダとその下のフォルダを確認します。
AXI4_practice_26_131225.png

12. 図はVerilog版なのでled_axi_lite_salve_verilogフォルダがあります。VHDL版はled8_axi_lite_salve_vhdlフォルダがあります。これらのフォルダはAXI4 Lite SlaveカスタムIPをシミュレーションするために作ってあります。
13. dataフォルダの下のled8_axi_lite_slave_v2_1_0.mpdファイルを開きます。
14. led8_axi_lite_slave_v2_1_0.mpdファイルを眺めます。Peripheral Optionsの設定があり、次にBus Interfacesの設定があります。VHDLのGenericsまたは、VerilogのParameterの設定があって、Portsの設定があります。
15. Ports設定の最後のLED8bitがコメントアウトされているので、#を削除して戻します。
AXI4_practice_27_131225.png

16. 同じフォルダのled8_axi_lite_slave_v2_1_0.paoファイルを開きます。
17. カスタムIPで使用するファイル名が定義されます。そのファイル名がコメントアウトされているので、##を削除して戻します。
AXI4_practice_28_131225.png

18. 上のled8_axi_lite_slave_v1_00_aフォルダに行って、hdlフォルダに行き、Verilogフォルダに行きます。
19. led8_axi_lite_slave.vを開きます。
20. Write TransactionのAXI4 Lite Slave Write Transaction State Machineがコメントアウトされているので、139行目から169行目までのコメントアウトを解除します。
AXI4_practice_29_131225.png

21. Read TransactionのAXI4 Lite Slave Read Transaction State Machineがコメントアウトされているので、177行目から198行目までのコメントアウトを解除します。
AXI4_practice_30_131225.png

3. 単体シミュレーション
22. Project Navigatorを立ちあげます。
23. parctices\practices_1\kadai\Verilog\led8_axi_lite_slave_v1_00_a\led8_axi_lite_slave_verilogフォルダのled8_axi_lite_slave_verilog.xiseプロジェクトをProject Navigatorから開きます。

24. Design ViewをSimulationになっていない場合には、Simulationに変更します。
AXI4_practice_31_131225.png

25. テストベンチやBFM (Bus Functional Model)を見てみましょう。
26. led8_axi_lite_slave_tbをクリックします。
27. ProcessesウインドウからSimulate Behavioral Modelをダブルクリックしてシミュレーションをスタートします。
28. ISimが起動してシミュレーション波形が表示されます。
AXI4_practice_32_131225.png

29. 波形を拡大して観察しましょう。
30. これで、単体シミュレーションは終了です。ISimを終了します。
  1. 2013年12月25日 04:19 |
  2. AXI4バスの演習資料
  3. | トラックバック:0
  4. | コメント:0

永遠の0(映画)を見てきました

おやじが心臓病で50日間入院していたので映画どころではありませんでした。やっと、心臓弁の置換手術が終わって退院出来たので、久しぶりに映画を見てきました(昨日です)。永遠の0を見てきました。
良かったです。涙が出てしました。
次は、ゼログラビティと武士の献立を見たいですね。
  1. 2013年12月23日 07:21 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

ZedBoard AXI4 Lite Slave 演習7(VHDLバージョンの作製)

ZedBoard AXI4 Lite Slave 演習6(Cソース・ファイルの公開)”の続き。

前回までの AXI4 Lite Slave カスタムIPは、Verilog HDLで書かれていたので、VHDL版を用意する必要がある。今度は、VHDL版を作製しシミュレーションを行った。

下にシミュレーション用のProject Navigator のプロジェクトを示す。
AXI4_practice_23_131223.png

led8_axi_lite_slave.vhd は VHDL で書かれているが、その他のシミュレーション用ファイルは Verilog HDLのままとした。
下にシミュレーション結果を示す。
AXI4_practice_24_131223.png

led8_axi_lite_slave.vhd の VHDL ソース・ファイルを下に示す。

-----------------------------------------------------------------------------
--
-- AXI Lite Slave
--
-- led8_axi_lite_slave
--
-- LED 8bitを制御する
-----------------------------------------------------------------------------

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use ieee.std_logic_misc.all;

--library unisim;
--use unisim.vcomponents.all;

entity led8_axi_lite_slave is
  generic (
    C_S_AXI_ADDR_WIDTH   : integer := 32;
    C_S_AXI_DATA_WIDTH   : integer := 32
    );
  port(
    -- System Signals
    ACLK    : in std_logic;
    ARESETN : in std_logic;

    -- Slave Interface Write Address Ports
    S_AXI_AWADDR   : in  std_logic_vector(C_S_AXI_ADDR_WIDTH-1 downto 0);
    S_AXI_AWPROT   : in  std_logic_vector(3-1 downto 0);
    S_AXI_AWVALID  : in  std_logic;
    S_AXI_AWREADY  : out std_logic;

    -- Slave Interface Write Data Ports
    S_AXI_WDATA  : in  std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0);
    S_AXI_WSTRB  : in  std_logic_vector(C_S_AXI_DATA_WIDTH/8-1 downto 0);
    S_AXI_WVALID : in  std_logic;
    S_AXI_WREADY : out std_logic;

    -- Slave Interface Write Response Ports
    S_AXI_BRESP  : out std_logic_vector(2-1 downto 0);
    S_AXI_BVALID : out std_logic;
    S_AXI_BREADY : in  std_logic;

    -- Slave Interface Read Address Ports
    S_AXI_ARADDR   : in  std_logic_vector(C_S_AXI_ADDR_WIDTH-1 downto 0);
    S_AXI_ARPROT   : in  std_logic_vector(3-1 downto 0);
    S_AXI_ARVALID  : in  std_logic;
    S_AXI_ARREADY  : out std_logic;

    -- Slave Interface Read Data Ports
    S_AXI_RDATA  : out std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0);
    S_AXI_RRESP  : out std_logic_vector(2-1 downto 0);
    S_AXI_RVALID : out std_logic;
    S_AXI_RREADY : in  std_logic;

    -- User Signals
    LED8bit : out std_logic_vector(7 downto 0)
    );

end led8_axi_lite_slave;

architecture implementation of led8_axi_lite_slave is
-- RESP の値の定義
constant RESP_OKAY :    std_logic_vector := "00";
constant RESP_EXOKAY :  std_logic_vector := "01";
constant RESP_SLVERR :  std_logic_vector := "10";
constant RESP_DECERR :  std_logic_vector := "11";

-- Write Transaction State Machine
type WRITE_TRAN_SM is (IDLE_WR, DATA_WIRTE_HOLD, BREADY_ASSERT);
signal wrt_cs : WRITE_TRAN_SM;

-- Read Transaction State Machine
type READ_TRAN_SM is (IDLE_RD, RDATA_WAIT);
signal rdt_cs : READ_TRAN_SM;

-- Registers
signal Commannd_Register :      std_logic_vector(31 downto 0);
signal Counter_Load_Register :  std_logic_vector(31 downto 0);
signal LED_Interval_Resgister : std_logic_vector(31 downto 0);

-- Counters
signal LED_Display_Counter :    std_logic_vector(7 downto 0);
signal LED_Interval_Counter :   std_logic_vector(31 downto 0);

signal awready :        std_logic := '1';
signal bvalid :         std_logic := '0';
signal arready :        std_logic := '1';
signal rvalid :         std_logic := '0';
signal rdata :          std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0);
signal awaddr_hold :    std_logic_vector(C_S_AXI_ADDR_WIDTH-1 downto 0);
signal wready :         std_logic;

begin
    ---- Write Transaction
    -- AXI4 Lite Slave Write Transaction State Machine (Address, Response)
    proc_Write_Tran_SM : process (ACLK) begin
        if ACLK'event and ACLK='1' then
            if ARESETN = '0' then
                wrt_cs <= IDLE_WR;
                awready <= '1';
                bvalid <= '0';
                awaddr_hold <= (others => '0');
                wready <= '0';
            else
                case wrt_cs is
                    when IDLE_WR =>
                        if S_AXI_AWVALID = '1' then -- Write Transaction Start
                            wrt_cs <= DATA_WIRTE_HOLD;
                            awready <= '0';
                            awaddr_hold <= S_AXI_AWADDR;
                            wready <= '1';
                        end if;
                    when DATA_WIRTE_HOLD =>
                        if S_AXI_WVALID = '1' then -- Write data just valid
                            wrt_cs <= BREADY_ASSERT;
                            bvalid <= '1';
                            wready <= '0';
                        end if;
                    when BREADY_ASSERT =>
                        if S_AXI_BREADY = '1' then -- The write transaction was terminated.
                            wrt_cs <= IDLE_WR;
                            bvalid <= '0';
                            awready <= '1';
                        end if;
                end case;
            end if;
        end if;
    end process proc_Write_Tran_SM;
    S_AXI_AWREADY <= awready;
    S_AXI_BVALID <= bvalid;
    S_AXI_BRESP <= RESP_OKAY;
    S_AXI_WREADY <= wready;

    ---- Read Transaction
    -- AXI4 Lite Slave Read Transaction State Machine
    proc_Read_Tran_SM : process (ACLK) begin
        if ACLK'event and ACLK='1' then
            if ARESETN = '0' then
                rdt_cs <= IDLE_RD;
                arready <= '1';
                rvalid <= '0';
            else
                case rdt_cs is
                    when IDLE_RD =>
                        if S_AXI_ARVALID = '1' then
                            rdt_cs <= RDATA_WAIT;
                            arready <= '0';
                            rvalid <= '1';
                        end if;
                    when RDATA_WAIT =>
                        if S_AXI_RREADY = '1' then
                            rdt_cs <= IDLE_RD;
                            arready <= '1';
                            rvalid <= '0';
                        end if;
                end case;
            end if;
        end if;
    end process proc_Read_Tran_SM;
    S_AXI_ARREADY <= arready;
    S_AXI_RVALID <= rvalid;
    S_AXI_RRESP <= RESP_OKAY;

    -- S_AXI_RDATA
    proc_RDATA : process (ACLK) begin
        if ARESETN = '0' then
            rdata <= (others => '0');
        elsif S_AXI_ARVALID = '1' then
            case S_AXI_ARADDR(3 downto 0) is
                when x"0" => rdata <= Commannd_Register;
                when x"4" => rdata <= Counter_Load_Register;
                when x"8" => rdata(31 downto 8) <= x"000000";
                                    rdata(7 downto 0) <= LED_Display_Counter;
                when x"c" => rdata <= LED_Interval_Resgister;
                     when others => 
            end case;
        end if;
    end process proc_RDATA;
    S_AXI_RDATA <= rdata;

    ---- Registeres
    -- Commannd_Register
    -- オフセット0:Command Register(R/W)
    -- ビット0:1 - LEDの値を+1する 0 - LEDの値はそのまま (デフォルト値は0)
    -- ビット31〜1:リザーブ
    proc_Commannd_Register : process (ACLK) begin
        if ACLK'event and ACLK='1' then
            if ARESETN = '0' then
                Commannd_Register <= (others => '0');
            else
                if S_AXI_WVALID='1' and wready='1' and awaddr_hold(3 downto 0)=x"0" then
                    Commannd_Register(0) <= S_AXI_WDATA(0);
                end if;
            end if;
        end if;
    end process proc_Commannd_Register;

    -- Counter_Load_Register
    -- オフセット4:LED Counter Load Register(R/W)
    -- ビット7〜0:8ビット分のLEDの値
    -- ビット31〜8:リザーブ(Read時はすべて0)
    proc_Counter_Load_Register : process (ACLK) begin
        if ACLK'event and ACLK='1' then
            if ARESETN = '0' then
                Counter_Load_Register <= (others => '0');
            else
                if S_AXI_WVALID='1' and wready='1' and awaddr_hold(3 downto 0)=x"4" then
                    Counter_Load_Register(7 downto 0) <= S_AXI_WDATA(7 downto 0);
                end if;
            end if;
        end if;
    end process proc_Counter_Load_Register;

    -- LED_Interval_Resgister
    -- オフセットC:LED Interval Register(R/W)但し、動作クロックは100MHzとする
    -- ビット31〜0:LED値を+1する時のカウント値
    proc_LED_Interval_Resgister : process (ACLK) begin
        if ACLK'event and ACLK='1' then
            if ARESETN = '0' then
                LED_Interval_Resgister <= (others => '0');
            else
                if S_AXI_WVALID='1' and wready='1' and awaddr_hold(3 downto 0)=x"C" then
                    LED_Interval_Resgister <= S_AXI_WDATA;
                end if;
            end if;
        end if;
    end process proc_LED_Interval_Resgister;

    ---- Conteres
    -- LED_Display_Counter
    proc_LED_Display_Counter : process (ACLK) begin
        if ACLK'event and ACLK='1' then
            if ARESETN='0' then
                LED_Display_Counter <= (others => '0');
            else
                if S_AXI_WVALID='1' and wready='1' and awaddr_hold(3 downto 0)=x"4" then -- Counter Load
                    LED_Display_Counter <= S_AXI_WDATA(7 downto 0);
                elsif Commannd_Register(0) = '1' then -- Enable
                    if LED_Interval_Counter = x"00000000" then 
                        LED_Display_Counter <=  std_logic_vector(unsigned(LED_Display_Counter) + 1);
                    end if;
                end if;
            end if;
        end if;
    end process proc_LED_Display_Counter;
    LED8bit <= LED_Display_Counter;

    -- LED_Interval_Counter
    proc_LED_Interval_Counter : process (ACLK) begin
        if ACLK'event and ACLK='1' then
            if ARESETN='0' then
                LED_Interval_Counter <= (others => '0');
            else
                if Commannd_Register(0) = '1' then -- Enable
                    if LED_Interval_Counter = x"00000000" then
                        LED_Interval_Counter <= LED_Interval_Resgister;
                    else
                        LED_Interval_Counter <= std_logic_vector(unsigned(LED_Interval_Counter) - 1);
                    end if;
                else
                    LED_Interval_Counter <= LED_Interval_Resgister;
                end if;
            end if;
        end if;
    end process proc_LED_Interval_Counter;

end implementation;

  1. 2013年12月23日 05:12 |
  2. AXI4バスの演習資料
  3. | トラックバック:0
  4. | コメント:0

ISE14.5以降の ISE で SDK と ChipScope Pro の協調デバックをする方法

ZedBoard AXI4 Lite Slave 演習3(実機テスト)”でSDKとChipScope Pro(以下、ChipScope)を同時に使えなかった。以前は同時に使えたと思ったのだが。。。(ISE14.7を使用している)

そこで、検索してみたところ、Xilinx User Community Forums の”[14.6] SDK and Chipscope do not work together”がヒットした。
それによると、ISE14.4にロールバックして使っているとか。。。どうやらISE14.5からダメになったようだ。
そのページからリンクされたWordファイル、”Launch SDK and Chipscope.docx ‏”にやり方が書いてあったので、実際に確かめてみることにした。

SDK起動

・SDKを立ち上げる、もしくはSDKが立ち上がった状態のとき。

・ZedBoardをJTAGモードで立ち上げる。(MI2~MI6の設定ピンをすべてGNDにする)

・SDKのXilinx Tools -> Program FPGA を選択して、Program FPGAダイアログを出す。

・ビットストリームを選択し、Program ボタンをクリックして、Zynqにビットストリームをダウンロードする。
SDK_ChipScope_1_131221.png

・ZedBoard の青い Done LEDが点灯する。

・SDKで、プロジェクトを選択し、右クリックメニューから Debug As -> Launch on Hardware (System Debuger) を選択する。
SDK_ChipScope_2_131221.png

・SDKをデバック・パースペクティブにするというダイアログが出る。Yesボタンをクリックする。
SDK_ChipScope_3_131221.png

・SDKがデバック・パースペクティブに変更された。
SDK_ChipScope_8_131221.png

ChipScope起動

・Project Navigator に戻って、ChipScope を起動する。
SDK_ChipScope_4_131221.png

・ChipScope が起動する。
SDK_ChipScope_5_131221.png

・JTAG Chain メニューから Open Plug-in... を選択する。
SDK_ChipScope_6_131221.png

・Plug-in Parameters に、xilinx_tcf URL =tcp::3121 と入力して、了解ボタンをクリックする。
SDK_ChipScope_7_131221.png

・FPGAが認識されるので、OKボタンをクリックする。
SDK_ChipScope_9_131221.png

・Dataportが表示されるが、まだ信号名が入っていない。
SDK_ChipScope_10_131221.png

CDCファイルのインポート

・ChipScope の File メニューから Import... を選択する。
SDK_ChipScope_11_131221.png

・system\implementation\chipscope_axi_monitor_0_wapper\chipscope_axi_monitor_0.cdc を選択する。
SDK_ChipScope_12_131221.png

・OKボタンをクリックする。

・信号名が表示された。
SDK_ChipScope_13_131221.png

・これで、SDK, ChipScope協調デバックができた。下の図は、SDKでブレークポイントを設定しながら、AXI4 Lite Slave の応答を ChipScope で確認しているところだ。操作は Tera Term で行っている。
SDK_ChipScope_14_131221.png

(業務連絡)hw_server はすでに立ち上がっていました。
  1. 2013年12月21日 19:24 |
  2. Chipscope
  3. | トラックバック:0
  4. | コメント:2

Vivado HLS 2013.4でラプラシアン・フィルタ関数をaxi masterモジュールにする2

Vivado HLS 2013.4でラプラシアン・フィルタ関数をaxi masterモジュールにする”の続き。

前回、IPをエクスポートできたので、”AXI4 Master アクセスのラプラシアン・フィルタ IP9(できた。完成)”のXPSプロジェクトにVivado HLS生成ラプラシアン・フィルタAXI4 Master IPコアが入っているので、入れ替えた。
Vivado_HLS_2013_4_8_131221.png

Project Navigator に戻って、論理合成、インプリメント、ビットストリームを生成した。
Vivado_HLS_2013_4_8_131221.png

ハードウェアとビットストリームをエクスポートして、SDKを立ち上げた。
Vivado_HLS_2013_4_10_131221.png

SDKでSDカードのブートイメージを生成して、SDカードに書いて、ZedBoardをブートした。

SDKからリモートデバックで、ZedBoardに接続して、制御ソフトウェアを起動したが、リターンが帰ってこなかった。
残念ながら動作しなかったようだ。

Vivado HLS 2013.4でラプラシアン・フィルタ関数をaxi masterモジュールにする3”に続く。
  1. 2013年12月21日 05:44 |
  2. Vivado HLS
  3. | トラックバック:0
  4. | コメント:0

Vivado HLS 2013.4でラプラシアン・フィルタ関数をaxi masterモジュールにする

”Vivado HLS 2013.3でラプラシアン・フィルタ関数をaxi masterモジュールにする”の続き。

(2013/12/21:ラプラシアン・フィルタのバグを修正したため、3つのVivado HLS で扱っているCソース・ファイルが違ってしまったので、前のバージョンの結果をやり直しました。)

一昨日、Vivado 2013.4 が出たので、再度、Vivado HLS でC言語からラプラシアン・フィルタのAXI4 Master IPを生成した。

C Simulation は、通常モードだとものすごく時間がかかっていたので中断したが、Debugモードでは成功した。
Vivado_HLS_2013_4_1_131219.png

C Synthesis の Utilization Estimates の結果を下に示す。
Vivado_HLS_2013_4_2_131219.png

Vivado HLS 2013.3 の時の C Synthesis の Utilization Estimates の結果を下に示す。
Vivado_HLS_2013_4_6_131220.png

Vivado HLS 2013.2 のC Synthesis のレポートを示す。
Vivado_HLS_2013_4_5_131220.png


3種3様なのだが、特にDSP48Eの数が極端に違っている。
Cのソフトウェアは、3つとも同じものだ。(”Vivado HLS 2013.3でラプラシアン・フィルタ関数をaxi masterモジュールにする”)

Export RTLを行った後の Vivado_HLS\lap_filter_axim\solution1\impl\pcores\lap_filter_axim_top_v1_00_a\synhdl\verilog フォルダを下に示す(Vivado HLS 2013.4の生成したVerilog HDLファイル)
Vivado_HLS_2013_4_3_131219.png

次に、Vivado HLS 2013.3 で生成したIPの Verilog HDL ファイルの内容を下に示す。
Vivado_HLS_2013_4_7_131221.png

2013.3から2013.4の差分を見ると、1つの Verilog HDL ファイルが増えた。

lap_filter_axim_urem_12ns_12ns_12_15.v

  1. 2013年12月20日 03:47 |
  2. Vivado HLS
  3. | トラックバック:0
  4. | コメント:0

ZedBoard AXI4 Lite Slave 演習6(Cソース・ファイルの公開)

ZedBoard AXI4 Lite Slave 演習5(MPD と PAO ファイルの公開)”の続き。

今日は、Cソース・ファイルを貼っておく (led8_axi_lite_slave.c)。

/* * led8_axi_lite_slave.c * *  Created on: 2013/12/16 *      Author: Masaaki */

#include <stdio.h>
#include "xil_types.h"
#include "xtmrctr.h"
#include "xparameters.h"
#include "xil_io.h"
#include "xil_exception.h"
#include "xscugic.h"

#define LED8_AXILS_BASEADDR XPAR_LED8_AXI_LITE_SLAVE_0_S_AXI_RNG00_BASEADDR

extern char inbyte(void);

int main() {
    int inbyte_in;
    int val;
    char str[80];

    while(1){
        print("********************** LED8 TEST Start ***********************\n\r");
        print("TeraTerm: Please Set Local Echo Mode.\n\r");
        print("Press '1' to show all registers\n\r");
        print("Press '2' to set LED8 Enable or Disable(Toggle, Command Register)\n\r");
        print("Press '3' to set LED Counter Load Register (8bits, Please input hexadecimal)\n\r");
        print("Press '4' to set LED Interval Register (32bits, Please input decimal)\n\r");
        print("Press '5' to exit\n\r");
        print("Selection : ");
        inbyte_in = inbyte();
        print(" \r\n");
        print(" \r\n");

        switch(inbyte_in) {
            case '1' : // Show all registers
                val = (int)Xil_In32((u32)LED8_AXILS_BASEADDR);
                printf("Command Register is %x\r\n", val);
                val = (int)Xil_In32((u32)(LED8_AXILS_BASEADDR+4));
                printf("LED Counter Load Register is %x\r\n", val);
                val = (int)Xil_In32((u32)(LED8_AXILS_BASEADDR+8));
                printf("LED Monitor Register is %x\r\n", val);
                val = (int)Xil_In32((u32)(LED8_AXILS_BASEADDR+0xc));
                printf("LED Interval Register is %d (decimal)\r\n", val);
                break;
            case '2' : // Set LED8 Enable or Disable(Toggle, Command Register)
                val = (int)Xil_In32((u32)LED8_AXILS_BASEADDR);
                if (val & 1) {
                    Xil_Out32((u32)LED8_AXILS_BASEADDR, (u32)0);
                    print("LED8 count is Disable\n\r");
                } else {
                    Xil_Out32((u32)LED8_AXILS_BASEADDR, (u32)1);
                    print("LED8 count is Enable\n\r");
                }
                break;
            case '3' : // Set LED Counter Load Register (8bits, Please input hexadecimal)
                print("Please input LED Counter Load Register value (hexadecimal)");
                scanf("%x", &val);
                Xil_Out32((u32)(LED8_AXILS_BASEADDR+4), (u32)val);
                print(" \r\n");
                break;
            case '4' : // Set LED Interval Register (32bits, Please input hexadecimal)
                print("Please input LED Interval Load Register value (decimal) ");
                scanf("%d", &val);
                Xil_Out32((u32)(LED8_AXILS_BASEADDR+0xc), (u32)val);
                print(" \r\n");
                break;
            case '5' : // exit
                print("exit\r\n");
                return 0;
        }
        print(" \r\n");
    }

}

  1. 2013年12月19日 04:52 |
  2. AXI4バスの演習資料
  3. | トラックバック:0
  4. | コメント:0

ZedBoard AXI4 Lite Slave 演習5(MPD と PAO ファイルの公開)

ZedBoard AXI4 Lite Slave 演習4(Verilog HDL と UCF ソースの公開)”の続き。

今回は、MPDファイルとPAOファイルを貼っておく。MUIファイルはテンプレートのまま使用している。
まずは、MPDファイルを貼っておく (led8_axi_lite_slave_v2_1_0.mpd) 。

#-- DISCLAIMER OF LIABILITY
#--
#-- This file contains proprietary and confidential information of
#-- Xilinx, Inc. ("Xilinx"), that is distributed under a license
#-- from Xilinx, and may be used, copied and/or disclosed only
#-- pursuant to the terms of a valid license agreement with Xilinx.
#--
#-- XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION
#-- ("MATERIALS") "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
#-- EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING WITHOUT
#-- LIMITATION, ANY WARRANTY WITH RESPECT TO NONINFRINGEMENT,
#-- MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE. Xilinx
#-- does not warrant that functions included in the Materials will
#-- meet the requirements of Licensee, or that the operation of the
#-- Materials will be uninterrupted or error-free, or that defects
#-- in the Materials will be corrected. Furthermore, Xilinx does
#-- not warrant or make any representations regarding use, or the
#-- results of the use, of the Materials in terms of correctness,
#-- accuracy, reliability or otherwise.
#--
#-- Xilinx products are not designed or intended to be fail-safe,
#-- or for use in any application requiring fail-safe performance,
#-- such as life-support or safety devices or systems, Class III
#-- medical devices, nuclear facilities, applications related to
#-- the deployment of airbags, or any other applications that could
#-- lead to death, personal injury or severe property or
#-- environmental damage (individually and collectively, "critical
#-- applications"). Customer assumes the sole risk and liability
#-- of any use of Xilinx products in critical applications,
#-- subject only to applicable laws and regulations governing
#-- limitations on product liability.
#--
#-- Copyright (c) 1995-2010 Xilinx, Inc. All rights reserved.
#--
#-- This disclaimer and copyright notice must be retained as part
#-- of this file at all times.
#--
###################################################################
##
## Name : led8_axi_lite_slave
## Desc : Microprocessor Peripheral Description
## : Automatically generated by PsfUtility
##
###################################################################

BEGIN led8_axi_lite_slave

## Peripheral Options
OPTION IPTYPE = PERIPHERAL
OPTION IMP_NETLIST = TRUE
OPTION STYLE = HDL
OPTION DESC = LED8 AXI Lite Slave
OPTION LONG_DESC = LED 8bit AXI4-Lite Slave
OPTION HDL = MIXED
OPTION RUN_NGCBUILD = FALSE

## Bus Interfaces
BUS_INTERFACE BUS = S_AXI, BUS_STD = AXI, BUS_TYPE = SLAVE

## Generics for VHDL or Parameters for Verilog
PARAMETER C_S_AXI_ADDR_WIDTH = 32, DT = integer, ASSIGNMENT = CONSTANT, BUS = S_AXI
PARAMETER C_S_AXI_DATA_WIDTH = 32, DT = integer, ASSIGNMENT = CONSTANT, BUS = S_AXI
PARAMETER C_S_AXI_PROTOCOL = AXI4Lite, DT = string, TYPE = NON_HDL, ASSIGNMENT = CONSTANT, BUS = S_AXI
PARAMETER C_S_AXI_SUPPORTS_READ = 1, DT = integer, RANGE = (0,1), TYPE = NON_HDL, ASSIGNMENT = OPTIONAL_UPDATE, BUS = S_AXI
PARAMETER C_S_AXI_SUPPORTS_WRITE = 1, DT = integer, RANGE = (0,1), TYPE = NON_HDL, ASSIGNMENT = OPTIONAL_UPDATE, BUS = S_AXI
PARAMETER C_S_AXI_NUM_ADDR_RANGES = 1, BUS = S_AXI, DT = INTEGER, ASSIGNMENT = OPTIONAL_UPDATE, TYPE = NON_HDL, RANGE = (1:4)
PARAMETER C_S_AXI_RNG00_BASEADDR = 0xFFFFFFFF, BUS = S_AXI, DT = std_logic_vector, ADDRESS = BASE, PAIR = C_S_AXI_RNG00_HIGHADDR, ISVALID = (C_S_AXI_NUM_ADDR_RANGES >= 1), TYPE = NON_HDL, MIN_SIZE = 0x1000
PARAMETER C_S_AXI_RNG00_HIGHADDR = 0x00000000, BUS = S_AXI, DT = std_logic_vector, ADDRESS = HIGH, PAIR = C_S_AXI_RNG00_BASEADDR, ISVALID = (C_S_AXI_NUM_ADDR_RANGES >= 1), TYPE = NON_HDL
PARAMETER C_S_AXI_RNG01_BASEADDR = 0xFFFFFFFF, BUS = S_AXI, DT = std_logic_vector, ADDRESS = BASE, PAIR = C_S_AXI_RNG01_HIGHADDR, ISVALID = (C_S_AXI_NUM_ADDR_RANGES >= 2), TYPE = NON_HDL, MIN_SIZE = 0x1000
PARAMETER C_S_AXI_RNG01_HIGHADDR = 0x00000000, BUS = S_AXI, DT = std_logic_vector, ADDRESS = HIGH, PAIR = C_S_AXI_RNG01_BASEADDR, ISVALID = (C_S_AXI_NUM_ADDR_RANGES >= 2), TYPE = NON_HDL
PARAMETER C_S_AXI_RNG02_BASEADDR = 0xFFFFFFFF, BUS = S_AXI, DT = std_logic_vector, ADDRESS = BASE, PAIR = C_S_AXI_RNG02_HIGHADDR, ISVALID = (C_S_AXI_NUM_ADDR_RANGES >= 3), TYPE = NON_HDL, MIN_SIZE = 0x1000
PARAMETER C_S_AXI_RNG02_HIGHADDR = 0x00000000, BUS = S_AXI, DT = std_logic_vector, ADDRESS = HIGH, PAIR = C_S_AXI_RNG02_BASEADDR, ISVALID = (C_S_AXI_NUM_ADDR_RANGES >= 3), TYPE = NON_HDL
PARAMETER C_S_AXI_RNG03_BASEADDR = 0xFFFFFFFF, BUS = S_AXI, DT = std_logic_vector, ADDRESS = BASE, PAIR = C_S_AXI_RNG03_HIGHADDR, ISVALID = (C_S_AXI_NUM_ADDR_RANGES >= 4), TYPE = NON_HDL, MIN_SIZE = 0x1000
PARAMETER C_S_AXI_RNG03_HIGHADDR = 0x00000000, BUS = S_AXI, DT = std_logic_vector, ADDRESS = HIGH, PAIR = C_S_AXI_RNG03_BASEADDR, ISVALID = (C_S_AXI_NUM_ADDR_RANGES >= 4), TYPE = NON_HDL

## Ports
PORT ACLK = "", BUS = S_AXI, DIR = I, SIGIS = CLK
PORT ARESETN = ARESETN, BUS = S_AXI, DIR = I, SIGIS = RST
PORT S_AXI_AWADDR = AWADDR, BUS = S_AXI, DIR = I, VEC = [(C_S_AXI_ADDR_WIDTH-1):0]
PORT S_AXI_AWPROT = AWPROT, BUS = S_AXI, DIR = I, VEC = [2:0]
PORT S_AXI_AWVALID = AWVALID, BUS = S_AXI, DIR = I
PORT S_AXI_AWREADY = AWREADY, BUS = S_AXI, DIR = O
PORT S_AXI_WDATA = WDATA, BUS = S_AXI, DIR = I, VEC = [(C_S_AXI_DATA_WIDTH-1):0]
PORT S_AXI_WSTRB = WSTRB, BUS = S_AXI, DIR = I, VEC = [((C_S_AXI_DATA_WIDTH/8) -1):0]
PORT S_AXI_WVALID = WVALID, BUS = S_AXI, DIR = I
PORT S_AXI_WREADY = WREADY, BUS = S_AXI, DIR = O
PORT S_AXI_BRESP = BRESP, BUS = S_AXI, DIR = O, VEC = [1:0]
PORT S_AXI_BVALID = BVALID, BUS = S_AXI, DIR = O
PORT S_AXI_BREADY = BREADY, BUS = S_AXI, DIR = I
PORT S_AXI_ARADDR = ARADDR, BUS = S_AXI, DIR = I, VEC = [(C_S_AXI_ADDR_WIDTH-1):0
PORT S_AXI_ARPROT = ARPROT, BUS = S_AXI, DIR = I, VEC = [2:0]
PORT S_AXI_ARVALID = ARVALID, BUS = S_AXI, DIR = I
PORT S_AXI_ARREADY = ARREADY, BUS = S_AXI, DIR = O
PORT S_AXI_RDATA = RDATA, BUS = S_AXI, DIR = O, VEC = [(C_S_AXI_DATA_WIDTH-1):0]
PORT S_AXI_RRESP = RRESP, BUS = S_AXI, DIR = O, VEC = [1:0]
PORT S_AXI_RVALID = RVALID, BUS = S_AXI, DIR = O
PORT S_AXI_RREADY = RREADY, BUS = S_AXI, DIR = I

PORT LED8bit = "", DIR = O, VEC = [7:0]
END


次に、PAO ファイルを貼っておく (led8_axi_lite_slave_v2_1_0.pao)。

## -- DISCLAIMER OF LIABILITY
## --
## -- This file contains proprietary and confidential information of
## -- Xilinx, Inc. ("Xilinx"), that is distributed under a license
## -- from Xilinx, and may be used, copied and/or disclosed only
## -- pursuant to the terms of a valid license agreement with Xilinx.
## --
## -- XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION
## -- ("MATERIALS") "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
## -- EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING WITHOUT
## -- LIMITATION, ANY WARRANTY WITH RESPECT TO NONINFRINGEMENT,
## -- MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE. Xilinx
## -- does not warrant that functions included in the Materials will
## -- meet the requirements of Licensee, or that the operation of the
## -- Materials will be uninterrupted or error-free, or that defects
## -- in the Materials will be corrected. Furthermore, Xilinx does
## -- not warrant or make any representations regarding use, or the
## -- results of the use, of the Materials in terms of correctness,
## -- accuracy, reliability or otherwise.
## --
## -- Xilinx products are not designed or intended to be fail-safe,
## -- or for use in any application requiring fail-safe performance,
## -- such as life-support or safety devices or systems, Class III
## -- medical devices, nuclear facilities, applications related to
## -- the deployment of airbags, or any other applications that could
## -- lead to death, personal injury or severe property or
## -- environmental damage (individually and collectively, "critical
## -- applications"). Customer assumes the sole risk and liability
## -- of any use of Xilinx products in critical applications,
## -- subject only to applicable laws and regulations governing
## -- limitations on product liability.
## --
## -- Copyright 2009 Xilinx, Inc.
## -- All rights reserved.
## --
## -- This disclaimer and copyright notice must be retained as part
## -- of this file at all times.
##
###############################################################################
##
## axi_lite_slave_v2_1_0.pao
##
## Peripheral Analyze Order File
##
##
###############################################################################


lib led8_axi_lite_slave_v1_00_a led8_axi_lite_slave.v verilog

  1. 2013年12月19日 04:50 |
  2. AXI4バスの演習資料
  3. | トラックバック:0
  4. | コメント:0

ZedBoard AXI4 Lite Slave 演習4(Verilog HDL と UCF ソースの公開)

ZedBoard AXI4 Lite Slave 演習3(実機テスト)”の続き。

Verilog HDL と UCF ソースをブログに貼っておく。
まずは、led8_axi_lite_slave.v から下に示す。

//-----------------------------------------------------------------------------
//-- (c) Copyright 2010 Xilinx, Inc. All rights reserved.
//--
//-- This file contains confidential and proprietary information
//-- of Xilinx, Inc. and is protected under U.S. and
//-- international copyright and other intellectual property
//-- laws.
//--
//-- DISCLAIMER
//-- This disclaimer is not a license and does not grant any
//-- rights to the materials distributed herewith. Except as
//-- otherwise provided in a valid license issued to you by
//-- Xilinx, and to the maximum extent permitted by applicable
//-- law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND
//-- WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES
//-- AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING
//-- BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON-
//-- INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and
//-- (2) Xilinx shall not be liable (whether in contract or tort,
//-- including negligence, or under any other theory of
//-- liability) for any loss or damage of any kind or nature
//-- related to, arising under or in connection with these
//-- materials, including for any direct, or any indirect,
//-- special, incidental, or consequential loss or damage
//-- (including loss of data, profits, goodwill, or any type of
//-- loss or damage suffered as a result of any action brought
//-- by a third party) even if such damage or loss was
//-- reasonably foreseeable or Xilinx had been advised of the
//-- possibility of the same.
//--
//-- CRITICAL APPLICATIONS
//-- Xilinx products are not designed or intended to be fail-
//-- safe, or for use in any application requiring fail-safe
//-- performance, such as life-support or safety devices or
//-- systems, Class III medical devices, nuclear facilities,
//-- applications related to the deployment of airbags, or any
//-- other applications that could lead to death, personal
//-- injury, or severe property or environmental damage
//-- (individually and collectively, "Critical
//-- Applications"). Customer assumes the sole risk and
//-- liability of any use of Xilinx products in Critical
//-- Applications, subject only to applicable laws and
//-- regulations governing limitations on product liability.
//--
//-- THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS
//-- PART OF THIS FILE AT ALL TIMES.
//-----------------------------------------------------------------------------
//
// AXI Lite Slave
//
// Verilog-standard:  Verilog 2001
//--------------------------------------------------------------------------
//
// Structure:
//   led8_axi_lite
//
// LED 8bitを制御する
//--------------------------------------------------------------------------

`default_nettype none

module led8_axi_lite_slave #(
    parameter integer C_S_AXI_ADDR_WIDTH            = 32,
    parameter integer C_S_AXI_DATA_WIDTH            = 32
)(
    // System Signals
    input wire ACLK,
    input wire ARESETN,

    // Slave Interface Write Address Ports
    input  wire [C_S_AXI_ADDR_WIDTH-1:0]   S_AXI_AWADDR,
    input  wire [3-1:0]                    S_AXI_AWPROT,
    input  wire                            S_AXI_AWVALID,
    output wire                            S_AXI_AWREADY,

    // Slave Interface Write Data Ports
    input  wire [C_S_AXI_DATA_WIDTH-1:0]   S_AXI_WDATA,
    input  wire [C_S_AXI_DATA_WIDTH/8-1:0] S_AXI_WSTRB,
    input  wire                            S_AXI_WVALID,
    output wire                            S_AXI_WREADY,

    // Slave Interface Write Response Ports
    output wire [2-1:0]                    S_AXI_BRESP,
    output wire                            S_AXI_BVALID,
    input  wire                            S_AXI_BREADY,

    // Slave Interface Read Address Ports
    input  wire [C_S_AXI_ADDR_WIDTH-1:0]   S_AXI_ARADDR,
    input  wire [3-1:0]                    S_AXI_ARPROT,
    input  wire                            S_AXI_ARVALID,
    output wire                            S_AXI_ARREADY,

    // Slave Interface Read Data Ports
    output wire [C_S_AXI_DATA_WIDTH-1:0]   S_AXI_RDATA,
    output wire [2-1:0]                    S_AXI_RRESP,
    output wire                            S_AXI_RVALID,
    input  wire                            S_AXI_RREADY,

    // User Signals
    output  wire    [7:0]                  LED8bit
);

    // RESP の値の定義
    parameter    RESP_OKAY =        2'b00;
    parameter    RESP_EXOKAY =    2'b01;
    parameter    RESP_SLVERR =     2'b10;
    parameter    RESP_DECERR =    2'b11;

    // Write Address Transaction State Machine
    parameter    IDLE_WR =            2'b00,    // for wrt_cs
                DATA_WRITE_HOLD =    2'b01,
                BREADY_ASSERT =        2'b11;
    reg        [1:0]    wrt_cs = IDLE_WR;

    // Read Transaction State Machine
    parameter    IDLE_RD    =        1'b0,    //  for rdt_cs
                 RDATA_WAIT =    1'b1;
    reg            rdt_cs = IDLE_RD;

    // Registers
    reg        [31:0]    Commannd_Register;
    reg        [31:0]    Counter_Load_Register;
    reg        [31:0]    LED_Interval_Resgister;

    // Counter
    reg        [7:0]    LED_Display_Counter;
    reg        [31:0]    LED_Interval_Counter;

    reg        awready = 1'b1;
    reg        bvalid = 1'b0;
    reg        arready = 1'b1;
    reg        rvalid = 1'b0;
    reg     [C_S_AXI_DATA_WIDTH-1:0]    rdata;
    reg        [C_S_AXI_ADDR_WIDTH-1:0]    awaddr_hold;
    reg        wready;

    //// Write Transaction
    // AXI4 Lite Slave Write Transaction State Machine (Address, Response)
    always @(posedge ACLK) begin : proc_Write_Tran_SM
        if (~ARESETN) begin
            wrt_cs <= IDLE_WR;
            awready <= 1'b1;
            bvalid <= 1'b0;
            awaddr_hold <= 0;
            wready <= 1'b0;
        end else begin
            case (wrt_cs)
                IDLE_WR :
                    if (S_AXI_AWVALID) begin    // Write Transaction Start
                        wrt_cs <= DATA_WRITE_HOLD;
                        awready <= 1'b0;
                        awaddr_hold <= S_AXI_AWADDR;
                        wready <= 1'b1;
                    end
                DATA_WRITE_HOLD :
                    if (S_AXI_WVALID) begin    // Write data just valid
                        wrt_cs <= BREADY_ASSERT;
                        bvalid <= 1'b1;
                        wready <= 1'b0;
                    end
                BREADY_ASSERT :
                    if (S_AXI_BREADY) begin    // The write transaction was terminated.
                        wrt_cs <= IDLE_WR;
                        bvalid <= 1'b0;
                        awready <= 1'b1;
                    end
            endcase
        end
    end
    assign S_AXI_AWREADY = awready;
    assign S_AXI_BVALID = bvalid;
    assign S_AXI_BRESP = RESP_OKAY;
    assign S_AXI_WREADY = wready;

    //// Read Transaction
    // AXI4 Lite Slave Read Transaction State Machine
    always @(posedge ACLK) begin : proc_Read_Tran_SM
        if (~ARESETN) begin
            rdt_cs <= IDLE_RD;
            arready <= 1'b1;
            rvalid <= 1'b0;
        end else begin
            case (rdt_cs)
                IDLE_RD :
                    if (S_AXI_ARVALID) begin
                        rdt_cs <= RDATA_WAIT;
                        arready <= 1'b0;
                        rvalid <= 1'b1;
                    end
                RDATA_WAIT :
                    if (S_AXI_RREADY) begin
                        rdt_cs <= IDLE_RD;
                        arready <= 1'b1;
                        rvalid <= 1'b0;
                    end
            endcase
        end
    end
    assign S_AXI_ARREADY = arready;
    assign S_AXI_RVALID = rvalid;
    assign S_AXI_RRESP = RESP_OKAY;

    // S_AXI_RDATA
    always @(posedge ACLK) begin : proc_RDATA
       if(~ARESETN) begin
            rdata <= 32'd0;
       end else if (S_AXI_ARVALID) begin
            case (S_AXI_ARADDR[3:0])
                4'h0 : rdata <= Commannd_Register;
                4'h4 : rdata <= Counter_Load_Register;
                4'h8 : rdata <= {24'd0, LED_Display_Counter};
                4'hC : rdata <= LED_Interval_Resgister;
            endcase
       end
    end
    assign S_AXI_RDATA = rdata;

    //// Registeres
    // Commannd_Register
    // オフセット0:Command Register(R/W)
    // ビット0:1 - LEDの値を+1する 0 - LEDの値はそのまま (デフォルト値は0)
    // ビット31〜1:リザーブ
    always @(posedge ACLK) begin : proc_Commannd_Register
       if(~ARESETN) begin
            Commannd_Register <= 32'd0;
       end else begin
            if (S_AXI_WVALID==1'b1 && wready==1'b1 && awaddr_hold[3:0]==4'h0)
                Commannd_Register[0] <= S_AXI_WDATA[0];
       end
    end

    // Counter_Load_Register
    // オフセット4:LED Counter Load Register(R/W)
    // ビット7〜0:8ビット分のLEDの値
    // ビット31〜8:リザーブ(Read時はすべて0)
    always @(posedge ACLK) begin : proc_Counter_Load_Register
       if(~ARESETN) begin
            Counter_Load_Register <= 32'd0;
       end else begin
            if (S_AXI_WVALID==1'b1 && wready==1'b1 && awaddr_hold[3:0]==4'h4)
                Counter_Load_Register[7:0] <= S_AXI_WDATA[7:0];
       end
    end

    // LED_Interval_Resgister
    // オフセットC:LED Interval Register(R/W)但し、動作クロックは100MHzとする
    // ビット31〜0:LED値を+1する時のカウント値
    always @(posedge ACLK) begin : proc_LED_Interval_Resgister
       if(~ARESETN) begin
            LED_Interval_Resgister <= 32'd0;
       end else begin
            if (S_AXI_WVALID==1'b1 && wready==1'b1 && awaddr_hold[3:0]==4'hC)
                LED_Interval_Resgister <= S_AXI_WDATA;
       end
    end

    //// Conteres
    // LED_Display_Counter
    always @(posedge ACLK) begin : proc_LED_Display_Counter
       if(~ARESETN) begin
            LED_Display_Counter <= 8'd0;
       end else begin
              if (S_AXI_WVALID==1'b1 && wready==1'b1 && awaddr_hold[3:0]==4'h4) // Counter Load
                  LED_Display_Counter <= S_AXI_WDATA[7:0];
               else if (Commannd_Register[0]) begin // Enable
                if (LED_Interval_Counter == 32'd0)
                    LED_Display_Counter <= LED_Display_Counter + 8'd1;
            end
       end
    end
    assign LED8bit = LED_Display_Counter;

    // LED_Interval_Counter
    always @(posedge ACLK) begin : proc_LED_Interval_Counter
       if(~ARESETN) begin
            LED_Interval_Counter <= 32'd0;
       end else begin
            if (Commannd_Register[0]) begin // Enable
                if (LED_Interval_Counter == 32'd0)
                    LED_Interval_Counter <= LED_Interval_Resgister;
                else
                    LED_Interval_Counter <= LED_Interval_Counter - 32'd1;
            end else
                LED_Interval_Counter <= LED_Interval_Resgister;
       end
    end
endmodule

`default_nettype wire


次に、system_top.ucf を示す。

NET "axi_gpio_0_GPIO_IO_pin" LOC = T18;
NET "axi_gpio_0_GPIO_IO_pin" IOSTANDARD = LVCMOS25;
NET "processing_system7_0_GPIO_pin" LOC = R18;
NET "processing_system7_0_GPIO_pin" IOSTANDARD = LVCMOS25;

# PlanAhead Generated IO constraints

NET "LED8bit[7]" IOSTANDARD = LVCMOS33;
NET "LED8bit[6]" IOSTANDARD = LVCMOS33;
NET "LED8bit[5]" IOSTANDARD = LVCMOS33;
NET "LED8bit[4]" IOSTANDARD = LVCMOS33;
NET "LED8bit[3]" IOSTANDARD = LVCMOS33;
NET "LED8bit[2]" IOSTANDARD = LVCMOS33;
NET "LED8bit[1]" IOSTANDARD = LVCMOS33;
NET "LED8bit[0]" IOSTANDARD = LVCMOS33;

# PlanAhead Generated physical constraints

NET "LED8bit[0]" LOC = T22;
NET "LED8bit[1]" LOC = T21;
NET "LED8bit[2]" LOC = U22;
NET "LED8bit[3]" LOC = U21;
NET "LED8bit[4]" LOC = V22;
NET "LED8bit[5]" LOC = W22;
NET "LED8bit[6]" LOC = U19;
NET "LED8bit[7]" LOC = U14;

  1. 2013年12月19日 04:45 |
  2. AXI4バスの演習資料
  3. | トラックバック:0
  4. | コメント:0

ZedBoard AXI4 Lite Slave 演習3(実機テスト)

ZedBoard AXI4 Lite Slave 演習3(インプリメント)”の続き。

前回、インプリメントが終了した。今回は、ハードウェアをSDKにエクスポートして、SDKを立ちあげソフトウェアを作製した。そして、ZedBoardにビットストリームをダウンロードし、ソフトウェアを実行して実行した。

LEDはインクリメントしても、なかなかReadが出来なかった。それは、下のリストで case 文の S_AXI_ARADDR[3:0] の [3:0] が抜けいていたことだった。比較する物のビット幅が合わずに適当にアサインされてしまったようだ。VHDLだったらエラーが出ていたんだが、1日くらい気づかなかった。。。残念。。。

    // S_AXI_RDATA
    always @(posedge ACLK) begin : proc_RDATA
       if(~ARESETN) begin
            rdata <= 32'd0;
       end else if (S_AXI_ARVALID) begin
            case (S_AXI_ARADDR[3:0])
                4'h0 : rdata <= Commannd_Register;
                4'h4 : rdata <= Counter_Load_Register;
                4'h8 : rdata <= {24'd0, LED_Display_Counter};
                4'hC : rdata <= LED_Interval_Resgister;
            endcase
       end
    end
    assign S_AXI_RDATA = rdata;



・XPSプロジェクトをProject Navigator のHierarchy ウインドウ上で選択して、Processes ウインドウから Export Hardware Design To SDK with Bitstream を選択して、ハードウェアをエクスポートしてSDKを立ち上げる。
AXI4_practice_20_131218.png

・SDKが立ち上がったら、ワークスペースを選択した。

・ソフトウェアを作ってコンパイルした。

・Xilinx Tools から Program FPGA を選択してビットストリームをZedBoardにダウンロードした。(その際に、指定するビットストリームは、PS_PL_Tutorial\system\implementation\system.bit が良いようだ。これは、ビットストリームを伴ってエクスポートする際に、エクスポートするフォルダがずれることがあるからだ)

・Run Configuration を作製して、Runする。

下に、SDKの様子を示す。
AXI4_practice_21_131218.png

Tera Termを起動して、ソフトウェアを実行している様子を下に示す。
AXI4_practice_22_131218.png

LED Interval Register に 50000000 をセットして、0.5秒に1回、LEDの2進数の値を+1している。

実際の動作風景を動画に取ったので、貼っておく。


今回は、Verilog HDL版を作ったので、次は、VHDL版を作る。
  1. 2013年12月18日 22:16 |
  2. AXI4バスの演習資料
  3. | トラックバック:0
  4. | コメント:0

ZedBoard AXI4 Lite Slave 演習3(インプリメント)

ZedBoard AXI4 Lite Slave 演習2(シミュレーション)”の続き。

前回、LED8表示回路の単体でのシミュレーションが成功した。今回は、AXI4 Lite Slave カスタムIPとして、設定ファイルを書いて、XPSプロジェクトにAdd IPし、Project Navigator に戻ってインプリメントを行った。

XPSプロジェクトで、MPDファイル、PAOファイルを書いてAdd IPを行った。(MUIファイルはテンプレートのまま)
下にXPSプロジェクトの各タプの様子を示す。
AXI4_practice_15_131217.png

AXI4_practice_16_131217.png

AXI4_practice_17_131217.png

これで、XPSプロジェクトは終了なので、Project Navigator に戻って、User Constraints -> I/O Pin Planning (PlanAhead) - Pre-Synthesis を選択して、PlanAhead を起動して、LED8bit のIOピンの割り当てを行った。
AXI4_practice_18_131217.png

system.ucf を示す。

NET "axi_gpio_0_GPIO_IO_pin" LOC = T18;
NET "axi_gpio_0_GPIO_IO_pin" IOSTANDARD = LVCMOS25;
NET "processing_system7_0_GPIO_pin" LOC = R18;
NET "processing_system7_0_GPIO_pin" IOSTANDARD = LVCMOS25;

# PlanAhead Generated IO constraints

NET "LED8bit[7]" IOSTANDARD = LVCMOS33;
NET "LED8bit[6]" IOSTANDARD = LVCMOS33;
NET "LED8bit[5]" IOSTANDARD = LVCMOS33;
NET "LED8bit[4]" IOSTANDARD = LVCMOS33;
NET "LED8bit[3]" IOSTANDARD = LVCMOS33;
NET "LED8bit[2]" IOSTANDARD = LVCMOS33;
NET "LED8bit[1]" IOSTANDARD = LVCMOS33;
NET "LED8bit[0]" IOSTANDARD = LVCMOS33;

# PlanAhead Generated physical constraints

NET "LED8bit[0]" LOC = T22;
NET "LED8bit[1]" LOC = T21;
NET "LED8bit[2]" LOC = U22;
NET "LED8bit[3]" LOC = U21;
NET "LED8bit[4]" LOC = V22;
NET "LED8bit[5]" LOC = W22;
NET "LED8bit[6]" LOC = U19;
NET "LED8bit[7]" LOC = U14;


論理合成、インプリメント、ビットストリームの生成を行って、成功した。
AXI4_practice_19_131217.png
  1. 2013年12月17日 05:25 |
  2. AXI4バスの演習資料
  3. | トラックバック:0
  4. | コメント:0

XPSプロジェクトでの入出力信号の処理

XPSプロジェクトでMIG(Memory Interface Generator) で DDR3 SDRAMをインスタンスしていますが、その時に DQ, DQS_P, DQS_N 等の 入出力信号 (inout) は、Net名とExtarnal Ports名を同じ名前にしておかないと Design Rule Check でエラーが出るようです。覚書として書いておきます。
xps_inout_1_131216.png
  1. 2013年12月16日 10:59 |
  2. EDK
  3. | トラックバック:0
  4. | コメント:0

AXI4 Lite Master BFM の Verilog HDL コード

AXI4 Lite Master BFM の Verilog HDL コードを貼っておく。AXI4 Lite Master BFM は、AXI4 Master BFM のラッパーとして作られている。
Verilog HDL の task で書いてあって、下に示す。7つの task がある。

AXI_LiteM_1Seq_Write(Write Address, Write Data, Write Response をシーケンシャルにオーバーラップせずに行う)
AXI_LiteM_WAC(Write Address Channel の Transaction を実行する)
AXI_LiteM_WDC(Write Data Channel の Transaction を実行する)
AXI_LiteM_WRC(Write Response Channel の Transaction を実行する)
AXI_LiteM_1Seq_Read(Read Address, Read Data をシーケンシャルに行う)
AXI_LiteM_RAC(Read Address Channel の Transaction を実行する)
AXI_LiteM_RDC(Read Data Channel の Transaction を実行する)


下に、Verilog HDL コードを示す。

// AXI4 bus Lite Master Bus Fucntion Mode
// 2013/12/14
// AXI4_Master_BFM のラッパー
//
//

`default_nettype none

`timescale 100ps / 1ps

module AXI4_Lite_Master_BFM #(
    parameter DELAY = 10 )
(
    input   wire    ACLK,

    output wire [31:0] S_AXI_AWADDR,
    output wire [2:0] S_AXI_AWPROT,
    output wire S_AXI_AWVALID,
    output wire [31:0] S_AXI_WDATA,
    output wire [3:0] S_AXI_WSTRB,
    output wire S_AXI_WVALID,
    output wire S_AXI_BREADY,
    output wire [31:0] S_AXI_ARADDR,
    output wire [2:0] S_AXI_ARPROT,
    output wire S_AXI_ARVALID,
    output wire S_AXI_RREADY,

    input wire S_AXI_AWREADY,
    input wire S_AXI_WREADY,
    input wire [1:0] S_AXI_BRESP,
    input wire S_AXI_BVALID,
    input wire S_AXI_ARREADY,
    input wire [31:0] S_AXI_RDATA,
    input wire [1:0] S_AXI_RRESP,
    input wire S_AXI_RVALID
);

    parameter   ASIZE_BT_4  = 3'd2; // 32 bit width
    parameter   ASIZE_BT_2 = 3'd1;  // 16 bit width
    parameter   ASIZE_BT_1 = 3'd0;  // 8 bit width

    parameter   ABURST_FIXED    = 2'd0;
    parameter   ABURST_INCR = 2'd1;
    parameter   ABURST_WRAP = 2'd2;

    // RESP の値の定義
    parameter   RESP_OKAY =     2'b00;
    parameter   RESP_EXOKAY =   2'b01;
    parameter   RESP_SLVERR =   2'b10;
    parameter   RESP_DECERR =   2'b11;

    reg  [7:0]  awlen_hold = 0;
    reg  [0:0]  wid_hold = 0;
    reg  axi_w_transaction_active = 0;
    reg  axi_r_transaction_active = 0;
    reg  [7:0]  arlen_hold = 0;

    // AXI4_BFM のインスタンス
    AXI4_Master_BFM #(.DELAY(DELAY)) MBFMi(
        .ACLK(ACLK),
        .S_AXI_AWID(),
        .S_AXI_AWADDR(S_AXI_AWADDR),
        .S_AXI_AWLEN(),
        .S_AXI_AWSIZE(),
        .S_AXI_AWBURST(),
        .S_AXI_AWLOCK(),
        .S_AXI_AWCACHE(),
        .S_AXI_AWPROT(S_AXI_AWPROT),
        .S_AXI_AWREGION(),
        .S_AXI_AWQOS(),
        .S_AXI_AWUSER(),
        .S_AXI_AWVALID(S_AXI_AWVALID),
        .S_AXI_AWREADY(S_AXI_AWREADY),
        .S_AXI_WID(),
        .S_AXI_WDATA(S_AXI_WDATA),
        .S_AXI_WSTRB(S_AXI_WSTRB),
        .S_AXI_WLAST(),
        .S_AXI_WUSER(),
        .S_AXI_WVALID(S_AXI_WVALID),
        .S_AXI_WREADY(S_AXI_WREADY),
        .S_AXI_BID(1'b0),
        .S_AXI_BRESP(S_AXI_BRESP),
        .S_AXI_BUSER(1'b0),
        .S_AXI_BVALID(S_AXI_BVALID),
        .S_AXI_BREADY(S_AXI_BREADY),
        .S_AXI_ARID(),
        .S_AXI_ARADDR(S_AXI_ARADDR),
        .S_AXI_ARLEN(),
        .S_AXI_ARSIZE(),
        .S_AXI_ARBURST(),
        .S_AXI_ARLOCK(),
        .S_AXI_ARCACHE(),
        .S_AXI_ARPROT(S_AXI_ARPROT),
        .S_AXI_ARREGION(),
        .S_AXI_ARQOS(),
        .S_AXI_ARUSER(),
        .S_AXI_ARVALID(S_AXI_ARVALID),
        .S_AXI_ARREADY(S_AXI_ARREADY),
        .S_AXI_RID(1'b0),
        .S_AXI_RDATA(S_AXI_RDATA),
        .S_AXI_RRESP(S_AXI_RRESP),
        .S_AXI_RLAST(1'b1),
        .S_AXI_RUSER(1'b0),
        .S_AXI_RVALID(S_AXI_RVALID),
        .S_AXI_RREADY(S_AXI_RREADY)
    );

    // Write Channel
    // wait_clk_bready : 0 - bready の Wait は無し、0以外 - bready の Wait は wait_clk_bready の値の Wait が入る
    // wmax_wait : 0 - wvalid の Wait は無し、0以外 - wmax_wait を最大値とするランダムな値の Wait が wvalid に入る
    task AXI_LiteM_1Seq_Write; // Write Address, Write Data, Write Response をシーケンシャルにオーバーラップせずに行う。
        input   [31:0]  awaddr;
        input   [31:0]  wdata;
        input   [7:0]   wait_clk_bready;
        input   [7:0]   wmax_wait;
        begin
            MBFMi.AXI_Master_1Seq_Write(1'b0, awaddr, 8'd0, ASIZE_BT_4, ABURST_INCR, wdata, wait_clk_bready, wmax_wait);
        end
    endtask

    // Write Address Channel
    task AXI_LiteM_WAC;
        input   [31:0]  awaddr;
        begin
            MBFMi.AXI_MASTER_WAC(1'b0, awaddr, 8'd0, ASIZE_BT_4, ABURST_INCR);
        end
    endtask

    // Write Data Channel
    // wmax_wait : 0 - wvalid の Wait は無し、0以外 - wmax_wait を最大値とするランダムな値の Wait が wvalid に入る
    task AXI_LiteM_WDC;    // WDATA は+1する
    // とりあえず、WSTRBはオール1にする
        input   [31:0]  wdata;
        input   [7:0]   wmax_wait;  // Write時の最大wait数
        begin
            MBFMi.AXI_MASTER_WDC(wdata, wmax_wait);
        end
    endtask

    // Write Response Channel
    // wait_clk_bready : 0 - bready の Wait は無し、0以外 - bready の Wait は wait_clk_bready の値の Wait が入る
    task AXI_LiteM_WRC;    // wait_clk_bready
        input   [7:0]   wait_clk_bready;
        begin
            MBFMi.AXI_MASTER_WRC(wait_clk_bready);
        end
    endtask

    // Read Channel
    task AXI_LiteM_1Seq_Read; // Read Address, Read Data をシーケンシャルに行う。
        input   [31:0]  araddr;
        input   [7:0]   rmax_wait;  // Read時の最大wait数
        begin
            MBFMi.AXI_Master_1Seq_Read(1'b0, araddr, 8'd0, ASIZE_BT_4, ABURST_INCR);
        end
    endtask

    // Read Address Channel
    task AXI_LiteM_RAC;
        input   [31:0]  araddr;
        begin
            MBFMi.AXI_MASTER_RAC(1'b0, araddr, 8'd0, ASIZE_BT_4, ABURST_INCR);
        end
    endtask

    // Read Data Channel
    task AXI_LiteM_RDC; // S_AXI_RLAST がアサートされるまでS_AXI_RREADY をアサートする
        input   [7:0]   rmax_wait;  // Read時の最大wait数
        begin
            MBFMi.AXI_MASTER_RDC(rmax_wait);
        end
    endtask
endmodule

`default_nettype wire

  1. 2013年12月15日 04:07 |
  2. AX4 Lite Slave IPの作製
  3. | トラックバック:0
  4. | コメント:0

ZedBoard AXI4 Lite Slave 演習2(シミュレーション)

ZedBoard AXI4 Lite Slave 演習1”の続き。

今回は、ZedBoard AXI4 Lite Slave 演習の回路 led8_axi_lite_slave.v を作り、テストベンチ (led8_axi_lite_slave_tb.v) を作った。更に、AXI4 Master BFMのラッパーとして、AXI4 Lite Master BFM を作製した。
Project Navigator のプロジェクトを作製して、シミュレーションを行った。
下に、Project Navigator のプロジェクトを示す。(ISE14.7)
AXI4_practice_11_131214.png

AXI4 Lite Slave Write Transaction を示す。Writeの手順を下に示す。

・オフセット4 (LED Counter Load Register) に 32'hAA を Writeする。
・オフセットC (LED Interval Register) に 32'h8 を Writeする。
・オフセット0 (Command Register) に 1 を Writeする。


下に、AXI4 Lite Slave Write のシミュレーション波形を示す。
AXI4_practice_12_131214.png

次に、AXI4 Lite Slave Read Transaction を示す。Readの手順はオフセット0、オフセット4、オフセット8、オフセットCと順番に Readした。シミュレーション波形を下に示す。
AXI4_practice_13_131214.png

最後に、led8_axi_lite_slave.v のシミュレーション波形を下に示す。
AXI4_practice_14_131214.png

テストベンチ、led8_axi_lite_slave_tb.v を下に貼っておく。

`default_nettype none

`timescale 100ps / 1ps

////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date:   05:08:14 12/14/2013
// Design Name:   led8_axi_lite
// Module Name:   D:/HDL/FndtnISEWork/Zynq-7000/ZedBoard/AXI4_bus/parctices/PS_PL_Tutorial/system/pcores/led8_axi_lite_v1_00_a/led8_axi_lite_verilog/led8_axi_lite_tb.v
// Project Name:  led8_axi_lite_verilog
// Target Device:
// Tool versions:
// Description:
//
// Verilog Test Fixture created by ISE for module: led8_axi_lite
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
////////////////////////////////////////////////////////////////////////////////

module led8_axi_lite_slave_tb;

    parameter DELAY    = 10;

    // Inputs
    wire ACLK;
    wire ARESETN;
    wire [31:0] S_AXI_AWADDR;
    wire [2:0] S_AXI_AWPROT;
    wire S_AXI_AWVALID;
    wire [31:0] S_AXI_WDATA;
    wire [3:0] S_AXI_WSTRB;
    wire S_AXI_WVALID;
    wire S_AXI_BREADY;
    wire [31:0] S_AXI_ARADDR;
    wire [2:0] S_AXI_ARPROT;
    wire S_AXI_ARVALID;
    wire S_AXI_RREADY;

    // Outputs
    wire S_AXI_AWREADY;
    wire S_AXI_WREADY;
    wire [1:0] S_AXI_BRESP;
    wire S_AXI_BVALID;
    wire S_AXI_ARREADY;
    wire [31:0] S_AXI_RDATA;
    wire [1:0] S_AXI_RRESP;
    wire S_AXI_RVALID;
    wire [7:0] LED8bit;

    // Instantiate the Unit Under Test (UUT)
    led8_axi_lite_slave uut (
        .ACLK(ACLK),
        .ARESETN(ARESETN),
        .S_AXI_AWADDR(S_AXI_AWADDR),
        .S_AXI_AWPROT(S_AXI_AWPROT),
        .S_AXI_AWVALID(S_AXI_AWVALID),
        .S_AXI_AWREADY(S_AXI_AWREADY),
        .S_AXI_WDATA(S_AXI_WDATA),
        .S_AXI_WSTRB(S_AXI_WSTRB),
        .S_AXI_WVALID(S_AXI_WVALID),
        .S_AXI_WREADY(S_AXI_WREADY),
        .S_AXI_BRESP(S_AXI_BRESP),
        .S_AXI_BVALID(S_AXI_BVALID),
        .S_AXI_BREADY(S_AXI_BREADY),
        .S_AXI_ARADDR(S_AXI_ARADDR),
        .S_AXI_ARPROT(S_AXI_ARPROT),
        .S_AXI_ARVALID(S_AXI_ARVALID),
        .S_AXI_ARREADY(S_AXI_ARREADY),
        .S_AXI_RDATA(S_AXI_RDATA),
        .S_AXI_RRESP(S_AXI_RRESP),
        .S_AXI_RVALID(S_AXI_RVALID),
        .S_AXI_RREADY(S_AXI_RREADY),
        .LED8bit(LED8bit)
    );

    // AXI4_Lite_Master_BFM
    AXI4_Lite_Master_BFM #(.DELAY(DELAY)) LMBFMi(
        .ACLK(ACLK),
        .S_AXI_AWADDR(S_AXI_AWADDR),
        .S_AXI_AWPROT(S_AXI_AWPROT),
        .S_AXI_AWVALID(S_AXI_AWVALID),
        .S_AXI_AWREADY(S_AXI_AWREADY),
        .S_AXI_WDATA(S_AXI_WDATA),
        .S_AXI_WSTRB(S_AXI_WSTRB),
        .S_AXI_WVALID(S_AXI_WVALID),
        .S_AXI_WREADY(S_AXI_WREADY),
        .S_AXI_BRESP(S_AXI_BRESP),
        .S_AXI_BVALID(S_AXI_BVALID),
        .S_AXI_BREADY(S_AXI_BREADY),
        .S_AXI_ARADDR(S_AXI_ARADDR),
        .S_AXI_ARPROT(S_AXI_ARPROT),
        .S_AXI_ARVALID(S_AXI_ARVALID),
        .S_AXI_ARREADY(S_AXI_ARREADY),
        .S_AXI_RDATA(S_AXI_RDATA),
        .S_AXI_RRESP(S_AXI_RRESP),
        .S_AXI_RVALID(S_AXI_RVALID),
        .S_AXI_RREADY(S_AXI_RREADY)
    );

    // test
    initial begin
        // Initialize Inputs

        // Wait 100 ns for global reset to finish
        #1000;

        // Add stimulus here
        @(posedge ACLK);    // 次のクロックへ
        #DELAY;

        LMBFMi.AXI_LiteM_1Seq_Write(32'h4, 32'hAA, 0, 0);    // LED8bit = AA, wait_clk_bready=0, wmax_wait=0
        LMBFMi.AXI_LiteM_1Seq_Write(32'hC, 32'h8, 1, 2);    // 8クロックでLEDが+1される, wait_clk_bready=1, wmax_wait=2
        LMBFMi.AXI_LiteM_1Seq_Write(32'h0, 32'h1, 2, 3);    // LED incriment Enable, wait_clk_bready=2, wmax_wait=3

        #1000;    // Wait 100 ns
        @(posedge ACLK);    // 次のクロックへ
        #DELAY;
        LMBFMi.AXI_LiteM_1Seq_Read(32'h0, 0);    // Command Register, rmax_wait=0
        LMBFMi.AXI_LiteM_1Seq_Read(32'h4, 1);    // LED Counter Load Register, rmax_wait=1
        LMBFMi.AXI_LiteM_1Seq_Read(32'h8, 2);    // LED Monitor Register, rmax_wait=2
        LMBFMi.AXI_LiteM_1Seq_Read(32'hC, 3);    // LED Interval Register, rmax_wait=3
    end

    // ACLK
    clk_gen #(
        .CLK_PERIOD(100),    // 10nsec, 100MHz
        .CLK_DUTY_CYCLE(0.5),
        .CLK_OFFSET(0),
        .START_STATE(1'b0)
    ) ACLKi (
        .clk_out(ACLK)
    );

    // reset_gen
    reset_gen #(
        .RESET_STATE(1'b0),
        .RESET_TIME(1000)    // 100nsec
    ) RESETi (
        .reset_out(ARESETN)
    );

endmodule

module clk_gen #(
    parameter         CLK_PERIOD = 100,
    parameter real    CLK_DUTY_CYCLE = 0.5,
    parameter        CLK_OFFSET = 0,
    parameter        START_STATE    = 1'b0 )
(
    output    reg        clk_out
);
    begin
        initial begin
            #CLK_OFFSET;
            forever
            begin
                clk_out = START_STATE;
                #(CLK_PERIOD-(CLK_PERIOD*CLK_DUTY_CYCLE)) clk_out = ~START_STATE;
                #(CLK_PERIOD*CLK_DUTY_CYCLE);
            end
        end
    end
endmodule

module reset_gen #(
    parameter    RESET_STATE = 1'b1,
    parameter    RESET_TIME = 100 )
(
    output    reg        reset_out
);
    begin
        initial begin
            reset_out = RESET_STATE;
            #RESET_TIME;
            reset_out = ~RESET_STATE;
        end
    end
endmodule

`default_nettype wire

  1. 2013年12月15日 03:51 |
  2. AXI4バスの演習資料
  3. | トラックバック:0
  4. | コメント:0

Zynq勉強会 7番目の資料”7 AXI4 バス説明、AXI4バスを使用したカスタムIPの作成方法”を公開

7 AXI4 バス説明、AXI4バスを使用したカスタムIPの作成方法”を公開しました。この資料は、ZYNQ勉強会のプレゼン資料です。
AXI4バス説明とAXI4バスを使用したカスタムIPの作成方法を書いてあります。
このプレゼン資料は、ARM社の要登録資料“AMBA AXI and ACE Protocol Specification Issue E”を参考に作成しました
必ず、下のURLにアクセスし、登録後に、ARM社のドキュメントをダウンロードしてから、この資料をお読み下さい。
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ihi0022e/index.html

一昨日公開したのですが、リンクが生きてなかったため、再投稿しました。

(2013/12/13:追記)
AXI4バスの勉強を初めて最初に書いたブログ記事は、2011年12月7日の”AXI4 プロトコルの勉強1”でした。これから2年の月日が経ちました。この2年間の成果のエッセンスを”7 AXI4 バス説明、AXI4バスを使用したカスタムIPの作成方法”に書きました。改めてまとめてみると再び気づいた事もあって、自分にとっても有意義でした。
AXI4バスが日本で作られたものでないことは少し残念ですが、AXI4バスを使っていろいろなIPがシームレスに接続できれば良いと思います。この資料が皆様のAXI4バスの理解の助けになれば幸いです。そして、資料のおかしいところがありましたら、ご指摘下さい。また、皆様の資料もできれば公開して頂いて(難しいかもしれませんが。。。)、AXI4バスを盛り上げていけたら?と思います。

(2013/12/24:追記)
諸般の事情により slideshare の資料を削除しました。お知り合いの方でご希望の方は、ARM社のドキュメントをダウンロードしてからメールかツイッターでDMして頂ければPDFで送ります。
  1. 2013年12月12日 06:32 |
  2. AXI4バスの演習資料
  3. | トラックバック:0
  4. | コメント:0

ZedBoard AXI4 Lite Slave 演習1

ZedBoard AXI4 Lite Slave 演習
以前、実習したZynq用ツールのチュートリアル1,2,3を元に実習を行う。使用するISEのバージョンはISE14.7とする。

・実習回路の説明
実習内容は、Zynq用ツールのチュートリアルにLED表示を追加する。LEDは8個使用して、右端をLED Display CounterのLSBに接続し、左端をMSBとした2進数表示とする。LED Interval Registerに設定された設定値を過ぎると、LEDの表示が+1される。LEDのカウントアップ(+1)は、Command Register のビット0でイネーブル/ディスエーブルすることができる。ブロック図を図1に示す。

AXI4_practice_5_131212.png
     図 1 ZedBoard AXI4 Lite Slave 演習

AXI4 Lite Slaveレジスタ仕様
レジスタの仕様を示す。

オフセット0:Command Register(R/W)
 ビット0:1 - LEDの値を+1する 0 - LEDの値はそのまま (デフォルト値は0)
 ビット31~1:リザーブ
オフセット4:LED Counter Load Register(R/W)
 ビット7~0:8ビット分のLEDの値
 ビット31~8:リザーブ(Read時はすべて0)
オフセット8:LED Monitor Register(Read Only)
 ビット7~0:8ビット分の現在のLEDの値
 ビット31~8:すべて0
オフセットC:LED Interval Register(R/W)但し、動作クロックは100MHzとする
 ビット31~0:LED値を+1する時のカウント値


演習
1. 用意してあるXilinx社のAXI4バス用テンプレートar37425のaxi_lite_slave_v1_00_aフォルダに、data, doc, hdlの3つのフォルダがあるのを確認する。
AXI4_practice_6_131212.png

2. dataフォルダを開く。中に、MPD、MUI、PAOの3つのファイルがあることを確認する。
AXI4_practice_7_131212.png

3. MPD、MUI、PAOの3つのファイルを開いて、内容を確認する。講義で受けた内容を再度見てみよう。
4. axi_lite_slave_v1_00_aフォルダに戻って、docフォルダを開く。空なのがわかる。
5. もう一度、axi_lite_slave_v1_00_aフォルダに戻って、hdlフォルダを開く。verilogフォルダとvhdlフォルダがあるのが見える。
AXI4_practice_8_131212.png

6. verilogフォルダを開く。axi_lite_slave.vが見える。
AXI4_practice_9_131212.png

7. axi_lite_slave.vを開いて、見てみよう。AXI4 Lite Slaveポート定義が書いてあるのが見える。
8. hdlフォルダに戻り、vhdlフォルダを開く。axi_lite_slave.vhdが見える。
AXI4_practice_10_131212.png

9. axi_lite_slave.vhdを開いて、見てみよう。こちらも、AXI4 Lite Slaveポート定義が書いてあるのが見える
  1. 2013年12月12日 04:54 |
  2. AXI4バスの演習資料
  3. | トラックバック:0
  4. | コメント:0

Zynq勉強会 6番目の資料”6_XPSプロジェクトでカスタムIPを作る方法”を公開

Zynq勉強会 6番目の資料”6_XPSプロジェクトでカスタムIPを作る方法”を公開しました。

Zynq勉強会についての詳しい情報はこちらをどうぞ

見た感想をお待ちしております。

(2013/12/24:追記)
諸般の事情により slideshare の資料を削除しました。お知り合いの方でご希望の方は、メールかツイッターでDMして頂ければPDFで送ります。

(2015/01/04:追記)
再度公開しました。
  1. 2013年12月10日 12:10 |
  2. Zynq
  3. | トラックバック:0
  4. | コメント:0

AXI4 Lite Slave の演習資料1

ZedBoard用のAXI4 Lite Slave の演習資料を作っている。

AXI4 Lite Slave の演習は、実習したZynq用ツールのチュートリアル1,2,3を元に実習する。
Zynq用ツールのチュートリアルは、Project Navigator で作られたZedBoard.orgのReference Designs/Tutorials
のZynq Concepts, Tools, and Techniques on ZedBoard の ISE14.5 Version のWordマニュアルの31ページ”Chapter3 Embedded System Design Using the Zynq Processing System and Programmable Logic”のプロジェクトを使用している。下にProject Navigator のプロジェクトを示す。現在の使用バージョンは14.7。
AXI4_practice_1_131210.png

XPSプロジェクトの Bus Interface タブ。
AXI4_practice_2_131210.png

XPSプロジェクトの Portsタブ。
AXI4_practice_3_131210.png

XPSプロジェクトの Address タブ。
AXI4_practice_4_131210.png

ここに、ZedBoardのLED8個を+1する AXI4 Lite Slave IPを追加する。
レジスタの仕様をもう一度定義する。

オフセット0:Command Register(R/W)
 ビット0:1 - LEDの値を+1する 0 - LEDの値はそのまま (デフォルト値は0)
 ビット31~1:リザーブ
オフセット4:LED Counter Load Register(R/W)
 ビット7~0:8ビット分のLEDの値
 ビット31~8:リザーブ(Read時はすべて0)
オフセット8:LED Monitor Register(Read Only)
 ビット7~0:8ビット分の現在のLEDの値
 ビット31~8:すべて0
オフセットC:LED Interval Register(R/W)但し、動作クロックは100MHzとする
 ビット31~0:LED値を+1する時のカウント値

  1. 2013年12月10日 05:28 |
  2. AXI4バスの演習資料
  3. | トラックバック:0
  4. | コメント:0

Zynq勉強会用AXI4バスの演習資料の作製

今、Zynq勉強会をやっている。その勉強会用にAXI4バスの演習資料を作成しようとしている。ブログに書きながら作っていこうと思う。
Zynq勉強会の項目をいかに示す。

1_Zynq-7000の概要
2_Zynq用ツール概要
3_Zynq用ツールのチュートリアル1
4_Zynq用ツールのチュートリアル2
5_Zynq用ツールのチュートリアル3
6_XPSプロジェクトでカスタムIPを作る方法
7_AXI4 バス説明、AXI4バスを使用したカスタムIPの作成方法


最初はZynqの概要とZynq用ツールの概要を説明する。その後に、ZedBoard.orgのReference Designs/Tutorials
Zynq Concepts, Tools, and Techniques on ZedBoard の ISE14.5 Version のWordマニュアルの31ページ”Chapter3 Embedded System Design Using the Zynq Processing System and Programmable Logic”をPlanAheadプロジェクトからProject Navigator プロジェクトに変更したチュートリアルをライブでやりながら、受講者に一緒に同じ手順をやってもらう。
6番目で、XPSプロジェクトでカスタムIPを作る方法を詳細に解説し、7番目でAXI4バスの説明とAXI4バスを使用したカスタムIPの作成方法のノウハウを説明する。
今はここまでだが、AXI4バスの演習資料を作成しようとしている。演習としては、AXI4 Lite Slave と AXI4 Master のRead とWriteを作れれば良いかな?と思う。
作り方はXPSのAXI4バス・インタフェース作製用のウィザードを使用せずに、XILINXアンサー AR# 37425のAXI4 IPのテンプレートを使用して直接AXI4バスをHDLで記述する。なお、使用するシミュレータはISimとする。その方がXilinxツールの使用者全員が使用できるし、VHDL、Verilog HDL相当とも混在シミュレーションが可能だからだ。
下に予定しているZedBoard用 AXI4バス演習の項目を示す。

1.AXI4 Lite Slave の演習
ZedBoard.orgのReference Designs/Tutorials のZynq Concepts, Tools, and Techniques on ZedBoard の ISE14.5 Version のWordマニュアルの31ページ”Chapter3 Embedded System Design Using the Zynq Processing System and Programmable Logic”の回路に、LED制御を追加する。
具体的には、8つのLEDを制御するIOポートを用意して、値を設定するレジスタを用意する。更に、コマンド・レジスタを用意する。そこには、LEDを+1するコマンド・ビットを用意する。+1する時のクロックのカウント値を決めるレジスタと、そうそうLEDの点灯値を表示するレジスタも必要だ。よってレジスタ構成は次の通りになる。

オフセット0:コマンド・レジスタ(R/W)
 ビット0:1 - LEDの値を+1する 0 - LEDの値はそのまま (デフォルト値は0)
 ビット31~1:リザーブ
オフセット4:LED値のロード・レジスタ(R/W)
 ビット7~0:8ビット分のLEDの値
 ビット31~8:リザーブ(Read時はすべて0)
オフセット8:現在のLEDの値のReadレジスタ(Read Only)
 ビット7~0:8ビット分の現在のLEDの値
 ビット31~8:すべて0
オフセットC:LED値を+1する時のカウント値(R/W)但し、動作クロックは100MHzとする
 ビット31~0:LED値を+1する時のカウント値


ハードウェアをHDLで書いてもらい(穴埋めか?)、XPSプロジェクト用のMPDファイル、PAOファイルなどを書いてもらうことにしよう。SDKを立ちあげて、ソフトウェアも書いて、動作させる。

2.AXI4 Master Read の演習
ビットマップ・ディスプレイ・コントローラ AXI4 Master IPを実装する。キャラクタROM IPも一緒にXPSプロジェクトに入れる。キャラクタROM IPはこちらから提供する。
ソフトウェアでは、キャラクタROM IPからキャラクタを読み込んで、ビットマップ・ディスプレイ・コントローラのフレームバッファにWriteする。キャッシュが効いていて、キャラクタが表示されない場合は、キャッシュをフラッシュする。

3.AXI4 Master Write の演習
DDR3 SDRAMのフレーム・バッファにキャラクタを書き込むchar_write_axi_master IPを作る。”2.AXI4 Master Read の演習”のビットマップ・ディスプレイ・コントローラ AXI4 Master IPを使用して表示する。
ソフトウェアは、2つの AXI4 Master IPを起動するだけの機能とする。
  1. 2013年12月09日 04:39 |
  2. AXI4バスの演習資料
  3. | トラックバック:0
  4. | コメント:0
»