PSoC 4200 Prototyping Kit (14)
カスタム・コンポーネントの作成法や、Datapath Configuration Tool の操作方法などについては詳しい説明を省略します。
以下の文書を参照してください。
- KBA86838: "Datapath Configuration Tool Cheat Sheet"
最初の 3 つについてはバージョンは古くなりますが日本語版もあります。
データパスを利用したカスタム・コンポーネントの作成の概略は次のようになります。
- 開発するカスタム・コンポーネントのテスト/デバッグを目的とする新規プロジェクト/ワークスペースを作成
- 開発するカスタム・コンポーネントを収容するライブラリ・プロジェクトをワークスペースに追加
- 「Add Component Item」で新コンポーネントを追加し、「Symbol Wizard」でシンボルを作成
- シンボルのプロパティ設定
- 「Generate Verilog」で Verilog ソースのひな型を作成
- 「Datapath Configuration Tool」を起動し、設定する
- 作成された Verilog ソースを手動で変更し、データパス・セルの入出力とモジュールの入出力を接続する
- 必要に応じて API 関数定義のためのソースを作成
- 作成したコンポーネントをテスト・プロジェクトの回路上に配置しプロジェクトを完成させ、テストを行う
デバッグが完了して完成したコンポーネント・ライブラリは、目的のアプリケーションのプロジェクトを含むワークスペースにライブラリ・プロジェクトを丸ごとインポートするか、あるいはアプリケーション・プロジェクトにカスタム・コンポーネント単体を (複数ある場合はそれぞれ別個に) インポートするかして利用します。
「Symbol Wizard」で作成したシンボルを下に示します。
クロック入力「clk」、ディジタル入力「load」、ディジタル出力「sdmout」の 3 つの端子を持つシンボルとして定義します。
シンボルのプロパティ設定については省略します。
データパス設定ツールではデフォルトの設定から 5 ヵ所だけ変更します。
「New Datapath」から「cy_psoc3__dp16」を選んで 16 ビット幅のデータパスを作成します。
下位側の「SdmDac16_a」では下の図に示す CFGRAM 部分の 2 ヵ所のみ変更します。
上位側の「SdmDac16_b」の CFGRAM 部分では下位側と全く同じ 2 ヵ所を変更します。
それに加え、下の図に示す固定 comfiguration 部分の 1 ヵ所を変更します。
データパス設定ツールで生成される Verilog ファイルに手動で変更を加えた結果を下に示しまs。
//`#start header` -- edit after this line, do not edit this line // ======================================== // // Copyright YOUR COMPANY, THE YEAR // All Rights Reserved // UNPUBLISHED, LICENSED SOFTWARE. // // CONFIDENTIAL AND PROPRIETARY INFORMATION // WHICH IS THE PROPERTY OF your company. // // ======================================== `include "cypress.v" //`#end` -- edit above this line, do not edit this line // Generated on 02/21/2015 at 14:33 // Component: SdmDac16_v1_0 module SdmDac16_v1_0 ( output sdmout, input clk, input load ); //`#start body` -- edit after this line, do not edit this line // Your code goes here wire [1:0] co_msb; assign sdmout = co_msb[1]; cy_psoc3_dp16 #(.cy_dpconfig_a( { `CS_ALU_OP__ADD, `CS_SRCA_A0, `CS_SRCB_D0, `CS_SHFT_OP_PASS, `CS_A0_SRC__ALU, `CS_A1_SRC_NONE, `CS_FEEDBACK_DSBL, `CS_CI_SEL_CFGA, `CS_SI_SEL_CFGA, `CS_CMP_SEL_CFGA, /*CFGRAM0: */ `CS_ALU_OP_PASS, `CS_SRCA_A0, `CS_SRCB_D0, `CS_SHFT_OP_PASS, `CS_A0_SRC_NONE, `CS_A1_SRC_NONE, `CS_FEEDBACK_DSBL, `CS_CI_SEL_CFGA, `CS_SI_SEL_CFGA, `CS_CMP_SEL_CFGA, /*CFGRAM1: */ `CS_ALU_OP_PASS, `CS_SRCA_A0, `CS_SRCB_D0, `CS_SHFT_OP_PASS, `CS_A0_SRC_NONE, `CS_A1_SRC_NONE, `CS_FEEDBACK_DSBL, `CS_CI_SEL_CFGA, `CS_SI_SEL_CFGA, `CS_CMP_SEL_CFGA, /*CFGRAM2: */ `CS_ALU_OP_PASS, `CS_SRCA_A0, `CS_SRCB_D0, `CS_SHFT_OP_PASS, `CS_A0_SRC_NONE, `CS_A1_SRC_NONE, `CS_FEEDBACK_DSBL, `CS_CI_SEL_CFGA, `CS_SI_SEL_CFGA, `CS_CMP_SEL_CFGA, /*CFGRAM3: */ `CS_ALU_OP_PASS, `CS_SRCA_A0, `CS_SRCB_D0, `CS_SHFT_OP_PASS, `CS_A0_SRC_NONE, `CS_A1_SRC_NONE, `CS_FEEDBACK_DSBL, `CS_CI_SEL_CFGA, `CS_SI_SEL_CFGA, `CS_CMP_SEL_CFGA, /*CFGRAM4: */ `CS_ALU_OP_PASS, `CS_SRCA_A0, `CS_SRCB_D0, `CS_SHFT_OP_PASS, `CS_A0_SRC_NONE, `CS_A1_SRC_NONE, `CS_FEEDBACK_DSBL, `CS_CI_SEL_CFGA, `CS_SI_SEL_CFGA, `CS_CMP_SEL_CFGA, /*CFGRAM5: */ `CS_ALU_OP_PASS, `CS_SRCA_A0, `CS_SRCB_D0, `CS_SHFT_OP_PASS, `CS_A0_SRC_NONE, `CS_A1_SRC_NONE, `CS_FEEDBACK_DSBL, `CS_CI_SEL_CFGA, `CS_SI_SEL_CFGA, `CS_CMP_SEL_CFGA, /*CFGRAM6: */ `CS_ALU_OP_PASS, `CS_SRCA_A0, `CS_SRCB_D0, `CS_SHFT_OP_PASS, `CS_A0_SRC_NONE, `CS_A1_SRC_NONE, `CS_FEEDBACK_DSBL, `CS_CI_SEL_CFGA, `CS_SI_SEL_CFGA, `CS_CMP_SEL_CFGA, /*CFGRAM7: */ 8'hFF, 8'h00, /*CFG9: */ 8'hFF, 8'hFF, /*CFG11-10: */ `SC_CMPB_A1_D1, `SC_CMPA_A1_D1, `SC_CI_B_ARITH, `SC_CI_A_ARITH, `SC_C1_MASK_DSBL, `SC_C0_MASK_DSBL, `SC_A_MASK_DSBL, `SC_DEF_SI_0, `SC_SI_B_DEFSI, `SC_SI_A_DEFSI, /*CFG13-12: */ `SC_A0_SRC_ACC, `SC_SHIFT_SL, 1'h0, 1'h0, `SC_FIFO1_BUS, `SC_FIFO0_BUS, `SC_MSB_DSBL, `SC_MSB_BIT0, `SC_MSB_NOCHN, `SC_FB_NOCHN, `SC_CMP1_NOCHN, `SC_CMP0_NOCHN, /*CFG15-14: */ 10'h00, `SC_FIFO_CLK__DP,`SC_FIFO_CAP_AX, `SC_FIFO_LEVEL,`SC_FIFO__SYNC,`SC_EXTCRC_DSBL, `SC_WRK16CAT_DSBL /*CFG17-16: */ } ), .cy_dpconfig_b( { `CS_ALU_OP__ADD, `CS_SRCA_A0, `CS_SRCB_D0, `CS_SHFT_OP_PASS, `CS_A0_SRC__ALU, `CS_A1_SRC_NONE, `CS_FEEDBACK_DSBL, `CS_CI_SEL_CFGA, `CS_SI_SEL_CFGA, `CS_CMP_SEL_CFGA, /*CFGRAM0: */ `CS_ALU_OP_PASS, `CS_SRCA_A0, `CS_SRCB_D0, `CS_SHFT_OP_PASS, `CS_A0_SRC_NONE, `CS_A1_SRC_NONE, `CS_FEEDBACK_DSBL, `CS_CI_SEL_CFGA, `CS_SI_SEL_CFGA, `CS_CMP_SEL_CFGA, /*CFGRAM1: */ `CS_ALU_OP_PASS, `CS_SRCA_A0, `CS_SRCB_D0, `CS_SHFT_OP_PASS, `CS_A0_SRC_NONE, `CS_A1_SRC_NONE, `CS_FEEDBACK_DSBL, `CS_CI_SEL_CFGA, `CS_SI_SEL_CFGA, `CS_CMP_SEL_CFGA, /*CFGRAM2: */ `CS_ALU_OP_PASS, `CS_SRCA_A0, `CS_SRCB_D0, `CS_SHFT_OP_PASS, `CS_A0_SRC_NONE, `CS_A1_SRC_NONE, `CS_FEEDBACK_DSBL, `CS_CI_SEL_CFGA, `CS_SI_SEL_CFGA, `CS_CMP_SEL_CFGA, /*CFGRAM3: */ `CS_ALU_OP_PASS, `CS_SRCA_A0, `CS_SRCB_D0, `CS_SHFT_OP_PASS, `CS_A0_SRC_NONE, `CS_A1_SRC_NONE, `CS_FEEDBACK_DSBL, `CS_CI_SEL_CFGA, `CS_SI_SEL_CFGA, `CS_CMP_SEL_CFGA, /*CFGRAM4: */ `CS_ALU_OP_PASS, `CS_SRCA_A0, `CS_SRCB_D0, `CS_SHFT_OP_PASS, `CS_A0_SRC_NONE, `CS_A1_SRC_NONE, `CS_FEEDBACK_DSBL, `CS_CI_SEL_CFGA, `CS_SI_SEL_CFGA, `CS_CMP_SEL_CFGA, /*CFGRAM5: */ `CS_ALU_OP_PASS, `CS_SRCA_A0, `CS_SRCB_D0, `CS_SHFT_OP_PASS, `CS_A0_SRC_NONE, `CS_A1_SRC_NONE, `CS_FEEDBACK_DSBL, `CS_CI_SEL_CFGA, `CS_SI_SEL_CFGA, `CS_CMP_SEL_CFGA, /*CFGRAM6: */ `CS_ALU_OP_PASS, `CS_SRCA_A0, `CS_SRCB_D0, `CS_SHFT_OP_PASS, `CS_A0_SRC_NONE, `CS_A1_SRC_NONE, `CS_FEEDBACK_DSBL, `CS_CI_SEL_CFGA, `CS_SI_SEL_CFGA, `CS_CMP_SEL_CFGA, /*CFGRAM7: */ 8'hFF, 8'h00, /*CFG9: */ 8'hFF, 8'hFF, /*CFG11-10: */ `SC_CMPB_A1_D1, `SC_CMPA_A1_D1, `SC_CI_B_ARITH, `SC_CI_A_CHAIN, `SC_C1_MASK_DSBL, `SC_C0_MASK_DSBL, `SC_A_MASK_DSBL, `SC_DEF_SI_0, `SC_SI_B_DEFSI, `SC_SI_A_DEFSI, /*CFG13-12: */ `SC_A0_SRC_ACC, `SC_SHIFT_SL, 1'h0, 1'h0, `SC_FIFO1_BUS, `SC_FIFO0_BUS, `SC_MSB_DSBL, `SC_MSB_BIT0, `SC_MSB_NOCHN, `SC_FB_NOCHN, `SC_CMP1_NOCHN, `SC_CMP0_NOCHN, /*CFG15-14: */ 10'h00, `SC_FIFO_CLK__DP,`SC_FIFO_CAP_AX, `SC_FIFO_LEVEL,`SC_FIFO__SYNC,`SC_EXTCRC_DSBL, `SC_WRK16CAT_DSBL /*CFG17-16: */ } )) sdmdac16( /* input */ .reset(1'b0), /* input */ .clk(clk), /* input [02:00] */ .cs_addr(3'b0), /* input */ .route_si(1'b0), /* input */ .route_ci(1'b0), /* input */ .f0_load(1'b0), /* input */ .f1_load(1'b0), /* input */ .d0_load(load), /* input */ .d1_load(1'b0), /* output [01:00] */ .ce0(), /* output [01:00] */ .cl0(), /* output [01:00] */ .z0(), /* output [01:00] */ .ff0(), /* output [01:00] */ .ce1(), /* output [01:00] */ .cl1(), /* output [01:00] */ .z1(), /* output [01:00] */ .ff1(), /* output [01:00] */ .ov_msb(), /* output [01:00] */ .co_msb(co_msb), /* output [01:00] */ .cmsb(), /* output [01:00] */ .so(), /* output [01:00] */ .f0_bus_stat(), /* output [01:00] */ .f0_blk_stat(), /* output [01:00] */ .f1_bus_stat(), /* output [01:00] */ .f1_blk_stat() ); //`#end` -- edit above this line, do not edit this line endmodule //`#start footer` -- edit after this line, do not edit this line //`#end` -- edit above this line, do not edit this line
手動で変更/追加した部分だけを抜き出すと次のようになります。
wire [1:0] co_msb; assign sdmout = co_msb[1]; /* input */ .clk(clk), /* input */ .d0_load(load), /* output [01:00] */ .co_msb(co_msb),
assign 文は、データパスのインスタンス中での信号名「co_msb」と同じ wire 名で引き出した後にモジュール出力信号の名前「sdmout」に付け替えているだけで、そこに論理回路の実体が合成されることはありません。
API 関数定義のためのヘッダ・ファイル「SdmDac16.h」を下に示します。
/* ======================================== * * Copyright YOUR COMPANY, THE YEAR * All Rights Reserved * UNPUBLISHED, LICENSED SOFTWARE. * * CONFIDENTIAL AND PROPRIETARY INFORMATION * WHICH IS THE PROPERTY OF your company. * * ======================================== */ #if !defined(`$INSTANCE_NAME`_H) #define `$INSTANCE_NAME`_H #include "cytypes.h" #include "cyfitter.h" /*************************************** * Function Prototypes ****************************************/ void `$INSTANCE_NAME`_Write(uint16 dat); #endif /* [] END OF FILE */
API 関数定義のための C ソース・ファイル「SdmDac16.c」を下に示します。
/* ======================================== * * Copyright YOUR COMPANY, THE YEAR * All Rights Reserved * UNPUBLISHED, LICENSED SOFTWARE. * * CONFIDENTIAL AND PROPRIETARY INFORMATION * WHICH IS THE PROPERTY OF your company. * * ======================================== */ #include "`$INSTANCE_NAME`.h" void `$INSTANCE_NAME`_Write(uint16 dat) { CY_SET_REG16(`$INSTANCE_NAME`_sdmdac16_u0__16BIT_F0_REG, dat); } // void `$INSTANCE_NAME`_Write() /* Place your code here. */ /* `#START `$INSTANCE_NAME`` */ /* `#END` */ /* [] END OF FILE */
定義しているのは
SdmDac16_Write(uint16 dat)
の形の API 関数で、単にデータパス・セルの FIFO0 (F0) に 16 ビット・データを書き込むだけです。