2008年11月27日(木) 28日(金)†どうも最近、前と同じようなミスをして、時間を潰している。 あと、今年も1ヶ月だ。 リフレッシュ状態の修正†前に作ったリフレッシュ状態が25MHzでは動作しないので、修正 リフレッシュ後に66ns開ける必要があるため、AUTOリフレッシュ後にNOPを出力するように変更する。 論理シミュレーションに失敗する時→論理合成でエラーを確認する†論理シミュレーションをするが、どうしても不定値が出力される。 どうやら論理シミュレーションでは、配線のチェックまではしてくれないようだ(そりゃそうか)。 後は、モジュール単体での論理シミュレーションをやって、 論理シミュレーションに失敗する場合の対策
論理シミュレーションの良いところは、わざわざ論理合成をせずとも [2008-11-28-top]11-02-topの可読性を上げる、変数とモジュール化の見直し†どうも自分が書いたHDLが見にくい。 各モジュールの先頭の文字を階層識別文字とする。 例:READモジュールの階層識別文字は、"r" 各ブロックの出力端子名は、"<階層識別文字>"+"_"とする。 例:READモジュールの出力信号名は、"r_出力信号名" 参考資料:RTL設計スタイルガイド Verilog HDL編 第2版 こうすることでデバッグがかなり楽になる。 あとは、基本的なことだけど、
2008年11月20日(木)†ものづくり実践プロジェクトとか、TAとかで、 SDRAMのデータシート読み[L303]†よく考えてみると、メモリインタリーブをすれば、タイムラグなしに そこで、FullpageBurstをする前にもう一度データシートを読んだ。 SDRAMのデータシートメモ†
2008年11月08日(土)†UARTで、PCからLED制御する†2008-11-08-UARTRX_Chage デバッグ時に、UART経由で操作できれば、効率がアップできるかも。 2008年11月07日(金)†verilogで例外処理を書いた方が良いかも†今は、
2008年10月23日(木)†SDRAMの残りの作業†たぶん、それほど時間はかからないと思う。
SDRAM,バースト動作で4バイト書込,読込して、PCで確認(UART)†バースト動作で4バイト書込、読込をした。 しかし、なぜか1バイト目がうまく表示されない、 2008年10月20日(月)†CLK生成回路にリセット信号は不必要†今までは、発振器からクロックを生成するモジュールに、リセット信号を入れていた。 でも、しょうたさんと話して、initial文で、初期値が与えられることを知る。 2008年10月18日(土)†UART状態を追加†4バイトバースト動作で書込、読込するSDRAMのテストモジュールに、 2008年10月10日(金)†バースト動作の確認†連続した4バイトの書込、読込に成功した。 2008年10月09日(木)†リフレッシュを15.625usごとに必要†25Mを32分周で、1.28uのCLKを利用している。 2008年09月26日(金)†Behavioral Simulationに失敗するFATAL_ERROR†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を再起動をしても駄目みたい。 Div[0]を使っていないという警告†CLKを分周するHDLを書いた。 /* 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 駄目な対処法1・・・wireで適当な信号線を定義して、つないでみる。†assign Div_Dummy = Div[0]; これでもDiv_Dummyが出力されていないから、Div_Dummyに警告が出る 駄目な対処法2・・・シフトしてみる†always @( Div ) begin Div2 = Div >> 1 ; end ビットシフトするように書いたが、やはりDiv[0]は使われていないという警告消えず。 う〜ん、悩ましい。 posedgeを消してみると†これでも動きそうだけど、分からない警告が出る。 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. センシティビティリストの理解が間違っているのかも。。 警告は出来る限り減らす†今まで警告が多すぎて、ほぼ無視してきた。 警告が出る場合は、理解して、しっかりメモしておく。 2008年09月21日(日)23日(火)†モジュール化の続き†(前まで1つのモジュールで作成していた)SDRAMに1バイト書込読込のHDLを、以下のモジュールに分割するHDLを書いた。
ステートマシンの状態遷移もしていない。 いろいろやってみるが、解決できず。 |