Home > CPLD

Last modified: Apr 19, 2006



Table of Contents


CPLD with Verilog

CQ出版『VHDLで学ぶCPLD学習セット』をQuartus II と Verilog-HDL で開発する方法

Click to enlarge

TD4 on CPLD

毎日コミュニケーションズ『CPUの創り方』に掲載されているTD4 CPUをCQ出版『DesignWave 2003年1月号』付録CPLD上に実装

Click to enlarge

CPLD


CPLD with Verilog-HDL

CPLD (Complex Programmable Logic Device) を Verilog-HDL (Quartus II)で開発

CQ出版 DesignWave 『VHDLで学ぶCPLD学習セット』は、 AlteraのCPLD (MAX7032)を用い、VHDLをMax+PlusIIで合成し、実際に動かしてみるという学習セットです。 現在(2003年12月)、LeonardoSpectrum-Alteraのライセンスが切れてしまったためか、この学習セットは販売されていません。 ライセンスが切れたからといって使えないというのはもったいないので、Max+PlusIIの代わりにQuartus IIを用いて利用する方法を紹介します。

さらに学習セットではVHDLでの開発方法が記載されていますが、 ここではVerilog-HDLを用いることにします。

Quartus II setup

Quartus II web edition 3.0のライセンスセットアップをします。
詳細は省略。

  • DesignWave 2003年1月号 (付録: CPLD基板) Max+PlusII
  • DesignWave 2003年10月号 (付録: FPGA基板) Quartus II web edition 3.0

を参考に設定してください。 特に、Quartusのlisence setup方法を解説している後者。

HOWTO make

  1. New Project Quartusを起動して、
    [File] -> [New Project Wizerd]
    • New Project Wizerd: Introduction [Next]
    • New Project Wizerd: Directory, Name, and Top-Level Entity working directoryとprojectの名前、top-level entity(後述Verilog-HDLの中のトップモジュール)を指定します。

      (画像をクリックすると拡大)

    • New Project Wizerd: Add Files まだファイルを作っていないので、空欄のまま。
    • New Project Wizerd: EDA Tool Settings Quartusのみを利用するので、何も指定しない。
    • New Project Wizerd: Device Family

      Family: MAX7000SとYesを選択
    • New Project Wizerd: Select a Target Device

      EPM7032SLC44-10を選択
    • New Project Wizerd: Summary [Finish]
  2. Assign Pins 回路図を参考にしながら、Verilog-HDL内のpinの名前と実際のデバイスのpinの対応表を作ります。
    [Assignments] -> [Assign Pins...]
    Number 1のpinを選択して、Pin nameに"GCLK1" (Verilog-HDL内での名前)と入力し、[Add]。

    同様に、すべてのI/O pinに名前を付けます。

    しかし、このダイアログで入力するのは大変なので、一旦Quartusを終了させ、 un1001b.csf というテキストファイルを直接編集してしまいます。(正当な方法かどうかは分かりません。)

    CHIP(UN1001B)
    {
    (省略)
            GCLR : LOCATION = Pin_1;
    (ここに追加。例えば、)
            OE2 : LOCATION = Pin_2;
    }
    
    というように、すべてのpinに名前を付けます。
    参考
    $ grep LOCATION un1001b.csf > grep.csf
  3. Verilog-HDL Verilog-HDLファイルを作成します。
    例: sample.v (このファイル内のpinの名前は上記参考のgrep.csfを利用しています。)

    [Project] -> [Add/Remove Files in Project]でVerilog-HDLファイルを追加します。

  4. Compilation compile, fittingします。
    [Processing] -> [Start Compilation]
  5. Program CPLDのEEPROMに回路情報を焼き込みます。
    [Tools] -> [Programmer]
    書き込みツールを設定します。
    [Hardware...]
    Hardware Setting tabで[Add Hardware...]

    Hardware type: ByteBlasterMV or ByteBlaster II
    Port LPT1 (プリンタケーブルを繋いでいるポート)
    を選択します。[OK]

    ByteBlasterMVを選択して、[Select Hardware] -> [Close]

    対応する*.pofファイルのProgram/Configureのcheck boxをチェックします。
    プリンタケーブルとボードを接続し、ボードの電源を入れておきます。
    [Processing] -> [Start Programming]
    書き込みが終ると、回路が構成されます。

    sample.vではDSW2-3, DSW2-4の2bitで指定した値を加算しながらインクリメントする16bitカウンタが7セグメントLEDに表示されます。


TD4 on CPLD



毎日コミュニケーションズ『CPUの創り方』の中で製作される"TD4" (Toriaezu Dousasurudakeno 4bit-CPU) をCPLDで実装しました。 CPLDはDesignWave 2003年1月号の付録であるAltera EPM7256ATC100-10を利用しました。

