FC2カウンター FPGAの部屋 AXI4バスの演習資料

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

FPGAの部屋

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

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

以前、”Zynq勉強会 7番目の資料”7 AXI4 バス説明、AXI4バスを使用したカスタムIPの作成方法”を公開”で、Zynq勉強会のAXIバス資料を公開したが、一旦、削除した。今回もう一度、AXIバス資料を公開することにした。

Slideshare の”7 axi4 バス説明、axi4バスを使用したカスタムipの作成方法2”で公開した。

誤りやご意見などがありましたら、コメント欄でお知らせ下さい。よろしくお願いします。
  1. 2015年02月12日 19:37 |
  2. AXI4バスの演習資料
  3. | トラックバック:0
  4. | コメント:0

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

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

7. 実機でテスト

84. ZedBoardの設定を以下の様に行います。

MI02~MI06:GNDにショート
JP2, JP6:ショート
J18:VADJ SELECT:1V8


85. ダウンロード・ケーブルとZedBoardのUARTのポートからパソコンのUSBポートに接続します。
86. ZedBoardの電源をONします。
87. Xilinx ToolsメニューからProgram FPGAを選択します。
AXI4_practice_76_140101.png

88. Program FPGAダイアログが表示されます。
89. BitstreamのBrowse…ボタンをクリックします。
AXI4_practice_77_140101.png

90. Select bitstreamダイアログが表示されるので、ISEのプロジェクト・フォルダのsystem_top.bitを選択し、開くボタンをクリックします。
AXI4_practice_78_140101.png

91. これで、ビットストリーム・ファイルを指定できたので、Programボタンをクリックします。
AXI4_practice_79_140101.png

92. ZedBoardのDoneの青色LEDが点灯します。
AXI4_practice_80_140101.jpg

93. RunメニューからRun Configurationを選択します。
AXI4_practice_81_140101.png

94. ダイアログで、Xilinx C/C++ application (GDB)で右クリックし、右クリックメニューからNewを選択します。
AXI4_practice_82_140101.png

95. led8_axi_lite_slave_Debugができました。Applyボタンをクリックします。
AXI4_practice_83_140101.png

96. ApplyボタンとRevertボタンがハイドされました。Runボタンをクリックする前にTera Termを起動します。
97. Tera Termの起動画面で、シリアルのラジオボタンをクリックして、OKボタンをクリックします。
AXI4_practice_84_140101.png

98. 設定メニューからシリアルポートを選択します。
AXI4_practice_85_140101.png

99. ボー・レートを115200 bpsに設定します。OKボタンをクリックします。
AXI4_practice_86_140101.png

100. 設定メニューから端末を選択します。
AXI4_practice_87_140101.png

101. ローカルエコーにチェックを入れて、OKボタンをクリックします。
AXI4_practice_88_140101.png

102. SDKのRun Configurationsダイアログに戻ってRunボタンをクリックします。
AXI4_practice_89_140101.png

103. Tera Termにメッセージが出ます。
AXI4_practice_90_140101.png

104.  4を入力します。
AXI4_practice_91_140101.png

105.  50000000を入力します。これは、100MHzを50000000分周することになるので、LEDの点滅速度を0.5秒に設定します。
AXI4_practice_92_140101.png

106.  3を入力します。
AXI4_practice_93_140101.png

107.  aaと入力します。
AXI4_practice_94_140101.png

108. ZedBoardのLEDが10101010に点灯します。
AXI4_practice_95_140101.jpg

109.  2を入力します。
AXI4_practice_96_140101.png

110. ZedBoardのLEDがカウントアップするのが見えます。
AXI4_practice_97_140101.jpg

111.  1を入力します。
AXI4_practice_98_140101.png

112. すべてのレジスタの内容を表示します。LED Counter Load Registerの内容は先ほど設定したaaです。LED Monitor Registerの内容は現在のLEDで表示してる値を示します。
113.  もう一度、1を入力します。
AXI4_practice_99_140101.png

114. LEDのカウントアップが停止します。
115.  5を入力します。
AXI4_practice_100_140101.png

116. ソフトウェアが終了しました。
117. ZebBoardの電源をOFFします。
  1. 2014年01月01日 07:42 |
  2. AXI4バスの演習資料
  3. | トラックバック:0
  4. | コメント:0

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

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

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

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
»