ぱたへね

はてなダイアリーはrustの色分けができないのでこっちに来た

2008-01-01から1年間の記事一覧

ファイルのオープンとクローズの関数

いつもコピペでテストベンチを書いていたので、いまさらながら調べてみました。 $fopen 書式:$fopen("file_name", file_type) ファイルを開く。32bitのmultichannel descriptor か32bitのfile descriptorを返すので、integerで受け取る。32bitのMSBは予約さ…

ピン間n本の話

PCB

基板工場やアートワークの会社と話をするときに出てくるピン間n本というのは、状況によって意味が変わる。 デフォルトでは2.54mmピッチDIPのピン間に何本通すかという数字だが、BGA直下等、一番ピッチの狭いところで何本通すかという意味で使われる事も多い…

加算器を作ろう 最後の高速化

最初に決めた条件をはずせるなら、さらに高速になる可能性があります。 FPGAを変える まずオプションよりも何よりも一番効くのが「最速のデバイスにする」事です。アルゴリズムによる最適化を図る前に、最速のPCを買ってくるやり方です。現在入手可能な最速…

加算器を作ろう 手でチューニングしてみた。

「lpm_add_subを使っていれば問題無い」が結論なのですが、悔しいのでさらにチューニングしてみました。Fmaxを上げる事だけを考えているので実用的ではありません。手間暇かければ速くなるという例です。 回路の方針 32bitずつで加算を行い、各クロックでキ…

加算器を作ろう carry select adderによる加算

http://d.hatena.ne.jp/natsutan/20081121の続きです。前回はlpm_add_subを使用しましたが、手動で高速化を図ってみましょう。今回はcarry select adderと呼ばれる手法を用いました。carry select adderとは上位の加算をキャリー有り、キャリー無しの両方で…

加算器を作ろう lpm_add_subによる加算

次に最も実践的であるMegacore wizardを使う方法を紹介します。通常はこの方法だけ知っていれば十分です。 lpm_add_subの設定 Quatus2のTools→Maga Wizard Plug-In Managerを起動します。Arithmeticからlpm_add_subを選択しましょう。bit幅の設定と、Create …

加算器を作ろう マルチサイクルによる加算

CLKの周波数を維持したままタイミング制約を満たさない加算を実行するには、マルチサイクル制約を使うという手法があります。要するに加算自体を数クロックかけて行うので、タイミング制約は緩くしてねという事です。クロックによる同期設計を半ば放棄してい…

加算器を作ろう 最初の一歩

加算器のFPGA実装について調べた所、奥が深くとても面白い事がわかりました。特にFPGA実装に限ると、キャリー専用配線や、LUT構造により通常の加算器とは少し違った性能になることがあります。加算器をいかに速くできるかについて、いろいろと挑戦してみまし…

グレイコード

符号付き2進数のバリエーションのコメントで面白い話が聞けましたので検証してみました。元ネタは、第二の魚の骨発見です。どうしてこういう事が起きるのか、またグレイコードならどう違うのかをシミュレーションしてみました。Verilogによる実装も後ろで説…

符号付き2進数のバリエーション

ディジタル数値演算回路の実用設計に綺麗にまとまっていたので、表をそのまま使わさせていただきます。いろんな表記の中から好きな物を選べるのがVerilogの楽しいところでもあります。 10進 ストレートバイナリ 符号+絶対値 1の補数 2の補数 オフセットバイ…

プリント基板の厚さに関する指示

PCB

技術者の為のプリント基板設計入門を参考に整理しました。 板厚 板自体の厚さ。PCIやVMEといったコネクタまで規定された規格物の場合、規格で板厚の指定があるのでそれに合わせる。何回も挿抜を繰り返す基板は、強度を確保するために厚めにします。1.6mmを超…

Exercise 2.52 Instruction Set Styles

このCソースに対して等価なアセンブラを書き、4つのアーキテクチャを比較しなさい。 a = b + c; b = a + c; d = a - b; Accumulator Accumulatorの場合は8命令で実行できます。 load AddressB add AddressC # b + c store AddressA add AddressC # a + c sto…

プリント基板の電気的特性

PCB

