IC・トランジスタで出来たコンピューターを設計・製作するためのブログ

Jeans & Development 電子ブロック工房 三日坊主 フロントページ

円周率、小数点以下70桁 [一般的なこと]

2009年7月3日

C++で。
#include "stdafx.h"

#include <stdlib.h>

#define FIG 37

void prt(unsigned char* v1){
    unsigned char i;
    for (i=0;i<FIG-1;i++) {
        if (v1[i]<10) printf("0%d",v1[i]);
        else printf("%d",v1[i]);
    }
    printf("\n");
}

void copy(unsigned char* res, unsigned char* v1){
    unsigned char i;
    unsigned short t,c=0;
    v1[FIG-1]=10*((v1[FIG-1]+5)/10);
    for (i=FIG-1;i<FIG;i--) {
        t=v1[i]+c;
        c=t/100;
        if (i) t-=c*100;
        res[i]=t;
    }
}

void clear(unsigned char* res){
    unsigned char i;
    for (i=0;i<FIG;i++) res[i]=0;    
}

void add(unsigned char* res, unsigned char* v1, unsigned char* v2){
    unsigned char cache[FIG];
    unsigned char i;
    unsigned short t,c=0;
    for (i=FIG-1;i<FIG;i--) {
        t=v1[i]+v2[i]+c;
        c=t/100;
        if (i) t-=c*100;
        cache[i]=t;
    }
    copy(res,(unsigned char*)&cache);
}

void mul(unsigned char* res, unsigned char* v1, unsigned char v2){
    unsigned char cache[FIG];
    unsigned char i;
    unsigned short t,c=0;
    for (i=FIG-1;i<FIG;i--) {
        t=v1[i]*v2+c;
        c=t/100;
        if (i) t-=c*100;
        cache[i]=t;
    }
    copy(res,(unsigned char*)&cache);
}

void mul(unsigned char* res, unsigned char* v1, unsigned char* v2){
    unsigned char cache[FIG*3];
    unsigned char* r=&cache[0];
    unsigned char* t=&cache[FIG*2];
    unsigned char i;
    clear(r);
    clear(r+FIG);
    for (i=FIG-1;i<FIG;i--) {
        mul(t,v1,v2[i]);
        add(r+i,r+i,t);
    }
    copy(res,r);
}
void div(unsigned char* res, unsigned char* v1, unsigned char v2){
    unsigned char cache[FIG];
    unsigned char* r=&cache[0];
    unsigned char i;
    unsigned short c=0;
    for (i=0;i<FIG;i++) {
        c=c*100+v1[i];
        r[i]=c/v2;
        c=c-r[i]*v2;
    }
    copy(res,r);
}

int _tmain(int argc, _TCHAR* argv[])
{
    unsigned char* pi=new unsigned char[FIG];
    unsigned char* y=new unsigned char[FIG];
    unsigned char* t=new unsigned char[FIG];
    clear(pi);
    prt(pi);
    for (int n=0;n<127;n++) {
        clear(y);
        y[0]=3;
        div(y,y,2*n+1);
        for (int x=1;x<=n;x++) {
            clear(t);
            t[0]=x+n;
            div(t,t,x);
            div(t,t,16);
            mul(y,y,t);
        }
        add(pi,pi,y);
        prt(pi);
    }
    return 0;
}

copy関数内で丸めの処理をし、下2桁は表示しないようにしてある。このアルゴリズムだとこの辺が限界らしく、桁数をさらに上げると誤差が出るようだ。PICのpi calculatorにも入れてみよう。

割り算無しで円周率の計算 [一般的なこと]

2009年7月2日

割り算は少し面倒なので、これを行わずに円周率を計算させる方法を考えてみた。

for ($max=2;$max<=2000000000;$max=$max*sqrt(10)) {
    $t=time();
    echo intval($max).': '.calc_pi(intval($max))."  (".(time()-$t).")\n";
}

function calc_pi($max) {
    $total=0;
    $max2=$max*$max;
    $prev_y=$max-1;
    for ($x=0;$x<$max;$x++) {
        $max2_x2=$max2-$x*$x;
        for ($y=$prev_y;0<=$y;$y--) {
            if ($y*$y < $max2_x2) break;
        }
        $total+=$y+1;
        $prev_y=$y;
    }
    return $total;
}

PICkit 2を購入 [PIC]

2009年6月21日

先日、サンフランシスコの紀伊国屋に行ったとき、何気なく手にしたトランジスタ技術・2009年4月号。そこでの特集が、『これなら分かる!!PICマイコン』。以前から、PICでもAVRでもなんでもいいから、マイクロコントローラを使えるようにならにゃイカンなと思っていて、その機会がなかったのだが、これを機に勉強することにした。

