ブログ - 最新エントリー

XPからUbuntuへの移行メモ(ツール編)

カテゴリ : 
ツール
執筆 : 
dohi 2014-2-18 16:01
XPからUbuntuへの移行メモ(OS編)の続きです。


デスクトップ作業用の便利なツール等。
Ubuntuインストール時に、サードパーティのソフトをインストールするという選択をしていれば、いくつかは既にインストールされている。
特記のないものは、Ubuntソフトウェアセンター(デスクトップ左の、買い物袋アイコン)を開き、ソフト名を検索してインストール可能。


Officeソフト

LibreOffice Writer - ワードプロセッサ(MS-Wordに相当)
LibreOffice Calc - スプレッドシート(MS-Excelに相当)
LibreOffice Impress - プレゼンテーション(MS-PowerPointに相当)
LibreOffice Draw - 作図(Office製品からなくなったMS-Drawに相当)
LibreOffice Math - 数式エディタ(MS-Mathematicsの一部機能?)
LibreOffice Base - データベース(MS-Accessに相当)


PDFビューアー

ドキュメントビューアー - PDF、PS、EPS、DjVu等のビューアー


画像関連

GIMP 画像エディター - 画像作成、写真編集
KSnapshot - 画面表示を、ウィンドウ単位、矩形領域単位で取り込み(ドキュメント作成に便利)
Dia - ダイヤグラム、図表等作成(MS-Visio相当)


プロジェクト管理ツール

MS-Project相当のプロジェクト管理ツール、GanttProjectをインストールするには、GanttProjectのホームページからdebパッケージをダウンロード。.debファイルをダブルクリックすると、ubuntuソフトウェアセンターが開くので、インストールする。


VirtualBox

デバイスベンダの提供するツールは、Windowsのみ対応のものも多いため、XPも動かさざるを得ない場合、VirtualBoxの仮想環境で動かす。(KVMより安定して動きました)

VirtualBoxのダウンロードページから、「VirtualBox x.x.x for Linux hosts」の対応するもの(当該のUbuntuバージョン、32bitはi386、64bitはAMD64)と、「VirtualBox x.x.x Oracle VM VirtualBox Extension Pack」をダウンロード。
ダウンロードした.debをダブルクリックし、Ubuntuソフトウェアセンターからインストール。
sudo gpasswd -a 自分のユーザアカウント名 vboxusers
で、自身をvboxusersグループに追加する。
デスクトップで(どのWindowもアクティブでない状態で)Altキーを押し、コマンド検索に「virtualbox」と入力。Oracle VM VirtualBoxのアイコンが現れるので、クリックしてVirtualBoxマネージャーを起動。
VirtualBoxマネージャーのウインドウがアクティブな状態で、画面上部のステータスバーにマウスカーソルを動かし、ファイル-環境設定-拡張機能ーパッケージを追加(右側の四角に逆三角形のアイコン)で、ダウンロードしたOracle VM VirtualBox Extension Packを選択て、拡張機能をインストールする。

VirtualBox Mania等を参考に、ゲストOSをインストールする。
(ThinkPad T60は、WindowsXPのインストールメディアが無く、HDDイメージをリカバリするタイプのものなので、VritualBoxへのインストールができませんでした。たまたま、他のPC用にXPのインストールメディアを持っていたので、それを利用しました。Productキーは、PC本体に貼ってあるもものを入力すれば、問題なくインストール出来ました。)

VirtualBoxでゲストOS動作中に、PCがサスペンドやハイバネートすると、復帰後にゲストOSのCPU使用率が異常に大きくなり、事実上ゲストOSがクラッシュしてしまう問題があるため、VirtualBox をサスペンド&ハイバネートに対応させるの手順により、サスペンド・ハイバネート時に、ゲストOSを状態保存して休止する設定をおこなう。
sudo gedit /etc/pm/sleep.d/90virtualbox
で、以下内容のファイルを作成して保存。
#!/bin/bash

suspend_vms()
{
    for USER in $(ps h -C VirtualBox -o user | uniq); do
        for VM in $(sudo -u $USER VBoxManage list runningvms | grep -o "[0-9a-f-]\{36\}"); do
            sudo -u $USER VBoxManage controlvm $VM savestate
        done
    done
}

case "$1" in
	hibernate|suspend)
#	hibernate)
		suspend_vms
		;;
	*)
		;;
