月別アーカイブ: 2015年8月

Synthesijer.Scalaでソーティングネットワークを書いてみる

※ kick,busyのクロック遅延が気に入らなかったので若干回路を変更しました(8/19)

ネットワークの構成は,もっともシンプルな構成のひとつである,最大の要素を一番下に落としていくというタイプの実装です. ソーティングネットワーク(Wikipedia)で”バブルソートにあたる”と紹介されているもの,です.

構成要素の実装からはじめて,ネットワークの組み立て部分を紹介していきます.最後にコードの全容を掲載しています.

プリミティブ

ネットワークを構成するプリミティブは,2つの入力を受け取り,小さいほうを上に,大きいほうを下に出力する,というコンポーネントです.

Synthesijer.Scalaで書くとこんな感じです.

// プリミティブを生成するメソッド
// a, bはハードウェア世界の演算要素のインスタンス
def prim_net(a:ExprItem, b:ExprItem):(ExprItem, ExprItem) = {
  val s0, s1 = signal(32) // 新しいsignal(ハードウェア世界の変数)を生成する
  s0 := ?(a > b, b, a) // S0には小さい方を接続
  s1 := ?(a > b, a, b) // S1には大きい方を接続
  return (s0, s1)
}

signal(32)で32bitの信号(VHDLでいうsignal,Verilog HDLでいうwireかreg)をつくり,それぞれに比較器の出力を接続しています.メソッド自体の返り値は,ソート結果が格納された信号インスタンスのペアです.

続きを読む