FC2カウンター FPGAの部屋 2007年01月29日
fc2ブログ

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

親子で遊ぼうマイコンカー

昨日はNPOグローバリスジャパン主催の楽しいマイコン教室(親子で遊ぼうマイコンカー)に息子と行ってきた。
ラジコンカー(トミー・エアロアールシー)を改造してフリースケール社のマイコンMC9S08QG8を載せてラジコンの代わりに8ビットマイコンで制御しようということだ。詳しくはここのサイトに載っている。
実際はこのようにラジコンカーを改造したのではなく、すでに改造してあった。10台分改造するのは大変だったろう。主催者の皆さんありがとうございました。
まずは改造済みラジコンカーを製作した。1台以前自分で作ったことがあったのだが、結構手間取って作り上げたのは一番最後になってしまった。何はともあれ出来上がってとりあえずはラジコンで動いた。
最初にはラジコンで動かすためDIPスイッチがショートピンの代わりに入っていたが、それを抜いてマイコンを挿入。左にステアリングを切って前進するという動作を2回行うC言語プログラムが入っている。(つまり2回左に回る)ツールはCodeWarriorだった。フリースケールから無償でもらっているそうだ。CodeWarriorはMACのころにCGIソフトを作ったことがある。OSF/Motifに次いで2回目に作ったGUIソフトだった。懐かしい!!!
それを8の字に走行すように変更した。2回目の左ステアリングを右に変更すれば8の字に曲がれるが、右左が不均等なので時間を変えて均等にしようとしたが、ある程度は出来るが正確には出来ない。おもちゃなのである程度は仕方がない。
次に8の字にもう1つ下に円を追加した形をトレースするという問題が出た。これは左ステアリング1周、右ステアリング半周で出来た。でもやはり不均等だ。まあこれで良いことにした。
感想はC言語を小中学生がやるには難しいだろうということだ。やはりロゴ、マインドストームのようにグラフィカルに動作を組み立てる方がいいじゃないかと思う。カーニハン・リッチーのC言語本も紹介していたが小・中学生が読めるとは思わない。暇になったらGUI作っちゃおうか? CodeWarriorってコマンドラインから使えるのかな?統合できると良いのだけど。
それにDIPスイッチとマイコンチップを交換するのが面倒なので、最初からマイコン乗せておいてラジコンのコマンドでラジコンとマイコン制御を切り替えたほうがいいじゃないだろうか?
でも、全体的には面白かった。うちの息子もラジコンカーを作るところは夢中でやっていた。プログラムのあたりは人を気にしていたが全般的には大丈夫だった。良かった。
最後にアンケートをろくに書かなくてごめんなさい。息子の様子が心配なこともあって書かないでしまった。帰りにいろいろお話をしたかったのだけど。。。
micon_car_060129.jpg

  1. 2007年01月29日 19:29 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

Verilog2001版DDR SDRAMコントローラーのModelSimシミュレーション4

Verilog2001版DDR SDRAMコントローラーのModelSimシミュレーションも続けてやっている。
大体バグも取れてきたのだがModelSimXE3 starterだと1回シミュレーションするのに12分くらいかかる。バグを修正して辛抱強く12分待ってから確認するのでどうしても時間がかかる。
今は信号を遅延させたのだが前の信号と違うという状況がわからない。VHDLの慣性遅延のように記述した遅延量以下のパルスは遅延しないのだろうか?
VerilogHDLの遅延は伝播遅延だと書いてあるのを見たことがあったのだが、もう一度調べてみる必要がありそうだ。
Verilogコードは下のようだ。

`timescale 1ps / 1ps
parameter DELAY_TIME = 1500;
assign #DELAY_TIME ddr_dqs_fpga = (enable_o==1'b1) ? ddr_dqs_sdram : {DQS_BITS{1'bz}};
assign #DELAY_TIME ddr_dq_fpga = (enable_o==1'b1) ? ddr_dq_sdram : {DQ_BITS{1'bz}};

assign #DELAY_TIME ddr_dqs_sdram = (enable_o==1'b0) ? ddr_dqs_fpga : {DQS_BITS{1'bz}};
assign #DELAY_TIME ddr_dq_sdram = (enable_o==1'b0) ? ddr_dq_fpga : {DQ_BITS{1'bz}};


parameterの値はDQS_BITSは2で、DQ_BITSは16だ。
ModelSimの波形を下に示す。
Verilog_Delay_060129.png

上の図でddr_dqs_fpgaを1500ps遅延させてddr_dqs_sdramに入れているのだが、0-3-0と遷移するはずがddr_dqs_sdramでは0-3だけで最後の0の遷移がなくなってしまっている。
慣性遅延でなくなってしまったのか?もう少し調査することにする。

2006.01.29:追記 このページによるとassign文で遅延を書くと慣性遅延だそうだ。伝播遅延にするためにはalways文でノンブロッキング文で書くそうだ。早速書いてみよう。
  1. 2007年01月29日 06:18 |
  2. 入門Verilog
  3. | トラックバック:0
  4. | コメント:0