火曜日, 10月 30, 2007

LatticeMico32 シリアル通信の確認

前回、やり残していたシリアル通信の確認。


とその前に、以前はSpartan-3E Starter Kitのメス型の方のシリアルポートにアサインしていましたが、それをオス型の方に変更しました。

[ucfファイル]

# Period constraint for 50MHz operation
#
NET "clk" PERIOD = 20.0ns HIGH 50%;
#
# soldered 50MHz Clock.
#
NET "clk" LOC = "C9" | IOSTANDARD = LVTTL;
#
#
# Simple LEDs
# Require only 3.5mA.
#
NET "led<0>" LOC = "F12" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 4;
NET "led<1>" LOC = "E12" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 4;
#
# Press buttons
# Must have pull DOWN resistors to provide Low when not pressed.
#
NET "btn_south" LOC = "K17" | IOSTANDARD = LVTTL | PULLDOWN;
#
# UART connections
#
#NET "tx_female" LOC = "M14" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 4;
#NET "rx_female" LOC = "R7" | IOSTANDARD = LVTTL;
NET "RS232_DTE_RXD" LOC = "U8" | IOSTANDARD = LVTTL ;
NET "RS232_DTE_TXD" LOC = "M13" | IOSTANDARD = LVTTL | DRIVE = 8 | SLEW = SLOW ;
# End of File
#


[ラッパー]

`define LEDOUT_BITS 2

module wrap_s3e_kit (/*AUTOARG*/
// Outputs
led, RS232_DTE_TXD,
// Inputs
clk, btn_south, RS232_DTE_RXD
);

input clk;
input btn_south;
output [`LEDOUT_BITS-1:0] led;
output RS232_DTE_TXD;
input RS232_DTE_RXD;


system_top system_top_i (
.clk_i(clk),
.rst_i_n(~btn_south),
.led_out(led),
.tx_out(RS232_DTE_TXD),
.rx_in(RS232_DTE_RXD)
);

endmodule


結果は以下のとおり。

↓ハイパーターミナルを起動して、LatticeMico32をリセット。


リセット直後にLatticeMico32から送信されるメッセージが表示されます。

↓その後、適当にキーボードから文字を打つと、


そのまま返ってきた文字が表示されます。

ハイパーターミナル側のボーレートは115200bpsに設定しています。

以上で無事、シリアル通信の動作も確認ができましたので
今後はこれを使って遊んでみようかなと思います。

金曜日, 10月 26, 2007

LatticeMico32 Spartan-3E スターターキットに実装(補足)

前回の補足

Spartan-3E スターターキット用のUCFは自作なので一応載せておきます。

[ucfファイル]

# Period constraint for 50MHz operation
#
NET "clk" PERIOD = 20.0ns HIGH 50%;
#
# soldered 50MHz Clock.
#
NET "clk" LOC = "C9" | IOSTANDARD = LVTTL;
#
#
# Simple LEDs
# Require only 3.5mA.
#
NET "led<0>" LOC = "F12" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 4;
NET "led<1>" LOC = "E12" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 4;
#
# Press buttons
# Must have pull DOWN resistors to provide Low when not pressed.
#
NET "btn_south" LOC = "K17" | IOSTANDARD = LVTTL | PULLDOWN;
#
# UART connections
#
NET "tx_female" LOC = "M14" | IOSTANDARD = LVTTL | SLEW = SLOW | DRIVE = 4;
NET "rx_female" LOC = "R7" | IOSTANDARD = LVTTL;
# End of File
#


あとは、DesignWaveに付いていたトップモジュールに次のラップをかぶせてチンしてください。

`define LEDOUT_BITS 2

module wrap_s3e_kit (/*AUTOARG*/
// Outputs
led, tx_female,
// Inputs
clk, btn_south, rx_female
);

input clk;
input btn_south;
output [`LEDOUT_BITS-1:0] led;
output tx_female;
input rx_female;


system_top system_top_i (
.clk_i(clk),
.rst_i_n(~btn_south),
.led_out(led),
.tx_out(tx_female),
.rx_in(rx_female)
);

endmodule


載せるほどのものでもないですが。。。
これでSpartan-3E スターターキットに実装できると思います。

リセットはプッシュボタンスイッチのBTN_SOUTHで
シリアルはメス型の DB9 DCE コネクタにアサインされています。

ちなみにシリアルのほうはまだ動作確認していないので
ご使用は自己責任でお願いします。

木曜日, 10月 25, 2007

LatticeMico32のページ

そういえば、LatticeMico32のページにリンクを貼っていなかったので一応リンクしときます。

ラティスMico32 オープン、無償の32ビット・ソフト・プロセッサ


基本的に英語ですが色々情報が手に入ると思います。

ちなみにLatticeMico32の主な特徴は

