goo blog サービス終了のお知らせ 

組み込まれたエンジニア

我輩は石である。名前はまだ無い。

gccのpdp11ターゲット

2013-11-16 22:54:29 | Weblog

gcc-3.2のpdp11ターゲットは、パッチを作成して、GNUに送ったのですが、最近のgccではpdp11が標準で入っているという記事をどこかで見かけ、私の作業はいらないかと安心していました。

ところが、昨日、FPGA版のpdp11互換チップをDE2に移植している人から、渡した機械語プログラムの動作がおかしいので、論理かツールのどちらかが問題ではないかと問い合わせがあって、シミュレーション環境を作成して確認したところ、私の問題ではなく、GNUのコンパイラのバグでした。

同じプログラムを私のパッチ入りのgcc-3.2でコンパイルすれば問題なく正しいコードが出るので、GNU向けに誰かが不良を埋め込んでいます。原因は分かっていますが、4.X系のコンパイラのソースはチェックしていないのと、私のパッチを使えば、3.2にはなっても正しいコードが出来るので、GNUにパッチを送るにしても、あまりモチベーションは上がらないですね。

pdp11用のコンパイラは、誰も使っていないことが良く分かりますね :-)


NSLCORE 20120915版

2012-09-20 21:32:16 | Weblog

久々の更新です。

新規の機能は、下記の通り

  1. SystemC生成における新オプション
    1. -sc_ext_cpp : エクステンションを.cppにします
    2. -sc_split_header : ヘッダファイルを別ファイルとして生成します
    3. -sc_bool : 1ビット端子をboolとして生成します
  2. レジスタアトリビュート新設 レジスタ個別にクロック・リセット信号などを設定できるようにしました
    reg .attribute(.clock=clockname .reset=resetname)  someregister[8];
    のように .attribute()内に記述します。スキュー保証はユーザ責任となります
  3. 入出力端子宣言における範囲指定形式導入
    output addr[15:2];
    のように、端子の添え字のスタートを指定可能にしました。上記の例の場合、addrは14ビット信号になります。

ダウンロードはオーバートーンのバイナリ配布ページより

マニュアルに記載していない拡張のため、当面experimental扱いとしますが、問題があればご連絡ください。

 


ETロボコン向け開発環境

2012-03-16 09:52:47 | Weblog

nxtOSEK2.17対応のLiveCygwinパッケージを作成しました。

LiveCygwinは、ダウンロード・展開するだけで、インストール作業なしでCygwinの動作環境を得られるので、ユーザ権限が制限されている環境でも利用可能です。

(もちろん、LEGOのデバイスドライバは管理者権限でないとインストールできないので、LiveCygwinだけで、全てが済むわけではありません)

 

LiveCygwinをお使いの方は、2つのファイルをダウンロードして、

usr/arch

のフォルダにそのまま入れてください。

次回の起動時に、自動的に展開し、利用可能になります。

また、LiveCygwinをお使いでない方は、LiveCygwin.zipをダウンロード、展開し、その中の、上記フォルダに2つのファイルを入れてください。

次回の起動時に、ホームディレクトリに

nxtOSEK217

というディレクトリが作成されているので、その中の

sample_c/helloworld

に移動し、

make all

として、バイナリが作成できることを確認してください。

 


サンプリング定理とCDからDSDへのアップコンバート

2012-01-04 09:06:52 | Weblog

CDをKORGのAudioGateでDSDにアップコンバートすると音質が向上するというので前から気になっていますけれど、DSDを再生できるプレーヤーは限られているので、まずは、原理から考察してみます。

サンプリング定理で、元信号に回帰するためには、サンプルされた 信号を三角関数で畳み込むことが必須です。
ところが、多くのDA変換回路は単にステップ変換するだけなので 、元信号には回帰しません。
 

このことを知らないエンジニアも結構いるような気がします(習ったはずなので、忘れているだけか、単に無視しているのか・・)


添付画像の緑のような細かなサンプリングステップを想起するとローパスフィルタだけで元信号に近くなる気がするけれど、同様にサンプリング定理を満たしてる標本信号であっても、青の線をローパスフィルタを通しても元信号になりません。(特にエンベローブに低周波成分のノイズが乗るように見えます)

三角関数で畳み込むというのは、デジタル回路には簡単ではないので、信号処理を大規模に前処理して、オーバーサンプリングするか、オーバーサンプリングADPCM(DSD)にすることで、緑の線に近づけることで、元信号に近い音が出せるようになります。

