4.2.1 なひたふさんの基板を使う
なひたふさんのFPGA基板NP1003Eを入手しました。これを例に説明したいと思います。FPGA基板ですので、既に配線されています。従ってピン配置はシミュレーション前に教えてやらなくてはいけません。また、提供されているテンプレートファイルはVHDLなのでVerilogに変換する必要があります。
Verilogに変換する
まず、Verilogへの変換ですが、公開されているテンプレートのVHDLファイルをVeritakのトランスレータを使って変換します。(translated.v)
さらに、そのままだと論理合成できない箇所がありますので、手修正(以下のソースでTAKの部分 2箇所)をを行います。
//------------------------------------------------------------------- // // This file is automatically generated by VHDL to Verilog Translator. // Ver.1.08 Build Mar.6.2004 // www.sugawara-systems.com // tech-support@sugawara-systems.com // See Original Copyright Notice for property of the file .( somewhere in this file.) // //-------------------------------------------------------------------- //-------------------------------------------- // NP1003 SDRAM & USB template source file // (C) Copyright 2003 Nahitafu Nahitech // http://www.nahitech.com //-------------------------------------------- `timescale 1ns/1ns `define ns 1 `define us (1000*`ns) `define ms (1000*`us) `define sec (1000*`ms) module main ( clk0, clk1, clk2, clk3, user, sd_d, sd_a, sd_bs1, sd_bs0, sd_ldqm, sd_udqm, sd_wen, sd_ras, sd_cas, sd_clk, sd_cke, sd_cs, usb_d, usb_wr, usb_rd, usb_txe, usb_rxf, usb_pwren, usb_rsto ); input clk0; input clk1; input clk2; input clk3; inout [36:0] user ; inout [15:0] sd_d ; output [12:0] sd_a ; output sd_bs1; output sd_bs0; output sd_ldqm; output sd_udqm; output sd_wen; output sd_ras; output sd_cas; output sd_clk; output sd_cke; output sd_cs; inout [7:0] usb_d ; output usb_wr; output usb_rd; input usb_txe; input usb_rxf; input usb_pwren; input usb_rsto; wire clk; wire logich; wire logicl; integer usb_state; wire usb_rxf_node; wire usb_txe_node; wire usb_rx_ready; wire usb_tx_ready; wire usb_received; wire usb_transmitted; wire [7:0] usb_tx_data; wire [7:0] usb_rx_data; wire usb_wr_node; wire usb_rd_node; reg /* conflict */[36:0] user_;//TAK =37'bz wire /* conflict */[36:0] user; wire [15:0] sd_d; wire [12:0] sd_a; wire sd_bs1; wire sd_bs0; wire sd_ldqm; wire sd_udqm; wire sd_wen; wire sd_ras; wire sd_cas; wire sd_clk; wire sd_cke; wire sd_cs; wire [7:0] usb_d; wire usb_wr; wire usb_rd; assign {clk}=clk0; assign {logich}=1'b1; assign {logicl}=1'b0; assign {sd_clk}=~ (clk); assign {sd_cs}=1'b1; assign {sd_ras}=1'b1; assign {sd_cas}=1'b1; assign {sd_cke}=1'b0; assign {sd_wen}=1'b1; assign {sd_d}={(15-0+1- 0){1'bz}}; assign {sd_a}={(12-0+1- 0){1'b0}}; assign {sd_bs1}=1'b0; assign {sd_bs0}=1'b0; assign {sd_ldqm}=1'b0; assign {sd_udqm}=1'b0; assign {usb_rd_node}=logich; assign {usb_wr_node}=logicl; assign {usb_rd}=usb_rd_node; assign {usb_wr}=usb_wr_node; assign {usb_d}={(7-0+1- 0){1'bz}}; //TAK assign {user[35:0]}={(35-0+1- 0){1'b0}}; always @ (posedge clk ) begin user_[36] <= (usb_txe & usb_rxf); end //always assign user = user_;//Added for Conflict reslover. endmodule |
LEDを光らせる記述
LEDを光らせるアプリケーションをやってみましょう。LEDの点滅を確認するには、数Hz程度に周波数を落とさなくてはいけません。ということで、26ビットのカウンタを上の記述に追加記述してみます。筆者のクロックは24MHzですが、26ビットカウンタの上位4ビットをLEDに出力するものとします。また、本目的であるゲートシミュレーションの様子を確認するには、それだけでは足りませんので、カウンタの全ビットUSERに出力するものとします。以下はled.vの記述です。なお筆者の基板では、USER[3:0]をLED4,3,2,1に接続しています。
//------------------------------------------------------------------- // // This file is automatically generated by VHDL to Verilog Translator. // Ver.1.08 Build Mar.6.2004 // www.sugawara-systems.com // tech-support@sugawara-systems.com // See Original Copyright Notice for property of the file .( somewhere in this file.) // //-------------------------------------------------------------------- //-------------------------------------------- // NP1003 SDRAM & USB template source file // (C) Copyright 2003 Nahitafu Nahitech // http://www.nahitech.com //-------------------------------------------- `timescale 1ns/1ns `define ns 1 `define us (1000*`ns) `define ms (1000*`us) `define sec (1000*`ms) module main ( clk0, clk1, clk2, clk3, user, sd_d, sd_a, sd_bs1, sd_bs0, sd_ldqm, sd_udqm, sd_wen, sd_ras, sd_cas, sd_clk, sd_cke, sd_cs, usb_d, usb_wr, usb_rd, usb_txe, usb_rxf, usb_pwren, usb_rsto ); input clk0; input clk1; input clk2; input clk3; inout [36:0] user ; inout [15:0] sd_d ; output [12:0] sd_a ; output sd_bs1; output sd_bs0; output sd_ldqm; output sd_udqm; output sd_wen; output sd_ras; output sd_cas; output sd_clk; output sd_cke; output sd_cs; inout [7:0] usb_d ; output usb_wr; output usb_rd; input usb_txe; input usb_rxf; input usb_pwren; input usb_rsto; wire clk; wire logich; wire logicl; integer usb_state; wire usb_rxf_node; wire usb_txe_node; wire usb_rx_ready; wire usb_tx_ready; wire usb_received; wire usb_transmitted; wire [7:0] usb_tx_data; wire [7:0] usb_rx_data; wire usb_wr_node; wire usb_rd_node; reg /* conflict */[36:0] user_;//TAK Jun.12.2004 =37'bz; wire /* conflict */[36:0] user; wire [15:0] sd_d; wire [12:0] sd_a; wire sd_bs1; wire sd_bs0; wire sd_ldqm; wire sd_udqm; wire sd_wen; wire sd_ras; wire sd_cas; wire sd_clk; wire sd_cke; wire sd_cs; wire [7:0] usb_d; wire usb_wr; wire usb_rd; reg [25:0] counter; //カウンタのレジスタ宣言を追加する assign {clk}=clk0; assign {logich}=1'b1; assign {logicl}=1'b0; assign {sd_clk}=~ (clk); assign {sd_cs}=1'b1; assign {sd_ras}=1'b1; assign {sd_cas}=1'b1; assign {sd_cke}=1'b0; assign {sd_wen}=1'b1; assign {sd_d}={(15-0+1- 0){1'bz}}; assign {sd_a}={(12-0+1- 0){1'b0}}; assign {sd_bs1}=1'b0; assign {sd_bs0}=1'b0; assign {sd_ldqm}=1'b0; assign {sd_udqm}=1'b0; assign {usb_rd_node}=logich; assign {usb_wr_node}=logicl; assign {usb_rd}=usb_rd_node; assign {usb_wr}=usb_wr_node; assign {usb_d}={(7-0+1- 0){1'bz}}; // TAK Jun.12.2004 assign {user[35:0]}={(35-0+1- 0){1'b0}}; //カウンタ本体の記述 always @(posedge clk) begin if (!usb_rsto) counter <=0;//USBのリセット信号を利用していリセットする else counter <=counter+1;//26ビットカウンタ end assign user[35:4]={7'b000_0000,counter[25:0]};//遅延シミュレーションの様子を見るに最下位ビットを外に出す assign user[3:0]=counter[25:22];//LEDに接続 可視化のためには、十分遅く点滅しなければならないので最上位ビットを接続 //カウンタの記述終わり always @ (posedge clk ) begin user_[36] <= (usb_txe & usb_rxf); end //always // assign user = user_;//Added for Conflict reslover. assign user[36]=user_[36]; endmodule |
XILINX プロジェクトを構成する。
プロジェクトのソースとして、上記 led.vとピン番記述ファイルnp1003temp.ucf
を一緒にプロジェクトソースに追加します。プロジェクトPropertyは以下のようになっています。
後は、VHDLの場合と同じようにしていけば、OKです。コンパイル、PROMに焼いて、USBのコネクタを外してまた挿すと、LEDが点滅します。美しい。。