MRAMをバウンダリスキャンで操作する
MRAMというメモリがあります。何やら磁気を利用したメモリらしいのですが、メリットは、
- 書き換え回数の制限がない(FlashROMより優れている)
- SRAM並に高速(DRAMより優れている)
- 不揮発性
ということらしいです。
さて、今月、MITOUJTAGをお買い上げいただいたお客様から、バウンダリスキャンでMRAMを書き換えできないかという問い合わせをいただいたので、実際に試してみました。
私はMRAMの単品は持っていなかったのdですが、ちょうどヒューマンデータ製のFPGAボード(XCM-022)がMRAMを搭載していて、そのXCM-022を乗せた試作ボードがあったので、そのシステムを使ってMRAMの実験をしてみることにしまいた。
MITOUJTAG Proには、アドバンスドJTAGファンクションジェネレータ(AJFG)、JTAGスクリプトといって、FPGAの端子をC++言語で書いたとおりに動かす機能があります。
ここでは、そのJTAGスクリプトを使ってFPGA(XC7K160T)の端子を動かし、MRAMにアクセスしてみました。
まず、仕様しているMRAMは、Everspin社のMR2A16AMA35だそうです。
※このEVERSPINという社名を聞いて思わず笑ってしまいました。素晴らしい社名です。とてもセンスがあります。
データシートを見て驚いたのは、SPI ROMやDDR2 SDRAMのようなコマンドがないこと。普通のSRAMと同じように使えばよいのです。これは楽だ・・・・
まずは、ピン配置ファイルを作ります。俗に言うUCFです。
NET "MRAM_WE" LOC="F21"; NET "MRAM_OE "LOC="J22"; NET "MRAM_DQU<15>" LOC="U20"; NET "MRAM_DQU<14>" LOC="T20"; NET "MRAM_DQU<13>" LOC="R19"; NET "MRAM_DQU<12>" LOC="P19"; NET "MRAM_DQU<11>" LOC="P20"; NET "MRAM_DQU<10>" LOC="N19"; NET "MRAM_DQU<9>" LOC="L21"; NET "MRAM_DQU<8>" LOC="K21"; NET "MRAM_DQL<7>" LOC="L20"; NET "MRAM_DQL<6>" LOC="K19"; NET "MRAM_DQL<5>" LOC="L18"; NET "MRAM_DQL<4>" LOC="K16"; NET "MRAM_DQL<3>" LOC="V17"; NET "MRAM_DQL<2>" LOC="J19"; NET "MRAM_DQL<1>" LOC="M16"; NET "MRAM_DQL<0>" LOC="J20"; NET "MRAM_CE" LOC="F20"; NET "MRAM_BE<1>" LOC="J21"; NET "MRAM_BE<0>" LOC="K22"; NET "MRAM_A<18>" LOC="N18"; NET "MRAM_A<17>" LOC="P17"; NET "MRAM_A<16>" LOC="R17"; NET "MRAM_A<15>" LOC="M21"; NET "MRAM_A<14>" LOC="U16"; NET "MRAM_A<13>" LOC="M20"; NET "MRAM_A<12>" LOC="K17"; NET "MRAM_A<11>" LOC="H20"; NET "MRAM_A<10>" LOC="R18"; NET "MRAM_A<9>" LOC="T19"; NET "MRAM_A<8>" LOC="M18"; NET "MRAM_A<7>" LOC="M17"; NET "MRAM_A<6>" LOC="N20"; NET "MRAM_A<5>" LOC="G22"; NET "MRAM_A<4>" LOC="H22"; NET "MRAM_A<3>" LOC="E22"; NET "MRAM_A<2>" LOC="G20"; NET "MRAM_A<1>" LOC="G21";
このUCFをMITOUJTAGで処理すると、↓のようなピン定義ファイルになります。
MRAM_WE F21 MRAM_OE J22 MRAM_DQ U20 T20 R19 P19 P20 N19 L21 K21 L20 K19 L18 K16 V17 J19 M16 J20 MRAM_CE F20 MRAM_BE J21 K22 MRAM_A N18 P17 R17 M21 U16 M20 K17 H20 R18 T19 M18 M17 N20 G22 H22 E22 G20 G21
それから、JTAGスクリプトを書きます。
#include "default.h" #include "conio.h" JEXPORT int jmain() { j_bypass(); j_sample();j_extest(); // AJFGで端子を操作するにはこの行を有効にしてください int addr = 0; MRAM_WE = "1"; MRAM_OE = "1"; MRAM_CE = "1"; MRAM_BE <= "00"; MRAM_CE = "0"; printf("Skip MRAM write (Y/n) ?\n"); if(getch() == 'n'){ printf("Write to MRAM...\n"); for(int addr=0;addr < 1000;addr++) { MRAM_A = addr; MRAM_DQ = ~addr; MRAM_WE <= "0"; MRAM_WE <= "1"; } } MRAM_OE = "0"; MRAM_CE = "0"; MRAM_DQ <= "Z"; printf("Read from MRAM...\n"); for(int addr=0;addr < 1000;addr++) { MRAM_A <= addr; if((addr & 7) == 0) printf("%08lx : ",addr); printf("%04x ",(int)MRAM_DQ); if((addr & 7) == 7) printf("\n"); } MRAM_OE <= "1"; MRAM_CE <= "1"; return 0; }
普通のC言語のように見えますが、高位合成じゃなくてJTAGスクリプトです。ここで書いたMRAM_CEやMRAM_Aといった変数が変化すると、実際のFPGAの端子が動くというものです。
上のプログラムを実行すると、DOSプロンプトが開いて、このように表示されます。
そして、そのときの端子の波形がJTAGロジアナに表示されます。
赤い波形が出力ピン、緑の波形は入力ピンです。書いてから読んでいるので、DQ端子は赤から緑に変化しているのがわかります。
結論をいうと、SRAMと同じ手順でアクセスできました。これは、DDRメモリやFlashROM、SPI Flashと比べてはるかに楽です。この手軽さには、かなり感動しました。
私はMRAMの特徴(メリット)に
- 伝統的なパラレルSRAMと同じ手順で簡単にアクセスできる
もあると、声を大きくして言いたいです。
| 固定リンク
コメント