« MCAで得られたスペクトルが | トップページ | MITOUJTAG BASIC/Pro 3.0をリリースしました »

2016.04.25

MRAMをバウンダリスキャンで操作する

MRAMというメモリがあります。何やら磁気を利用したメモリらしいのですが、メリットは、

  • 書き換え回数の制限がない(FlashROMより優れている)
  • SRAM並に高速(DRAMより優れている)
  • 不揮発性

ということらしいです。

さて、今月、MITOUJTAGをお買い上げいただいたお客様から、バウンダリスキャンでMRAMを書き換えできないかという問い合わせをいただいたので、実際に試してみました。

私はMRAMの単品は持っていなかったのdですが、ちょうどヒューマンデータ製のFPGAボード(XCM-022)がMRAMを搭載していて、そのXCM-022を乗せた試作ボードがあったので、そのシステムを使ってMRAMの実験をしてみることにしまいた。

Np1080

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プロンプトが開いて、このように表示されます。

Mram2

そして、そのときの端子の波形がJTAGロジアナに表示されます。

Mram1

赤い波形が出力ピン、緑の波形は入力ピンです。書いてから読んでいるので、DQ端子は赤から緑に変化しているのがわかります。

結論をいうと、SRAMと同じ手順でアクセスできました。これは、DDRメモリやFlashROM、SPI Flashと比べてはるかに楽です。この手軽さには、かなり感動しました。

私はMRAMの特徴(メリット)に

  • 伝統的なパラレルSRAMと同じ手順で簡単にアクセスできる

もあると、声を大きくして言いたいです。

|

« MCAで得られたスペクトルが | トップページ | MITOUJTAG BASIC/Pro 3.0をリリースしました »

コメント

コメントを書く



(ウェブ上には掲載しません)




« MCAで得られたスペクトルが | トップページ | MITOUJTAG BASIC/Pro 3.0をリリースしました »