DE0-Nanoテスト

SystemBuilderが生成したプロジェクトを手直ししてとりあえずの環境を整えた。
フォルダをRTL/IP/制約/プロジェクト本体に分けて、保存するようにし、Subversionでバージョン管理する。
Xilinxと比べてわかったのは、vivadoでは制約のXDCでピン配置まで管理するが、AlteraのQuartusでは制約のSDCはあくまでタイミング情報のみ保持し、ピン配置などはプロジェクト管理ファイルの.qsfで管理するということが違うようだ。
まあ、わかってしまえばどうということの無い差。


Psuh SWとDIP SWをLEDに直結するデザインから始めて、PLL IPを使ってクロックの逓倍を行い、適当な回路でLEDをチカチカさせるところまでできた。
乗っているデバイスがトランシーバーなしのEのためか、PLLは機能がそんなに無い単純なものだった。
Xilinxで作った非同期リセットからクロックごとの同期リセットを作るリセットブリッジ回路とかも移植した。


LEDをチカチカさせるのは、LFSRを使って行った。
LFSR部分のコードを以下に示す。

module LFSR_RANDOM8
	(
	input 	wire				CLK				,
	input	wire				SYNC_RST		,
	input	wire				UPDATE			,
	
	output	wire		[7:0]		RANDOM			
	
);
	//=======================================================
	//  REG/WIRE declarations
	//=======================================================
	//Mersenne prime Linear Feedback Shift Register
	reg		[ 12:0]		LFSR_13				;
	reg		[ 16:0]		LFSR_17				;
	reg		[ 18:0]		LFSR_19				;
	reg		[ 30:0]		LFSR_31				;
	reg		[ 60:0]		LFSR_61				;
	reg		[ 88:0]		LFSR_89				;
	reg		[106:0]		LFSR_107			;
	reg		[126:0]		LFSR_127			;
	
	always @( posedge CLK ) begin
		if(SYNC_RST == 1'b1)begin
			LFSR_13		<=	1'b1;
			LFSR_17		<=	1'b1;
			LFSR_19		<=	1'b1;
			LFSR_31		<=	1'b1;
			LFSR_61		<=	1'b1;
			LFSR_89		<=	1'b1;
			LFSR_107	<=	1'b1;
			LFSR_127	<=	1'b1;
		end else begin
			if(UPDATE == 1'b1)begin
				//Shift
				LFSR_13		[ 12:1]	<=	LFSR_13		[ 11:0]	;
				LFSR_17		[ 16:1]	<=	LFSR_17		[ 15:0]	;
				LFSR_19		[ 18:1]	<=	LFSR_19		[ 17:0]	;
				LFSR_31		[ 30:1]	<=	LFSR_31		[ 29:0]	;
				LFSR_61		[ 60:1]	<=	LFSR_61		[ 59:0]	;
				LFSR_89		[ 88:1]	<=	LFSR_89		[ 87:0]	;
				LFSR_107	[106:1]	<=	LFSR_107	[105:0]	;
				LFSR_127	[126:1]	<=	LFSR_127	[125:0]	;
				//LSB Generation (from Xilinx xapp 052)
				LFSR_13		[    0]	<=	LFSR_13[12] ^ LFSR_13[3] ^ LFSR_13[2] ^ LFSR_13[0]		; //13 13,4,3,1
				LFSR_17		[    0]	<=	LFSR_17[16] ^ LFSR_17[13]					; //17 17,14
				LFSR_19		[    0]	<=	LFSR_19[18] ^ LFSR_19[5] ^ LFSR_19[1] ^ LFSR_19[0]		; //19 19,6,2,1
				LFSR_31		[    0]	<=	LFSR_31[30] ^ LFSR_31[27]					; //31 31,28
				LFSR_61		[    0]	<=	LFSR_61[60] ^ LFSR_61[59] ^ LFSR_61[45] ^ LFSR_61[44]		; //61 61,60,46,45
				LFSR_89		[    0]	<=	LFSR_89[88] ^ LFSR_89[50]					; //89 89,51
				LFSR_107	[    0]	<=	LFSR_107[106] ^ LFSR_107[104] ^ LFSR_107[43] ^ LFSR_107[41]	; //107 107,105,44,42
				LFSR_127	[    0]	<=	LFSR_127[126] ^ LFSR_127[125]					; //127 127,126
			end 
		end
	end
	
	assign	RANDOM[0]	=	LFSR_13		[    0]	;
	assign	RANDOM[1]	=	LFSR_17		[    0]	;
	assign	RANDOM[2]	=	LFSR_19		[    0]	;
	assign	RANDOM[3]	=	LFSR_31		[    0]	;
	assign	RANDOM[4]	=	LFSR_61		[    0]	;
	assign	RANDOM[5]	=	LFSR_89		[    0]	;
	assign	RANDOM[6]	=	LFSR_107	[    0]	;
	assign	RANDOM[7]	=	LFSR_127	[    0]	;
	
endmodule

LEDごとの周期がなるべく被らないようにしたい→周期が互いに素なら最大周期になる→LFSRの周期は長さをNとすると2^N-1→2^N-1の形で素数になるメルセンヌ素数にすればいいだろうという考え。
長さが決まったら、最大周期になるタップ位置はXilinxが公開しているアプリケーションノートに乗っているので、そこから拾い出す。


これを実装した状態でLEは22,320個中の515個を使用しており、まだまだ余裕。
組み合わせで513LE、レジスタで499LEと出ているので、現在はレジスタネックだと思われる。


とりあえず、リファレンスデザインのSDRAMコントローラやらI2Cなんかを移植するか…


PLLの条件を変えて何回か合成してみたが、Fmaxが270〜300MHz程度になるので、当分250MHzで開発する。