・RISCアーキテクチャ
・32ビットデータバス
・32ビット命令
・32汎用レジスタ
・最大32の外部割込み
・命令キャッシュ(オプション)
・データキャッシュ(オプション)
・デュアルWISHBONE メモリーインタフェース(命令とデータ)

などなど

デュアルウィッシュボーンってなんかクルマのサスっぽいな。

オープンソースなのでシミュレーションでCPU内部の動作を確認することもできますし
ソフトウェアの開発環境(GNU-Tools)もソースコードが公開されているので
(私には無理ですが)そのへんをいろいろいじったりもできるんじゃないでしょうか?

水曜日, 10月 24, 2007

LatticeMico32 Spartan-3E スターターキットに実装

前回の続き

とりあえず途中経過程度で。
ここのところ本業が忙しい時期に入ってきたのでなかなか進めれていません。

Spartan-3E スターターキット
に実装してみました。

↓LEDが点滅しているところ。


ちゃんと動いてますね。
ちなみにクロックの動作周波数は50MHzです。

あと、シリアルも繋げなきゃいけなかったのですが
適当なPCにシリアルポートが付いているものがなく。。。

最近はデスクトップでもレガシーI/Oついてないんですよね。

ということでこれは次回に持ち越し。

ここのところのLatticeMico32の話題に関しては、
DesignWaveの記事をほぼなぞっているだけということもあってあまり詳細は書いていません。

もし、同じようなことをやっていてうまく行かないという方がいれば
コメントに質問を入れてください。

ソースもほぼそのまま使っているのでここに載せるわけにもいけないため
ある程度落ち着いたら、自分で適当なトップモジュールを組んでアップしようと思います。

その前にソフトの開発環境のこと勉強しておかないとナ。

月曜日, 10月 15, 2007

LatticeMico32 シミュレーション

前回の続き

で、今回はシミュレーションまでやってみる。

ちなみにこの内容はDesignWaveMagazineの2007年10月号の記事を参考にしています。

RTL,テストベンチのコードはそのCD-ROMに収録されているものを使用していますのでお持ちでない方はあしからず。

まずシステムの構成ですが、プロセッサのコアと命令用およびデータ用のSRAM関連のほかにUARTインタフェースモジュールとLED制御用のレジスタがあります。

記事によると、まずスタートアップ後にUARTからmessage("This is a message from Mico32 processor.\n")が出力されます。
その後、UARTに関しては受信したキャラクタをそのまま送り返すようになっています。

また、LEDは約0.5秒ごとに2つのLEDが点灯・消灯を繰り返すとのこと。

ModelSimで約1秒間のシミュレーションを行った結果の波形は次のようになりました。



確かに2つのLED(ledの下位2ビット)が約0.5秒間隔で点灯と消灯を繰り返している模様。

次に先頭の部分を拡大。



詳細は確認していませんが、UARTがなにやら送信していることがわかります。

次にその少し後を拡大。



受信したコードをそのまま送信していることが確認できます。

というわけで、シミュレーションでなんとなく動作していることもわかりました。

ちなみに今回、ModelSim XE Starter とModelSim PE とで実行時間の比較を行いました。

結果は1,009,312,600nsのシミュレーションに対して、実行時間が

XE Starter・・・2921.70seconds
PE ・・・1024.16seconds


PCのスペックは
OS : Microsoft Windows XP SP2
CPU: Intel(R) Core(TM)2 CPU 6400 @ 2.13GHz
RAM: 2.75GByte

です。

Xilinxのサイトによると、10000行以下のデザインであればXE staterの実行速度はPEの30%とのことなので大体そのとおりになっているようです。

ただ、10000行を超えるとXE starterの性能はガタ落ちのようなので実際にプロセッサを組み込んでシミュレーションを行う場合はもっと上のグレードか他のシミュレータを選んだほうがよさそうです。

今回のデザインでコメントを除いた行数は大体8,500行ぐらいでした。

ただ1点気になるのは、DWMの記事ではボーレートを50MHzのクロック入力で115,200bpsに設定してあると書いてあるのですが(そしてソースコード上のパラメータもそうなっている)、テストベンチのクロックの周期は4000としてあります。
タイムスケールが設定されていないのでよくわかりませんがpsだとすると25MHz。
これは単純なミス?

たぶん実際は50MHz入れてやればよいのでしょう。

今日はここまで。

次回は実際にFPGAに実装して動作確認をしてみようと思います。

木曜日, 10月 11, 2007

LatticeMico32 Xilinx ISEで合成&インプリ

前回の続き

結果から先にいうと、
ISEで一応、合成とインプリまでできました。

デバイスはXC3S250E-4VQ100でオプションは特に変更せずに
スライスの利用率が51%、最大動作周波数が62.290MHzという結果が出ました。

DesignWaveの記事では、
スライスの利用率が54%、最大動作周波数が71.4MHzとのことなので大体そんなところかな。

問題になっていたエラーは、前回修正した2箇所目の部分を次のようにすれば出なくなりました。


