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、さらにVGA、PS2、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