Lattice XP2のFPGA回路内部へ、FPGAのJTAGポートを使って通信したいのですが、調べても資料がないので、試行錯誤で調べました。
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モジュールの入出力信号のタイミングを調べたところ、次の図のようになりました。
(クリックで拡大)
注意しなければならないところは、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ロジアナが作れそうです。
特殊電子回路はEDS Fairに出展します。詳細はこちら http://www.tokudenkairo.co.jp/edsfair2009.html
最近のコメント