FC2カウンター FPGAの部屋 2011年01月16日
fc2ブログ

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

Interface2011年2月号のNSLサンプルを試す5(インプリメントを試す)

今回はNSLファイルをVerilogとVHDLに変換したものをISE12.4でインプリメントして、Spartan3 Starter Kit で動作させてみようと思う。

まずはVerilogからやってみる。VerilogはNSL CoreのOptimizeオプションをチェックして、Synthesisしたほうがシンプルなコードがでるようだ。
NSL_Sample_35_110116.png

これでCQ出版社からダウンロードしたQuartus II のプロジェクトのtimer7seg.v とほとんど変わらない。ただ、counter_0to5モジュールのp_resetが追加してあるだけだ。

ISE12.4のプロジェクトを作成して、Spartan3 Starter Kit でインプリントしようとしたが、Spartan3 Starter Kit の7セグメントLEDの仕様に合っていないので、timer7seg.nsl を変更することにした。
セグメントの出力は1つで、seg_figureによって、出力するセグメントを決めるように変更した。そして、プッシュボタンスイッチを押したときの極性は1だ。seg_figureを2ビットから4ビットに変更した。変更内容を下に示す。

declare    timer7seg  {
    
    // -- timer_30MHz_to_1sec  --
    input        reset ;
    output        seg_o[8] ;
    output        seg_figure[4] ;        // For support DYNAMIC drive.
}

.............

module    timer7seg {
    reg                cnt_1sec[32] = 0 ;
    reg                cnt_100Hz[19] = 0 ;
    reg                seg_figure_buffer[4] = 4'b1110 ;
    reg                seg1_o[8] = 0xc0;
    reg                seg2_o[8] = 0xc0;
    counter_0to9    u_counter_0to9;

    /* common operations */
    {

        seg1_o := ~u_counter_0to9.seg0to9_o ;
        seg2_o := ~u_counter_0to9.seg0to5_o ;
        
        any {
            seg_figure_buffer == 0b1101 : seg_o = seg2_o;
            seg_figure_buffer == 0b1110 : seg_o = seg1_o;
        
        }

        any {
            cnt_1sec == ONE_SECOND : {
                if(reset) {
                    u_counter_0to9.reset() ;
                } else {
                    u_counter_0to9.countup() ;
                }
                cnt_1sec := 0 ;
            }
            else : {
                cnt_1sec++ ;
            }
        }
        
        any {
            cnt_100Hz == CNT_DYNAMIC : {
                cnt_100Hz := 0 ;
                any {
                    seg_figure_buffer == 0b1110 : seg_figure_buffer := 0b1101 ;
                    seg_figure_buffer == 0b1101 : seg_figure_buffer := 0b1110 ;
                }
            }
            else : {
                cnt_100Hz++ ;
            }
        }
        seg_figure    = seg_figure_buffer ;
    }
}


これで、Verilogに変換したものをISE12.4でインプリントする。
まずは制約ファイル(UCF)を作った。timer7seg.ucfを下に示す。

NET "m_clock" LOC = T9;
NET "p_reset" LOC = L14;
NET "reset" LOC = M13;

# PlanAhead Generated physical constraints
NET "seg_figure[0]" LOC = D14;
NET "seg_figure[1]" LOC = G14;
NET "seg_figure[2]" LOC = F14;
NET "seg_figure[3]" LOC = E13;
NET "seg_o[0]" LOC = E14;
NET "seg_o[1]" LOC = G13;
NET "seg_o[2]" LOC = N15;
NET "seg_o[3]" LOC = P15;
NET "seg_o[4]" LOC = R16;
NET "seg_o[5]" LOC = F13;
NET "seg_o[6]" LOC = N16;
NET "seg_o[7]" LOC = P16;
#Created by Constraints Editor (xc3s200-ft256-4) - 2011/01/16
NET "m_clock" TNM_NET = m_clock;
TIMESPEC TS_m_clock = PERIOD "m_clock" 20 ns HIGH 50%;


インプリントして、Spartan3 Starter Kit にダウンロードしたら、見事に動作した。うれしい。
NSL_Sample_36_110116.jpg

次にVHDLでやってみた。VHDLでやるとエラーが出た。
NSL_Sample_37_110116.png

最初のエラーは、

v_net_1 <= '1' when (v_net_2) else '0' ;


だ。エラーの内容は、

ERROR:HDLParsers:802 - "H:/Documents and Settings/Masaaki/My Documents/NSL/Xilinx_ISE/VHDL/timer7seg.vhdl" Line 71. v_net_2 is not a boolean expression.


v_net_2がboolean じゃなくてstd_logic なので、値を示す必要があるようだ。下のように修正すると通る。

v_net_1 <= '1' when (v_net_2='1') else '0' ;


その他、同様のエラーの部分を数カ所、修正すると論理合成が終了した。これでインプリントした。Spartan3 Starter Kit にダウンロードすると動作した。
NSL CoreのVHDL出力は、そのままではISE12.4のXSTで論理合成出来ないようだ。

(2011/01/18:追記)
Synplify Pro D-2009.12でNSL Coreから出力されたVHDLを論理合成してみましたが、やはり、

v_net_1 <= '1' when (v_net_2) else '0' ;



@E:CD648 : timer7seg.vhdl(71) | Expression does not match type boolean


でエラーになってしまいます。
他にもエラーが出ていました。

Quartus II だとVHDLの出力がそのままでも論理合成出来るそうですが、それ以外の論理合成ツールではVHDLソースの修正が必要なようです。

(2011/01/22:追記)
新しくダウンドードしたNSL Core version 20100119でNSLから生成されたVHDLがXSTの論理合成を通って、Spartan3 Starter Kit にダウンロードすると動作することが確認できました。いろいろ修正していただいて、ありがとうございました。

  1. 2011年01月16日 20:09 |
  2. NSL
  3. | トラックバック:0
  4. | コメント:0