技術者の為のプリント基板設計入門から抜粋しました。 配線抵抗 1cmあたりの抵抗値[Ω] t:導体厚(mm) 幅[mm] t=0.035 t=0.07 1.0 0.0048 0.0.0024 0.5 0.0096 0.0.0048 0.3 0.016 0.008 0.2 0.024 0.012 0.1 0.048 0.024 スルーホールの抵抗 穴経[mm] 抵抗[mΩ…

Instruction Set Styles

a = b +c; を、Accumulator、Memory-memory、Stack、Load-storeの命令セットスタイルでどうなるか考えて考えようという問題。a,b,cはメモリ上の変数です。Load-storeの命令スタイルは、教科書にでてくるMIPSのスタイルです。 Accumulator Accumulatorの場合…

SPEC2006

教科書に出てくるSPEC(Standard Performance Evaluation Corporation)について、簡単に調べました。総本山 http://www.specbench.org/CPU関連の最新はSPEC2006になります。 http://www.specbench.org/cpu2006/INT版の一覧はこちらになります。 http://www.sp…

PowerPC

In More DepthにPowerPCの特徴が書いてあったのでまとめました。PowerPCはMIPSに近いアーキテクチャを持っています。一番の違い(The primary difference)は、2つの追加のアドレッシングモードと、いくつかの命令です。 Indexed Addressing と Update Address…

Exercise 2.22 MIPS Coding and ASCII Strings その2

2.22 [20] Write a procedure, bcount, in MIPS assembly language. The bcount procedure takes a single argument, which is a pointer to a string in register $a0, and it returns a count of the total number of b characters in the string in regis…

Exercise 2.21 MIPS Coding and ASCII Strings

[30] Write a program in MIPS assembly language to convert an ASCII decimal string to an integer. Your program should expect register $a0 to hold the address of a null-terminated string containing some combination of the digits 0 through 9.…

Exercise 2.20

null-terminate された文字列"A byte is 8 bits"のバイト数を求めなさい。 16文字+nullなので、合計17バイトになります。コンパイラを使って確認してみましょう char s[] = "A byte is 8 bits"; をsde-gccでコンパイルすると、こうなります。 .file 1 "c.c"…

Exercise 2.19

IrisとJulieの名前を、ASCIIとUnicode(Basic Laten character set)で表現しなさい。 テキストエディタで書いて、各文字コードで保存、バイナリエディタで覗いてみたら簡単にわかります。 ASCII Iris 49 72 69 73 Julie 4A 75 6C 69 65 UTF-8 Iris 49 72 69 7…

Exercise 2.16-2.18 Fibonacci number

フィボナッチ数を、再帰バージョンと末尾再帰バージョンにしたときの比較です。SICPの1.2.2 Tree Recursionと全く同じ問題ですね。 http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-11.html#%_sec_1.2.2 再帰バージョン iint fib(int n){ if (n == 0)…

FPGA初心者向けのテキスト

mixiでたっくさんに教わりました。セミナー自体はチェックしていたのですが、まさかテキストまで公開されているとは思いませんでした。 http://www-online.kek.jp/Seminar/fpgaseminar.htmlこちらの資料に目を通すだけで、FPGA開発に関して一通りの事は分か…

Tail Recursion

Tail Recursion とは 末尾再帰とは、関数の最後の命令がその関数自身の呼び出しであるような再帰呼び出しのことです。バイナリアン的には、どのように最適化されるかが面白いところですので、「末尾再帰は最適化できる」というスタンスで紹介します。 最適化…

末尾呼出の最適化:tail call optimization

末尾呼出の最適化とは 末尾呼出の最適化とは、ある関数f()の最後が別の関数g()を呼び出しているだけの場合、g()の呼出をcallでなくjmpに変える最適化です。わずかですが速度とサイズの両方を改善する反面、デメリットが非常に少なく、定数畳み込みと並んで私…

関数呼び出しまとめ

5つのプロセッサで、関数呼び出しの方法をまとめました。 MIPS sparc sh ARM x86 レジスタ渡し可能な引数 4個まで 6個まで 4個まで 4個まで スタックを使用 戻り先の格納先 register register stack register stack 関数の呼出し jal call jsr bl call 関数…

関数呼び出しsh、ARM、x86編

残りのプロセッサについても、さっとまとめました。 Cソース/アセンブラはここにまとめてあります。 SH SHの場合、引数が4つまではレジスタ渡し、5つ目からスタックを使用します。 関数の呼出はjsr命令を使い、戻るときはrts命令を使います。 他のRISCプロセ…

関数呼び出しsparc編

register window Sparcプロセッサは、register windowと呼ばれる一風変わったアーキテクチャを採用しています。プロセッサ自体は、64〜528個の汎用レジスタを持っており、ソフトウェアからは32個のレジスタにアクセスできます。32個のうち24個は汎用レジスタ…

FPGAで動くCPU特集

[fpga-cpu]でFPGAで動く小さいCPUの議論が盛り上がっています。 http://tech.groups.yahoo.com/group/fpga-cpu/messages/3060?xm=1&m=e&l=1その中で評判が良い物を紹介してみます。 個人的にはb16がシンプルなので一度FPGAで動かしてみたいところです。 Zyli…

SIMDプロセッサの開発環境が無料公開

SIMD コンピュータアーキテクチャの教科書には、SIMD(Single Instruction Multiple Data)のアーキテクチャが必ずでてきます。理屈は分かるのですが実際にどのようなプロセッサなのかイメージがわかない人もいると思います。今回は、リコーのSIMDプロセッサRi…

関数呼び出しMIPS編

MIPSの関数呼び出し規約を、gccを使って確認してみました。教科書によると、$4〜$7($a0〜$a3)が引数、$2〜$3($v0〜$v1)が戻り値として使われます。 元となるソース 違いを確認するために、引数が4個の関数と、引数が5個の関数を呼び出し、gccの出したアセン…