CDをAudioGateでDSDに変換して再生すると元より良くなるというのは、こんな原理ではないかな?もちろん、同じ原理で三角関数畳み込みで元信号に近づけたオーバーサンプリングPCMにしても同じような傾向が得られるはずなので、再生可能機器が限られるDSDだけでなく、DVDAudioでも、いいような気もします。(もっとも、こちらも限られてますね)

本記事は、facebookのウォールに投稿した内容の転載です。

 

 

 


ReVIEW再び

2012-01-02 00:05:43 | Weblog

明けましておめでとうございます。

今年もよろしくお願いします。

 

一度はあきらめかけたReVIEWですが、帰省して時間があるので、もう一度設定をし直してみました。

結果として、最新版をgitでCygwinにダウンロード・展開して、ほぼそのまま動作しました。先日動作しなかった状況をきちんとメモにしていなかったので、何が悪かったのかは不明ですが、PDFもepubも普通に作成できるようになりました。

少し手間取ったのが、dvipdfmxの日本語フォントの設定です。w32texのデフォルトでは、dvipdfmxが小塚フォントを使うようになっていて、このフォントを持たない私の環境では、まともにPDFが出来ませんでしたが、

w32tex/share/texmf/fonts/map/dvipdfmx/base/cid-x.map

を編集し、PSのデフォルトフォントに変更することで、無事PDFが完成です。

ReVIEWの良いところは、TeXと被るのですが、もう少しラフにお任せレイアウトにできることです。細かなレイアウトに凝りたい場合には、TeXを用いた方がよいと思いますが、TeXからEPUBに簡単に出力できるようにならないと、文書主体の電子書籍作成にTeXはお勧めしにくいです。

ReVIEWもTeXも、基本はテキストファイルなので、CVSやsubversionなどのバージョンコントロールとの相性も非常に良いのも助かります。

ReVIEWの設定と併せて60ページほどのドキュメントを作成して年末年始を過ごしています。

 


pdp11互換機+UNIX

2011-11-30 19:26:06 | Weblog

以前、飯田君がSFLで記述した環境をNSLに移植しました。

機械的に記述を変換しただけなので、論理は変えていません。

変更中、気がついたのですが、SFLでは、常に動作して、終わらないステージを多用する傾向があるようです。

理由を考えると、どうやら、状態遷移マシンを作るには、ステージを使う必要があることからのようです。NSLでは、ブロックは状態を持つことができるので、リセット時に起動して終了しないステージは廃止し、ブロックの状態遷移に変更しました。

NSLの非商用ライセンスでコンパイルができるように、Makefileの構成を少し変更しています。

 

例によって、IP-ARCHのホームページからダウンロードできます。

 


MidwayゲームプラットフォームをNSLに変更

2011-11-22 06:38:34 | Weblog

以前SFLで書いていた(スペースインベーダーのゲーム基板として有名な)MidwayゲームプラットフォームをNSLに書き直しました

といっても、SFLをNSL化するのは、簡単なので、書き直しはあっという間ですが、Verilatorのテストベクトルを流しても、ゲーム画面になっていないので、??と思ったら、割込みタイミングをFPGA用(100Hz)に設定したままでした。

シミュレーション用に割込み頻度を上げる対策をしてもいいのですが、FPGAのタイミングのまま、シミュレーションサイクルを伸ばし、5千万クロックまわすことにしました。ここまでまわすと、インベーダーたちが画面に出てきますが、まだ弾は出ていません。サイトを動かしながら、9千万クロックまでシミュレーションをまわすと、弾が表示され、インベーダーも1機破壊してました。

次は、pdp11互換機のコードをNSL化しようと思っていますが、非商用ライセンスで動作するように、記述を分割したいので、少し暇な時間が必要そうです。

 


ReVIEW

2011-11-10 18:59:05 | Weblog

電子書籍のEPUBフォーマットを簡単に作る方法として、ReVIEWに注目中ですが、自分の環境ではまともなものが出来ません。そもそもサンプルコード自体がbyte sequence errorとなってコンパイルに失敗するのですが、この原因はrubyの文字コードの扱い変更にあるようで、ruby-1.9系では動かない気がします。デフォルト文字コードを明示的に指定するように修正すると、一見、動いたように見えるのですが、出来上がったファイルは壊れています。

