DE0買いました

1日遅れながら、DE0を買っていじったのでそれについて。


DE0というのはAlteraのFPGA、CycloneIIIを実装したFPGAボードです。メーカーの製品のページは以下です。
http://www.terasic.com.tw/cgi-bin/page/archive.pl?Language=English&No=364
このボードは定価でも1万円程度、学割なら7000円程度と非常に安価でかつSDRAM8Mbyte、フラッシュ4MByte、さらにVGAPS2、SDカード端子と必要なものはがっちりそろっているので初めての方(俺です俺)にもってこいのボードです。
といっても、日本円で支払いたかったので、アカデミーは諦めてデジキーで一般価格で買いました。デジキーの商品のページは以下です。
http://search.digikey.com/scripts/DkSearch/dksus.dll?Cat=2621773&k=DE0
送料セットで1万2千円程度でした。今回銀行振り込みで購入したのですが、このサイト、驚いたのが振り込みが商品が到着してからになっています。それまであまり音沙汰が無かったので不安になってましたw
それで、これが実際に届いたものです。

第一印象はその大きさでした。かなり小さいです。マイナーな話で悪いですが、カシオのEX-word*1とほとんど同じサイズです。
動かすのは簡単で、Alteraのサイトから開発ツール(Quartus II)を落としてインストールすると一緒に入るドライバー*2を使います。
届いたらまずハードウェアチェックのために付属のコントロールツール*3から一通りデバイスの動作チェックができるのでやってみるといいかもしれません。


自分はAlteraもVerilogHDLが今回初めてだったのでかなり迷いながら(某t氏にいろいろ教えてもらいつつ)7セグを使ったカウンターを書いてみました。
書いてて困ったのはチャッタリングでした。押したときも離したときも両方ディレイを取れば安定した出力が得られました。
でも慣れてみたら結構わかりやすくていい言語だとおもいます。次はディスプレイに出力する回路を書く予定。
ソースを以下に掲載します。また、ツールの使い方に関してはまた後日時間を見つけてレポートに起こす予定です。

`define CLK_ns 20

module test(
	input [0:0] BUTTON,
	input CLOCK_50,
	output [6:0] HEX0_D,
	output [6:0] HEX1_D,
	output [6:0] HEX2_D,
	output [6:0] HEX3_D,	
	output [0:0] LEDG
	);
	
	//signal configure
	wire [6:0] rHEX0_D;
	assign HEX0_D = rHEX0_D;
	wire [6:0] rHEX1_D;
	assign HEX1_D = rHEX1_D;
	wire [6:0] rHEX2_D;
	assign HEX2_D = rHEX2_D;
	wire [6:0] rHEX3_D;
	assign HEX3_D = rHEX3_D;
	reg rLEDG;
	assign LEDG = rLEDG;
	reg [15:0] rNUM;
	wire wBUTTON;
	reg rON;
	
	//sub module configure
	sm7SEG s7SEG0 (rHEX0_D, rNUM[3:0]);
	sm7SEG s7SEG1 (rHEX1_D, rNUM[7:4]);
	sm7SEG s7SEG2 (rHEX2_D, rNUM[11:8]);
	sm7SEG s7SEG3 (rHEX3_D, rNUM[15:12]);

	smSW sSW (CLOCK_50, BUTTON, wBUTTON);
	
	//text
	always@(posedge CLOCK_50) begin
		if(wBUTTON == 1'b1 && rON == 0) begin
			rLEDG <= 1'b1;
			rNUM <= rNUM + 16'h1;
			rON <= 1'b1;
		end else if(wBUTTON == 1'b1 && rON != 0) begin
			rLEDG <= rLEDG;
			rNUM <= rNUM;
			rON <= rON;
		end else begin
			rLEDG <= 1'b0;
			rNUM <= rNUM;
			rON <= 1'b0;
		end
	end
endmodule

module smSW(
	input CLK,
	input BUTTON,
	output OUT
	);
	//constance
	parameter waitns = 2560; //ns
	localparam loopend = waitns / `CLK_ns;
	
	//reg configure
	reg [12:0] rCFlag;
	reg rOUT;
	assign OUT = rOUT;
	
	always@(posedge CLK) begin
		if(BUTTON == 1'b1 && rCFlag != 13'h00000000) begin
			rCFlag <= rCFlag + 13'h00000001;
			rOUT <= 1'b0;
		end else if(BUTTON == 1'b0 && rCFlag < loopend) begin
			rCFlag <= rCFlag + 13'h00000001;
			rOUT <= rOUT;
		end else if(BUTTON == 1'b0 && rCFlag == loopend) begin
			rCFlag <= rCFlag + 13'h00000001;
			rOUT <= 1'b1;
		end else begin
			rCFlag <= rCFlag;
			rOUT <= rOUT;
		end
	end
endmodule


module sm7SEG(
	output [6:0] HEX,
	input [3:0] NUM
	);
		
	//function
	function [6:0] dec7SEG;
		input [3:0] iNUM;

		case (iNUM)
			4'h0: dec7SEG = 7'b1000000;
			4'h1: dec7SEG = 7'b1111001;
			4'h2: dec7SEG = 7'b0100100;
			4'h3: dec7SEG = 7'b0110000;
			4'h4: dec7SEG = 7'b0011001;
			4'h5: dec7SEG = 7'b0010010;
			4'h6: dec7SEG = 7'b0000010;
			4'h7: dec7SEG = 7'b1011000;
			4'h8: dec7SEG = 7'b0000000;
			4'h9: dec7SEG = 7'b0010000;
			4'ha: dec7SEG = 7'b0001000;
			4'hb: dec7SEG = 7'b0000011;
			4'hc: dec7SEG = 7'b1000110;
			4'hd: dec7SEG = 7'b0100001;
			4'he: dec7SEG = 7'b0000110;
			4'hf: dec7SEG = 7'b0001110;
			default: dec7SEG = 7'b0000000;
		endcase
	endfunction
	
	//text
	assign HEX = dec7SEG(NUM);
	
endmodule

*1:B6よりすこし小さいくらい

*2:e.g. C:\altera\91sp1\quartus\drivers\usb-blaster

*3:DE0_ControlPanel.exe