kondo
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
]
開始行:
#contents();
*メニュー [#wf322d66]
-[[ファイルキャビネット>./cabinet]]
**過去の日記 [#c9ba0736]
-[[./2008年5・6月]]
-[[./2008年7・8月]]
-[[./2008年9・10・11月]]
**kondoへのコメント [#k7b86010]
#pcomment(reply);
*2009年01月27日(火) [#g10b6bae]
**inout信号のテストパタンについて [#g16f6ce7]
この辺が参考になりそう。
FPGA BBS [One Topic All View / Re[5]: inout信号のテストに...
http://www.fpga.co.jp/cbbs/cbbs.cgi?mode=al2&namber=379&n...
衝突しないようにするため、
テストパタンから出力しない時は、High-Zを出力する必要があ...
例えば、参考リンク内で、
#30 BUS_reg <= 1'bz ;
もしくは、入出力を切り替える制御信号がある場合
assign BUS = (RD==1) ? BUS_reg : 1'bz ;
と書いてあげても良いのかな。
*2009年01月26日(月) [#icca0206]
**(続き)BlockRAMを使って、FullPageBurstの動作を確認する [...
HDLを確認したり、シミュレーションをしたりするが、問題が見...
試しにパソコンを再起動してみると、うまく動いた。
FullPageBurstで書き込んだデータを、FullPageBurstで読み込...
UARTモジュールであくのりっちに出力する。
ようやくうまくいった。
困った時、
+Cleanup
+プロジェクトの作り直し
加えて
-再起動
**SDRAMの残りの作業(+問題点) [#sce5a2a9]
問題点
-UARTモジュールから出力する時・・・同じ情報が2回出力される。
--シミュレーションから解決を試みよう。
-残された警告
--つながれていない?そんなことは無いはずなのだけど・・。...
WARNING:Xst:2677 - Node <CAS> of sequential type is unco...
WARNING:Xst:2677 - Node <REFRESHModule/CAS> of sequentia...
この問題を解決して、
SDRAMを制御するモジュールとして、モジュール化しよう。
*2009年01月25日(日) [#v311f28c]
**BlockRAMを使って、FullPageBurstの動作を確認する→失敗・...
レジスタ配列を使っていた部分を、ブロックRAMに変更した。
だけどUARTモジュールからは何の応答もない。
ロジアナで見ると、SDRAMへの書込と読込は正常に動作している...
今日は諦める。。
*2009年01月22日(木) [#hb51cf54]
**BlockRAMを使ってみる [#jac602b8]
出来て当然なんだけど、一応確認しておく。
module top( CLK , SW , TXD );
input CLK , SW ;
output TXD;
//UART
wire CLK2 , xRST ;
wire uo_RDY , uo_EN ;
wire [7:0] uo_Dout; //UARTONの出力信号
wire ut_RDY ; //UARTTXの出力信号
reg EN;
reg [7:0] DQ ;
/*block RAM module*/
reg [7 : 0] dina; //Write Port
reg [8 : 0] addra;
reg [0 : 0] wea;
reg [8 : 0] addrb;
wire [7 : 0] doutb; //Read Port
reg [9:0] q; //counter
reg flag; //UARTONモジュールが読込時の時間稼ぎフラグ
always @( posedge CLK or negedge xRST ) begin
if( xRST == 0 ) begin
q <= 0;
flag <= 0;
dina <= 0;
addra <= 0;
wea <= 0;
addrb <= 0;
end
else begin
if( q < 512 ) begin //Write
dina <= q;
addra <= q;
wea <= 1;
q <= q + 1;
end
else if( q == 512 ) begin //Write
dina <= q;
addra <= q;
wea <= 1;
q <= q + 1;
addrb <= 0;
end
else if( q > 512 && q < 1024 ) begin //Read
addrb <= q-513 ;
wea <= 0;
//UART呼び出し
if( flag == 1 ) begin
flag <= 0;
q <= q + 1;
EN <= 0;
end
else if( uo_RDY == 1 ) begin
EN <= 1;
DQ <= doutb ;
flag <= 1;
end
end
else begin
//何もしない
end
end // else begin
end
//モジュール呼出
UARTON UARTON_0( .CLK(CLK) , .xRST(xRST) ,
.u_EN(EN) , .u_Dout(DQ) , .uo_RDY(uo_RDY) , //UART-...
.ut_RDY(ut_RDY) , .uo_EN(uo_EN) , .uo_Dout(uo_Dout)...
UARTTX UARTTX_0( .CLK(CLK2) , .xRST(xRST) ,
.uo_EN(uo_EN), .uo_Dout(uo_Dout),
.ut_TXD(TXD) , .ut_RDY(ut_RDY) );
SWgen SWgen( CLK , SW , xRST );
CLKgen CLKgen_1( .CLKi(CLK) , .CLKo(CLK2) , .Div(12'd10...
BLOCKRAMTEST BLOCKRAMTEST(
.clka(CLK),
.dina(dina),
.addra(addra),
.wea(wea),
.clkb(CLK),
.addrb(addrb),
.doutb(doutb)
);
endmodule
*2008年12月22日(月) [#f87e35b0]
**論理合成できない問題はDQBufが大きいためだった [#a2b64817]
秋田先生の指摘で分かった。
reg [7:0] DQBuf [511:0];
使用しているFlipFlopの数は、
240/4896
(XC3S250Eが使用できるFlipFlopの数は、4896個
1つのスライスに2つのFlipflopが載っているらしい。)
理論上は、ぎりぎり足りそうだけど、
ついでに他の物も合成され足りなくなったのかな。
実際先生の指摘通り、8バイトしかアクセスしていない時は、以...
WARNING:Xst:646 - Signal <DQBuf<511:108>> is assigned bu...
WARNING:Xst:646 - Signal <DQBuf<99:0>> is assigned but n...
DQBuf[変数]に変更すると、512バイト分のレジスタが作成され...
警告はしっかり読んで、理解しないといけないな。
見てはいたけどまさか消されているとは。。
**CLBの代わりにブロックRAMを使う方針になった [#o7722d58]
どうやらSpartan-3EにもブロックRAMが用意されているようだ。
XC3S250Eには、216kbitのメモリがあるので、
これを使えば余裕で足りるっぽい。
必要なビット数
reg [7:0] DQBuf [511:0];
なので、4096ビットあれば足りる。
CLBでメモリを構成するのは効率が悪いことを学んだ。
*2008年12月21日(日) [#bdffcf62]
まだ、レジスタ配列の添え字に変数が使えない問題が残ってい...
**レジスタ配列の添え字に算術演算した結果を入れることはで...
これは論理合成可能
else if( q== 516)begin
cnt <=0
end
else if( q == 517 ) begin
DQuart <= DQBuf[cnt];
cnt <= 1;
end
else if( q == 518 ) begin
r_EN <= 1;
DQuart <= DQBuf[cnt];
end
これは論理合成できない
cntは0で初期化されている。
else if( q == 517 ) begin
DQuart <= DQBuf[cnt];
cnt <= cnt + 10'd1;
end
else if( q == 518 ) begin
DQuart <= DQBuf[cnt];
end
やっぱり変数が使えないようだ。
これじゃあ、結局全ての状態を書き出すしかないのかな。
膨大な量だけど。。
*2008年12月20日(土) [#s9d8233b]
見直した結果、警告を減らすことができ、
FullPageBurstの内、8バイトを正常に確認できた。
**ようやくFullPageBurstの8バイトを確認できた、出力も正常...
2008-12-17-top_2
ようやく出来た。出力も正常に一回のみで、FullPageBurstの動...
今までシミュレーションに頼りすぎていたな。
やはり警告は出来る限り減らすべき
***残ったWarning [#v068cd58]
CLKの分周に一番下の桁は使っていない
WARNING:Xst:647 - Input <Div<0>> is never used. This por...
HDLでは、8バイトしかアクセスしていないため
WARNING:Xst:646 - Signal <DQBuf<511:108>> is assigned bu...
WARNING:Xst:646 - Signal <DQBuf<99:0>> is assigned but n...
これがよく分からない。
WARNING:Xst:2677 - Node <CAS> of sequential type is unco...
WARNING:Xst:2677 - Node <REFRESHModule_0/CAS> of sequent...
*2008年12月17日(水) [#e85591a1]
論理合成が終わらない問題、UARTが永遠に出力を送信してくる...
こういう時は、もう一度最初からプログラムを見直していく。
どうやらリフレッシュ状態に追加した部分に不具合があったよ...
***リフレッシュ状態の前の状態を保持できない [#b5f2a4ec]
always文を用いた組み合わせ回路の場合
preNXT<=preNXTとすると状態保持はできそうだが、
preNXTがセンシティビティリストのあるため、あまりよくなさ...
↑具体的にどうなるのか知りたいが・・・一回実際にやってみるし...
REFRESH:begin
if( ref_END == 1 )begin
NXT <= preNXT;
preNXT <= 3'd0;
end
else begin
NXT <= REFRESH ;
preNXT <= preNXT;
end
end
結局、状態数を増やして対応することにしよう。
**RTLシミュレーションとゲートレベルシミュレーション [#dc9...
おそらく
-RTLシミュレーションが論理シミュレーション
-ゲートレベルシミュレーションが論理合成後のシミュレーション
(2.2.2)
**always文の注意点 [#h1411082]
-全ての条件が記述されていないとラッチ生成される
--regの変数をalways文内で変更した場合、全ての条件を記述し...
-右辺に書いた信号は、すべてセンシティビティリストに記述する
-左辺に書いた信号は、センシティビティリストに書かない
--無限ループになる可能性があるため
---つまり、preNXT <= preNXTはダメ・・
-1つのalways文で、2つ以上のif,caseを並べて使用しない
--不必要なプライオリティ回路が生成されるため
--デバッグ効率が落ちるため
---ブロッキング代入文であっても,デバッグ効率が落ちるため...
-1つのalways文から出力される信号は5つまで
全くロジックを含まないもの、同様のロジックを生成する信号...
(2.6.1)
-1つのalways文の中に複数のエッジは記述可能→避けるべき
--論理合成ツールは、エッジ変化の順序を制御する暗黙のステ...
--とりあえず、辞めた方が良い。。
-入力値の固定したFFを生成しない(2.3.5)
--たしかにWarningがしょっちゅう出るな
--↑これとは違うのかな・・
-リセットする場合、全reg変数がリセットされるべき(2.3.6)
--always文を分けて書けばよい。
*2008年12月14日(日) [#rba24605]
**レジスタ配列に変数を使う→論理合成が終わらない [#cfdf81f6]
どうやらレジスタ配列に変数を使うと、論理合成が終わらない...
DQBuf[q]にすると論理合成が終わらなくなる。
何が起こっているのだろうか。
else if( q == 516 ) begin//PRECHARGE(tRP=15n)
RAS <= 0;
CAS <= 1;
WE <= 0;
q <= 0 ;
Address[10] <= 0; // 0 => single bank
BA <= 2'b00; // Bank assign
end
/* UARTでPCに送信する */
else if( q > 516 && q < 645 ) begin //64回,8バイト送信
//常にNOPを出力
CS <= 0;
RAS <= 1;
CAS <= 1;
WE <= 1;
if( q[0] == 1 ) begin
UartState <= 1; //UARTを起動する
r_DQ[7:0] <= DQBuf[q];
r_DQ[15:8] <= DQBuf[1];
r_DQ[23:16] <= DQBuf[2];
r_DQ[31:24] <= DQBuf[3];
r_DQ[39:32] <= DQBuf[4];
r_DQ[47:40] <= DQBuf[5];
r_DQ[55:48] <= DQBuf[6];
r_DQ[63:56] <= DQBuf[7];
q <= q + 1;
end
else if(q[0] == 0) begin
//UARTモジュールがR_DQを読込
if( u_END == 1 ) begin
q <= q + 1;
UartState <= 0; //reset
end
end
end
*2008年12月11日(木) [#rc676231]
**ビット幅指定に変数は使えない [#ze0c7fda]
こりゃ、困った。
2008-12-11-test
always @(posedge CLK or negedge xRST) begin
if(xRST==0)begin
q1<=7;
q2<=0;
end
else begin
out <= in[q2:q1];
q1 <= q1 + 8;
q2 <= q2 + 8;
end
end
レジスタ配列を使う方法があるのかな。
*2008年12月04日(木) [#hdb75e5c]
**FullPageBurstの内8バイトの読込確認 [#g3c60465]
論理合成が出来ない問題は解決していない。
とりあえず、前に作ったUART,UARTON,UARTTXで512ビットの...
8ビットを確認した。0〜7ビット目と100〜101ビットを確認し...
正しく動作していた。
ただし、1回8バイトが送出されるはずが、
永遠に出力が出てくる。
シミュレーションではうまくいっていたんだけどな〜
*2008年12月03日(水) [#a0b1c0d8]
**論理シミュレーションは成功するが、論理合成できず。 [#xe...
やはり終わらない。
論理合成の途中まではやってくれているようだ。
CPUもずっと動き続けているが、終わらない。
FullPageBurstで、書き込めているかどうか確認すらできない。
これを追加してからだな。
//UARTでDQBufを送信する
if( ReadFlag == 1 ) begin
/*
SDRAMからの読込が始まったらReadFlag=1になる。
その後、DQBuf[DQBufCnt]をUARTで送信する。
送信後にReadEND=1にし、ReadFlag=0にする
*/
if( DQBufCnt == 512 ) begin
ReadEND <= 1;
end
else if( uo_RDY == 1 )begin //UARTONが送信可能状態なら
r_EN <= 1'b1;
r_DQ <= DQBuf[DQBufCnt];
DQBufCnt <= DQBufCnt + 1;
end
else begin
//送信待ち
r_EN <= 1'b0;
end
end
else begin
//ReadFlagが立つまで初期化しておく
DQBufCnt <= 0;
ReadEND <= 0;
end
`timescale 1ns / 1ps
//READモジュール
module READModule(CLK , ReadState , ReadEND , CS , RAS ,...
//######################################
// Input-Output
//######################################
input CLK , ReadState ;
input uo_RDY ;
output ReadEND , CS , RAS , CAS , WE , DQM ;
output [11:0] Address ;
output [1:0] BA ;
output r_EN ;
output [7:0] r_DQ ;
input [7:0] DQ ;
//######################################
// Internal Signal
//######################################
reg CS , RAS , CAS , WE , ReadEND , DQM;
reg [11:0] Address;
reg [1:0] BA;
reg [12:0] q ; // State Counter
reg [7:0] DQBuf [511:0] ; //8ビット幅DQBuf 512ワード(バ...
reg [9:0] DQBufCnt;//UARTの送信用カウンタ、次に送信する...
reg ReadFlag; //READの2CLK後・・・DQが返ってくるところでRe...
reg r_EN;
reg [7:0] r_DQ;
always @(posedge CLK) begin
if( ReadState==1) begin
if(q==0) begin
//ACTIVE
CS <= 0;
RAS <= 0;
CAS <= 1;
WE <= 1;
Address <= 12'b000000_000000;
BA <= 2'b00;
q <= q + 1 ;
//ReadEND <= 0;
DQM <= 1;
//ReadFlag <= 0;
end
else if(q==1) begin
//READ
CS <= 0;
RAS <= 1;
CAS <= 0;
WE <= 1;
Address <= 12'b0_1_0_000000000; //FullpageBurstなの...
BA <= 2'b00 ;
DQM <= 0;
q <= q + 1;
end
else if( q == 2 ) begin
//NOP
//実際にREADを出力しているのはこの3CLK目のタイミング
CS <= 0;
RAS <= 1;
CAS <= 1;
WE <= 1;
q <= q + 1;
DQM <= 0;
end
else if( q == 3 ) begin
//NOP
CS <= 0;
RAS <= 1;
CAS <= 1;
WE <= 1;
q <= q + 1;
DQM <= 0;
end
else if( q == 4 ) begin
//NOP(READ Burst 1bit〜)
CS <= 0;
RAS <= 1;
CAS <= 1;
WE <= 1;
q <= q + 1;
DQM <= 0;
//Read
DQBuf[q-4] <= DQ;
//UART
ReadFlag <= 1; //UARTの開始のためのフラグ
end
else if( q > 4 && q < 514 ) begin
//NOP(READ Burst 2bit目〜)
CS <= 0;
RAS <= 1;
CAS <= 1;
WE <= 1;
q <= q + 1;
DQM <= 0;
//Read
DQBuf[q-4] <= DQ;
//debug DQoutを入れる時間があるので、1CLK遅く立ち上げ
//UART_EN <= 1;
end
else if( q == 514 ) begin
//Burst Terminate
CS <= 0;
RAS <= 1;
CAS <= 1;
WE <= 0;
q <= q + 1;
DQM <= 0;
//Read
DQBuf[q-4] <= DQ;
end
else if( q == 515 ) begin
//NOP
CS <= 0;
RAS <= 1;
CAS <= 1;
WE <= 1;
q <= q + 1;
DQM <= 1;
//Read
DQBuf[q-4] <= DQ;
end
else if( q == 516 ) begin
//PRECHARGE(tRP=15n)
RAS <= 0;
CAS <= 1;
WE <= 0;
q <= q + 1 ;
Address[10] <= 0; // 0 => single bank
BA <= 2'b00; // Bank assign
//ReadEND <= 1;
//↑UART送信後にReadENDする
end
else if( q == 517 ) begin
//UART送信中
//NOP
CS <= 0;
RAS <= 1;
CAS <= 1;
WE <= 1;
DQM <= 1;
end
else begin
//例外処理
CS <= 0;
RAS <= 1;
CAS <= 1;
WE <= 1;
q <= q + 1;
//ReadEND <= 0;
DQM <= 1;
//UART
//EnUART_ON <= 0;
end
//UARTでDQBufを送信する
if( ReadFlag == 1 ) begin
if( DQBufCnt == 512 ) begin
ReadEND <= 1;
end
else if( uo_RDY == 1 )begin //UARTONが送信可能状態...
r_EN <= 1'b1;
r_DQ <= DQBuf[DQBufCnt];
DQBufCnt <= DQBufCnt + 1;
end
else begin
//送信待ち
r_EN <= 1'b0;
end
end
else begin
//ReadFlagが立つまで初期化しておく
DQBufCnt <= 0;
ReadEND <= 0;
end
end //if( ReadState )
else begin
CS <= 0;
RAS <= 1;
CAS <= 1;
WE <= 1;
Address <= 12'b000000_000000;
BA <= 2'b00;
DQM <= 1;
ReadEND <= 0;
//DQout <= 0;
q <= 0;
ReadFlag <= 0;
DQBufCnt <= 0;
end //else begin
end // always end
endmodule
Consoleの表示結果は、
Reading design: READModule.prj
========================================================...
* HDL Compilation ...
========================================================...
Compiling verilog file "READ.v" in library work
Module <READModule> compiled
No errors in compilation
Analysis of file <"READModule.prj"> succeeded.
========================================================...
* Design Hierarchy Analysis ...
========================================================...
Analyzing hierarchy for module <READModule> in library <...
========================================================...
* HDL Analysis ...
========================================================...
Analyzing top module <READModule>.
Module <READModule> is correct for synthesis.
========================================================...
* HDL Synthesis ...
========================================================...
Performing bidirectional port resolution...
INFO:Xst:2679 - Register <CS> in unit <READModule> has a...
INFO:Xst:2679 - Register <Address<11>> in unit <READModu...
INFO:Xst:2679 - Register <Address<9>> in unit <READModul...
INFO:Xst:2679 - Register <Address<8>> in unit <READModul...
INFO:Xst:2679 - Register <Address<7>> in unit <READModul...
INFO:Xst:2679 - Register <Address<6>> in unit <READModul...
INFO:Xst:2679 - Register <Address<5>> in unit <READModul...
INFO:Xst:2679 - Register <Address<4>> in unit <READModul...
INFO:Xst:2679 - Register <Address<3>> in unit <READModul...
INFO:Xst:2679 - Register <Address<2>> in unit <READModul...
INFO:Xst:2679 - Register <Address<1>> in unit <READModul...
INFO:Xst:2679 - Register <Address<0>> in unit <READModul...
INFO:Xst:2679 - Register <BA> in unit <READModule> has a...
Synthesizing Unit <READModule>.
Related source file is "READ.v".
Found 1-bit register for signal <Address<10>>.
Found 1-bit register for signal <CAS>.
Found 1-bit register for signal <DQM>.
Found 1-bit register for signal <RAS>.
Found 1-bit register for signal <ReadEND>.
Found 1-bit register for signal <WE>.
Found 8-bit register for signal <r_DQ>.
Found 1-bit register for signal <r_EN>.
Found 4096-bit register for signal <DQBuf>.
Found 10-bit up counter for signal <DQBufCnt>.
Found 13-bit register for signal <q>.
Found 13-bit adder for signal <q$share0000>.
Found 13-bit comparator greater for signal <RAS$cmp_...
Found 13-bit comparator less for signal <RAS$cmp_lt0...
Found 1-bit register for signal <ReadFlag>.
INFO:Xst:738 - HDL ADVISOR - 4096 flip-flops were inferr...
Summary:
inferred 1 Counter(s).
inferred 4125 D-type flip-flop(s).
inferred 1 Adder/Subtractor(s).
inferred 2 Comparator(s).
inferred 8 Multiplexer(s).
Unit <READModule> synthesized.
INFO:Xst:1767 - HDL ADVISOR - Resource sharing has ident...
========================================================...
HDL Synthesis Report
Macro Statistics
# Adders/Subtractors : 1
13-bit adder : 1
# Counters : 1
10-bit up counter : 1
# Registers :...
1-bit register : 8
13-bit register : 1
8-bit register :...
# Comparators : 2
13-bit comparator greater : 1
13-bit comparator less : 1
# Multiplexers : 1
8-bit 512-to-1 multiplexer : 1
========================================================...
========================================================...
* Advanced HDL Synthesis ...
========================================================...
Loading device for application Rf_Device from file '3s25...
*2008年12月02日(火) [#m81b0d9f]
**ReadのFullPageBurstと並行して、UARTで送信する。→論理合...
以下の文を、READモジュールに追加した。
あれ、論理合成が終わらない。
ずっとCPUが動き続けている。。
//UARTでDQBufを送信する
if( ReadFlag == 1 ) begin
/*
SDRAMからの読込が始まったらReadFlag=1になる。
その後、DQBuf[DQBufCnt]をUARTで送信する。
送信後にReadEND=1にし、ReadFlag=0にする
*/
if( DQBufCnt == 512 ) begin
ReadEND <= 1;
end
else if( uo_RDY == 1 )begin //UARTONが送信可能状態なら
r_EN <= 1;
r_DQ <= DQBuf[DQBufCnt];
DQBufCnt <= DQBufCnt + 1;
end
else begin
//送信待ち
end
end
else begin
//ReadFlagが立つまで初期化しておく
DQBufCnt <= 0;
ReadEND <= 0;
end
**if,else if文とcase文の違い [#w4605322]
if,else if文とcase文は、全く一緒だと思っていた。
けど、よく考えてみたら全然違うことに気づいた。
ソフトウェアとハードウェアのプログラミングの違いなのかな。
if,else if文は上から順番に実行され該当したものが実行され...
そのため、段数が多くなればなるほど、動作が遅くなる。
RTL設計スタイルガイドで確認してみると、
上の方に書いた条件は早く実行されるが、下の方に書いた条件...
if文はプライオリティを記述するもの、case文は並行動作を記...
(参照元:RTL設計スタイルガイド Verilog HDL編 第2版 PP.2...
**レジスタ配列の添え字に算術演算可能 [#h5f85690]
file name : 2008-12-02-registerArray_UseVariable
module top( CLK , xRST , Dout0 , Dout1 , Dout2 , Dout3 );
input CLK , xRST ;
output [7:0] Dout0 , Dout1 , Dout2 , Dout3;
reg [7:0] RegArray [3:0] ; //レジスタ配列8バイト(1ワー...
reg [10:0] q; //カウンタ
assign Dout0 = RegArray[0];
assign Dout1 = RegArray[1];
assign Dout2 = RegArray[2];
assign Dout3 = RegArray[3];
always @(posedge CLK) begin
if(xRST==0)begin //reset
q <= 1;
end
else if(q==5) begin //initialize
q <= 0;
end
else begin
q <= q + 1 ;
RegArray[q-1] <= q;
end
end
endmodule
とりあえず、これで確認できた。
でも、これだと毎回引き算が行われることになる。
でも仕方ないか。
この辺は、STARC2-68辺りが参考になる。
終了行:
#contents();
*メニュー [#wf322d66]
-[[ファイルキャビネット>./cabinet]]
**過去の日記 [#c9ba0736]
-[[./2008年5・6月]]
-[[./2008年7・8月]]
-[[./2008年9・10・11月]]
**kondoへのコメント [#k7b86010]
#pcomment(reply);
*2009年01月27日(火) [#g10b6bae]
**inout信号のテストパタンについて [#g16f6ce7]
この辺が参考になりそう。
FPGA BBS [One Topic All View / Re[5]: inout信号のテストに...
http://www.fpga.co.jp/cbbs/cbbs.cgi?mode=al2&namber=379&n...
衝突しないようにするため、
テストパタンから出力しない時は、High-Zを出力する必要があ...
例えば、参考リンク内で、
#30 BUS_reg <= 1'bz ;
もしくは、入出力を切り替える制御信号がある場合
assign BUS = (RD==1) ? BUS_reg : 1'bz ;
と書いてあげても良いのかな。
*2009年01月26日(月) [#icca0206]
**(続き)BlockRAMを使って、FullPageBurstの動作を確認する [...
HDLを確認したり、シミュレーションをしたりするが、問題が見...
試しにパソコンを再起動してみると、うまく動いた。
FullPageBurstで書き込んだデータを、FullPageBurstで読み込...
UARTモジュールであくのりっちに出力する。
ようやくうまくいった。
困った時、
+Cleanup
+プロジェクトの作り直し
加えて
-再起動
**SDRAMの残りの作業(+問題点) [#sce5a2a9]
問題点
-UARTモジュールから出力する時・・・同じ情報が2回出力される。
--シミュレーションから解決を試みよう。
-残された警告
--つながれていない?そんなことは無いはずなのだけど・・。...
WARNING:Xst:2677 - Node <CAS> of sequential type is unco...
WARNING:Xst:2677 - Node <REFRESHModule/CAS> of sequentia...
この問題を解決して、
SDRAMを制御するモジュールとして、モジュール化しよう。
*2009年01月25日(日) [#v311f28c]
**BlockRAMを使って、FullPageBurstの動作を確認する→失敗・...
レジスタ配列を使っていた部分を、ブロックRAMに変更した。
だけどUARTモジュールからは何の応答もない。
ロジアナで見ると、SDRAMへの書込と読込は正常に動作している...
今日は諦める。。
*2009年01月22日(木) [#hb51cf54]
**BlockRAMを使ってみる [#jac602b8]
出来て当然なんだけど、一応確認しておく。
module top( CLK , SW , TXD );
input CLK , SW ;
output TXD;
//UART
wire CLK2 , xRST ;
wire uo_RDY , uo_EN ;
wire [7:0] uo_Dout; //UARTONの出力信号
wire ut_RDY ; //UARTTXの出力信号
reg EN;
reg [7:0] DQ ;
/*block RAM module*/
reg [7 : 0] dina; //Write Port
reg [8 : 0] addra;
reg [0 : 0] wea;
reg [8 : 0] addrb;
wire [7 : 0] doutb; //Read Port
reg [9:0] q; //counter
reg flag; //UARTONモジュールが読込時の時間稼ぎフラグ
always @( posedge CLK or negedge xRST ) begin
if( xRST == 0 ) begin
q <= 0;
flag <= 0;
dina <= 0;
addra <= 0;
wea <= 0;
addrb <= 0;
end
else begin
if( q < 512 ) begin //Write
dina <= q;
addra <= q;
wea <= 1;
q <= q + 1;
end
else if( q == 512 ) begin //Write
dina <= q;
addra <= q;
wea <= 1;
q <= q + 1;
addrb <= 0;
end
else if( q > 512 && q < 1024 ) begin //Read
addrb <= q-513 ;
wea <= 0;
//UART呼び出し
if( flag == 1 ) begin
flag <= 0;
q <= q + 1;
EN <= 0;
end
else if( uo_RDY == 1 ) begin
EN <= 1;
DQ <= doutb ;
flag <= 1;
end
end
else begin
//何もしない
end
end // else begin
end
//モジュール呼出
UARTON UARTON_0( .CLK(CLK) , .xRST(xRST) ,
.u_EN(EN) , .u_Dout(DQ) , .uo_RDY(uo_RDY) , //UART-...
.ut_RDY(ut_RDY) , .uo_EN(uo_EN) , .uo_Dout(uo_Dout)...
UARTTX UARTTX_0( .CLK(CLK2) , .xRST(xRST) ,
.uo_EN(uo_EN), .uo_Dout(uo_Dout),
.ut_TXD(TXD) , .ut_RDY(ut_RDY) );
SWgen SWgen( CLK , SW , xRST );
CLKgen CLKgen_1( .CLKi(CLK) , .CLKo(CLK2) , .Div(12'd10...
BLOCKRAMTEST BLOCKRAMTEST(
.clka(CLK),
.dina(dina),
.addra(addra),
.wea(wea),
.clkb(CLK),
.addrb(addrb),
.doutb(doutb)
);
endmodule
*2008年12月22日(月) [#f87e35b0]
**論理合成できない問題はDQBufが大きいためだった [#a2b64817]
秋田先生の指摘で分かった。
reg [7:0] DQBuf [511:0];
使用しているFlipFlopの数は、
240/4896
(XC3S250Eが使用できるFlipFlopの数は、4896個
1つのスライスに2つのFlipflopが載っているらしい。)
理論上は、ぎりぎり足りそうだけど、
ついでに他の物も合成され足りなくなったのかな。
実際先生の指摘通り、8バイトしかアクセスしていない時は、以...
WARNING:Xst:646 - Signal <DQBuf<511:108>> is assigned bu...
WARNING:Xst:646 - Signal <DQBuf<99:0>> is assigned but n...
DQBuf[変数]に変更すると、512バイト分のレジスタが作成され...
警告はしっかり読んで、理解しないといけないな。
見てはいたけどまさか消されているとは。。
**CLBの代わりにブロックRAMを使う方針になった [#o7722d58]
どうやらSpartan-3EにもブロックRAMが用意されているようだ。
XC3S250Eには、216kbitのメモリがあるので、
これを使えば余裕で足りるっぽい。
必要なビット数
reg [7:0] DQBuf [511:0];
なので、4096ビットあれば足りる。
CLBでメモリを構成するのは効率が悪いことを学んだ。
*2008年12月21日(日) [#bdffcf62]
まだ、レジスタ配列の添え字に変数が使えない問題が残ってい...
**レジスタ配列の添え字に算術演算した結果を入れることはで...
これは論理合成可能
else if( q== 516)begin
cnt <=0
end
else if( q == 517 ) begin
DQuart <= DQBuf[cnt];
cnt <= 1;
end
else if( q == 518 ) begin
r_EN <= 1;
DQuart <= DQBuf[cnt];
end
これは論理合成できない
cntは0で初期化されている。
else if( q == 517 ) begin
DQuart <= DQBuf[cnt];
cnt <= cnt + 10'd1;
end
else if( q == 518 ) begin
DQuart <= DQBuf[cnt];
end
やっぱり変数が使えないようだ。
これじゃあ、結局全ての状態を書き出すしかないのかな。
膨大な量だけど。。
*2008年12月20日(土) [#s9d8233b]
見直した結果、警告を減らすことができ、
FullPageBurstの内、8バイトを正常に確認できた。
**ようやくFullPageBurstの8バイトを確認できた、出力も正常...
2008-12-17-top_2
ようやく出来た。出力も正常に一回のみで、FullPageBurstの動...
今までシミュレーションに頼りすぎていたな。
やはり警告は出来る限り減らすべき
***残ったWarning [#v068cd58]
CLKの分周に一番下の桁は使っていない
WARNING:Xst:647 - Input <Div<0>> is never used. This por...
HDLでは、8バイトしかアクセスしていないため
WARNING:Xst:646 - Signal <DQBuf<511:108>> is assigned bu...
WARNING:Xst:646 - Signal <DQBuf<99:0>> is assigned but n...
これがよく分からない。
WARNING:Xst:2677 - Node <CAS> of sequential type is unco...
WARNING:Xst:2677 - Node <REFRESHModule_0/CAS> of sequent...
*2008年12月17日(水) [#e85591a1]
論理合成が終わらない問題、UARTが永遠に出力を送信してくる...
こういう時は、もう一度最初からプログラムを見直していく。
どうやらリフレッシュ状態に追加した部分に不具合があったよ...
***リフレッシュ状態の前の状態を保持できない [#b5f2a4ec]
always文を用いた組み合わせ回路の場合
preNXT<=preNXTとすると状態保持はできそうだが、
preNXTがセンシティビティリストのあるため、あまりよくなさ...
↑具体的にどうなるのか知りたいが・・・一回実際にやってみるし...
REFRESH:begin
if( ref_END == 1 )begin
NXT <= preNXT;
preNXT <= 3'd0;
end
else begin
NXT <= REFRESH ;
preNXT <= preNXT;
end
end
結局、状態数を増やして対応することにしよう。
**RTLシミュレーションとゲートレベルシミュレーション [#dc9...
おそらく
-RTLシミュレーションが論理シミュレーション
-ゲートレベルシミュレーションが論理合成後のシミュレーション
(2.2.2)
**always文の注意点 [#h1411082]
-全ての条件が記述されていないとラッチ生成される
--regの変数をalways文内で変更した場合、全ての条件を記述し...
-右辺に書いた信号は、すべてセンシティビティリストに記述する
-左辺に書いた信号は、センシティビティリストに書かない
--無限ループになる可能性があるため
---つまり、preNXT <= preNXTはダメ・・
-1つのalways文で、2つ以上のif,caseを並べて使用しない
--不必要なプライオリティ回路が生成されるため
--デバッグ効率が落ちるため
---ブロッキング代入文であっても,デバッグ効率が落ちるため...
-1つのalways文から出力される信号は5つまで
全くロジックを含まないもの、同様のロジックを生成する信号...
(2.6.1)
-1つのalways文の中に複数のエッジは記述可能→避けるべき
--論理合成ツールは、エッジ変化の順序を制御する暗黙のステ...
--とりあえず、辞めた方が良い。。
-入力値の固定したFFを生成しない(2.3.5)
--たしかにWarningがしょっちゅう出るな
--↑これとは違うのかな・・
-リセットする場合、全reg変数がリセットされるべき(2.3.6)
--always文を分けて書けばよい。
*2008年12月14日(日) [#rba24605]
**レジスタ配列に変数を使う→論理合成が終わらない [#cfdf81f6]
どうやらレジスタ配列に変数を使うと、論理合成が終わらない...
DQBuf[q]にすると論理合成が終わらなくなる。
何が起こっているのだろうか。
else if( q == 516 ) begin//PRECHARGE(tRP=15n)
RAS <= 0;
CAS <= 1;
WE <= 0;
q <= 0 ;
Address[10] <= 0; // 0 => single bank
BA <= 2'b00; // Bank assign
end
/* UARTでPCに送信する */
else if( q > 516 && q < 645 ) begin //64回,8バイト送信
//常にNOPを出力
CS <= 0;
RAS <= 1;
CAS <= 1;
WE <= 1;
if( q[0] == 1 ) begin
UartState <= 1; //UARTを起動する
r_DQ[7:0] <= DQBuf[q];
r_DQ[15:8] <= DQBuf[1];
r_DQ[23:16] <= DQBuf[2];
r_DQ[31:24] <= DQBuf[3];
r_DQ[39:32] <= DQBuf[4];
r_DQ[47:40] <= DQBuf[5];
r_DQ[55:48] <= DQBuf[6];
r_DQ[63:56] <= DQBuf[7];
q <= q + 1;
end
else if(q[0] == 0) begin
//UARTモジュールがR_DQを読込
if( u_END == 1 ) begin
q <= q + 1;
UartState <= 0; //reset
end
end
end
*2008年12月11日(木) [#rc676231]
**ビット幅指定に変数は使えない [#ze0c7fda]
こりゃ、困った。
2008-12-11-test
always @(posedge CLK or negedge xRST) begin
if(xRST==0)begin
q1<=7;
q2<=0;
end
else begin
out <= in[q2:q1];
q1 <= q1 + 8;
q2 <= q2 + 8;
end
end
レジスタ配列を使う方法があるのかな。
*2008年12月04日(木) [#hdb75e5c]
**FullPageBurstの内8バイトの読込確認 [#g3c60465]
論理合成が出来ない問題は解決していない。
とりあえず、前に作ったUART,UARTON,UARTTXで512ビットの...
8ビットを確認した。0〜7ビット目と100〜101ビットを確認し...
正しく動作していた。
ただし、1回8バイトが送出されるはずが、
永遠に出力が出てくる。
シミュレーションではうまくいっていたんだけどな〜
*2008年12月03日(水) [#a0b1c0d8]
**論理シミュレーションは成功するが、論理合成できず。 [#xe...
やはり終わらない。
論理合成の途中まではやってくれているようだ。
CPUもずっと動き続けているが、終わらない。
FullPageBurstで、書き込めているかどうか確認すらできない。
これを追加してからだな。
//UARTでDQBufを送信する
if( ReadFlag == 1 ) begin
/*
SDRAMからの読込が始まったらReadFlag=1になる。
その後、DQBuf[DQBufCnt]をUARTで送信する。
送信後にReadEND=1にし、ReadFlag=0にする
*/
if( DQBufCnt == 512 ) begin
ReadEND <= 1;
end
else if( uo_RDY == 1 )begin //UARTONが送信可能状態なら
r_EN <= 1'b1;
r_DQ <= DQBuf[DQBufCnt];
DQBufCnt <= DQBufCnt + 1;
end
else begin
//送信待ち
r_EN <= 1'b0;
end
end
else begin
//ReadFlagが立つまで初期化しておく
DQBufCnt <= 0;
ReadEND <= 0;
end
`timescale 1ns / 1ps
//READモジュール
module READModule(CLK , ReadState , ReadEND , CS , RAS ,...
//######################################
// Input-Output
//######################################
input CLK , ReadState ;
input uo_RDY ;
output ReadEND , CS , RAS , CAS , WE , DQM ;
output [11:0] Address ;
output [1:0] BA ;
output r_EN ;
output [7:0] r_DQ ;
input [7:0] DQ ;
//######################################
// Internal Signal
//######################################
reg CS , RAS , CAS , WE , ReadEND , DQM;
reg [11:0] Address;
reg [1:0] BA;
reg [12:0] q ; // State Counter
reg [7:0] DQBuf [511:0] ; //8ビット幅DQBuf 512ワード(バ...
reg [9:0] DQBufCnt;//UARTの送信用カウンタ、次に送信する...
reg ReadFlag; //READの2CLK後・・・DQが返ってくるところでRe...
reg r_EN;
reg [7:0] r_DQ;
always @(posedge CLK) begin
if( ReadState==1) begin
if(q==0) begin
//ACTIVE
CS <= 0;
RAS <= 0;
CAS <= 1;
WE <= 1;
Address <= 12'b000000_000000;
BA <= 2'b00;
q <= q + 1 ;
//ReadEND <= 0;
DQM <= 1;
//ReadFlag <= 0;
end
else if(q==1) begin
//READ
CS <= 0;
RAS <= 1;
CAS <= 0;
WE <= 1;
Address <= 12'b0_1_0_000000000; //FullpageBurstなの...
BA <= 2'b00 ;
DQM <= 0;
q <= q + 1;
end
else if( q == 2 ) begin
//NOP
//実際にREADを出力しているのはこの3CLK目のタイミング
CS <= 0;
RAS <= 1;
CAS <= 1;
WE <= 1;
q <= q + 1;
DQM <= 0;
end
else if( q == 3 ) begin
//NOP
CS <= 0;
RAS <= 1;
CAS <= 1;
WE <= 1;
q <= q + 1;
DQM <= 0;
end
else if( q == 4 ) begin
//NOP(READ Burst 1bit〜)
CS <= 0;
RAS <= 1;
CAS <= 1;
WE <= 1;
q <= q + 1;
DQM <= 0;
//Read
DQBuf[q-4] <= DQ;
//UART
ReadFlag <= 1; //UARTの開始のためのフラグ
end
else if( q > 4 && q < 514 ) begin
//NOP(READ Burst 2bit目〜)
CS <= 0;
RAS <= 1;
CAS <= 1;
WE <= 1;
q <= q + 1;
DQM <= 0;
//Read
DQBuf[q-4] <= DQ;
//debug DQoutを入れる時間があるので、1CLK遅く立ち上げ
//UART_EN <= 1;
end
else if( q == 514 ) begin
//Burst Terminate
CS <= 0;
RAS <= 1;
CAS <= 1;
WE <= 0;
q <= q + 1;
DQM <= 0;
//Read
DQBuf[q-4] <= DQ;
end
else if( q == 515 ) begin
//NOP
CS <= 0;
RAS <= 1;
CAS <= 1;
WE <= 1;
q <= q + 1;
DQM <= 1;
//Read
DQBuf[q-4] <= DQ;
end
else if( q == 516 ) begin
//PRECHARGE(tRP=15n)
RAS <= 0;
CAS <= 1;
WE <= 0;
q <= q + 1 ;
Address[10] <= 0; // 0 => single bank
BA <= 2'b00; // Bank assign
//ReadEND <= 1;
//↑UART送信後にReadENDする
end
else if( q == 517 ) begin
//UART送信中
//NOP
CS <= 0;
RAS <= 1;
CAS <= 1;
WE <= 1;
DQM <= 1;
end
else begin
//例外処理
CS <= 0;
RAS <= 1;
CAS <= 1;
WE <= 1;
q <= q + 1;
//ReadEND <= 0;
DQM <= 1;
//UART
//EnUART_ON <= 0;
end
//UARTでDQBufを送信する
if( ReadFlag == 1 ) begin
if( DQBufCnt == 512 ) begin
ReadEND <= 1;
end
else if( uo_RDY == 1 )begin //UARTONが送信可能状態...
r_EN <= 1'b1;
r_DQ <= DQBuf[DQBufCnt];
DQBufCnt <= DQBufCnt + 1;
end
else begin
//送信待ち
r_EN <= 1'b0;
end
end
else begin
//ReadFlagが立つまで初期化しておく
DQBufCnt <= 0;
ReadEND <= 0;
end
end //if( ReadState )
else begin
CS <= 0;
RAS <= 1;
CAS <= 1;
WE <= 1;
Address <= 12'b000000_000000;
BA <= 2'b00;
DQM <= 1;
ReadEND <= 0;
//DQout <= 0;
q <= 0;
ReadFlag <= 0;
DQBufCnt <= 0;
end //else begin
end // always end
endmodule
Consoleの表示結果は、
Reading design: READModule.prj
========================================================...
* HDL Compilation ...
========================================================...
Compiling verilog file "READ.v" in library work
Module <READModule> compiled
No errors in compilation
Analysis of file <"READModule.prj"> succeeded.
========================================================...
* Design Hierarchy Analysis ...
========================================================...
Analyzing hierarchy for module <READModule> in library <...
========================================================...
* HDL Analysis ...
========================================================...
Analyzing top module <READModule>.
Module <READModule> is correct for synthesis.
========================================================...
* HDL Synthesis ...
========================================================...
Performing bidirectional port resolution...
INFO:Xst:2679 - Register <CS> in unit <READModule> has a...
INFO:Xst:2679 - Register <Address<11>> in unit <READModu...
INFO:Xst:2679 - Register <Address<9>> in unit <READModul...
INFO:Xst:2679 - Register <Address<8>> in unit <READModul...
INFO:Xst:2679 - Register <Address<7>> in unit <READModul...
INFO:Xst:2679 - Register <Address<6>> in unit <READModul...
INFO:Xst:2679 - Register <Address<5>> in unit <READModul...
INFO:Xst:2679 - Register <Address<4>> in unit <READModul...
INFO:Xst:2679 - Register <Address<3>> in unit <READModul...
INFO:Xst:2679 - Register <Address<2>> in unit <READModul...
INFO:Xst:2679 - Register <Address<1>> in unit <READModul...
INFO:Xst:2679 - Register <Address<0>> in unit <READModul...
INFO:Xst:2679 - Register <BA> in unit <READModule> has a...
Synthesizing Unit <READModule>.
Related source file is "READ.v".
Found 1-bit register for signal <Address<10>>.
Found 1-bit register for signal <CAS>.
Found 1-bit register for signal <DQM>.
Found 1-bit register for signal <RAS>.
Found 1-bit register for signal <ReadEND>.
Found 1-bit register for signal <WE>.
Found 8-bit register for signal <r_DQ>.
Found 1-bit register for signal <r_EN>.
Found 4096-bit register for signal <DQBuf>.
Found 10-bit up counter for signal <DQBufCnt>.
Found 13-bit register for signal <q>.
Found 13-bit adder for signal <q$share0000>.
Found 13-bit comparator greater for signal <RAS$cmp_...
Found 13-bit comparator less for signal <RAS$cmp_lt0...
Found 1-bit register for signal <ReadFlag>.
INFO:Xst:738 - HDL ADVISOR - 4096 flip-flops were inferr...
Summary:
inferred 1 Counter(s).
inferred 4125 D-type flip-flop(s).
inferred 1 Adder/Subtractor(s).
inferred 2 Comparator(s).
inferred 8 Multiplexer(s).
Unit <READModule> synthesized.
INFO:Xst:1767 - HDL ADVISOR - Resource sharing has ident...
========================================================...
HDL Synthesis Report
Macro Statistics
# Adders/Subtractors : 1
13-bit adder : 1
# Counters : 1
10-bit up counter : 1
# Registers :...
1-bit register : 8
13-bit register : 1
8-bit register :...
# Comparators : 2
13-bit comparator greater : 1
13-bit comparator less : 1
# Multiplexers : 1
8-bit 512-to-1 multiplexer : 1
========================================================...
========================================================...
* Advanced HDL Synthesis ...
========================================================...
Loading device for application Rf_Device from file '3s25...
*2008年12月02日(火) [#m81b0d9f]
**ReadのFullPageBurstと並行して、UARTで送信する。→論理合...
以下の文を、READモジュールに追加した。
あれ、論理合成が終わらない。
ずっとCPUが動き続けている。。
//UARTでDQBufを送信する
if( ReadFlag == 1 ) begin
/*
SDRAMからの読込が始まったらReadFlag=1になる。
その後、DQBuf[DQBufCnt]をUARTで送信する。
送信後にReadEND=1にし、ReadFlag=0にする
*/
if( DQBufCnt == 512 ) begin
ReadEND <= 1;
end
else if( uo_RDY == 1 )begin //UARTONが送信可能状態なら
r_EN <= 1;
r_DQ <= DQBuf[DQBufCnt];
DQBufCnt <= DQBufCnt + 1;
end
else begin
//送信待ち
end
end
else begin
//ReadFlagが立つまで初期化しておく
DQBufCnt <= 0;
ReadEND <= 0;
end
**if,else if文とcase文の違い [#w4605322]
if,else if文とcase文は、全く一緒だと思っていた。
けど、よく考えてみたら全然違うことに気づいた。
ソフトウェアとハードウェアのプログラミングの違いなのかな。
if,else if文は上から順番に実行され該当したものが実行され...
そのため、段数が多くなればなるほど、動作が遅くなる。
RTL設計スタイルガイドで確認してみると、
上の方に書いた条件は早く実行されるが、下の方に書いた条件...
if文はプライオリティを記述するもの、case文は並行動作を記...
(参照元:RTL設計スタイルガイド Verilog HDL編 第2版 PP.2...
**レジスタ配列の添え字に算術演算可能 [#h5f85690]
file name : 2008-12-02-registerArray_UseVariable
module top( CLK , xRST , Dout0 , Dout1 , Dout2 , Dout3 );
input CLK , xRST ;
output [7:0] Dout0 , Dout1 , Dout2 , Dout3;
reg [7:0] RegArray [3:0] ; //レジスタ配列8バイト(1ワー...
reg [10:0] q; //カウンタ
assign Dout0 = RegArray[0];
assign Dout1 = RegArray[1];
assign Dout2 = RegArray[2];
assign Dout3 = RegArray[3];
always @(posedge CLK) begin
if(xRST==0)begin //reset
q <= 1;
end
else if(q==5) begin //initialize
q <= 0;
end
else begin
q <= q + 1 ;
RegArray[q-1] <= q;
end
end
endmodule
とりあえず、これで確認できた。
でも、これだと毎回引き算が行われることになる。
でも仕方ないか。
この辺は、STARC2-68辺りが参考になる。
ページ名: