
FPGAは、プログラマブルな集積回路の一つ。Verilogなどで処理を記述して、修正回路として挙動させることができます。
ブレッドボードにゲートや抵抗を繋いで回路を作るよりも、楽に回路を実装できるかも?
いちいちカルノー図とか描かなくていいわけです。
(新しい技術なのかと思いきや、実はFPGAの発売は1985年からということで、自分より年上でした)
それはさておき、今回は下記URL「触って学ぼう FPGA開発入門」をもとに、クロックとボタン入力でLEDをカウントダウン/カウントアップさせるverilogを実行してみました。
【参考】
http://monoist.atmarkit.co.jp/mn/kw/fpga_basic.html (触って学ぼう FPGA開発入門)
module UPDOWN(RESET, CLK, DEC, COUNT); //モジュール名とポート
input RESET, CLK, DEC; //入力ポート
output [3:0] COUNT; //出力ポート
reg [22:0] tmp_count; //継続的代入文はwire宣言、手続き的代入文の左辺はreg宣言
reg [3:0] COUNT_TMP;
//動作を記述。(CLK,RESETいずれかが変化したら、always文中のbegin~endの処理が実施
always @(posedge CLK or negedge RESET)
begin
if (RESET == 1"b0) //RESETが0 (つまりON)のとき
tmp_count <= 23"h000000; //tmp_countを0にリセット
else //RESETが0でない(つ・ワりOFF)のとき
tmp_count <= tmp_count + 23"h1; //tmp_countをカウントup
end
//カ・Eンタは6MHzで高速すぎるため、フリーランカウンタの最上位ビットのみをクロックとして入力
assign DIVIDE_CLK = tmp_count[22]; //22bit目をDIVIDE_CLKへ
always @(posedge DIVIDE_CLK or negedge RESET)//DIVIDE_CLKまたはRESETが変化したとき
begin
if (RESET == 1"b0) //RESETが0 (つまりON)のとき
COUNT_TMP <= 4"h0; //tmp_countを0にリセット
else if (DEC == 1"b1) //RESETが0でない(つまりOFF)かつ、DECスイッチが押されていないとき
COUNT_TMP <= COUNT_TMP + 4"h1; //カウントアップ
else //DECスイッチが押されているとき
COUNT_TMP <= COUNT_TMP - 4"h1; //カウントダウン
end
assign COUNT = ~COUNT_TMP; //LEDは負論理(0のとき点灯)なので、反転
endmodule
|
Windows8に開発環境+ドライバを入れるとブルースクリーンになるので、わざわざWin7を引っ張りだすはめに...
せっかく7セグも実装されているのでこちらに出力したいですが、それはまた追々、
