DE0-CVで(大げさな)Lチカ

動作確認、さぁ行ってみようかぁ。

  • Quartus Primeを起動、"File" -> "New Project Wizard"を選択、プロジェクト名は"LEDBlink"、詳細設定はこちらの中で参照しているこちらを参照、"Family & Device Setting"を"5CEBA4F23C7"にするのを忘れずに。
  • "File" -> "New..."で"Verilog HDL"を選択、以下の通りに実装、"LEDBlink.v"で保存
module LEDBlink(
	input wire in_clk, 
	input wire [9:0] in_switch, 
	input wire [3:0] in_button,
	output wire [9:0] out_led, 
	output wire [6:0] seven_segment_0, 
	output wire [6:0] seven_segment_1, 
	output wire [6:0] seven_segment_2, 
	output wire [6:0] seven_segment_3, 
	output wire [6:0] seven_segment_4, 
	output wire [6:0] seven_segment_5);
	//
	wire reset = ~in_button[0];
	//
	// clock divder for 1 sec
	//
	reg [25:0] _26bit_counter;
	wire _26bit_counter_expired;
	assign _26bit_counter_expired = (_26bit_counter == 26'd49_999_999)? 1'b1: 1'b0;
	//
	always @(posedge in_clk or posedge reset)
	begin
		if (reset)
			_26bit_counter <= 26'd0;
		else
		begin
			if (_26bit_counter_expired)
				_26bit_counter <= 26'd0;
			else
				_26bit_counter <= _26bit_counter + 26'd1;
		end
	end
	//
	// LED blink latch
	//
	reg led_latch;
	//
	always @(posedge in_clk or posedge reset)
	begin
		if (reset)
			led_latch <= 1'd0;
		else
			if (_26bit_counter_expired)
				led_latch <= ~led_latch;
	end
	//
	// counter for 7 segment LED 
	//
	reg [3:0] _4bit_counter;
	//
	always @(posedge in_clk or posedge reset)
	begin
		if (reset)
			_4bit_counter <= 4'd0;
		else
			if (_26bit_counter_expired)
				_4bit_counter  <= _4bit_counter + 4'd1;
	end
	
	//assign LEDs
	seven_segment_decoder seven_segment_decoder_0(
	.in_4bit(_4bit_counter + 4'd5), 
	.out_seven_segment(seven_segment_0));
	seven_segment_decoder seven_segment_decoder_1(
	.in_4bit(_4bit_counter + 4'd4), 
	.out_seven_segment(seven_segment_1));
	seven_segment_decoder seven_segment_decoder_2(
	.in_4bit(_4bit_counter + 4'd3), 
	.out_seven_segment(seven_segment_2));
	seven_segment_decoder seven_segment_decoder_3(
	.in_4bit(_4bit_counter + 4'd2),
	.out_seven_segment(seven_segment_3));
	seven_segment_decoder seven_segment_decoder_4(
	.in_4bit(_4bit_counter + 4'd1), 
	.out_seven_segment(seven_segment_4));
	seven_segment_decoder seven_segment_decoder_5(
	.in_4bit(_4bit_counter), 
	.out_seven_segment(seven_segment_5));
	//
	assign out_led = (led_latch)? 10'b11_1111_1111: 10'b00_0000_0000;
endmodule
  • "File" -> "New..."で"Verilog HDL"を選択、以下の通りに実装、こちらは"seven_segment_decoder.v"で保存
module seven_segment_decoder(
	input wire [3:0] in_4bit, 
	output wire [6:0] out_seven_segment);
	//
	function [6:0] led_decoder;
		//
		input [3:0] in_number;
		//
		begin
			case (in_number)
				4'h0:
					led_decoder = 7'b1000000;
				4'h1:
					led_decoder = 7'b1111001;
				4'h2:
					led_decoder = 7'b0100100;
				4'h3:
					led_decoder = 7'b0110000;
				4'h4:
					led_decoder = 7'b0011001;
				4'h5:
					led_decoder = 7'b0010010;
				4'h6:
					led_decoder = 7'b0000010;
				4'h7:
					led_decoder = 7'b1111000;
				4'h8:
					led_decoder = 7'b0000000;
				4'h9:
					led_decoder = 7'b0011000;
				4'ha:
					led_decoder = 7'b0001000;
				4'hb:
					led_decoder = 7'b0000011;
				4'hc:
					led_decoder = 7'b0100111;
				4'hd:
					led_decoder = 7'b0100001;
				4'he:
					led_decoder = 7'b0000110;
				4'hf:
					led_decoder = 7'b0001110;
				default:
					led_decoder = 7'b1111111;
			endcase
		end
	endfunction
	//
	assign out_seven_segment[6:0] = led_decoder(in_4bit);
	//
endmodule
  • 一度、Quartus Primeを終了、プロジェクトフォルダー下の"(project名).qsf"をテキストエディターで開き、以下をコピペ。
set_location_assignment PIN_M6 -to in_button[3]
set_location_assignment PIN_M7 -to in_button[2]
set_location_assignment PIN_U7 -to in_button[0]
set_location_assignment PIN_W9 -to in_button[1]
set_location_assignment PIN_U13 -to in_switch[0]
set_location_assignment PIN_V13 -to in_switch[1]
set_location_assignment PIN_T13 -to in_switch[2]
set_location_assignment PIN_T12 -to in_switch[3]
set_location_assignment PIN_AA15 -to in_switch[4]
set_location_assignment PIN_AB15 -to in_switch[5]
set_location_assignment PIN_AA14 -to in_switch[6]
set_location_assignment PIN_AA13 -to in_switch[7]
set_location_assignment PIN_AB13 -to in_switch[8]
set_location_assignment PIN_AB12 -to in_switch[9]
set_location_assignment PIN_AA2 -to out_led[0]
set_location_assignment PIN_AA1 -to out_led[1]
set_location_assignment PIN_W2 -to out_led[2]
set_location_assignment PIN_Y3 -to out_led[3]
set_location_assignment PIN_N2 -to out_led[4]
set_location_assignment PIN_N1 -to out_led[5]
set_location_assignment PIN_U2 -to out_led[6]
set_location_assignment PIN_U1 -to out_led[7]
set_location_assignment PIN_L2 -to out_led[8]
set_location_assignment PIN_L1 -to out_led[9]
set_location_assignment PIN_U21 -to seven_segment_0[0]
set_location_assignment PIN_V21 -to seven_segment_0[1]
set_location_assignment PIN_W22 -to seven_segment_0[2]
set_location_assignment PIN_W21 -to seven_segment_0[3]
set_location_assignment PIN_Y22 -to seven_segment_0[4]
set_location_assignment PIN_Y21 -to seven_segment_0[5]
set_location_assignment PIN_AA22 -to seven_segment_0[6]
set_location_assignment PIN_AA20 -to seven_segment_1[0]
set_location_assignment PIN_AB20 -to seven_segment_1[1]
set_location_assignment PIN_AA19 -to seven_segment_1[2]
set_location_assignment PIN_AA18 -to seven_segment_1[3]
set_location_assignment PIN_AB18 -to seven_segment_1[4]
set_location_assignment PIN_AA17 -to seven_segment_1[5]
set_location_assignment PIN_U22 -to seven_segment_1[6]
set_location_assignment PIN_Y19 -to seven_segment_2[0]
set_location_assignment PIN_AB17 -to seven_segment_2[1]
set_location_assignment PIN_AA10 -to seven_segment_2[2]
set_location_assignment PIN_Y14 -to seven_segment_2[3]
set_location_assignment PIN_V14 -to seven_segment_2[4]
set_location_assignment PIN_AB22 -to seven_segment_2[5]
set_location_assignment PIN_AB21 -to seven_segment_2[6]
set_location_assignment PIN_Y16 -to seven_segment_3[0]
set_location_assignment PIN_W16 -to seven_segment_3[1]
set_location_assignment PIN_Y17 -to seven_segment_3[2]
set_location_assignment PIN_V16 -to seven_segment_3[3]
set_location_assignment PIN_U17 -to seven_segment_3[4]
set_location_assignment PIN_V18 -to seven_segment_3[5]
set_location_assignment PIN_V19 -to seven_segment_3[6]
set_location_assignment PIN_U20 -to seven_segment_4[0]
set_location_assignment PIN_Y20 -to seven_segment_4[1]
set_location_assignment PIN_V20 -to seven_segment_4[2]
set_location_assignment PIN_U16 -to seven_segment_4[3]
set_location_assignment PIN_U15 -to seven_segment_4[4]
set_location_assignment PIN_Y15 -to seven_segment_4[5]
set_location_assignment PIN_P9 -to seven_segment_4[6]
set_location_assignment PIN_N9 -to seven_segment_5[0]
set_location_assignment PIN_M8 -to seven_segment_5[1]
set_location_assignment PIN_T14 -to seven_segment_5[2]
set_location_assignment PIN_P14 -to seven_segment_5[3]
set_location_assignment PIN_C1 -to seven_segment_5[4]
set_location_assignment PIN_C2 -to seven_segment_5[5]
set_location_assignment PIN_W19 -to seven_segment_5[6]
set_location_assignment PIN_M9 -to in_clk

これでDE0-CVボード上の部品との接続ができる。
このピンアサインメントはよく使うので、"Assignments" -> "Export Assignments"を選択し、どこかに保存して置くと他のプロジェクトでインポートできる。

DE0-CV導入

f:id:nobu_macsuzuki:20180305112252j:plain
遅々としながらも、趣味FPGAプロジェクトは継続している。

FPGA ボードで学ぶ組込みシステム開発入門 ?Altera編?

FPGA ボードで学ぶ組込みシステム開発入門 ?Altera編?

に沿って、Cyclone III開発キットであるDE0を利用しちまちまやっていた。
この本の著者が改訂版であるをこの1月に出版した。
前半は前の本からツール類を更新した(Quartus Prime、Qsys)程度だが、後半にはSDRAMを利用したVGAコントローラやCMOSカメラコントローラなど、魅かれる内容だ。
動作速度のため、推奨FPGAがCyclone Vに変更になった。
今後Cyclone V SoCに着手しようと考えていたので、ツールを最新のものに更新することも考えてCyclone Vの開発キットであるTerasic DE0-CVを購入した。

新しい開発ツールであるQuartus Primeだが・・・ほとんどQuartus II。
基本的にDE0の開発で使用していたQuartus II 13.1と比較して、Quartus、Qsys、ModelSim Altera、Nios II Software Build Tool for Eclipseといったツールチェーンは変わらない。
変わったのはわずかにIP Catalog(旧Megawizard、Alteraが供給するソフトIP)くらいか。
ツールであるQuartus Primeはこちらからダウンロードできる、無償のLight Editionで十分である。
https://www.altera.co.jp/products/design-software/fpga-design/quartus-prime/download.html
ダウンロードページではオプションが選択できる、Quartus Prime(含むModelSim - Intel FPGA Edition (aka ModelSim - Altera))とCyclone V device supportだけをダウンロードすればよい。
Akamai DL3をインストールしていない場合は、こちらを先にインストールする - あとあと面倒が少なくてすむ。
ダウンロードが完了したら、Quartus Primeのインストーラを起動する、あとは勝手にすべて導入してくれる。

インストールが終わったら、Quartus Primeを起動、さっそく動作確認だ。
プロジェクトの作成方法はQuartus IIと一緒、こちらの通り進めればよい。
唯一違うのはターゲットデバイスの設定で、DE0-CVに搭載されているCyclone Vは"5CEBA4F23C7"だ。

Terasic DE0-CVはほぼDE0コンパチで、DE0で開発したVerilog HDLの資産はかなりが継承できる。
外見上の違いは7セグLEDが4個から6個に、ボタンが3個から4個+デバイスリセットに、SDスロットがマイクロSDスロットになったくらいだ。

スマートウォッチ(Ticwatch E)を購入 - 1年ぶり4回目

f:id:nobu_macsuzuki:20180216170058j:plain
わずか2か月でHuawei Watchと別れて、一年が経った。
Huawei Watchに関しては短い付き合いになると覚悟の上であったが、最初のmoto360も、Apple Watchも「コレジャナイ感」は半端なく、どうにも「スマートウォッチ」とは思えなかったのだ。
よっぽどスマート(笑)さのかけらのないGarmin Forerunner 225の方が、筆者には実用的スマートウォッチだ。
昨年の年末商戦前に出たIDCの予想以降も、IT業界ではスマートウォッチのオワコンぶりが変わりなく、いわゆるIT・ガジェット系のニュースで見ることは稀になってきた。
しかしマーケティング的には、ここにきて面白くなってきている。
フォッシルや、タグホイヤーモンブランなどの腕時計デザインブランドがコンスタントに新製品を出してきているのだ。
カシオも昨年Protekのラインにスマートウォッチを追加した。
しかも、タグホイヤーモンブランなどの「高級」ブランドやカシオのものを除くと、市場価格がほぼ$200前後で横並びだ、安くはない。


腕時計市場とはどんな市場なのだろうか。
この業界の方は大変親切で、こんな貴重な資料をネットでロハで公開してくれている。
http://www.jcwa.or.jp/images/estimate_graph.png

  • 全世界の腕時計の生産台数は年間14億台で、年間成長率がほぼ0
  • そのうち95%以上がクォーツ、つまりホームセンターなどでキュッパやイチキュッパで売っているあれ

こんな市場で在庫が山のように膨れ上がることは考えられないので、生産台数=出荷台数だろう、FIFOだ。
スマートウォッチの出荷台数が年間おおよそ2000万台、全世界腕時計の1%強となる。
よくいう「アーリーアダプター」というのは市場の+σテール、つまり16%。
つまりスマートウォッチを腕時計市場全体でみると、アーリーアダプターさえつかみ損ね、見事にChasmの谷に落ちたことになるのだ。
ちなみにスマホ(笑)の年間生産台数は20億台に届くほどで、台数規模としては腕時計に並ぶ。
IT業界からすれば、2匹目の>10億台市場への挑戦は見事に失敗に終わったわけだ。


ところが、これを腕時計市場のプレーヤーから見たらどうだろうか?
こちらこちらに腕時計市場の変遷を書かれている方がいるのだが、他の市場と同様に技術の水準化によるコモディティー化が一気に進んだ後に、「良質で安く手に入る大量生産品」と「差別化のすすんだ寡少な高級品」との市場のセグメント化が進んだのだ。
他の市場って何?という方は、車を見よう、PCを見よう。
どちらも年間出荷台数がおおよそ1億台の市場だが、見事なセグメント化が進んでいる。
腕時計のセグメントの規模に関する情報がないのだが、一般的なセオリー通りであれば+σテール、つまり16%がこの「差別化による高級品」の市場規模だろう。
だとすれば、スマートウォッチの1%強の腕時計市場への上積みは、差別化腕時計を作っている腕時計デザインブランドからすれば10%近い市場拡大に見えるはずだ。
新しいセグメント、売り上げ台数10%上積み、そりゃ、やるだろう、やるしかないだろう。
スマートウォッチのラインナップ化をやるだろう。
返ってこの市場の顧客からみたらどうだろうか?
このご時世に腕時計を買ってつける御仁は、価格はどうであれ与太郎だ。
スマートかそうでないかはともかく、気に入れば買うだろう。
自分の好きな腕時計デザインブランドが新作を出したら、たとえ10本目だろうが20本目だろうが買うだろう、与太郎だ。
そしてスマートかそうでないかは、気にとめないだろう。


ここが筆者も大きくつまづいていたところだ。
「スマートウォッチ」という言葉にとらわれすぎていて、何か特別な腕時計にできない「機能」を求めていたのだ。
そんなものは「垂直差別化」の終わった腕時計市場では、日本の時計メーカーがしのぎを削る「ソーラー腕時計」「電波腕時計」「GPS腕時計」と変わらないのだ。
なにもなくたって、ブランドインテマシーとフェイスリフトで物は売れるのだ。
ただ、その市場規模はIT業界のお気に召すものではなかっただけなのだ。


ちなみに筆者は高機能腕時計マンセーで、キナティックもソーラー式三波電波腕時計も所有している、別な意味で与太郎だ。
GPS腕時計ももう少し値ごろになったらぜひ購入したいと考えている。
全てクロノグラフ付だ。
こんな筆者ならスマートでないスマートウォッチを一本ぐらい持っていてもよいだろう。
ということで、4度目のお迎えをすることにした。

キャズム Ver.2 増補改訂版 新商品をブレイクさせる「超」マーケティング理論

キャズム Ver.2 増補改訂版 新商品をブレイクさせる「超」マーケティング理論

GPD Pocketがスリープさせて蓋を閉じると勝手に復帰してしまい、がんがんバッテリーを食ってお困りの貴兄に(解決編)

さて今まで、

と4度に渡って対策してきた、通称「スリープ死」問題。
しかし、それでも治らなかった筆者のGPD Pocket。
こいつは2台目で、一台目ではこんな不具合はなかったのに、なぜ?と思い、ハタと気が付いた。
nobu-macsuzuki.hatenablog.com
これ。
これのおかげで、キーボードやクリクリトラックパッドがディスプレイ側に当たり、USB HIDメッセージでGPD Pocketを起こしてしまうのを防いでいたのだ。
さっそく再度クッションをつけたところ、ぴたりとおさまった。
後で、上の変更も一つづつ戻してみよう。

GPD Pocketのホールセンサーをぬっころしてカバーを開いたときのアクションも無効にしたのに、スリープさせて蓋を閉じると勝手に復帰してしまい、がんがんバッテリーを食ってお困りの貴兄に

MSFTがアホやから、大事な設定をWindows Updateの度にどんどん隠す。

  • regeditを開き、"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Power\PowerSettings\2E601130-5351-4d9d-8E04-252966BAD054\C36F0EB4-2988-4a70-8EEE-0884FC2C2433"の"Attribute"を2に変更する
  • 再起動
  • "コントロールパネル" -> "電源の管理" -> "プラン設定の編集"を開き、"詳細な電源設定の変更"を選択
  • "アイドル回復性"の下に、"IO一体化のタイムアウト"が現れるので、バッテリー駆動を"60000"(ミリ秒)に変更する
  • 再起動

これでいろいろなIOの割り込みの衝突で、GPD Pocketがスリープから復帰したまま戻れなくなるのが防げる。


英語キーボードのキーマップのカスタマイズ(Windows編)

こちらでも触れたとおり、筆者はかつてのADBキーボードでの日本語入力の習慣を引きずった変なキー配置を使用している。
日本語キーボードなら

  • "無変換"キーと"全角/半角"キーを入れ替え
  • "Caps Lock"キーと左"Ctrl"キーを入れ替え

この利点は日本語<->英語入力の切り替えが左親指でできるので、英語日本語交じりの文章が爆速で打てるようになること、Controlキーを使うコピー・ペーストのショートカットが爆速になることだ。


英語キーボードを使用するようになってからは魔改造になり、こんなことになっている。
f:id:nobu_macsuzuki:20180205061138p:plain
これは以下のようにして実現している。

  • まず、通常のWindows英語キーボード同様にAXキーボード配列にして、左"ALT"キーで"全角/半角"キーが代用できるようにする。
  • HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layoutにバイナリ値"Scancode Map"を追加する
  • 追加した"Scancode Map"に以下のバイナリ列を入力する

f:id:nobu_macsuzuki:20180205061308p:plain
弊害として、左親指付近に"ALT"キーがなくなってしまう。
筆者は、ALTキーを使ったショートカットはエクセルの"ALT" -> "E" -> "S" -> "V"(テキストのみ保持で貼り付け)と、"ALT" -> "F" -> "V"(オートフィルター)ぐらいしか使わないので、この魔改造でもなんとかなっている。

英語キーボードのMacBookをBoot Campした時にのキーマップのカスタマイズ


"自己責任"、"「転んでも一人で起きる」"の意味がわからない方は、以下の記載の事柄は適用しないように、お願いいたします。

さて、こちらで説明した通り、筆者はどのキーボードでも"Caps Lock"キーと左"Ctrl"キーを入れ替えて使っている。
Windowsで日本語キーボードを使用していた時には、頻繁に使用する"全角/半角"キーを使えるようにするために、"無変換"キーと"全角/半角"キーを入れ替えていた。
これをすると、ほとんどファンクションキーを使わずに、半角英語交じりの日本語を早く打てるようになる。
さらに英語キーボードWindowsで使用しているときには、

  • AXキーボード配列にして、左"ALT"キーで"全角/半角"キーが代用できるようにしたうえで、
  • 右"ALT"キーと左"ALT"キーを入れ替える

これで英語キーボードでも、ほぼ日本語キーボードの"変換"キーのある位置で、日本語入力と英語入力の切り替えができるようになった。
・・・他の人が筆者のキーボードを使えなくなる魔改造だ。


さてMacBookBoot CampしてWindowsで使用すると、"Command"キーが"Windows"キーになる。
つまり、筆者が"全角/半角"キーとして使用したいところに、"Windows"キーがあるわけだ。
むむむむむ・・・
何とかこうしたい。
f:id:nobu_macsuzuki:20180205062825j:plain

  • まず、通常のWindows英語キーボード同様にAXキーボード配列にして、左"ALT"キーで"全角/半角"キーが代用できるようにする。
  • HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layoutにバイナリ値"Scancode Map"を追加する
  • 追加した"Scancode Map"に以下のバイナリ列を入力する

f:id:nobu_macsuzuki:20180204153406p:plain
・・・魔改造だ。