『CPUの創り方』では、汎用ロジックIC (74HC*)を用いてTD4を作っていきます。 74*で作ると半田付けが面倒なのでCPLDという選択をしました。 74*で作る雰囲気を味わうために、74*のlibraryを組み合わせて回路図を書き、合成させようと試みました。 しかし、マウスで回路図すべてを描くのは骨が折れるので、 結局RTL (Register Transfer Level)記述のVerilog-HDLで設計しました。

作り始めは、Quartusを利用してRTLから合成、fitting、JTAG downloadまでしようと考えましたが、 QuartusはMAX7000Aのような古いデバイスはサポートしていませんでした。 そこで、legacy deviceに対応している MAX+plus II を利用しました。 しかし、free edition の MAX+plus II では RTL を合成するライセンスがないです。 そこで、他社の合成ツールを利用してRTLをEDIF (Electronic Design Interchange Format)に落し、 EDIF を MAX+plusII で fitting、JTAG downloadまで行ないました。

TD4 Specification

General register 4bit * 2
Address space 4bit (16byte)
Program counter 4bit
Flag register 1bit (Carry)
Arithmthic operation 4bit add
clock 10MHz
logic cells 9/256 (3%) (チャタリング除去回路含む)

Block Diagram

Instruction Set (opcode)

  • arithmetic
    ADD_A_Im 0x0, ADD_B_Im 0x5
  • move
    MOV_A_Im 0x3, MOV_B_Im 0x7, MOV_A_B 0x1, MOV_B_A 0x4
  • jump
    JMP_Im 0xF
  • branch
    JNC_Im 0xE
  • Port IN
    IN_A 0x2, IN_B 0x6
  • Port OUT
    OUT_B 0x9, OUT_Im 0xB

Mother Board

手元に3.3Vで動作するクロックがなかったので、トグルスイッチを使って手動クロックを発生することにしました。 プッシュスイッチだとチャタリング除去にアナログ素子(R,C,74HC14?)あるいは、タイマ(クロック)が必要ですが、 トグルスイッチだと2つのNANDゲートでチャタリング除去ができてマクロセルの少ないCPLDでは手頃です。

Register Transfer Level (RTL)

td4.tar.gz

td4/
td4/alu.v ALU (Arithmetic Logic Unit)
td4/decoder.v opcode decoder
td4/epm7256a.v mother board top module
td4/mux.v MUX (multiplexer) module
td4/opcode.v opcode header file
td4/pc.v PC (Program Counter) module
td4/register.v register module
td4/rom.v ROM module
td4/td4.v TD4 CPU top module

HOWTO make

  1. license setup
    MAX+plus IIのlicense setupを行ないます。
  2. import EDIF
    RTLから合成ツールを用いてEDIFを生成し、*.edfと名付けます。
    MAX+plus IIの [File] - [Project] - [Name] で *.edf を選択します。
  3. assign device
    MAX+plus II では、GUIでEPM725ATC100-10を選択できません。
    とりあえず、[Assign] - [Device]で、EPM7256AETC100-10を選択し、*.acfを編集します。
    CHIP *
    BEGIN
    	DEVICE = EPM7256ATC100-10;
    END
    
    GLOBAL_PROJECT_SYNTHESIS_ASSIGNMENT_OPTIONS
    BEGIN
    	DEVICE_FAMILY = MAX7000A;
    END;
    
  4. prefit
    [MAX+plus II] - [Compile] compiler window で [Start]
  5. pin assign
    [Assing] - [Pin/Location/Chip...] でNode Name, Pin, Pin Typeを設定するか、
    または、*.acf を直接編集します。
    CHIP *
    BEGIN
    	|RESET : INPUT_PIN = 98;
    	|LED0 :	OUTPUT_PIN = 40;
    	|LED1 :	OUTPUT_PIN = 42;
    	|LED2 :	OUTPUT_PIN = 46;
    	|LED3 :	OUTPUT_PIN = 50;
    	|TSW0 :	INPUT_PIN = 78;
    	|TSW1 :	INPUT_PIN = 80;
    END
    
  6. postfit
    compiler window で [Start]
  7. download
    ByteBlasterMVなどをprinter portに接続します。
    [Option] - [Hardware Setup]で設定を確認します。
    (Windows2000/XPでは予めdevice driver "Altera ByteBlaster"を設定する必要があります。)
    [MAX+plus II] - [Programmer] で [Program]

Reference

  • CQ出版 DesignWave 『VHDLで学ぶCPLD学習セット』解説書
  • CQ出版 『トランジスタ技術』 2001年7月号-2002年1月号 連載 (上記解説書の元記事)
  • CQ出版 『DesignWave』 2003年10月号
  • 毎日コミュニケーションズ 『CPUの創り方』
  • CQ出版 『DesignWave』 2003年1月号
  • Altera MAX 7000 Programmable Logic Device Family Data Sheet