esac

exit $?
ファイルに実行のパーミッションを与える。
sudo chmod +x /etc/pm/sleep.d/90virtualbox

(別のPCで、64bit環境のUbuntuに、Windows8 64bitをVirtualBoxで仮想化してインストールして使っていますが、上記の方法を使っても、サスペンド復帰後に、ゲストOSのクラッシュを避けれれませんでした。64bitの問題なのか、Windows8による問題なのかは不明です。32bitのUbuntuとWindowsXPpro32bitでは、問題なく復帰しています。)


リモートデスクトップ

Ubuntuクライアントから、ネットワーク内の他のWindows、Ubuntuどちらのマシンへも、リモートデスクトップでログインできる。

デスクトップで(どのWindowもアクティブでない状態で)Altキーを押し、コマンド検索に「remmina」と入力。Remminaリモートデスクトップクライアントのアイコンが現れるので、クリックして起動する。
ウインドウ上部の、新規リモートデスクトップの作成アイコン(書類に+のアイコン)をクリックし、適当な名前を付ける。プロトコルは、「RDP - リモートデスクトッププロトコル」を選択。サーバーの欄に接続先のIPアドレスを入力し、ユーザ名、パスワードにそれぞれリモートPCでログインしているものを入力。色数は、256色以外を選択。(256色で、不具合が出る場合があるとの情報あり)

リモートPCがWindowsならば、リモートデスクトップの接続を許可する必要がある。

リモートPCがUbuntuならば、vnc で Ubuntu をリモート操作に従い、リモート側のPCを設定する。
x11vncをインストール。
sudo apt-get install x11vnc xinetd
xinetdの定義ファイルを作成。
sudo gedit /etc/xinetd.d/x11vnc
以下内容を入力し、保存する。
service x11vnc
{
    type = UNLISTED
    disable = no
    socket_type = stream
    protocol = tcp
    wait = no
    user = root
    server = /usr/bin/x11vnc
    server_args = -inetd -o /var/log/x11vnc.log -display :0 -forever -bg -rfbauth /etc/vncpasswd -shared -enablehttpproxy -forever -nolookup -auth /var/run/lightdm/root/:0    
    port = 5900
    flags = IPv6
}
x11vncのパスワードを設定設定。
sudo x11vnc -storepasswd /etc/vncpasswd
xinetd を再起動する。
sudo service xinetd restart

自分自身を「再帰的」にリモートデスクトップ接続すると、ブラウザクラッシュに遭ったかと思うほど、悲惨なウィンドウになるので注意!

XPからUbuntuへの移行メモ(OS編)

カテゴリ : 
ツール
執筆 : 
dohi 2014-2-5 22:14
2014年4月の、XPサポート終了に伴い、開発ツールや事務用ツールをUbuntuへ移行しています。その作業メモです。何かの参考になりましたら・・


インストールメディアの作成とインストール

32bit版は、Ubuntu Japanese Teamのサイトから、12.04LTS Desktop日本語RemixのISOイメージをダウンロードして、DVDに焼き、インストールメディアにする。

64bit版は、英語コミュニティDesktopダウンロードページから、64-bitを指定してISOイメージをダウンロード、インストールメディアを造る。

インストールメディアでUbuntuのGUIが起動するので、インストーラを実行する。
インストールには、インターネットに接続する必要がある。
WiFiの設定は、画面上部ステータスバーの逆三角形アイコンを右クリック。
「サードパーティのソフトウェアをインストールする」チェックボックスをチェックするのがオススメ。
インストール自体は、数分から十数分で完了する。


各コマンドの入力は、terminalシェルから入力する。terminalシェルは、「Ctrl」「Alt」「t」の同時押しで開く。
エディタは、terminalシェルで、geditと入力すると開く。ファイル名を付けてgedit fle_nameとすると、ファイルが存在すればそのファイルを開き、存在しなければファイルを作成する。



rootパスワードの設定

Utuntuインストーラでは、rootのパスワード設定がされないため、rootとしてログインできない。不用意にrootになって、システムを壊さないようにという思想と思われるが、唯一設定した管理ユーザがsudoグループを抜けてしまうと、回復が難しくなるので、rootパスワードを設定する。
sudo passwd
で、「[sudo] password for 自分のユーザ名」と聞いてくるので、先ずはインストール時に設定したパスワードを入力する。続いて「新しいUNIXパスワードを入力してください:」と聞いてくるので、rootのパスワードを設定する。更に「新しいUNIX パスワードを再入力してください:」で、再度rootのパスワードを入力する。以後、
su root
で、rootになる。

