Tag: VerilogHDL

言語ごとの要点備忘録

つまみ食いが好きなので色々な言語を触ってちょっとだけコードを書く、みたいなことをいつもしているんですが、
たまに使おうとすると結構忘れていて同じ所で引っかかったりします。
復習すると忘れないだろうというのと、忘れた時に見返せる&書き足せるので、ブログにまとめることに。
なお、この記事は書いているうちになかのひとが疲れてしまったので書きかけです。


C++

まずここを引く癖をつけよう。 https://msdn.microsoft.com/ja-jp/library/dtefa218.aspx

static

・静的ローカル変数(関数内で定義) : 関数が呼ばれ終わっても残る。
・静的メンバ変数&関数(クラス内で定義) : クラスの全てのインスタンスで共有する変数,関数。クラス名::でアクセスする。インスタンスがなくても使える。また、静的メンバ関数からは静的メンバ変数にしかアクセス出来ない。
・静的グローバル変数(グローバルスコープで定義) : ファイルの中でしか使えなくなるグローバル変数。

auto

型推論。関数内でしか使えない。

継承

class Female : (アクセス修飾子) Human {};
アクセス修飾子はpublic, protected(自身と派生クラスからアクセス), public

virtual

抽象クラスを作りたいときに。virtualをつけると仮想関数になる。
class Humanを継承したclass Femaleと class Male のインスタンスをHuman型の配列に入れて、それぞれ継承したメソッドgrowup()を順番に呼びたい時とする。
virtualしないとHumanのgrowup()を読んでしまうが、virtualしておけばそれぞれのメソッドを呼びに行ってくれる。

条件コンパイル

ヘッダに書いて宣言が重複するのを防ぐ。

#ifndef HOGEHOGE 
#define HOGEHOGE 
(header source code) 
#endif

オーバーロードとオーバーライド

オーバーロード : 同じ名前だが引数の型が違う関数 を 複数定義

オーバーライド : 同じ名前で引数の型も同じ関数 を 上書き定義

ラムダ式

[](){}(); 引数:()は省略可能

http://kaworu.jpn.org/cpp/%E3%83%A9%E3%83%A0%E3%83%80%E5%BC%8F

参照クラス

C++/CXのみで使う。参照クラスはWindows Runtimeによって管理される(GCの対象になる)。参照カウンタを使って自動的にデストラクタが呼ばれるのでべんり

宣言 : ref

インスタンス化 : ref new

ポインタ : ^(キャレット、ハンドル) ポインタと同様に使えるがポインタではない。

リングバッファ

STL::dequeでもいいけど、ビットマスクを使うとスマートにかける。


Ruby

ここを引け http://miyamae.github.io/rubydoc-ja/

ruby、便利だが覚えることが多くて書くたび忘れるのでこれからはpythonを使うようにしたい

i++ みたいなインクリメントはできない

毎回確実にハマる

Math

requireしなくても含まれてる

コメントアウト

#か=begin =end

 


Python

勉強中。

ディレクトリ

import os 
os.listdir

標準入出力

import subprocess 
subprocess.call(cmd,shell=True)

コメントアウト

# 複数行は””” ””” だが文字列として扱っているだけで公式な方法ではない

 


js

prototype

var classname = function(arg1) { 
this.arg1 = arg1 
}

classname.prototype =  { 
method1 : function(){}, 
method2 : function(){} 
}

 


Max on js

I/O port

入力ポートの数 : inlets

出力ポートの数 : outlets

I/O

inlet : にどのポートからの入力か(0~)

augument : 実際に来た値。packされてる場合添字アクセスで取り出せる。

msg_int() とかであれば引数に変数名を指定してその名前で使える。

 


Verilog

まだ忘れていないことが多いのでこの項目はありません。

 


git

.gitignore

ホワイトリスト方式で!を使って書く時の注意。

!で無視を取り消すファイルはgitignoreから見える場所にある必要がある。一度無視してしまったフォルダの中身はgitignoreから見えないので、まず①無視してしまったフォルダをホワイトリストに入れる②フォルダの下を全て無視に加える③無視したくないファイルのみを!で否定する のようにする。