Debianのマシンでは動いたのですが、モバイル環境で作れないと、結局利用しなくなるのは見えているので、ArchLinuxのrubyをダウングレードするか、ReVIEWのバージョンアップを待つしかないかな?

言語処理系が、過去の互換性を崩すような変更をする場合、かなり仕様作成に注意するか、マイグレーションの手段を用意しておかなくてはいけないと思うのですが、スクリプト系の言語は平気で連続性のない変更を加えるのでしょうか?

 

 


coLinux+ArchLinux

2011-11-05 07:56:58 | Weblog

持ち運び用のマシンでLinuxを使うのに、VMでは重過ぎるので、coLinuxを導入することにする。

カーネルはともかく、OSとしての構成を整えるのにディストリビューションのファイルシステムを導入する必要があるけれど、ここで、coLinuxのサイトに置いてあった、普段使ったことのないArchLinuxを入れてみることにした。

ところが、思ったよりも導入に手間取ったので、備忘録を記す。

何はともあれ、システムアップデートの前に、パッケージ管理ソフトのpacmanをアップデートする必要があるけれど、これが一筋縄ではいかないのだった。

coLinuxのファイルシステムを使うのであれば、次の手順を順番を変更せずに行うこと。

 

  • /dev/cobd2用のFS作成
  • mount -n -o remount,rw /
  • nano /etc/fstab
    • /dev/hda1 -> /dev/cobd0
    • /dev/hda2 -> /dev/cobd1
    • /dev/cobd2 /mnt/ext ext3 noatime 1 1
  • mkfs.ext3 /dev/cobd2
  • nano /etc/pacman.d/mirrorlist
  • mkdir /mnt/ext
  • reboot
  • for i in root home var usr ; do cp -r /$i /mnt/ext; rm -r /$i; ln -s /mnt/ext/$i /; done
  • pacman -Sy
  • pacman -S xz
  • pacman -S expat
    • cd /var/cache/pacman/pkg; xz -d ex*.xz; pacman -U expat*
  • pacman -S db
    • cd /var/cache/pacman/pkg; xz -d db*.xz; pacman -U db*
  • pacman -S openssl -> /var/cache/pacman/pkgでxzを展開し、pacman -Uでインストール
  • pacman -Sd libarchive
  • pacman -Sd libfetch
  • pacman -S pacman
  • pacman-db-upgrade
  • /etc/pacman.d/mirrorlist のJapanの項のコメント削除
  • rm /etc/profile.d/locale.sh
  • pacman -Syu
  •  


    OSEK/VDX (ToppersATK1) alarm.cのパッチ

    2011-09-20 16:37:01 | Weblog

    性能向上がほとんどないのに、無意味なほど複雑と思えるコードを見ると、思わず変更したくなります。

    ATK1のカーネルではalarm.cのカウンタの回し方がそうです。

    オリジナルのコードでは、カウンタを2倍の値まで回していますが、そのメリットはほとんどないように思います。(カウンタの発動の比較時に比較演算が1つ減る程度なので、性能的にはゴミです)

    一方、2倍までまわす弊害は多く、多くの関数で、余分な条件判断を行なわざるをえません。

    パッチファイルは、alarm.patch です。

     


    WindowsでGHDL

    2011-07-18 17:19:11 | Weblog

    VHDLシミュレータGHDLの本家サイトにWindows版のGHDLがあるので、ダウンロードして使ってみた。

    ところが、どうにも思うように動かない。

    簡単なものなら動くのだけれど、少し複雑なものになると、シミュレーションがそもそもスタートしない。VCDファイルをダンプしてみても、何一つイベントが出てこない。

    始めは自分の記述がおかしいのかと散々記述方法を工夫してみたけれど、結論としては、本家のWindows版は腐っていることが分かった。

    Linux版や、Sourceforgeで配布しているCygwin版なら、同じ記述が難なく動くのだった。

    で、Cygwin版なら、自分が作っているLiveCygwinに入れれば、VerilogもSystemCもVHDLもNSLも開発できる総合環境になるので、便利だと思い、作業をしてみたら、Cygwin版が前提としているCygwinベースバージョンがかなり新しく、LiveCygwinの現在配布版では動かないことが分かった。

    ということで、GHDLを入れて、LiveCygwinのベースバージョンをCygwin-1.7に変更したものを作成した。

    ZIPファイルはこちら

    7zで圧縮したISOイメージはこちら

     

    ライブラリや起動コマンドなどいろいろと変更しているので、バージョン違いによる不整合が出る可能性があります。問題があれば、何なりとご連絡ください。

     

     mingwで動くようになれば、Cygwinに煩わされることはなくなるので、途中までは作業をしたのですが、GHDLのコンパイルには数多くのライブラリを用意しなくてはならず、mingwのライブラリを作って回るのも本質的ではないので断念しました。

     

     


    ビットマップディスプレイとキャラクターディスプレイ

    2011-06-17 07:48:18 | Weblog

    学生と話をしていて、キャラクターディスプレイのことがよく伝わらなかったので、サンプルプログラムを作った。ビットマップディスプレイは直感的だけれど、キャラクターディスプレイは一度間接参照が入るので、初心者には分かりにくいのかも?

    サンプルは、VGAの640x480画面にドットクロック25MHzで80桁x24行(程度)表示する。デバッグ用に、トップモジュールはsimという名前になっているので、FPGAベンダーのツールを使うときには注意が必要。(ファイル名!=トップモジュール)

    フォントは、X11の8x16.bdfを同封し、これからキャラジェネのパターンを抽出するスクリプト、初期画面のデータを作成するスクリプトを用意して、合成可能なVerilogHDLファイルを生成するMakefileも入っている。

    さくっと3時間ほどで作ったので、整理はされていないけれど、短いプログラムなので、じっくり読むと分かると思う。

    ALTERAのDE0で動作確認済み。

     

    DE0は、nCEとVGA出力ピンがぶつかっていて、そのままだとQuartusIIがエラーを出してコンパイルできない。設定から、nCEをユーザーIOに切り替える必要があるそうだ。

     


    NSL: 構造体の初期化

    2011-06-13 09:22:06 | Weblog

    NSLでは、regタイプの構造体インスタンスには初期値を与えられます。

    struct st {
      a[4];
      b[8];
      c[12];
      } ;
    
    declare x {}
    
    module x{
      st reg mm = {5,0x21,543};
      }
    



    注意が必要なのは、

    {5,0x21,543}

    を通常の実行文において記述すると、連結演算子とみなして、連結しようとしてしまうことです。この場合、ビット数推定ができないので、エラーになります。各フィールドのビット数を厳密に指定して記述すれば、初期化でも実行文でも使える記述になるので、好ましいでしょう。

    個々に設定せずに、まとめて0に初期化したい場合、


    st reg mm =0;


    と書くこともできます。


    念のため書いておきますが、wireタイプには初期値は設定できません。


    6502互換CPU NSL版

    2011-05-16 09:32:54 | Weblog
    6502互換CPUのm65をNSLで書き直しました
    シミュレーション上でWozのモニタ(Applie-Iのモニタ)を動作させるパッケージとしています。

    コンパイルは、20110511版以降のNSLCOREが必要となります。
    シミュレーションには論理シミュレータが必要です。私は、Icarus Verilogを使っていますが、シミュレーション構文はあまり複雑なものを合成しないので、大抵のシミュレータで動作すると思います。なお、Makefileを書き換えればSystemCでもシミュレーション可能だと思いますが、まだ試していません。

    この規模の回路になると、行数が多くなるので、NSLCOREの非商用ライセンスが必要になります。

    NSLはSFLよりもできることが多いのですが、SFLのレベルの構文もほぼ用意しているので、SFLからNSLへの書き直しは、機械的にできる軽微な修正となります。なので、あまり時間をかけずに可能でした。ただし、taskを複数利用するケースだけは注意が必要です。SFLのタスクは、それぞれがステージ中の特定の動作状況を表しますが、私(と私を参考にコードを書いた学生)のコード以外に1つのステージに複数のタスクを書く例はほぼなかったので、NSLでは、ステージとタスクを1つの手続きとしてまとめました。m65は複数のタスクと内部関数を使って、直行する制御を実現していたので、この部分の修正が単純な置き換えではできません。

    色々とやり方を検討したのですが、タスク相当のレジスタを手続きの引数で与えることにしました。他にも状態と内部関数を利用するとか、いくつも代替手段はありますが、あまり手間をかけずに動作させることを優先しました。今後、もう少し概念を整理して、きれいな記述になる方法を検討してみます。