目次

メニュー

過去の日記

kondoへのコメント

コメントはありません。 Comments/kondo

お名前:

2008年12月21日(日)

まだ、レジスタ配列の添え字に変数が使えない問題が残っている。

レジスタ配列の添え字に算術演算した結果を入れることはできない?

これは論理合成可能

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日(土)

見直した結果、警告を減らすことができ、
FullPageBurstの内、8バイトを正常に確認できた。

ようやくFullPageBurstの8バイトを確認できた、出力も正常に一回のみ

2008-12-17-top_2
ようやく出来た。出力も正常に一回のみで、FullPageBurstの動作を確認

今までシミュレーションに頼りすぎていたな。
やはり警告は出来る限り減らすべき

残ったWarning

CLKの分周に一番下の桁は使っていない

WARNING:Xst:647 - Input <Div<0>> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved.

HDLでは、8バイトしかアクセスしていないため

WARNING:Xst:646 - Signal <DQBuf<511:108>> is assigned but never used. This unconnected signal will be trimmed during the optimization process.
WARNING:Xst:646 - Signal <DQBuf<99:0>> is assigned but never used. This unconnected signal will be trimmed during the optimization process.

これがよく分からない。

WARNING:Xst:2677 - Node <CAS> of sequential type is unconnected in block <REFRESHModule_0>.
WARNING:Xst:2677 - Node <REFRESHModule_0/CAS> of sequential type is unconnected in block <top>.

2008年12月17日(水)

論理合成が終わらない問題、UARTが永遠に出力を送信してくる問題もあり、一行に進まない。。

こういう時は、もう一度最初からプログラムを見直していく。
どうやらリフレッシュ状態に追加した部分に不具合があったようだ。

リフレッシュ状態の前の状態を保持できない

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シミュレーションとゲートレベルシミュレーション

おそらく

always文の注意点

2008年12月14日(日)

レジスタ配列に変数を使う→論理合成が終わらない

どうやらレジスタ配列に変数を使うと、論理合成が終わらないようだ。
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日(木)

ビット幅指定に変数は使えない

こりゃ、困った。

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日(木)

FullPageBurstの内8バイトの読込確認

論理合成が出来ない問題は解決していない。
とりあえず、前に作ったUART,UARTON,UARTTXで512ビットの内の
8ビットを確認した。0〜7ビット目と100〜101ビットを確認したが、
正しく動作していた。

ただし、1回8バイトが送出されるはずが、
永遠に出力が出てくる。
シミュレーションではうまくいっていたんだけどな〜

2008年12月03日(水)

論理シミュレーションは成功するが、論理合成できず。