/* 
/.* 
!/dir/ 
/dir/* 
!/dir/hoge.txt

 


VBA+Excel

なんでVBなんで書かないといけないんだろう。でもExcelのゴミみたいなグラフ描画機能をなんとかするためには

使わないといけないこともある。前回手探りで書いたけど全然わからない。

よくわからないメソッドがたくさんあるのでデバッグモードでオブジェクトを調べながら書くと良い。

条件分岐

If 条件式 Then 
ElseIf 条件式 Then 
Else 
End If

関数

Sub hoge() 
End Sub

変数

Dim 変数名 As 型 型は省略可能

with

一時的なnamespaceを作っているような感じ…? Withの中では主語(対象)を省略して書ける。

With 対象 
.メソッド 
End With

シート中の要素へのアクセス

AciveSheet, ChartObjects, Chart, とか、

Interior とか、

全ての要素にアクセス?

SeriesCollection

複数のパラメータ

まだよくわかっていないのだけど、グラフの色を決定するプロパティが二つあったりしてややこしい。

どちらが優先されるのかもよくわからない。

色の要素を持つ別々のオブジェクトを継承していたりして、Interior.ColorでもLineナンチャラ.Colorみたいなのでも色が設定できたりする。わけがわからない。

コメントアウト



DOSコマンド

バッチファイルなんて書きたくない、シェルスクリプトを書かせろ

ラベルとgoto

:START 
(処理) 
PAUSE 
GOTO START

 

 


実際、いろいろ書いていると頭がこんがらがってくるので書く言語を絞ったほうが良いのかもしれない。

仕事でやってるわけでもないので継続的に一つの言語扱うのは稀だし、ぱーっと書いてぱーっと忘れる……

Verilogの演算ルール、文法まとめ

(この記事は書きかけです。書き終わるまで参考にしないでください)

 

最近、HDLを勉強していて、1年くらいの勉強の成果としてFPGAでシンセ制作にチャレンジしています。

ソフトウェア言語の場合、計算をするときにいちいち値の範囲とかは考えませんが、verilogだと全ての変数(レジスタ)と途中の式についてunsignedなのかsignedなのか、ビット幅はどれくらいなのか、を決めて、そして把握して書いていかないと容易に意図しない計算結果を出してしまいます。あわわ。

毎回混乱するので、今回はverilogHDL(2001)の計算の時のルールを自分用メモとしてまとめました。
なおLHSはLeft Hand Sideの略で、式の左側(代入される側)を指します。RHSも同様に式の右側。

 

参考にしたサイト

デジタル・デザイン・ノート デジタル回路を設計する際に考慮すべきポイントがとてもわかりやすくまとまってる良サイト。

Verilogチュートリアル Veritakの開発者のページ。Veriogの文法仕様について詳しく乗っています。一読すべき。

 

符号と評価の基本

次のように評価します。

  1. 式の評価前にLHSとRHSの中で最大のビット幅のものを探す。これが計算時のビット幅になる。
  2. RHSが全てsignedの場合、符号付きで計算する。一つでもunsignedを含む場合、符号なしで計算する。
  3. RHSでの演算結果をLHSに代入する。乗算などでRHSのビット幅がLHSを超えている場合はMSB側を切り捨てて代入する。

算術シフト(>>>)

  • unsigned : 論理シフト(>>)になる。ゼロ拡張される。(上位ビットは0で埋まる)
  • signed : 算術シフト(>>>)になり、符号拡張される。(上位ビットはMSBの符号で埋まる)
  • LHS(Left Hand Side = 式の左側)には依存しない。
  • シフト後もビット幅は変わらない。
  • <<<は<<と同じ。同様にビット幅は変わらない(シフト後も幅拡張はされない)。

 

パートセレクト(hoge[3:0]),連接演算({a,b})

unsignedになる! signedで計算したい時、これを気にしてないととんでもないことになる。

  • 解決方法1 : 自動の幅拡張が起こらないよう、LHSとRHSのビット幅を揃えておく。
  • 解決方法2 : $signed()をつかってキャストする。

 

デシマル表現(単なる1とか、0とか)

signedになる。幅指定していないので、幅はverilogのルールに則り32bitだと解釈される。
ちなみにマイナスを付ける場合は -2’b1 みたいに書く。

 

演算いろいろ

計算後に確保しておきたいビット幅

  • 足し算 : 大きい方のビット幅+1
  • 乗算 : 両方のビット幅を足したもの

こういうのってQiitaとかにpostしたほうがいいんかな…?