sudoグループを抜けてしまった際の、別の対処手段として、予備の管理アカウントを作っておくこともオススメ。
画面上部ステータスバーの一番右、電源アイコンから、システム設定-ユーザーアカウントを開き、ダイアログウインドウの右上から「ロック解除」する。
左下の+ボタンで、アカウントの種類「管理者」で予備アカウントを作成。ダイアログウインドウに戻ったところで、作成したアカウントを選択し、パスワードを設定する。


日本語環境の導入

32bit版日本語Remixは、既に導入み。

64bit版は、Japanese Teamによる追加パッケージの利用方法に従って導入。terminalにて、
wget -q https://www.ubuntulinux.jp/ubuntu-ja-archive-keyring.gpg -O- | sudo apt-key add -
wget -q https://www.ubuntulinux.jp/ubuntu-jp-ppa-keyring.gpg -O- | sudo apt-key add -
sudo wget https://www.ubuntulinux.jp/sources.list.d/precise.list -O /etc/apt/sources.list.d/ubuntu-ja.list
sudo apt-get update
sudo apt-get install ubuntu-defaults-ja
システム設定-言語サポートで、「日本語」と「English」を有効にしておく。


日本語環境ーもうひと手間

geditの文字化けを解消する (GNOME3)に従って設定。
gsettings set org.gnome.gedit.preferences.encodings auto-detected "['UTF-8','CURRENT','SHIFT_JIS','EUC-JP','ISO-2022-JP','UTF-16']"
gsettings set org.gnome.gedit.preferences.encodings shown-in-menu "['UTF-8','SHIFT_JIS','EUC-JP','ISO-2022-JP','UTF-16']"

あまり賢くない日本語入力Anthyに変わり、Mozcをインストールする。
sudo apt-get install ibus-mozc
画面上のキーボードアイコンー再起動、もう一度キーボードアイコンー設定で、インプットメソッドのタブ、「日本語ーMozc」を一番上に。(私は、Anthyを削除しました)


ノートPCなら試してみる価値あり

Ubuntu 12.04 LTS でハイバネートを有効にする方法により、ハイバネートを試す。以下コマンドで、PCをハイバネートし、電源投入でハイバネート前の状態に復旧するかを試す。(ThinkPad T60では、問題なくハイバネート出来ました)
sudo pm-hibernate
うまくいくなら、
sudo gedit /etc/polkit-1/localauthority/50-local.d/com.ubuntu.enable-hibernate.pkla
で、以下の内容のファイルを作成して保存。
[Re-enable hibernate by default]
Identity=unix-user:*
Action=org.freedesktop.upower.hibernate
ResultActive=yes
再起動して、電源アイコンからのメニューに、シャットダウンと同様、ハイバネートがあらわれたら完了。

Ubuntu日本語フォーラムのこのアーティクルにより、バッテリーの充電スレッショルド設定をする。
sudo apt-get install tp-smapi-dkms
sudo modprobe tp-smapi
sudo apt-get install sysfsutils
sudo gedit /etc/sysfs.conf
でファイル(全部コメント行のはず)を開き、末尾に以下を追加して保存。(充電開始、終了の数値を%で設定。例は、残量50%で充電開始、95%で充電停止)
#
# For a LiIon battery
devices/platform/smapi/BAT0/start_charge_thresh = 50
devices/platform/smapi/BAT0/stop_charge_thresh = 95
続いて、
sudo gedit /etc/modules
でファイル(lpのみが記述されているはず)を開き、末尾に以下を追加して保存。
tp-smapi
再起動後、以下コマンドでtp_smapiがロードされていることを確認。
dmesg | grep tp_smapi


好みによりカスタマイズ

IBM PC/XTの83Keyboardや、Happy Hacking Keyboardの様に、CtrlキーをAキーの隣に配置するには、システム設定-キーボードレイアウト-オプション-Ctrlキーの位置で、「CtrlとCaps Lockを入れ替える」チェックボックスをチェック。

ブート時に起動メニュー(grubメニュー)を表示するには、
sudo gedit /etc/default/grub
でフィアルを開き、GRUB_HIDDEN_TIMEOUT=0の行頭に#を付けてコメントアウトして保存。
以下コマンドで、grubをアップデート。
sudo update-grub

