目次
返信したいコメント選択できるようにしました。
コメントはありません。 Comments/kondo
どうも最近、前と同じようなミスをして、時間を潰している。
ここは、初心に返って、HDLを出力信号名を分かりやすくしたり、コメントを追加したりしよう。急がば回れ、だ。
あと、今年も1ヶ月だ。
11月はゆっくり進めすぎたかも、と反省。こんなとこで時間かけている場合じゃない
がんばって、今年中にセンサノードを仮完成させたい。
前に作ったリフレッシュ状態が25MHzでは動作しないので、修正
リフレッシュ後に66ns開ける必要があるため、AUTOリフレッシュ後にNOPを出力するように変更する。
論理シミュレーションをするが、どうしても不定値が出力される。
文法も問題ないし、よく分からなかった。
結局、論理合成をやってみて、問題が分かった。
RAS、CASが、topの中で、複数でドライブされていたのが原因だった。
どうやら論理シミュレーションでは、配線のチェックまではしてくれないようだ(そりゃそうか)。
論理シミュレーションに失敗する場合は、必ず論理合成して確認する。
後は、モジュール単体での論理シミュレーションをやって、
全体シミュレーションをやればtopに問題があることには気づけたはず。。
論理シミュレーションに失敗する場合の対策
論理シミュレーションの良いところは、わざわざ論理合成をせずとも
動作を確認できるところだと思うので、微妙な修正を加えた時などは、
そのまま論理シミュレーションする。
不定値が出てきた場合は、信号がぶつかっていると考えて、
論理合成をかけてみよう。
どうも自分が書いたHDLが見にくい。
出力信号のルールなどが定まっていない時の部分が残っているためか。
各モジュールの先頭の文字を階層識別文字とする。
例:READモジュールの階層識別文字は、"r"
各ブロックの出力端子名は、"<階層識別文字>"+"_"とする。
例:READモジュールの出力信号名は、"r_出力信号名"
参考資料:RTL設計スタイルガイド Verilog HDL編 第2版
こうすることでデバッグがかなり楽になる。
モジュール間のつながりが非常に分かりやすいからである。
あとは、基本的なことだけど、
ものづくり実践プロジェクトとか、TAとかで、
あっという間に時間が過ぎてしまった。。orz
よく考えてみると、メモリインタリーブをすれば、タイムラグなしに
読込が可能だということに気づいた。
そこで、FullpageBurstをする前にもう一度データシートを読んだ。
2008-11-08-UARTRX_Chage
LEDの点灯を、PCからUART経由で、制御する。
お、これは便利だ。
デバッグ時に、UART経由で操作できれば、効率がアップできるかも。
今は、
たぶん、それほど時間はかからないと思う。
バースト動作で4バイト書込、読込をした。
さらに、この前作ったUARTモジュールで、PCで表示させ確認する。
ようやく成功。。
しかし、なぜか1バイト目がうまく表示されない、
原因は、READモジュールからUARTに値を渡すタイミングが1CLK分ずれていたようだ。
今までは、発振器からクロックを生成するモジュールに、リセット信号を入れていた。
理由は、ビヘイビアシミュレーションをする時に初期値を与えるため、だった。
でも、しょうたさんと話して、initial文で、初期値が与えられることを知る。
まだまだ勉強不足だった。
STARCの本を、読んで勉強しよう。
4バイトバースト動作で書込、読込するSDRAMのテストモジュールに、
作成した連続読み込みできるUARTモジュールを使った状態、を追加する
連続した4バイトの書込、読込に成功した。
25Mを32分周で、1.28uのCLKを利用している。
12回に1回リフレッシュしないといけないのか。
FATAL_ERROR:Simulator:Fuse.cpp:164:$Id: Fuse.cpp,v 1.35.4.4.2.1 2008/05/02 FATAL_ERROR:Simulator:Fuse.cpp:164:$Id: Fuse.cpp,v 1.35.4.4.2.1 2008/05/02 17:57:52 jimmyw Exp $ - Failed to link the design Process will terminate. For technical support on this issue, please open a WebCase with this project attached at http://www.xilinx.com/support.
こうなってしまうと、Clean up Projectをしても、ISEを再起動をしても駄目みたい。
プロジェクトを作り直すのが最良か。
CLKを分周するHDLを書いた。
Div[0]を使っていないという警告が出る。
無視してもいい警告のようだが、消したい。
/* CLKgen 先生からもらったプログラムを参考にした cntの値が何から始まるか分からないので、最初のクロックはいつ立ち上がるか不明(特に問題なし) */ module CLKgen( CLKi , CLKo , Div); input CLKi; //Clock input input [9:0] Div; //10bit => 1024 divider output CLKo; //Clock output reg [8:0] cnt; reg CLKo; wire [8:0] Div2; assign Div2 = Div[9:1] ; //posedgeで動作するため、すでに2分周されている。そのため、Divを2で割っておく always @( posedge CLKi ) begin if( cnt == Div2 ) begin CLKo <= ~CLKo; cnt <= 0; end else begin cnt <= cnt + 1 ; end end endmodule
assign Div_Dummy = Div[0];
これでもDiv_Dummyが出力されていないから、Div_Dummyに警告が出る
これを消すには、Outputで無駄に信号線を出すしかないか。
always @( Div ) begin Div2 = Div >> 1 ; end
ビットシフトするように書いたが、やはりDiv[0]は使われていないという警告消えず。
う〜ん、悩ましい。
とりあえず、警告が出るモジュールだということを記録しておいて、使おう。
これでも動きそうだけど、分からない警告が出る。
module CLKgen( CLKi , CLKo , Div); input CLKi; //Clock input input [9:0] Div; //10bit => 1024 divider output CLKo; //Clock output reg [9:0] cnt; reg CLKo; always @( CLKi ) begin if( cnt == Div ) begin CLKo <= ~CLKo; cnt <= 0; end else begin cnt <= cnt + 1 ; end end endmodule
今度はこの警告が出た。
"top.v" line 36: One or more signals are missing in the sensitivity list of always block. To enable synthesis of FPGA/CPLD hardware, XST will assume that all necessary signals are present in the sensitivity list. Please note that the result of the synthesis may differ from the initial design specification.
センシティビティリストの理解が間違っているのかも。。
今まで警告が多すぎて、ほぼ無視してきた。
だけど、警告を見れば、ビット幅のミスなども無くせるので、
出来る限り警告を減らしていくようにしようと思う。
警告が出る場合は、理解して、しっかりメモしておく。
最悪、理解できなくても、警告を記録する。
(前まで1つのモジュールで作成していた)SDRAMに1バイト書込読込のHDLを、以下のモジュールに分割するHDLを書いた。
ステートマシンの状態遷移もしていない。
CLKだけは正常に生成されている。
いろいろやってみるが、解決できず。
困った。
明日、新しくHDLを書き直してみよう。