So-net無料ブログ作成
-| 2012年04月 |2012年05月 ブログトップ
- | 次の10件

部品(クロック載せ替え) [HDL]

信号のクロック載せ替えを行うモジュールです。
こういうモジュールでは非同期リセットを使ってます。

i_clkに同期したi_sigを、o_clkに同期したo_sigにつなぎます。sigwパラメーターは信号の本数です。i→oへ載せ替えた信号(fwd)を、o→iへ載せ替え返して戻します(ret)。相手が信号を受け取ったことを確認するためです。ハンドシェイクを行っているので、双方のクロックの周波数がどんな関係でも使えます。
fwd、retの[1]は必ずメタステーブル状態になるので使えません。[2]以降も可能性はありますが確率は下がるのでこれを使います。できれば[1]~[2]以降の距離(遅延時間)に制約をかけます。
modeでそのまま、立ち上がり、立ち下がりを切り替えてます。

`timescale 1ns / 1ps
`default_nettype none

module  signal_transit
#(
  parameter  sigw  = 1,  // signal width
  parameter  mode  = ""  // mode, "","UP","DOWN"
)
(
  // common
  input   wire             a_rst,  // Async Reset
  // input
  input   wire             i_clk,  // clock
  input   wire [sigw-1:0]  i_sig,  // signal
  // output
  input   wire             o_clk,  // clock
  output  reg  [sigw-1:0]  o_sig   // signal
);
  generate
    genvar i;
    for (i = 0; i < sigw; i = i+1) begin  : sigwL
      reg    [3:1]  fwd;    // [1] may have meta-state
      reg    [2:1]  ret;    // [1] may have meta-state
      reg           i_trg;  

      always @(posedge a_rst or posedge i_clk) begin
        if (a_rst) begin
          i_trg  <= 'b0;
          ret    <= 'b0;
        end
        else begin
          if      (i_sig[i] )  i_trg  <= 1'b1;
          else if (ret[2])     i_trg  <= 1'b0;

          ret    <= {ret[  1], fwd[2]};  // return
        end
      end

      always @(posedge a_rst or posedge o_clk) begin
        if (a_rst) begin
          fwd       <= 'b0;
          o_sig[i]  <= 'b0;
        end
        else begin
          fwd    <= {fwd[2:1], i_trg };  // forward

          if      (mode == "UP")    o_sig[i]  <= (fwd[3:2] == 2'b01);  // Up-Edge
          else if (mode == "DOWN")  o_sig[i]  <= (fwd[3:2] == 2'b10);  // Down-Edge
          else                      o_sig[i]  <= fwd[2];               // Normal
        end
      end
    end
  endgenerate

endmodule

`default_nettype wire

複数本数の信号が載せ替えられますが、当然データのやりとりには使えません。それぞれ独立した信号として扱います。

回路図追加。リセットとかエッジの記述は省いてます。仕組みはわかりやすいですが、AND-ORの部分はHDLの方がわかりやすそうです。
signal_transit.png

OpenIndiana 151a導入メモ [PC]

G7 ML110へOIを導入したときのメモ。こちらの記事そのままです。
Lunatilia様の記事
本来はiLOから操作すればISOマウントして画面キャプチャも撮れて楽なんですが、ライセンス買ってないので、CDRに焼いて、USBキーボードつないで、VGAつないでやってます。
今回は151a server(テキストインストール)を使用。

・インストール前に、まずはBIOSの電源設定を変更。 「Power Regulator for ProLiant:」が最初は「HP Dynamic Power Savings Mode」になってると思いますが、これを「OS Control mode」へ。 変更しなくてもインストールに支障ありませんが、OSから電源管理が見えないようです。ひょっとしたらBIOSで電源管理させた方が消費電力低いかも知れませんが。 ESXiなどでは変更必須みたいです。

・CDRにISOイメージを焼いて起動。
・キーボードと言語の選択。自分は47:USキー、15:Japanを選択。
以下、続行はF2キー、戻るのはF3キーです。
・Diskの選択。USB(c2t0d0)を選択。
・「Use the whole disk」を選択。
・Computer Nameを入力。
・ネットワークの設定「Automatically」は自動でDHCPも有効に。「None」は設定無し。どちらかを選ぶ。後からStatic IPにするのでどちらでもよいが、Automaticallyにしておくとnameserverとか自動設定されるみたいで、ちょっとだけ楽?
・Time Zone。Asia、Japanを選択。
・日時設定。
・ルートパスワードの設定とユーザの追加。sshで管理者として入るときはこのユーザになります。
以上で準備完了。F2でインストール開始です。
だいたい2~30分程度でインストール完了です。F8キーでリブート。初回の起動だけサービスの設定などでちょっと時間かかります。loginプロンプトが出てきたらログイン。

・Static IPに変更します。192.168.0.11/24にしています。

# svcadm disable nwam
# svcs -a | grep nwam
disabled       00:00:00 svc:/network/physical:nwam

# vi /etc/nodename
サーバーの名前

# vi /etc/defaultrouter
192.168.0.1

# vi /etc/inet/netmasks
192.168.0.0  255.255.255.0

# vi /etc/resolv.conf
nameserver 192.168.0.1

# mv /etc/nsswitch.conf /etc/nsswitch.conf.org  いらない?
# cp -p /etc/nsswitch.dns /etc/nsswitch.conf

# dladm show-phys
LINK         MEDIA                STATE      SPEED  DUPLEX    DEVICE
e1000g0      Ethernet             up         1000   full      e1000g0
e1000g1      Ethernet             unknown    0      half      e1000g1

# ipadm create-if e1000g0
# ipadm create-addr -T static -a 192.168.0.11/24 e1000g0/v4

# svcadm enable svc:/network/physical:default

# svcs -a | grep physical
disabled       00:00:00 svc:/network/physical:nwam
online         00:00:00 svc:/network/physical:default

# ifconfig e1000g0
e1000g0: flags=1000843 mtu 1500 index 4
        inet 192.168.0.11 netmask ffffff00 broadcast 192.168.0.255
        ether e8:39:35:xx:xx:xx

# reboot
これでsshでログイン可能になります。TeraTermとかを使ってログイン。suでスーパーユーザーに。

まずは一発アップデート。ネットワークの設定に問題があると、ここで「見つからない」というエラーが出てきます。

# pkg image-update
WARNING: pkg(5) appears to be out of date, and should be updated before
running update.  Please update pkg(5) using 'pfexec pkg install
pkg:/package/pkg' and then retry the update.
pkd自体の更新が必要という事なので、まず更新し、再度image-update。
# pkg install pkg:/package/pkg
# pkg image-update
ダウンロードする更新パッケージは200MB弱。ちょっと時間かかります。完了するとopenindiana-1が出来ます。以前の環境はzfsのスナップショットで取ってあるみたいです。リブートで更新を有効に。の前にgrubのタイムアウトを短くしておきましょう。
# vi /rpool/boot/grub/menu.lst
timeout 5 ←元の30秒から変更
USBメモリなので、rootのatimeを切ってみます。どこかで不具合が出るかもしれません。そこはやはりHDDやSSDにした方が安全でしょう。
# zfs get atime
NAME                                          PROPERTY  VALUE  SOURCE
rpool                                         atime     on     default
rpool/ROOT                                    atime     on     default
rpool/ROOT/openindiana                        atime     on     default
rpool/ROOT/openindiana-1                      atime     on     default
rpool/export                                  atime     on     default
rpool/export/home                             atime     on     default
rpool/swap                                    atime     -      -
# zfs set atime=off rpool
# zfs get atime
NAME                                          PROPERTY  VALUE  SOURCE
rpool                                         atime     off    local
rpool/ROOT                                    atime     off    inherited from rpool
rpool/ROOT/openindiana                        atime     off    inherited from rpool
rpool/ROOT/openindiana-1                      atime     off    inherited from rpool
rpool/export                                  atime     off    inherited from rpool
rpool/export/home                             atime     off    inherited from rpool
rpool/swap                                    atime     -      -
下位には継承されるので、rpoolだけ変更すればOKです。 他にもchecksum=fletcher4とかcompression付けるとかお好みで。

パワーダウンの設定。まずはzpoolのデバイスを確認。

# zpool status
  pool: datapool
 state: ONLINE
config:

        NAME        STATE     READ WRITE CKSUM
        datapool    ONLINE       0     0     0
          raidz2-0  ONLINE       0     0     0
            c3t0d0  ONLINE       0     0     0
            c3t1d0  ONLINE       0     0     0
            c3t2d0  ONLINE       0     0     0
            c3t3d0  ONLINE       0     0     0

errors: No known data errors

  pool: rpool
 state: ONLINE
  scan: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        rpool       ONLINE       0     0     0
          c2t0d0s0  ONLINE       0     0     0

errors: No known data errors
c3t?d0が対象です。試しに15分で設定。
# vi /etc/power.conf
autopm                  enable
device-thresholds	/dev/dsk/c3t0d0		15m
device-thresholds	/dev/dsk/c3t1d0		15m
device-thresholds	/dev/dsk/c3t2d0		15m
device-thresholds	/dev/dsk/c3t3d0		15m
# pmconfig -r
何も言わないけど、ホントに効いてるのかな…?一応効いてるみたいですが。

一般ユーザの追加。-mを付けておくとzfsに新しくファイルシステムが作られます。ちなみに、この人はsu出来ません。

# useradd -u 1001 -g staff -d /home/daresore -s /bin/bash -m daresore

sambaの導入。正直どれが正しいパッケージなのかいまいちわからないけど、これで動いてるので良しとします。最近セキュリティホールが見つかってますし、ホントはソースからビルドするのが正解なんだとは思います。

# pkg install SUNWiconv-extra
# pkg install SUNWiconv-unicode
この2つはいる?いらない?わからないです。
入れなくても日本語名のファイルで問題ないみたいですが…

# pkg install SUNWsmba
# cp -p /etc/samba/smb.conf-example /etc/samba/smb.conf
# vi /etc/samba/smb.conf
   workgroup = HYGROUP
   server string = server name
   unix charset = UTF-8
   dos charset = CP932
   display charset = UTF-8
など、お好みに応じて編集。

# svcadm enable samba
# svcadm enable wins
# svcs 確認
# smbpasswd -a daresore  ユーザ追加

rsyncdを走らせる。 こちらを参照。

# cp rsyncd.xml /var/svc/manifest/network/
# cp rsyncd /lib/svc/method/
# chmod u+x /lib/svc/method/rsyncd
# cp rsync /etc/default/

# vi /etc/rsyncd.conf
use chroot = yes
read only = no
log file = /var/adm/rsyncd_upload.log
log format = - %a - %f
transfer logging = no

[share]
path = /export/share
comment = share

# svccfg -v import /var/svc/manifest/network/rsyncd.xml
svccfg: Taking "initial" snapshot for svc:/network/rsyncd:default.
svccfg: Taking "last-import" snapshot for svc:/network/rsyncd:default.
svccfg: Refreshed svc:/network/rsyncd:default.
svccfg: Successful import.
# svcs -a | grep rsync
online         22:38:53 svc:/network/rsyncd:default

# rsync -v localhost::share
/etc/rsyncd.confで公開したフォルダが見えるはずです。

とりあえず、ここで一段落です。

HP ProLiant G7 ML110 (その1) [PC]

HPのProLiant MicroServer(AMD AthlonII N36L 1.3GHzバージョン)にOpenIndiana、2Tx4のraidz2ボリュームという組み合わせでNAS+ちょっとしたサーバーを組んでます。2Tx4は割と最近導入したばかり。正直がら空きですが(笑)。
HDDには良くないのですが、スピンダウンさせると27~8W程度の消費電力(ワットモニター読み)となり、常時ONでも経済的。去年の震災以降は使うときだけ電源入れてますが、リモート管理カードのおかげでこれも便利です。
しかし飽きてきたのでサーバー強化のため、タイトルのサーバーをポチりました。クーポン券で11800円という例の所です。nonECC非対応らしいので、4GBx2のDIMMも購入。CeleronとはいえSandy Bridge世代の2コアですから、十分です。


構成などは省略して。良く出来てます、このサーバー。PCよりずっとサーバーっぽい作りだと思います。電源投入時にすごいファンの音がします(笑)少し経つと十分静かになるので大丈夫でしょう。ただし、PCIeに拡張カードを挿すとちょっとうるさくなります。夏場どうなるかも心配ですが。
最近のPCのように「大口径のファンをゆっくり回す」ような作りでは無いです。90mmのファンをそれなりの速度で回してます。機械的にはこっちの方が信頼性は上がるでしょう。無理にゆっくり回すと故障しやすくなりますからね。
しかし立ち上げ時間もサーバーっぽいです。OS起動「開始」までだいたい2分弱。スリープも出来ませんのでデスクトップ用途ではつらいでしょう


早速8GBのUSBメモリを内部のUSBコネクタに挿して、OI 151aを導入。raidz2ボリュームをimport。sambaとかrsyncdとかnfs入れて、他のサービスはおいおい。特に問題起こさずに完了しました。
スピンダウンしたときの消費電力は・・・27W?性能は圧倒的で電力同等じゃないか。やばいぞAMD。がんばれAMD!。
まぁ負荷かけたときはそれなりに食いますが。

こうなると欲が出てきます。標準の電源は効率が悪いので、ちょっと死蔵状態だったAntec EA-380D(80Plus Bronze)を引っ張り出してきて換装。電源コネクタの出っ張りが当たるけど、そんなのは剪定ばさみでジョッキン。(よい子は真似しないで下さい。せめてちゃんとした工具を使いましょう。)

R0026090.JPG
消費電力はアイドル22~3Wに。ファイル転送中も45W程度。最近の80Plusならもっと下がりそうです。優秀ですね~。



部品(リセットの同期化) [HDL]

共通で使ってる部品も残しておきます。
これは非同期リセットを同期化するモジュール。クロック1個に対して最低1つ実装します。クロックが止まっていてもリセットが入るように、リセットするときは非同期。リセット解除はクロック同期で、クロックとリセットがレーシングしないようにしてます。
パラメーターsrwはリセット解除後、何クロックリセットを維持するか、になります。2以上を設定します。

`timescale 1ns / 1ps
`default_nettype none

module  sync_reset
#(
  parameter  srw  = 2  // shift register width
)
(
  input   wire  a_rst,
  input   wire  clk,
  output  wire  rst
);
  reg   [srw:1]  rsr;

  always @(posedge a_rst or posedge clk) begin
    if (a_rst)  rsr  <= {srw{1'b1}};          // Async Reset
    else        rsr  <= {rsr[srw-1:1],1'b0};  // Sync Reset Release
  end

  assign rst  = rsr[srw];

endmodule

`default_nettype wire

library ieee;
use ieee.std_logic_1164.all;

entity sync_reset is
  generic  (
    srw  : integer  := 2
  );
  port (
    a_reset : in   std_logic;
    clock   : in   std_logic;
    reset   : out  std_logic
  );
end sync_reset;


architecture RTL of sync_reset is
  signal  rsr  : std_logic_vector(1 to srw);
begin
  process (clock, a_reset)
  begin
    if (a_reset = '1') then
      rsr  <= (others=>'1');                   -- Async Reset
    elsif (clock'event and clock = '1') then
      rsr  <= '0' & rsr(1 to srw-1);           -- Sync Reset Release
    end if;
  end process;

  reset  <= rsr(srw);
end  RTL;  -- of sync_reset


回路図追加。こういうのは図の方がわかりやすいですね。
sync_reset.pngリセット同期化
ちなみに回路図入力にはQuartusII使ってます。もちろん実際に使うことは無いのですが、回路図の清書には便利です。

最初に(その2) [HDL]

記述上の癖です。

バス幅とかはだいたいパラメータ化してます。
例えばAXIのアドレスは32bitと決まってるんですが、[31:0]とは記述してません。以下のように書いてます。
parameter axaw = 32;
wire [axaw-1:0] address;

なぜ?まどろっこしい。
例えば「wire [31:0] signal;」と書かれたこの信号、32bitというのはデータの幅でしょうか?アドレスの幅でしょうか?
というのがわからないのが気持ち悪いので…元々ソース中にマジックナンバー的な数字を入れることに抵抗があり、こういったマクロやパラメータをよく使います。

一見、パラメタライズされたモジュールができあがるように見えてしまうのですが、数値が変動することを想定しているとは限らないので、「パラメータで与えてるけど数値は変えちゃダメ」という妙なモジュールになってしまうのが問題です。

最初に [HDL]

最近AXIとか勉強中です。
趣味とは言え、一応決まりとかポリシーみたいのを並べてみます。自分にとっても再確認。この決まりは増えたり減ったり都合で書き換わったり例外措置を平気で認めたりします(笑)

(1)ターゲットはシミュレーションとFPGA。趣味だし。
結果、以下が決まります。
(1.1)同期回路が基本。
(1.2)同期リセットがデフォルト。非同期リセットは注意して使う。
この方がFPGAのツール側の自由度が上がります。FPGAのファミリによっては非同期リセットが使えないブロックを持つ物もありますし(XilinxのDSPブロックとか)。
非同期リセットを特別扱いにします。基本、クロックが無いところとか、クロックをまたぐところだけで使うようにします。

あと、
(1.3)リセットやクロックイネーブルは正論理で。
TTL全盛時代からロジックやってる人は頭の中が負論理な人もいます(自分もそう)が、FPGAによってはこれら制御信号が正論理のみというのもあります。負論理をサポートしたFPGAもありますが、サポートされてない方に合わせてます。

で、これからの流行りはたぶんこっち方向。
(2)合成は階層維持で。それで性能出すように心がける。
前のリセットの論理を気にするのも、次の出力のレジスタ化も、これが引っかかってたりします。

そして、性能を出しやすくするための決まり。
(3)モジュールの出力は必ずレジスタ(FF)化する。
(4)入力は可能ならレジスタ化する、のは実際難しいのでほどほどであきらめる。

モジュールの出力はレジスタ化する、これは極力守る。
ただし実機で使わないシミュレーションモデルは特にこの辺関知しないです。
(↑早速の例外事項)

もちろんこれらに縛られて物が作れないのでは本末転倒なので、必要があれば景気よく無視します。
(↑早速の例外事項その2)

intel NIC [PC]

メインのPCはP8Z86-M+i7 2600Kなのですが、NASからのリードが恐ろしく遅い。GbEなのにだいたい2MB/s以下。書き込みは7~90MB/s出るのに。HUBやケーブルを変えても変わりません。というか他のPC(ノート)では速度が出てます。NASから動画データなどを再生しながらファイル転送するとちゃんと速度が出るとか、どうも挙動が変です。ちなみにRealtekの蟹NIC。
ドライバーを入れ替えてもダメなので、「Gigabit CT Desktop Adapter EXPI9301CT」に差し替えました。で、あっさり問題解決。Read/WriteともにちゃんとGbEの帯域使ってます。
ということで、オンボのNICは当てにしてはダメなようです。

ギガビット CT デスクトップ・アダプタ EXPI9301CT

ギガビット CT デスクトップ・アダプタ EXPI9301CT

  • 出版社/メーカー: インテル
  • メディア: Personal Computers



nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

とりあえず始めてみました。

最初は勉強中のAXIあたりがネタになりそうです。
- | 次の10件
-|2012年04月 |2012年05月 ブログトップ

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。

×

この広告は1年以上新しい記事の更新がないブログに表示されております。