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が点滅します。美しい。。