トラ技をよむと、Cでプログラムが組めるではないか!しかも、HITEC-C liteというのを用いれば、すべてフリーソフトでできる。これはいい。アセンブラも楽しいが、Cで組めるとなると、やりたいことがすぐにコードになるという利点がある。

Microchip社が、これもフリーで出しているMPLAB IDEと、HITEC-Cを用いてトラ技を見ながら始めて書いたコードは以下のとおり。
#include <pic.h>
__CONFIG(INTIO & WDTDIS & PWRTDIS & MCLRDIS & UNPROTECT & BORDIS & IESODIS & FCMDIS);

void main(){

}

main()関数の中に色々と書けば、色々とできる。簡単・簡単。

Verilogライクなシミュレータ [シミュレーション]

2009年2月24日

C++で次のように書ける、ロジック回路のシミュレータを作ってみた。

bool input1,input2;
logic* na1=nandGate();
logic* na2=nandGate();
na1->connect(&input1,&na2->output);
na2->connect(&na1->output,&input2);

これは、NANDを二つつなげただけの、もっともシンプルなフリップフロップ。前にPHPで書いたものと違って、今回のは回路の内の遅延などもシミュレーションできるようにしてある。なので、ラッチやフリップフロップを組み合わせた複雑な回路のシミュレーションにも使えるはず。

使ったことないし良く分からないが、Verilogというものに構文が良く似ているようだ。既存のソフトの使い方を覚えるより、使いにくくても自作して細かな調整を自身で行うほうが、私には向いている。今回のシミュレータは、遅延時間を素子ごとにランダムに設定することもできるので、多分、回路を設計するさいの動作確認にも使える。

多分必要なもの [一般的なこと]

2009年2月21日

更新は、一年ぶり(正確には、1年3ヶ月)。

制作にあたって、たぶん次のようなツールが必要になる。USBインターフェースのI/Oポートをピックアッピしてみた。

NI USB 6501
USBee AX

NIの方は、24ポートあるのが魅力。少し値ははるが96ポートの製品もあるらしい。
USBeeの方は、8ポートだが、多分(よく調べていない)、スピードはこちらの方が速い。

どちらも、$100ちょっとの価格。とりあえず購入するのは、NIの方かな。実績もあるし。

レジスター3つ [デジタル回路]

2007年10月14日

cs, ip, sp の3つのレジスター
test

タイミング回路 [デジタル回路]

2007年10月14日

久々の更新。以前、この辺りの回路の一部出来ていたのだが、放っておいたままになっていた。思い出す意味もかねて、アップ。

参考になりそうなページ [一般的なこと]

2007年8月14日

ネットサーフィンをしていて見つけた、少し、いや、大いに参考になりそうなページ。

N.Kojima 総目次

実は、この表ページにたどり着く前に『はずかしい回路設計』というページに行き当たった。

ソフトウェアしか開発したことのないエンジニアがいきなり、簡単な回路だからあなたがハードも含めて設計しなさいと言われてしまった場合に陥りやすい誤りについて実例を見ていきましょう。(サイトから引用)

うーん、私はソフトウェアのエンジニアではないが、ギクッとする文面である。幸い、趣味で電子工作しているレベルでは、『とってもはずかしい』には該当しなかったので、ほっと一安心。それにしても、とっても参考になる。

あとは、『言語によるディジタル回路の設計 ~ VDHL』も、参考になりそう。どこかのページで見つけた『Verilog』という言語が気になっていたのであるが、そのあたりについて分かりやすく解説している。今は、ソフトウエアを使ってディジタル回路を設計する時代らしい。こういった手法が使えるようになると、FPGA も使いこなせるようになるのだろうか?

いいね、新しいものも。

半日でマイコン作成を体験 [一般的なこと]

2007年8月6日

ネットサーフィンをしていて、面白いページを発見。

半日でマイコン作成を体験:ITpro

回路図を色鉛筆でなぞることで、コンピューターの仕組みを理解しようという試み。あの、Z80マイコン(今は使われないマイコンという言葉を用いているのも一興)の全回路図が掲載されている。これは、いわゆるパチパチ式のコンピューターだ。パチパチ式という検索語でググっても何も出てこないが、パチパチ式マイコンとはこんな感じ

部品がそろうのなら、作りたくなってきた。

6bit CPU [CPU]

2007年8月6日

ニーモニック表を更新。2 byte, 3 byte 命令を認識しやすくするため、少し順序を入れ替えた。
<<前の記事   後の記事>>