« EDS Fair2009に出展します | トップページ | EDS Fairの会場から »

2009.01.20

LatticeXP2のFPGA回路内部へJTAGで通信する

Lattice XP2のFPGA回路内部へ、FPGAのJTAGポートを使って通信したいのですが、調べても資料がないので、試行錯誤で調べました。

Jtage XP2には、JTAGEというプリミティブがあります。このプリミティブをユーザロジックにインスタンシエートすることで、FPGAのJTAG端子の信号をFPGA内部回路へ接続することができるようになります。

XILINXにはBSCAN_SPARTAN3やBSCAN_VIRTEX4といったプリミティブがありますが、それと同じような役割をするものがJTAGEです。(ちなみに、LatticeSC/MはJTAGA、LatticeECP/ECとLatticeXPはJTAGB、LatticeECP2/MがJTAGC、MachXOがJTAGDです。)

JTAGEを使うには、TCKやTDIといったJTAG信号をFPGAの外から自分でつないでこないといけない点です。

つまり、メインモジュールのポート宣言で、
entity main is port (
 ・・・
 tck_ip : in std_logic;
 tdi_ip : in std_logic;
 tms_ip : in std_logic;
 tdo_op : out std_logic;
 ・・・
というのを作って、

INST_JTAGE : JTAGE port map (
 tck => tck_ip,
 tdi => tdi_ip,
 tms => tms_ip,
 tdo => tdo_op,
 ・・
と、自分でつながなければなりません。
ただし、これらのJTAG信号はVHDLソースでは形式的につながれているだけですので、JTAGEのTCKにユーザロジックの出力をつないだり、TDIの値をユーザロジックで見たりすることはできません。JTAGEモジュールのJTAG信号はトップのモジュールの入出力端子に直結する必要があります。
(XILINXの場合は、暗黙のうちにつないでくれます)

このようにすると、JTAGEモジュールの、JTCKとJTDIからユーザロジック用のJTAG信号が出てきます。これはユーザ回路で使うことができます。JTDO1/2にはユーザロジックで作った信号を与えると、FPGAのTDOピンから出てくるというわけです。

JTAGEモジュールを有効にするには、JTAGプライベート命令のIPA(0x32)とIPB(0x38)を使います。インストラクションレジスタにIPA命令を入れるとJTAGEモジュールの信号系統1が有効になり、IPB命令を入れると信号系統2が有効になります。

JTAGEモジュールには、JTCKやJTDI以外に、JRTI1/2、JSHIFT、JUPDATE、JRSTNといった信号があります。これらはFPGA内のTAPコントローラがRuntest/IdleステートやShift-DRステート、Updateステート、TestLogicResetステートにあるときにHになる信号です。JCE1は、Capture-DRもしくはShift-DRのときにHになります。
JTAGEモジュールの入出力信号のタイミングを調べたところ、次の図のようになりました。

Xp2_jtage_timing
(クリックで拡大)


注意しなければならないところは、JTCKとJCE1、JSHIFTなどの遷移するタイミングが全く同時(5ns以下)であることです。したがって、JTCKでJCEをサンプリングすることはできません。
次のような記述ではうまくうごきませんでした。
process(JTCK) begin
 if(JTCK'event and JTCK = '1') then ・・・ ×
  if(JCE1 = '1) then

JCE1を見るならば、JTCKの反転クロックで見なければなりません。

process(JTCK) begin
 if(JTCK'event and JTCK = '0') then ・・・ ○
  if(JCE1 = '1) then

こうすることで、うまく動くようになります。

もしくは、JCE1をいったん反転クロックでサンプリングして、

process(JTCK) begin
 if(JTCK'event and JTCK = '1') then ・・・ ○
  if(JCED1 = '1) then ・・・ JCED1はJCEを反転JTCKで遅延させたもの
   SHIFTREG <= TDI & SHIFTREG(SHIFTREG'LEFT downto 1);

とします。
ユーザ回路でシフトレジスタを作ったら、JSHIFTとJTCKによってそれをシフトさせます。
ただし、JTAGEモジュールにCAPTURE信号の出力はないので、JCE1 and not JSHIFTで条件を作るか、JCE1の立ち上がりエッジでCAPTUREさせればよい(こちらが正道だが非同期回路扱いになる)でしょう。

JTDOは次のようにします。

 JTDO <= SHIFTREG(0); ・・組み合わせ回路であるべし

JTAGEプリミティブのJTDO1/2に入れられた信号は、マスターのTCKの立下りでサンプリングされ、FPGAの外に出力されます。

これで、ユーザ回路の中にJTAG通信コンポーネントを入れることができるようになります。
シフトレジスタにブロックメモリやCPUの信号をつなげば、JTAGポートを通じてFPGAの外から中へアクセスできるようになります。

ということで、あと少しで、LatticeXP2対応のJTAGロジアナが作れそうです。
Lattice_xp2_logiana


特殊電子回路はEDS Fairに出展します。詳細はこちら http://www.tokudenkairo.co.jp/edsfair2009.html
460x60_01


|

« EDS Fair2009に出展します | トップページ | EDS Fairの会場から »