階層構造を意識した設計スタイルとは?:触って学ぼう FPGA開発入門(5)(3/4 ページ)
大規模回路の場合、1つのモジュールで設計を行うことは難しい。ここでは、大規模回路で用いられる階層構造での記述について解説します
テストベンチ記述の修正
テストベンチは、10進アップ・ダウンカウンタで使用したものを流用します。RTL記述からの出力が「COUNT」から「LED」「SA」に変更されたので、その部分を変更します。変更した記述をリスト5に示します。
1 module TEST_UPDOWN10; 2 reg clk, reset, dec; 3 wire [7:0] led; 4 wire [3:0] sa; 5 6 parameter CYCLE = 100; 7 parameter SIM_SEC1_MAX = 4; 8 9 UPDOWN_7SEG #(.SEC1_MAX(SIM_SEC1_MAX)) i1(.RESET(reset), .CLK(clk), .DEC(dec), .LED(led), .SA(sa)); 10 11 always #(CYCLE/2) 12 clk = ~clk; 13 14 initial 15 begin 16 reset = 1'b0; clk = 1'b0; dec = 1'b1; 17 #CYCLE reset = 1'b1; 18 #(15*CYCLE*SIM_SEC1_MAX) dec = 1'b0; 19 #(10*CYCLE*SIM_SEC1_MAX) $finish; 20 end 21 22 initial 23 $monitor($time,,"clk=%b reset=%b count=%b", clk, reset, i1.COUNT); 24 25 endmodule
リスト5 テストベンチの記述(T_UPDOWN10-2.v) |
変更点は以下のとおりです。
3〜4行目
ledとsaのポートに接続するためのwire宣言(複数bitあるので省略不可)
9行目
LEDとSAポートにledとsaの信号の接続
23行目
$monitorでカウンタの値を出力させている部分を、UPDOWN_7SEGモジュールの中のCOUNT信号に変更。具体的には「i1.COUNT」にする。
以上で、テストベンチ記述の修正が完了しました。
シミュレーションの実行
それでは、シミュレーションを実行しましょう! 基本的にシミュレーションの実行は、いままで解説してきたとおりです。
必要なファイル4つ(T_UPDOWN10-2.v、UPDOWN_7SEG.v、UPDOWN10-2.v、DECODER7.v)を用います。
今回は、図1にもあるとおり7セグメントLEDの結果もさることながら、RTLの最上位に相当する「UPDOWN_7SEG」の内部信号である「COUNT」信号を波形表示させたいところです。
基本的には画面左にある[Workspace]ウィンドウの[sim]タブにある、インスタンス名が出力されている部分「i1」を選択すると、[Objects]ウィンドウに「COUNT」信号が現れますので、これを右クリックしてショートカットメニュー[Add to Wave]−[Selected Signals]を選択し、波形表示[wave]ウィンドウに加えるだけです。以下のように「COUNT」が動作している様子を見ることができます(図2-1〜2-4)。
論理合成、配置配線、ダウンロード
論理シミュレーションの結果特に問題がなければ、「ISE WebPACK」で論理合成、配置配線を行います。セットアップ時の注意点は、ファイルを選択する際に図3-1のようにRTL記述に関連する下位のモジュール(UPDOWN10-2.v、DECODER7.v、UPDOWN_7SEG.v)をすべて選択することです。
画面左上の「Sources」ウィンドウに回路に必要なファイル(ピン固定のファイル含む)が、登録されます(図3-2)。
最上位のモジュール(UPDOWN_7SEG.v)を選択すれば、勝手に下位のモジュールを自動的に呼んできてくれるわけではありませんので注意してください。回路になるモジュールはすべて選択します。また、今回使用するピン固定のファイルをリスト6に示します。
1 NET "CLK" LOC = "P39" ; 2 NET "RESET" LOC = "P17" ; 3 NET "DEC" LOC = "P16" ; 4 NET "LED<0>" LOC = "P41" ; 5 NET "LED<1>" LOC = "P40" ; 6 NET "LED<2>" LOC = "P31" ; 7 NET "LED<3>" LOC = "P30" ; 8 NET "LED<4>" LOC = "P22" ; 9 NET "LED<5>" LOC = "P21" ; 10 NET "LED<6>" LOC = "P20" ; 11 NET "LED<7>" LOC = "P19" ; 12 NET "SA<0>" LOC = "P46" ; 13 NET "SA<1>" LOC = "P45" ; 14 NET "SA<2>" LOC = "P44" ; 15 NET "SA<3>" LOC = "P43" ;
リスト6 ピン固定ファイル(UPDOWN_7SEG.ucf) |
後はいままでどおり論理合成、配置配線、FPGA用のデータ作成を行います。
正常終了したらダウンロードを行い、動作を確認してみましょう。
ここまでの作業が問題なく完了していれば、真ん中のプッシュスイッチを押していない間は、右側の7セグメントLEDが0〜9まで1秒ごとにカウントアップし、真ん中のプッシュスイッチを押している間は、右側の7セグメントLEDが9〜0まで1秒ごとにカウントダウンするはずです。
いかがでしょうか? うまく動いたでしょうか?
Copyright © ITmedia, Inc. All Rights Reserved.