[修正後]
parameter integer INTEGER_DIVISOR = i_divisor(BAUD_RATE, CLK_IN_MHZ);



あと、Designwaveの記事ではISEでコンパイルする場合

・generate文中でif文を使う場合はラベルが必要
・localparam宣言で関数が使えない

とありましたが、今回うちの環境(ISE9.2.03i)ではこの2つは特に変更することなくコンパイルできました。
まだ動作を確認したわけではないのでなんともいえませんが。

まあ何はともあれ、XilinxのFPGAに実装できそうだということがわかったので
次はシミュレーションでもやってみようかと思います。

水曜日, 10月 10, 2007

うまくいかない

DesignWaveの2007年10月号の記事を参考に
XilinxのISEで「LatticeMico32」を合成しようとしているのですがうまくいかない。

ISEのバージョンは9.2.03i。

まず引っかかったのがuart_core内のintfaceモジュール。

ここで"CLK_IN_MHZ"が定義されていないとエラーが出たがこれは次のように2箇所を修正すると回避できた。

intface.v

[修正前]
function integer i_divisor;
input integer baudrate;
begin
i_divisor = ((1048576.0 * (baudrate/100.0)) / (CLK_IN_MHZ*10000.0)) + 0.5;
end
endfunction // i_divisor



[修正後]
function integer i_divisor;
input integer baudrate;
input integer clkinmhz;
begin
i_divisor = ((1048576.0 * (baudrate/100.0)) / (clkinmhz*10000.0)) + 0.5;
end
endfunction // i_divisor



[修正前]
parameter INTEGER_DIVISOR = i_divisor(BAUD_RATE);



[修正後]
parameter INTEGER_DIVISOR = i_divisor(BAUD_RATE, CLK_IN_MHZ);




その後も試行錯誤して、やっと合成がはじまったかなーと思ったら次のエラーに遭遇。

FATAL_ERROR:Xst:Portability/export/Port_Main.h:127:1.17


Xilinxのサイトで調べてみたけど

FATAL_ERROR:Xst:Portability/export/Port_Main.h:127:1.17

ちょっと原因がわかりません。

どなたか試された方いませんか?

一応、解決しました。
詳細はこちら

水曜日, 10月 03, 2007

アンケート結果

1ヶ月ぐらい、アンケートを取ってました→

『使っているシミュレータ(検証環境)は何?』

結果は次のとおり。



やっぱり無償版もあるModelSimの利用者が多いみたいですね。
FPGAに限るともっと比率は上がりそう。

しかし、NC-VerilogやVCSなどの利用者の方もいらっしゃるようで。
さすがにこれらは個人で購入する人はいないと思うので、企業にお勤めのエンジニアの方かまたは大学関係の方か。
そういう方々にもこのブログを見ていただいていると思うと恐縮です。

知ってる人は知っている国産シミュレータのVeritakも18%と健闘です。
コストパフォーマンスはNo.1?

Icarus Verilogの利用者は意外と少ないようです。
日本語のドキュメントが少ないことが原因?

Aldecはマイナー?

その他はCverとかでしょうか?


以上、第1回のアンケート結果でした。
第2回以降があるかどうかは未定ですが。。。

もし、こんなアンケートをやってほしいというものがあればコメントにどうぞ。

月曜日, 10月 01, 2007

オンチップバス

ここのところ、新しく書くテーマを何にしようかなぁと考えてます。

オンチップバスなんかどうでしょうか?

オンチップバスとは、チップ内でモジュール間の接続を行なうバスの事で
有名なところでは、

・CoreConnect
・AMBA
・WISHBONE

等があります。

それぞれの概要は次のPDFを参照。

SoC Bus Review

で、オンチップバスを採用する利点ですが
まずは文書化されているということでしょうか。

上記の3つであればそれぞれ仕様をWEBから入手可能です。
AMBAは日本語のドキュメントも提供されています。

なので、毎回その場かぎりのインタフェースを設計して、デバッグして、
しかもドキュメントが不十分という状況から脱却することができます。

また、インタフェースが統一されていれば再利用性もあがりますし
広く使われているインタフェースであればIPとしての価値も上がります。

以上のことから、オンチップバスを採用することをお勧めしたい。

SoCやってることところであれば当然のことと思われるかもしれないが
そうでないところでは意外に使われてないんじゃないでしょうか?

今のところ、AMBA AHBかWISHBONEかで迷ってるんですけど
今月のDesign Waveの記事にWISHBONEを採用しているオープンソースのCPUコアのことが書いてあったのでこれを使ってみるのも面白いかな?

ただ今、仕事で基板の回路設計をやっているのでなかなかそっちのほうに頭が向かない。

回路設計はロジックと違って、サイズや構造、電気的なこともさることながら部品の入手性や価格のことなんかも考えなきゃいけないので大変だ。

あまり好きくはないのだがやらねばその先ができないのでしょうがない。