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