やはり終わらない。
論理合成の途中まではやってくれているようだ。
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 , CAS , WE , DQM , Address , BA , DQ , uo_RDY , r_EN , r_DQ ); //, DQout );
	
	//######################################
	//	 	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が返ってくるところでReadFlagを立てる。その後、UARTで送信する。
	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なのでAUTOPrechargeなし(A10:Don't Care)
					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 <work>.


=========================================================================
*                            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 constant value of 0 during circuit operation. The register is replaced by logic.
INFO:Xst:2679 - Register <Address<11>> in unit <READModule> has a constant value of 0 during circuit operation. The register is replaced by logic.
INFO:Xst:2679 - Register <Address<9>> in unit <READModule> has a constant value of 0 during circuit operation. The register is replaced by logic.
INFO:Xst:2679 - Register <Address<8>> in unit <READModule> has a constant value of 0 during circuit operation. The register is replaced by logic.
INFO:Xst:2679 - Register <Address<7>> in unit <READModule> has a constant value of 0 during circuit operation. The register is replaced by logic.
INFO:Xst:2679 - Register <Address<6>> in unit <READModule> has a constant value of 0 during circuit operation. The register is replaced by logic.
INFO:Xst:2679 - Register <Address<5>> in unit <READModule> has a constant value of 0 during circuit operation. The register is replaced by logic.
INFO:Xst:2679 - Register <Address<4>> in unit <READModule> has a constant value of 0 during circuit operation. The register is replaced by logic.
INFO:Xst:2679 - Register <Address<3>> in unit <READModule> has a constant value of 0 during circuit operation. The register is replaced by logic.
INFO:Xst:2679 - Register <Address<2>> in unit <READModule> has a constant value of 0 during circuit operation. The register is replaced by logic.
INFO:Xst:2679 - Register <Address<1>> in unit <READModule> has a constant value of 0 during circuit operation. The register is replaced by logic.
INFO:Xst:2679 - Register <Address<0>> in unit <READModule> has a constant value of 0 during circuit operation. The register is replaced by logic.
INFO:Xst:2679 - Register <BA> in unit <READModule> has a constant value of 00 during circuit operation. The register is replaced by logic.

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_gt0000> created at line 113.
    Found 13-bit comparator less for signal <RAS$cmp_lt0000> created at line 113.
    Found 1-bit register for signal <ReadFlag>.
INFO:Xst:738 - HDL ADVISOR - 4096 flip-flops were inferred for signal <DQBuf>. You may be trying to describe a RAM in a way that is incompatible with block and distributed RAM resources available on Xilinx devices, or with a specific template that is not supported. Please review the Xilinx resources documentation and the XST user manual for coding guidelines. Taking advantage of RAM resources will lead to improved device usage and reduced synthesis time.
    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 identified that some arithmetic operations in this design can share the same physical resources for reduced device utilization. For improved clock frequency you may try to disable resource sharing.

=========================================================================
HDL Synthesis Report

Macro Statistics
# Adders/Subtractors                                   : 1
 13-bit adder                                          : 1
# Counters                                             : 1
 10-bit up counter                                     : 1
# Registers                                            : 522
 1-bit register                                        : 8
 13-bit register                                       : 1
 8-bit register                                        : 513
# 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 '3s250e.nph' in environment C:\Xilinx\10.1\ISE.

2008年12月02日(火)

ReadのFullPageBurstと並行して、UARTで送信する。→論理合成が終わらないorz

以下の文を、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文の違い

if,else if文とcase文は、全く一緒だと思っていた。
けど、よく考えてみたら全然違うことに気づいた。
ソフトウェアとハードウェアのプログラミングの違いなのかな。

if,else if文は上から順番に実行され該当したものが実行される。
そのため、段数が多くなればなるほど、動作が遅くなる。

RTL設計スタイルガイドで確認してみると、
上の方に書いた条件は早く実行されるが、下の方に書いた条件は、段数分だけ遅くなってしまう、ようだ。

if文はプライオリティを記述するもの、case文は並行動作を記述するものと考えて記述するとよいでしょう。
(参照元:RTL設計スタイルガイド Verilog HDL編 第2版 PP.2-50)

レジスタ配列の添え字に算術演算可能

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ワード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辺りが参考になる。

2008年11月27日(木) 28日(金)

どうも最近、前と同じようなミスをして、時間を潰している。
ここは、初心に返って、HDLを出力信号名を分かりやすくしたり、コメントを追加したりしよう。急がば回れ、だ。

あと、今年も1ヶ月だ。
11月はゆっくり進めすぎたかも、と反省。こんなとこで時間かけている場合じゃない
がんばって、今年中にセンサノードを仮完成させたい。

リフレッシュ状態の修正

前に作ったリフレッシュ状態が25MHzでは動作しないので、修正

リフレッシュ後に66ns開ける必要があるため、AUTOリフレッシュ後にNOPを出力するように変更する。

論理シミュレーションに失敗する時→論理合成でエラーを確認する

論理シミュレーションをするが、どうしても不定値が出力される。
文法も問題ないし、よく分からなかった。
結局、論理合成をやってみて、問題が分かった。
RAS、CASが、topの中で、複数でドライブされていたのが原因だった。

どうやら論理シミュレーションでは、配線のチェックまではしてくれないようだ(そりゃそうか)。
論理シミュレーションに失敗する場合は、必ず論理合成して確認する。

後は、モジュール単体での論理シミュレーションをやって、
全体シミュレーションをやればtopに問題があることには気づけたはず。。

論理シミュレーションに失敗する場合の対策

  1. 論理合成をやってみてエラーや警告を確認する。
  2. 単体シミュレーション、全体シミュレーションを行って、問題の切り分け

論理シミュレーションの良いところは、わざわざ論理合成をせずとも
動作を確認できるところだと思うので、微妙な修正を加えた時などは、
そのまま論理シミュレーションする。
不定値が出てきた場合は、信号がぶつかっていると考えて、
論理合成をかけてみよう。

[2008-11-28-top]11-02-topの可読性を上げる、変数とモジュール化の見直し

どうも自分が書いたHDLが見にくい。
出力信号のルールなどが定まっていない時の部分が残っているためか。

各モジュールの先頭の文字を階層識別文字とする。

例:READモジュールの階層識別文字は、"r"

各ブロックの出力端子名は、"<階層識別文字>"+"_"とする。

例:READモジュールの出力信号名は、"r_出力信号名"

参考資料:RTL設計スタイルガイド Verilog HDL編 第2版

こうすることでデバッグがかなり楽になる。
モジュール間のつながりが非常に分かりやすいからである。

あとは、基本的なことだけど、

2008年11月20日(木)

ものづくり実践プロジェクトとか、TAとかで、
あっという間に時間が過ぎてしまった。。orz

SDRAMのデータシート読み[L303]

よく考えてみると、メモリインタリーブをすれば、タイムラグなしに
読込が可能だということに気づいた。

そこで、FullpageBurstをする前にもう一度データシートを読んだ。

SDRAMのデータシートメモ

2008年11月08日(土)

UARTで、PCからLED制御する

2008-11-08-UARTRX_Chage
LEDの点灯を、PCからUART経由で、制御する。
お、これは便利だ。

デバッグ時に、UART経由で操作できれば、効率がアップできるかも。

2008年11月07日(金)

verilogで例外処理を書いた方が良いかも

今は、

2008年10月23日(木)

SDRAMの残りの作業

たぶん、それほど時間はかからないと思う。

SDRAM,バースト動作で4バイト書込,読込して、PCで確認(UART)

バースト動作で4バイト書込、読込をした。
さらに、この前作ったUARTモジュールで、PCで表示させ確認する。
ようやく成功。。

しかし、なぜか1バイト目がうまく表示されない、
原因は、READモジュールからUARTに値を渡すタイミングが1CLK分ずれていたようだ。

2008年10月20日(月)

CLK生成回路にリセット信号は不必要

今までは、発振器からクロックを生成するモジュールに、リセット信号を入れていた。
理由は、ビヘイビアシミュレーションをする時に初期値を与えるため、だった。

でも、しょうたさんと話して、initial文で、初期値が与えられることを知る。
まだまだ勉強不足だった。
STARCの本を、読んで勉強しよう。

2008年10月18日(土)

UART状態を追加

4バイトバースト動作で書込、読込するSDRAMのテストモジュールに、
作成した連続読み込みできるUARTモジュールを使った状態、を追加する

2008年10月10日(金)

バースト動作の確認

連続した4バイトの書込、読込に成功した。

2008年10月09日(木)

リフレッシュを15.625usごとに必要

25Mを32分周で、1.28uのCLKを利用している。
12回に1回リフレッシュしないといけないのか。

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を書いた。
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

駄目な対処法1・・・wireで適当な信号線を定義して、つないでみる。

assign Div_Dummy = Div[0];

これでもDiv_Dummyが出力されていないから、Div_Dummyに警告が出る
これを消すには、Outputで無駄に信号線を出すしかないか。

駄目な対処法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を書いた。

ステートマシンの状態遷移もしていない。
CLKだけは正常に生成されている。

いろいろやってみるが、解決できず。
困った。
明日、新しくHDLを書き直してみよう。


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS