2013/02/16

7SEG表示のためのBCD変換

花粉が飛んでますので引き籠り^^;  で、仕事は進みますねT_T
今日は、2進数カウンタ(ハードウェアでいう普通のカウンタですが)でエラーカウントした結果を周期的に7SEG-LED(7セグ)に10進数で表示するにはどうするか? です。
例えば、10(dec)は2進数で"1010b"で7SEGでは"Ah"でも良いのですが、10進数の"10d"と表示したいということです。

本当は元のデータは32bit(0~4,294,967,296)の表示が必要なのですが、規模が大きそうなのでとりあえず16bit(0~65,535)で作ります。
2進数16bitだと、7SEG-LEDに表示するには5個(5桁→0~65535)のLEDがあれば良いですね。1の位から万の位まで5桁なので。ちなみに16進数表示だと4個(0000~FFFF)の7SEG-LEDでOK。
※ 32bitだと10個必要ですが10個とかの7SEGはあまり無いので浮動小数点表示とかで・・考えるの大変なのでやめた。これはNiosIIとかのソフトウェアに任せた方が良さそう。


(1) 仕様
  (a) 入力は2進数16bitの符号なしとする(10進:0~65,535、16進:0000~FFFF)
  他には無いか・・


(2) RTL
verilogで設計してみました。(FlipFlop出力信号にsr_を付けてますが気にしなくてOKです)
//-----------------------------------------------------------------------------
// Title         : bin2dec
// Project       : none
//-----------------------------------------------------------------------------
// File          : bin2dec.v
// Author        : shio
// Created       : 2013/02/16
// Last modified : 2013/02/16
//-----------------------------------------------------------------------------
// Description   : 16bit(16進数4桁)のバイナリ値を10進数5桁の値に変換する
//                 16bitカウント値を10進数にして7SEG-LEDに表示するためのBCD変換
// 
//-----------------------------------------------------------------------------
// Copyright (c) 2013 by shio This model is the confidential and
// proprietary property of shio and the possession or use of this
// file requires a written license from shio.
//------------------------------------------------------------------------------
// Modification history :
// 2013/02/16 shio     created
//-----------------------------------------------------------------------------
module bin2dec
  (/*AUTOARG*/
  // Outputs
  DIGIT5, DIGIT4, DIGIT3, DIGIT2, DIGIT1, DIGITS,
  // Inputs
  CLK, XRST, LOAD, BINDT
  );

  // Ports
  input         CLK   ; // clock
  input         XRST  ; // reset
  input         LOAD  ; // ロード
  input  [15:0] BINDT ; // バイナリデータ(変換元)
  output  [3:0] DIGIT5; // セグメント5(万の位)
  output  [3:0] DIGIT4; // セグメント4(千の位)
  output  [3:0] DIGIT3; // セグメント3(百の位)
  output  [3:0] DIGIT2; // セグメント2(十の位)
  output  [3:0] DIGIT1; // セグメント1(一の位)
  output [19:0] DIGITS; // セグメント5..1(見やすいようにマージ)

  // Signals
  reg  [15:0] sr_bindt ;
  reg   [3:0] sr_digit5;
  reg   [3:0] sr_digit4;
  reg   [3:0] sr_digit3;
  reg   [3:0] sr_digit2;
  reg   [3:0] sr_digit1;
  reg         sr_end   ; // 変換が終了したことを示すフラグ
  reg  [19:0] sr_digits;

  // 各位毎に減算の繰返し
  always @(negedge XRST or posedge CLK)begin
    if(!XRST)begin
      sr_bindt   <= {16{1'b0}};
      sr_digit5  <= {4{1'b0}};
      sr_digit4  <= {4{1'b0}};
      sr_digit3  <= {4{1'b0}};
      sr_digit2  <= {4{1'b0}};
      sr_digit1  <= {4{1'b0}};
      sr_end     <= 1'b0;
    end
    else begin
      if(LOAD==1'b1)begin
        sr_bindt   <= BINDT;
        sr_digit5  <= {4{1'b0}};
        sr_digit4  <= {4{1'b0}};
        sr_digit3  <= {4{1'b0}};
        sr_digit2  <= {4{1'b0}};
        sr_digit1  <= {4{1'b0}};
        sr_end     <= 1'b0;
      end
      else if(sr_bindt>=16'd10000)begin
        sr_bindt  <= sr_bindt - 16'd10000;
        sr_digit5 <= sr_digit5 + 1'b1;
      end
      else if(sr_bindt>=16'd1000)begin
        sr_bindt  <= sr_bindt - 16'd1000;
        sr_digit4 <= sr_digit4 + 1'b1;
      end
      else if(sr_bindt>=16'd100)begin
        sr_bindt  <= sr_bindt - 16'd100;
        sr_digit3 <= sr_digit3 + 1'b1;
      end
      else if(sr_bindt>=16'd10)begin
        sr_bindt  <= sr_bindt - 16'd10;
        sr_digit2 <= sr_digit2 + 1'b1;
      end
      //else if(sr_bindt>=16'd1)begin
      //  sr_bindt  <= sr_bindt - 16'd1;
      //  sr_digit1 <= sr_digit1 + 1'b1;
      //end
      // 1の位は直接代入して終了信号を生成
      else begin
        sr_digit1 <= sr_bindt;
        sr_end    <= 1'b1;
      end
    end
  end

  // 終了信号でラッチ
  always @(negedge XRST or posedge CLK)begin
    if(!XRST)begin
      sr_digits = {20{1'b0}};
    end
    else begin
      if(sr_end==1'b1)begin
        sr_digits = {sr_digit5,sr_digit4,sr_digit3,sr_digit2,sr_digit1};
      end
    end
  end
    
  // 端子出力
  assign DIGIT5 = sr_digit5;
  assign DIGIT4 = sr_digit4;
  assign DIGIT3 = sr_digit3;
  assign DIGIT2 = sr_digit2;
  assign DIGIT1 = sr_digit1;
  assign DIGITS = sr_digits;

endmodule


(3) シミュレーション
テストベンチは以下の通り。ModelSim ALTERA STARTER EDITION 10.0c で確認。
//-----------------------------------------------------------------------------
// Title         : bin2dec
// Project       : none
//-----------------------------------------------------------------------------
// File          : tb_top.sv
// Author        : shio
// Created       : 16.02.2013
// Last modified : 16.02.2013
//-----------------------------------------------------------------------------
// Description   : 
// 
//-----------------------------------------------------------------------------
// Copyright (c) 2013 by shio This model is the confidential and
// proprietary property of shio and the possession or use of this
// file requires a written license from shio.
//------------------------------------------------------------------------------
// Modification history :
// 16.02.2013 : created
//-----------------------------------------------------------------------------
`timescale 1ps/1ps

module tb_top;
  
  //--------------------------------------------------------------------------------
  // 定数宣言
  //--------------------------------------------------------------------------------
  parameter  C_CYC_CLK  =  10.000ns;        // クロック(100MHz)
  parameter  C_RST_TIME = 105.000ns;        // リセット時間
  
  
  //--------------------------------------------------------------------------------
  // シグナル宣言
  //--------------------------------------------------------------------------------
  // クロックとリセットの生成
  bit          s_CLK  ;
  bit          s_XRST ;
  bit          LOAD   ;
  bit   [15:0] BINDT  ;
  logic  [3:0] DIGIT5 ;
  logic  [3:0] DIGIT4 ;
  logic  [3:0] DIGIT3 ;
  logic  [3:0] DIGIT2 ;
  logic  [3:0] DIGIT1 ;
  logic [19:0] DIGITS ;


  //--------------------------------------------------------------------------------
  // クロックとリセットの生成
  //--------------------------------------------------------------------------------
  // マスタクロック(初期値+OFFSET+繰り返し)
  initial begin 
    s_CLK = 0;
    forever #(C_CYC_CLK/2) s_CLK = ~s_CLK;
  end
  
  // リセット(fork~joinで並列処理)
  initial
    fork
      #0          s_XRST = 0;
      #C_RST_TIME s_XRST = 1;
    join
  
  
  //--------------------------------------------------------------------------------
  // タスク
  //--------------------------------------------------------------------------------


  //--------------------------------------------------------------------------------
  // 外部端子設定
  //--------------------------------------------------------------------------------
  initial begin
    // リセット解除待ち
    repeat(20) @(posedge s_CLK);

    // message
   $display("");
    $display("****************************************");
    $display("* test                                 *");
    $display("****************************************");

    // 1st-BINDT
    $display("1st-BINDT");
    BINDT = 65535;
    repeat(2) @(posedge s_CLK);
    #(1ns); LOAD = 1;
    #(C_CYC_CLK);LOAD = 0;
    repeat(40) @(posedge s_CLK);

    // 2nd-BINDT
    $display("2nd-BINDT");
    BINDT = 0;
    repeat(2) @(posedge s_CLK);
    #(1ns); LOAD = 1;
    #(C_CYC_CLK);LOAD = 0;
    repeat(10) @(posedge s_CLK);

    // 3rd-BINDT
    $display("3rd-BINDT");
    BINDT = 64999;
    repeat(2) @(posedge s_CLK);
    #(1ns); LOAD = 1;
    #(C_CYC_CLK);LOAD = 0;
    repeat(40) @(posedge s_CLK);

    // 4th-BINDT
    $display("4th-BINDT");
    BINDT = 10;
    repeat(2) @(posedge s_CLK);
    #(1ns); LOAD = 1;
    #(C_CYC_CLK);LOAD = 0;
    repeat(10) @(posedge s_CLK);

    // 5th-BINDT
    $display("5th-BINDT");
    BINDT = 100;
    repeat(2) @(posedge s_CLK);
    #(1ns); LOAD = 1;
    #(C_CYC_CLK);LOAD = 0;
    repeat(10) @(posedge s_CLK);

    // 6th-BINDT
    $display("6th-BINDT");
    BINDT = 10000;
    repeat(2) @(posedge s_CLK);
    #(1ns); LOAD = 1;
    #(C_CYC_CLK);LOAD = 0;
    repeat(10) @(posedge s_CLK);

   // sim終了
    repeat(10) @(posedge s_CLK);
   $display("### Simulation end ###");
    $finish;
  end


  //--------------------------------------------------------------------------------
  // インスタンス
  //--------------------------------------------------------------------------------
  //----------------------------------------
  // DUTs
  //----------------------------------------
  bin2dec u_bin2dec
    (
     .CLK  ( s_CLK  ),
     .XRST ( s_XRST ),
     .*
     );
  
endmodule
シミュレーション結果です。
LOAD=1でBINDT[15:0]をロード。その後、万の位から順に1CLK毎に処理される。
1の位は直接代入で良く、1CLKで処理終わり、ついでに終了フラグsr_endを生成。
20bitのBCDデータとしてはsr_endでラッチ。(これは要らないと思うけど一応見やすいので)

注) バス信号でtb_top/BINDT[15:0]とDIGITS[19:0]はHex表示、それ以外はunsigned(符号無し10進)表示にしています。sr_digit5~1の見ない部分は0,1,2.. とインクリメントしています。

レイテンシが入力する値により変わるので、最大の遅延を考慮して固定遅延後にラッチしてもいいかもしれませんね。そもそも7SEGを点灯する程度の速度ならラッチも不要か・・。
7SEGは1個当り100us~1ms程度で周期的に点灯させれば良いのかな? (10ms周期だと人間の目にはちらついて見えないようなので)

レイテンシは、万の位+千の位+百の位+十の位となる。
65535の場合は6+5+5+3=19CLK。0だと1CLK。10,100,1000,10000は2CLK。
最大は、64999で28CLKなので、30CLK後にラッチしても良いのかな~。


(3) その他

方法は他にもあって、減算を除算+余りで作ればレイテンシは最大5CLKとかになりますね・・。
また、0~BINDTまで回るカウンタを回し、10,100,1000,10000のイネーブルを作成、各位毎にカウントアップさせる方法もあります。最大65535CLKもかかるけど。

16bitくらいならレイテンシも回路規模も大したことない感じ。
32bitでは、レイテンシは69CLKくらいですが回路規模が大きいのかな?
大きなFPGAなら大丈夫かも。DE0-Nanoでインプリしても良いのですが・・そのうちということで^^;

2013/02/10

Excelのフーリエ変換を使う

FPGAでフーリエ変換をする必要が出来たのだが、そもそもフーリエ変換が良くわかっていないので勉強してみました。
簡単にいうと、時間領域の信号(たとえばsin波)を周波数領域に変換することなのですが、そもそも勉強家じゃないとピンと来ない・・^^;
ググると色々出てきますが、まずは自分で解析して結果を見てみたいということで、Excelのアドイン機能の分析ツールを使えばフーリエ解析(FFT)が出来るようです。

(1) Excelのフーリエ変換を使用できるようにする
まず、Excelに分析ツールをアドインします。(Excel2010)


Excelを開き、「オプション」 → 「アドイン」 → 「設定」 をクリックすると、以下のウィンドウが表示


分析ツール(VBAってのもあったが両方チェックした)をチェックしてOK


Excelの「データ」タブに「分析」が追加される。これで準備完了。


(2) 分析したいデータを作成する
ここは何を測定したいかで全然変わるので難しいのですが、まずは簡単な例で作成してみます。パラメータは、
  被測定周波数        :5MHz (5MHzのサイン波に3次の波を加えて少し矩形波っぽくしたもの)
  サンプリング周波数:100MHz
  FFTポイント数        :128 (Excelで解析する場合2のべき乗であある必要がある)

上記パラメータですが、一般的にはまず被測定周波数が決まっており、それを何MHzでサンプリングし、FFTを掛けるかを設計すると思います。自分はサンプリング周波数を100MHzとしました。
分析出来る最大周波数はこのサンプリング周波数で自動的に決まります。それはナイキスト周波数と呼ばれ、サンプリング周波数の1/2で50MHzとなります。50MHzにしたのは、5MHzを矩形波と仮定した場合、その周波数成分は、5MHzの3次,5次,7次,9次・・の周波数成分の合成となるのですが、まぁ9次(5MHz×9=45MHz)くらいまで捉えられればいいやという仕様です。

次にFFTポイント数ですが、これはFFT分解能に関わってきます。「サンプリング周波数100MHz」/「FFTポイント数128」=781,250Hz 。これは、FFT結果の1ステップの周波数に相当、つまり、周波数解析できる分解能になります。この分解能が粗いと感じたらFFTポイント数を増やす必要があります。1024とか4096とかの方がいいのかな。(Excelだと4096とかだと2分くらい時間がかかるので128にしました)
ちなみに、100MHzで128サンプリングすると10ns×128=1.28usになります。5MHzは200usなので1.28us/200ns=6.4 で6.4個の5MHzをサンプリングすることになります。

Excelで被測定周波数を作成します。
矩形波っぽくするために、4/π*sin(2πft)+sin(2πft)/3 (合ってるのかな?) で5MHzのsin波に15MHz(3次)の高調波成分を合成して作成しました。Excelで波形を散布図で見るとちょっと粗いけど・・まぁいいや。



(3) FFT してみる
「データ」→「データ分析」をクリックすると、分析ルールのウィンドウがポップアップ。
「フーリエ解析」を選択しOK。さらに、フーリエ解析する範囲を聞かれる。出力先は指定しないと、デフォルトで別シートになってしまうため指定する。


FFT解析に数秒かかる。(4096とかだと数分かかるが辛抱強く待つ)
FFT結果は、複素数形式( a + bi )で出力される。a=実部、b=虚部 となる。複素数はここでは説明しない(出来ない^^;)が、出力パワーを知るには絶対値を求めれば良い。
複素数の絶対値を取るのに便利な関数が用意されている。IMABS() でサクッと絶対値を取る。


(4) FFT結果をグラフで表示する
128ポイント全ての結果をグラグ化すると以下の通り。
フーリエ解析のポイントが2点あります。
1点目は、128ポイントの後半64ポイントはミラー化されているだけなので基本的には使用しない領域。(ナイキスト周波数50MHzを超える部分)
2点目は、先頭データはDC成分が見えるため、これも基本的には使用しない。
(このサンプルはDC成分が無いため見えていないが、DC成分が多いと0番目の絶対値が大きすぎで、被測定周波数成分が立っていないように見えますがそんなことは無い。注意が必要)
※こういう時は、10*LOG(IMABS(),10)とすればdB表示になり、DC成分含め見やすくなるので、dB表示にした方が見やすいこともありますね・・

横軸を分解能の周波数に変更すれば、フーリエ変換結果の周波数成分が分かる(下のグラフ)
【解析1】 前半と後半は対象となっている
【解析2】 5MHzと15MHzの成分が検出されているのが分かる(5次以降は無い)
【解析3】 ちょっと粗いかな(FFTポイントを多くすれば解像度も上がりピークも滑らかになりそう)
【解析4】 縦軸は絶対値だが10log10(*)でdB表示するともう少し滑らかになる・・

以上、、
サンプリング周波数は10MHzでは上手く行きませんが、15MHzだと解像度も上がり5MHzのピークは良く見えますね。また、25MHzだと解像度も上がるし15MHzもちゃんと解析できますので、このパラメータの例だと25MHzサンプルくらいが良い感じです。
ナイキスト周波数と分解能の関係、FPGAリソースに応じてFFTサンプル周波数とサンプルポイント数を決めるのが良さそうです。

おわり。(日曜なのに仕事した気分です^^)

2013/02/02

ブログ書くために・・

あとやりたいことは、画像挿入(サムネイルサイズを指定)と、表かな。

(1) 画像挿入
挿入はやってみればすぐに分かるはず。


画像は、まずアップロードし、表示を 小・中・大・特大・元画像 から選べる、これは便利。
あと、Bloggerでは画像の右に回り込むことしか出来ないようで、画像挿入直後に、
<div style="clear: both;"></div>
という、タグを入れることで回り込みを解除できるらしい・・。

(2) 表
これは、ググらないと分からないなぁ。
単純に書く。普通にHTML編集でHTLMタグで描く。

アルテラXilinx
ツールQuartusIIISE
デバイスStratixVertex

書式を指定して書く。
【テーブル】
アルテラXilinx
ツールQuartusIIISE
デバイスStratixVertex

そこそこ面倒^^;
Google docs の spread sheetで作成してHTMLをコピペする方法もあるようだが、spread sheetの表をHTM表示することが出来ない。(セーブは出来たが、ヘッダ部分を全部コピーするのは良くなさそう・・)

2013/01/30

Emacs Tips


ハードウェア言語(Verilog,VHDL)を書くテキストエディタとしてEmacsを良く使う。
別に秀丸くんでも良いのだが、Linux OSで編集する場合も良くあるので昔からEmacsだ。
また、入力支援(verilogmode.elやVHDLはEmacsデフォルトで持つ)があり、もう離れられない。
最近はWindows 7(自分は32bit)上で普通にEmacs24.1がインストール出来るのでWindowsでも使える。(Mule for winやMeadowのころから使えていたのだが)
Windowsで使う場合は同時にMinGWなどのUnix計コマンドが使えるターミナルも一緒にインストールしておくと便利。

但し、Lisp言語が分からないので、カスタマイズには苦しむ。
特に、自動インデントやタブ辺りが未だに思い通りにならないのだが、、
まぁ、大半のエンジニアはググって真似しての繰り返し・・だと思います^^;

ちなみに、Windws環境では ESC- を Alt で代用出来る。(そもそも最近は ESCキーを使ったことない)
例えば、goto-lineコマンド M-g は Alt-g となる。(Altキーを押しながら g を押す)
注意するのは、M-% などで、% はシフトキーが必要なので、AltとShiftを押しながら5キー(シフトで%)を押す。当たり前ですが。

Emacsはとにかくショートカットキーが多く、忘れた場合などはヘルプでキーとコマンドの対応を確認出来る。

Help (このヘルプは情報量が多すぎてこれまた大変^^)
C-h ? ヘルプ
C-h b キーバインド表示(自分でバインドしたものも表示される)


これがあるからEmacsから離れられない一つにディレクトリエディタがある。
C-x d
  C    dired-do-copy
  ^    dired-up-directory
  d    dired-flag-file-deletion
  q    quit-window
  u    dired-unmark
  v    dired-view-file
  ~    dired-flag-backup-files


あとは、良く使うキーをさらっとメモしておくことにしよう・・(とても全部は書けないので)

■カーソル移動
C-a        move-beginning-of-line
C-e        move-end-of-line
M-b        backward-word
M-c        capitalize-word

C-v        scroll-up-command
M-v        scroll-down-command

M-<        beginning-of-buffer
M->        end-of-buffer

■矩形処理(まだ他にいっぱいあります)
C-x r k    kill-rectangle
C-x r y    yank-rectangle
C-x r c    clear-rectangle (空白にする)
C-x r o    open-rectangle  (空白を挿入)

■置換
M-%        query-replace
  → 対話形式になって、y,nで置換をするしない
     . で置換して終了
     ! で以降全てを置換 など

■キーボードマクロ
C-x (      kmacro-start-macro
C-x )      kmacro-end-macro

■繰り返し
C-u 80 -   universal-argument(80個の - で線を引く)

■ウィンドウ分割
C-x 0      delete-window
C-x 1      delete-other-windows
C-x 2      split-window-below
C-x 3      split-window-right
C-x 5 0    delete-frame
C-x 5 1    delete-other-frames
C-x 5 2    make-frame-command


ちなみに .emacs.d/init.el に追加したキーバインドは以下の通り
~~~~~~~~~~
・F9で行番号を左横に表示

  (global-set-key [f9] 'linum-mode)

・M-g で指定行へ移動

  (global-set-key "\M-g" 'goto-line)

・キーボードマクロ呼び出し (Shift+7キーで繰り返し実行)

  (global-set-key [?\C-'] 'call-last-kbd-macro)

・C-, と C-. を画面の1行スクロールにバインドする

  (global-set-key [?\C-,] 'scroll-up-one-line)
  (defun scroll-up-one-line () (interactive) (scroll-up 1))
  (global-set-key [?\C-.] 'scroll-down-one-line)
  (defun scroll-down-one-line () (interactive) (scroll-down 1))

・C-iでリージョンインデント

  (global-set-key "\C-i" 'indent-region)
~~~~~~~~~~


あと、Emacs環境設定ファイル init.el ファイルはこんな感じ(emacs24.1用)
;; 初期フレームの設定(コメントアウトすればデフォルト設定)
(setq default-frame-alist
      (append (list '(foreground-color . "black")
;           '(background-color . "lightgray")
            '(border-color . "black")
            '(mouse-color . "white")
            '(cursor-color . "black")
            '(width . 115)
            '(height . 56)
            '(top . 10)
            '(left . 100))
          default-frame-alist))

;;; ***************************************
;;;  使用言語のカスタマイズ
;;; ***************************************
;; タブではなくスペースを使う
(setq-default indent-tabs-mode nil)
(setq indent-line-function 'indent-relative-maybe)
;;インデント幅
(setq c-basic-offset 2)
;; タブ幅を 2 に設定
(setq-default tab-width 2)

;; Cの字下げ
(add-hook 'c-mode-common-hook
          '(lambda () (c-set-style "GNU") (setq c-basic-offset 4)))


;;; verilog modeの設定(VHDLやCはデフォルトでハイライトするためverilogのみ追加)
;; ダウンロード( http://www.verilog.com/ )した verilog-mode.el を Meadow\site-lisp にコピーする
(autoload 'verilog-mode "verilog-mode" "Verilog mode" t )
(setq auto-mode-alist (cons  '("\\.v\\'" . verilog-mode) auto-mode-alist))
(setq auto-mode-alist (cons  '("\\.sv\\'" . verilog-mode) auto-mode-alist))
;; User customization for Verilog mode
(setq verilog-indent-level             2
      verilog-indent-level-module      2
      verilog-indent-level-declaration 2
      verilog-indent-level-behavioral  2
      verilog-indent-level-directive   2
      verilog-case-indent              2
      verilog-auto-newline             nil
      verilog-auto-indent-on-newline   nil
      verilog-tab-always-indent        t
      verilog-auto-endcomments         nil
      verilog-minimum-comment-distance 40
      verilog-indent-begin-after-if    t
      verilog-auto-lineup              '(case declaration))

;;; 自分のローカル Lisp ファイルを読み込む
(setq load-path (append' ("~/.elisp") load-path))

;; ツールバーを表示しない
(tool-bar-mode 0)

;;; 対応する括弧をハイライトする
(show-paren-mode t)

;;; カラム番号表示
(column-number-mode t)

;; 行番号を左横に表示(F9でトグルをキーバインドに追加)
(global-linum-mode 1)

;;; カーソルが画面から出たときにスクロールするステップ
(setq scroll-step 1)
 
;;; マウスホイールで3行スクロール(デフォルトで5行くらいなので小くする)
(defun scroll-down-with-lines () "" (interactive) (scroll-down 3))
(defun scroll-up-with-lines () "" (interactive) (scroll-up 3))
(global-set-key [wheel-up] 'scroll-down-with-lines)
(global-set-key [wheel-down] 'scroll-up-with-lines)

;;; モード行フォントを変える
;(set-face-font 'modeline "MS 明朝-12")

;;; @ 配色
; モードライン
(set-face-foreground  'modeline "White"  )
(set-face-background  'modeline "Black")
; 非アクティブ モードライン
(set-face-foreground  'mode-line-inactive "White")
(set-face-background  'mode-line-inactive "gray40")


;;; キーバインド
;; F9で行番号を左横に表示
(global-set-key [f9] 'linum-mode)
; M-g で指定行へ移動
(global-set-key "\M-g" 'goto-line)
; キーボードマクロ呼び出し(F3->***->F4,以降F4 に割り当てられているようだ)
(global-set-key [?\C-'] 'call-last-kbd-macro)
; C-, と C-. を画面の一行スクロールにバインドする
(global-set-key [?\C-,] 'scroll-up-one-line)
(defun scroll-up-one-line () (interactive) (scroll-up 1))
(global-set-key [?\C-.] 'scroll-down-one-line)
(defun scroll-down-one-line () (interactive) (scroll-down 1))
; C-iでリージョンインデント
(global-set-key "\C-i" 'indent-region)


;;; ***************************************
;;;  以下、Save Optionで自動追加
;;; ***************************************
(custom-set-faces
 ;; custom-set-faces was added by Custom.
 ;; If you edit it by hand, you could mess it up, so be careful.
 ;; Your init file should contain only one such instance.
 ;; If there is more than one, they won't work right.
 '(default ((t (:family "Courier New" :foundry "outline" :slant normal :weight normal :height 90 :width normal)))))
(custom-set-variables)

2013/01/29

ソースコードのハイライト

福岡市に住むハードウェアエンジニアです。
FPGAやらの備忘録を書こうと思うのだが、どのブログにしていいか分からず・・Bloggerにて開始。

まずやりたいことは、ソースコードをハイライトさせる。
ググってみると SyntaxHighlighter というのを利用するらしい。早速やってみる。

↓サイト
SyntaxHighlighter
↓ジェネレータ
syntax-highlighter-scripts-generator

管理画面の、"テンプレート" → "HTMLの編集" にて、ジェネレートしたテキストファイルを </head> の直前に張り付ける。
自分はThemeをEmacsにしてみた。(背景が黒)










あとは、HTMLの編集エディタで <pre> タグで囲めばOK
<pre class="brush: cpp;" title="">
  // コード(HTMタグ無しで)
</pre>
※コードの挿入は最後にした方が良いらしい・・
↓言語の指定
Bundled Brushes
言語は html,cpp,text など
classの " " 内には以下で、修飾できる。
  first-line: 10;    :開始行  ← 最終行指定が不明
  highlight: [,];     :強調
   collapse: true; :折り畳み(タイトルのみ表示)

#include "sys/alt_stdio.h"
int main()
{ 
  alt_putstr("Hello from Nios II!\n");
  /* Event loop never exits. */
  while (1);
  return 0;
}
こんな感じ。

★参考にさせて頂いたブロガーさん、素晴らしいです!
DevAchieve さん