Ubuntu12.04ltsにISE14.4をインストール

カテゴリ : 
ツール
執筆 : 
dohi 2013-3-25 20:00
Xilinxは、Ubuntuをサポートしていませんが、動かしている人は多いようです。私の環境でも、動作させることが出来ました。

32bit版なら、Ubuntu Japanから、日本語Remixパッケージをダウンロード可能です。
64bit環境を動かすには、Ubuntu.comのダウンロードーページから、64bit版をダウンロードします。
Ubuntuをインストールすると、管理権のあるuserが一つ出来ますが、「システム設定->ユーザアカウント」で、もう一つ管理権のあるuserを作っておくことがオススメです。Ubuntuは、rootでログインしない前提のようで、インストール直後の状態ではrootのパスワードがわかりません。管理権のあるuserアカウントがもうひとつあることで、万一、普段使っているアカウントから管理権がなくなってしまった場合に、対処することができます。


Xilinxのダウンロードサイトから、Vivado および ISE Design Suite - 2012.4 Full Product Installationの、Linux 用フル インストーラーをダウンロードします。6.5GBもあり、先方のトラフィックにも依りますが、私の回線(200MBPSの、西日本Flet's光)で一時間近く掛かりました。EDK、SDK、ライセンスツール等も含まれているので、他のファイルをダウンロードする必要はありません。(PetaLinuxSDKは、別ファイルになっています)
尚、日本語環境では、デフォルトのダウンロード先が、ユーザーホーム直下の、ダウンロードという名前のディレクトリになりますが、多バイトコードを含んだディレクトリにあると、インストールスクリプトが正しく動かないようです。ダウンロードしたISEのインストーラーを、~/xilinx等の、別のディレクトリにコピーします。

ファイルの解凍は、Ubuntuに標準でインストールされるファイルマネージャで出来ます。(右クリック->ここに解凍する)
端末(シェル)を、Ctrl+Alt+Tで開き、インストールスクリプトを起動します。解凍先が、~/xilinxなら、
cd ~/xilinx/Xilinx_ISE_DS_Lin_14.4_P.49d.3.0
sudo ./xsetup


Cable Driverのインストールには失敗します。
George Smart Wikiソリューションが書かれています。makeの際、64bit版ではlib32を指定するよう書かれていますが、私の環境では、通常のlib(64bit)でmake出来ています。逆に、lib32を指定するとエラーが出ましたが、ドライバーのインストールはできているようです。念の為、64bitのlibでもmakeを掛けています。以下、64bit版の場合です。
sudo apt-get install gitk git-gui libusb-dev build-essential libc6-dev-i386 fxload
cd /opt/Xilinx
sudo git clone git://git.zerfleddert.de/usb-driver
cd usb-driver/
sudo make lib32
sudo make
sudo ./setup_pcusb /opt/Xilinx/14.4/ISE_DS/ISE/
George Smart Wikiのこのページに、ISEのPATHを、.bashrcに設定する方法が書かれていますが、これをしてしまうと、ISE以外のソフトで不具合が出ます。私は、ホームディレクトリにset_xilinxというスクリプトを作って、
set_xilinxの中身
# setting for Xilinx tool
if [ -f /opt/Xilinx/14.4/ISE_DS/settings64.sh ] ; then
   . /opt/Xilinx/14.4/ISE_DS/settings64.sh
fi
ISE実行前に、これを実行しています。
. ./set_xilinx
ise
32bit環境では、set_xilinxのsettings64.shを、settings32.shにします。


ISEのシンセシスで、linuxのコマンドgmakeを使っているため、gmakeの無いUbuntuではエラーになります。コマンド名の齟齬だけなので、makeをgmakeにリンクしておきます。
sudo ln -s /usr/bin/make /usr/bin/gmake
情報源は、XilinxのUserForumです。

私も、インストールして動かしだしたばかりなので、他の問題が見つかり次第、内容を追加していきます。



2013年3月27日追記
ツールからXilinxドキュメントが開けない問題があります。ブラウザにURLを渡すライブラリのバージョンに齟齬があるようで、以下の操作により解決しました。
cd /opt/Xilinx/14.4/ISE_DS/ISE/lib/lin64
sudo mv libstdc++.so libstdc++.so.bak
sudo mv libstdc++.so.6 libstdc++.so.6.bak
sudo mv libstdc++.so.6.0.8 libstdc++.so.6.0.8.bak
sudo ln -s /usr/lib/x86_64-linux-gnu/libstdc++.so.6 ./libstdc++.so.6
32bit環境の場合は、lin64の部分がlinに、x86_64-linux-gnu部分がx86_32-linux-gnu i386-linux-gnuになるかと思います。
情報源は、このアーティクルです。


2013年3月29日追記
Cable Driverのセットアップスクリプト実行が漏れてました。makeのあとに、setup_pcusbの実行を追記しました。
George Smart Wikiのページでは、何故かこの行だけ、プロンプト込で書いてますね。

2013年4月16日追記
libstdc++ライブラリが、Xilinxディレクトリ中の他の場所にもありました。commonとPlanAheadディレクトリです。Xilinx SDKはcommonディレクトリのライブラリを参照しているようです。64bitの場合、以下のリンクを張ります。
cd /opt/Xilinx/14.4/ISE_DS/common/lib/lin64
sudo mv libstdc++.so libstdc++.so.bak
sudo mv libstdc++.so.6 libstdc++.so.6.bak
sudo mv libstdc++.so.6.0.8 libstdc++.so.6.0.8.bak
sudo ln -s /usr/lib/x86_64-linux-gnu/libstdc++.so.6 ./libstdc++.so.6
cd /opt/Xilinx/14.4/ISE_DS/PlanAhead/lib/lnx64.o
sudo mv libstdc++.so.6 libstdc++.so.6.bak
sudo ln -s /usr/lib/x86_64-linux-gnu/libstdc++.so.6 

2013年4月19日追記
sudoが抜けていた記述等を修正しました。
Cable Driverのインストールで、最初にlib32でmakeする必要があったので、修正しました。
ISE13.4、ISE14.5でも、同じ手順でインストール出来ました。

2013年6月11日追記
Ubuntuのライブラリアップデートのためか、fpga_editorが動かなくなりました。以下のエラーが出ます。
/opt/Xilinx/14.5/ISE_DS/ISE/bin/lin64/_fpga_editor: error while loading shared libraries: libXm.so.3: cannot open shared object file: No such file or directory
libmotif4をインストールして、リンクを張ります。
sudo apt-get install libmotif4:i386
sudo ln -s /usr/lib32/libm.so /usr/lib/libXm.so.3
すると、libstdc++でエラーが出ました。
/opt/Xilinx/14.5/ISE_DS/ISE/bin/lin64/_fpga_editor: error while loading shared libraries: libstdc++.so.5: cannot open shared object file: No such file or directory
libstd++5をインストールしてみます。
sudo apt-get install libstdc++5
今度はこのエラーが出ましたが、fpga_editorそのものは、動くようです。
Wind/U Warning (254): The Wind/U Client daemon running in the system has wrong version 0 - should be version 1.
Wind/U Error (193): X-Resource: DefaultGUIFontSpec (-*-helvetica-medium-r-normal-*-14-*) does not fully specify a font set for this locale
Wind/U Error (248): Failed to connect to the registry on server hogehoge

対策を調査中です。

2013年6月12日追記
昨日の追記で、余計なことをしていたようです。シンボリックリンクをやめたら、何がしかエラーは出るものの、fpga editorそのものは動くようになりました。

2014年2月12日 libstdc++.so.6の、32bit時のパスが間違っていたので修正しました。

Metastability、ABEL、PLD考

カテゴリ : 
ツール
執筆 : 
dohi 2009-7-17 23:08
 昔、PLDの開発言語と言えば、DATA I/O社のABELでした。国内のPC周辺機器メーカーに、非常に似た名前の会社が(当時から)あるので、ちょっと混乱したものです。DATA I/Oは、PLDプログラマの名品、29シリーズも作っていた会社ですが、ツールのABELは、Minc Washington社に分社し、その後Xilinx社に買収されました。Xilinx以外の新製品PLDの開発には、ABELが使えなくなったわけです。(それすら、随分昔の話です)
 もう、細かい文法は忘れてしまいましたが、if~then~else形式で状態遷移が自在に記述できるばかりでなく、例えば出力フリップフロップのJ/K入力の論理式を直に書けるなど、極限に論理を詰め込む様な技も使えました。(JK-FFタイプのPLDなど、数品種ぐらいしか無かったのですが)
 Gate Arrayでロジックを設計したときも、安く使える論理合成ツールが無く、ABELが吐き出すProduct Termの論理式を、Gate Arrayベンダのライブラリに置き換えて回路図を書きました。何かの機会に、Minc Washingtonの三上廉司さん(現在はミカミ・コンサルティング)にお会いしたときに、そのことを笑い話にしていました。
 FPGAのPin-to-Pinディレイが、数十ns程度になるまでは、ABEL+PLDは重宝しました。その後FPGAの価格も下がり、各社のFPGA/PLD設計ツールが無償でVHDLやVerilogの論理合成をサポートしたことと、Xilinxへの買収経緯もあり、ABELは役目を終えたのです。

 さて、当時のGAL(Generic Array Logic)のデータブックには、詳細なMatastability Reportが書かれており、Metastable freeであることが、GALの一つの「売り」になっていました。詳細は、「Lattice metastability report」で検索すると、そのものズバリ「Metastability Report」というPDFファイルがヒットしますのでそちらを参照いただくとして、端的に言えば、Setup/Hold Time Violationが起きたときに、FF出力が長時間不安定になるというものです。
 FPGAや、最近のMacro Cell型PLDの場合には、非同期入力に一段、FFを入れれば済む話ですが、FFが出力段にしかないClassic PLDにとっては、Metastable freeであることが大変重要です。さもなければ、PLD出力にMetastableが現れ、後位の回路に伝播してしまいます。
 現在もFPGA/PLDで、Metastability Reportを一般向けに出しているのはLatticeだけですが、通常の設計ではFFによるMetastability Filterを付けるので、トラブルを経験したことはありません。但し、Filter部にはMetastableが起きている(かどうかは、確かめる術を持っていません)ので、これを伝播させないためにトグル周波数に注意しなければなりません。
 二十年近くも前になりますが、某Gate Arrayベンダのエンジニアにうかがったところ、Metastable Timeは、Propagation Delayの六倍程度とのことでした。TPDが2nsのFFで、Route Delayが2nsだとすると、トグル周波数は1/(2*6+2)GHz=71MHz以下でなければ、Metastablity Filterは効かないことになります。

※このブログをご覧になった三上廉司さんからご連絡を頂きました。
現在は、ASIP Solutionsの社長をされています。
http://www.asip-solutions.com/
2010年6月14日追記

SCCのStart Bit検出回路の問題

カテゴリ : 
デバイス
執筆 : 
dohi 2008-10-4 21:59
ASYNC controlerを作りなが、思い出しました。15年ほど前、ZilogのSCC Z85C30を使っていた際のトラブルです。

Asyncで、半二重モデムに繋いでいたのですが、受信に切り替わった際、先頭キャラクタがフレーミング・エラー(STOPビット位置のRXDが、本来レベル"1"であるべきところ、"0"を検出)になる場合があるのです。

HPのプロトコル・アナライザ4951でモニタしても、エラーの位置は異なりますが、同じ現象が出ます。(当時HPには、測定器部門がありました。現在はアジレント

現象から、STARTビット直前にゴミが出ているのだろうと、プロ・アナのエラー出力をトリガにして、ストレージ・オシロで観測するのですが、見あたりません。
長いレンジが取れる測定器で観測すると、ゴミは随分と前の位置にありました。
モデム屋さん曰く、「エキストラ・ビット」と格好言い名前を付けてるんですが、要はゴミです。半二重モデムの宿命のようです。

DCDがoff('1')の間は、秒の単位の時間です。更に、この間はSCCのレシーバをディぜーブルにしているはずなんですが・・・
どうやら、SCCのレシーバ回路は、こんな動作になっているみたいです。
    ・・・・・・・・・・・・・・・・・

process(RXCLK, STATE_REG) begin
    if (STATE_REG = idle) then
        COUNTER <= "0000";
    elsif (RXCLK'event and RXCLK = '1') then
        if (RXD = '0') then
            COUNTER <= COUNTER + 1;
        end if;
    end if;
end process;

process(RXCLK, RX_RESET) begin
    if (RX_RESET = '1') then
        STATE_REG <= idle;
    elsif (RXCLK'event and RXCLK = '1') then
        case (STATE_REG) is
        when idle =>
            if (RXD = '0' and RX_enable = '1') then
                STATE_REG <= hunt;
            end if;
        when hunt =>  -- Start bit検出
            if (RXD = '1') then            -- ゴミ判定
                STATE_REG <= idle;
            elsif (COUNTER = "1000") then  -- start bit?
                STATE_REG <= pending;
            end if;
        when pending =>
            if (COUNTER = "1111") then
                STATE_REG <= is_start_bit;
            end if;

    ・・・・・・・・・・・・・・・・・

RXDは、RXCLKの16倍でサンプルされており、7クロックぐらいの'0'を検出すると、StartBitと判定するんじゃないでしょうか。それ以下だとゴミと判定ですが、一度7クロックを超えてしまうと、RXD='0'が残りのクロック数に達するまで待つ。状態遷移のミスですね。
DCDがonになる毎(送信から受信に切り替わる毎)に、レシーバをリセットするよう、ファームウェアを変更して対応しました。
そして、HPのプロ・アナも、ZilogのSCCを使っていたんだと分かったトラブルでした。

ModelSim LOOP文の怪

カテゴリ : 
ツール
執筆 : 
dohi 2008-10-3 1:18
先日「ダウンロード」にUPした、mwire.vhdをシミュレーションしていて発見した現象です。 例えば、こんなのをシミュレーションします。
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;

entity  mtest is
end mtest;

architecture testbench of mtest is

signal	RESn : std_logic; -- RESET(low active)
signal	CLK  : std_logic; -- CLOCK(10MHz 50%duty)
signal	CTR  : std_logic_vector(7 downto 0); -- binary counter
signal	s_A  : std_logic_vector(7 downto 0); -- copy of CTR
signal	s_B  : std_logic_vector(7 downto 0); -- copy of CTR
signal	s_C  : std_logic_vector(7 downto 0); -- copy of CTR


begin

-- CLK generation
process begin
    loop
        CLK <= '0';
        wait for 50 ns;
        CLK <= '1';
        wait for 50 ns;
    end loop;
end process;

-- RESn generaton
process begin
    RESn <= '0';
    wait until(CLK'event and CLK = '1');
    wait until(CLK'event and CLK = '0');
    RESn <= '1';
    wait;
end process;

-- counter
process (RESn, CLK) begin
    if (RESn = '0') then
        CTR <= "00000000";
    elsif (CLK'event and CLK = '1') then
        if (CTR = "11111111") then
            CTR <= "00000000";
        else
            CTR <= CTR + 1;
        end if;
    end if;
end process;

-- good case 問題ない場合
process (CTR) begin
    s_A(0) <= CTR(0);
    s_A(1) <= CTR(1);
    for i in 2 to 7 loop
        s_A(i) <= CTR(i);
    end loop;
end process;

-- bad case BIT0とBIT1がおかしくなる
s_B(0) <= CTR(0);
s_B(1) <= CTR(1);
process (CTR) begin
    for i in 2 to 7 loop
        s_B(i) <= CTR(i);
    end loop;
end process;

-- good case これは問題ない
s_C(0) <= CTR(0);
s_C(1) <= CTR(1);
process (CTR) begin
    s_C(2) <= CTR(2);
    s_C(3) <= CTR(3);
    s_C(4) <= CTR(4);
    s_C(5) <= CTR(5);
    s_C(6) <= CTR(6);
    s_C(7) <= CTR(7);
end process;

end;
s_A や s_C は、正しく CTR がコピーされるのですが、 s_B の下位bitは、不定になってしまいます。どうも、process文中の、loopの解釈が、うまくできないみたいです。





本来、loopを開けば、s_B と s_C は、全く同じことになるはずですが・・・ ModelSimは、QuatusII Web Editionにバンドルされている、ALTERA WEB EDITION 6.1gというVersionで試しています。

サイトを作ってみました

カテゴリ : 
その他
執筆 : 
dohi 2008-9-26 0:43
メール用ドメインを取ったので、HDLのフリーコードを載せられるようなサイトを開いてみました。 最初は、ホームページビルダーで作ろうとしたのですが、アートの才能が皆無なためか、断念してCSSに頼ることにしました。XOOPS Cubeのホダ塾ディストリビューションを使っています。 機能を調べながらのカスタマイズですが、体裁を考えながらHTMLを書くよりは、遙かに楽です。 現状、ほとんどカラですが、ボチボチ埋めていきます。