高位合成がやってきた、ヤァ!ヤァ!ヤァ!

cherry syn は、高位合成って言われてるツールの、僕が一人で作ったバージョンだけど、まぁ C 言語みたいな言語で書いた記述からデジタル順序回路を生成するツール、かな。誰でも簡単にデジタル回路を作れることを目指したもの。高位合成も今は色々あるみたいだけど。

とりあえず書いてみよう。


process logicboy(clkin uint#1 clk, rstin uint#1 rst, in uint#8 din1, in uint#8 din2, out uint#8 dout)
{
	dout = din1 + din2;
}

これを、cherry syn で、Cherry C って赤で書いてあるテキストエリアに打ち込んで、Synthesis っていう赤いボタンをクリックすると、VHDL 記述が出てくる。(これから Xilinx の ISE っていうツールで論理合成、マッピングをして、FPGA のコンフィグレーションファイルを生成する。)Firefox ブラウザか、Chrome ブラウザで動作させてね。Chrome の場合、ポップアップを許可する設定をする必要がある。

自分で打ち込むのが面倒な人は、cherry syn ページの右、Tutorials て書いてあるところに、tutorial1_1.chc というボタンがあるので、それをクリックすれば自動で入力してくれるよ。

さぁ、Synthesis ボタンを押すと、回路が合成されて、いくつかボタンが出てくる。このうち、view RTL schematic の logicboy って書いてあるボタンを押すと、最終的に生成された回路の絵が見れる。

一応、コントローラ Ctrl が書かれてるけど、一状態なので、ないのと同じ。加算器が一つあるだけの単なる組み合わせ回路だね。これじゃ高位合成を使う意味がないけど、ちょっと見てみて。

さっきの記述に戻ろう。logicboy がプロセス名で、これは何でもいい。process のパラメータの最初の二つはクロック、リセットで、必ず書かなければならない。


process logicboy(clkin uint#1 clk, rstin uint#1 rst, ...

それでは、次のように書き直して Synthesis をクリックしてみよう。(tutorial1_2.chc としてご用意いたしております^^)


process logicboy(clkin uint#1 clk, rstin uint#1 rst, in uint#8 din1, in uint#8 din2, out uint#8 dout)
{
	while (1) {
		dout = din1 + din2;
		dout = din1 - din2;
	}
}

Process logicboy's RTL を見てみると、今度は AddSub っていう加減算器がある。しかもコントローラの出力が3つになってるし、or ゲートみたいなやつも生成されてる。

これはね、1クロックごと、加算、減算を交互にやる記述。まぁそんな回路の用途はないかもしれんけど^^

それでは、”view CDFG”のlogicboyって書いてあるボタンを押して、出てくるウインドウを見てみよう。0, 1, 2 という数字が縦に並んでて、緑の横線で絵が縦に3つに区切られてる。一番上がステップ 0、次がステップ 1、一番下がステップ 2 となってて、基本的には、クロックに同期して状態が遷移していく。とは言えループがあるので 0, 1,と進んで、2 で終わりじゃなくて、0,1,2,1,2,1,2... と永遠に遷移していく。ピンク色の Label, Jump To というのを見れば、どのように遷移していくかがわかる。0, 1, と進んで、2 まで来たら、Jump To _L0_ で Label:_L0_ に飛ぶ。

ステップ 1 では、赤の入力 In(din2)、In(din1) からデータを入力して、オレンジのAdd:0 で加算をして、赤の Out(dout) でデータを出力する。

同様にステップ2では減算をする。

この加算、減算が一つの加減算器にマッピングされ、さっきの RTL 回路となるって訳。

CDFG は、高位合成の専門用語でコントロールデータフローグラフと言って、入力された記述をデータフロー解析してグラフに表したもの。まぁ、見ればわかるよね^^

RTL は、論理合成の専門用語でレジスタトランスファレベルと言って、演算器とか、レジスタとか、コントローラとか、ハードウェアの"構造"を表したものなんだ。

さて、Synthesis が終わると、VHDL というテキストエリアに VHDL 記述が、UCF というテキストエリアに FPGA のピン割り当ての情報(今は空っぽ)が出来る。これらを Xilinx のツールに入力すれば FPGA のコンフィグレーションデータができるんだ。それはまた後でやるよ。

ここで、ちょっと生成された VHDL を見てみよう。もちろん、VHDL を理解する必要はない。理解しなくても設計できるようにするのが僕の目標だから。ただし、出来た回路にどんな入出力ピンができるのかぐらいは、見ておかなきゃいけない。

entity LOGICBOY is
	port (
		CLK: in	std_logic;
		RST: in	std_logic;
		DIN1: in	std_logic_vector(7 downto 0);
		DIN2: in	std_logic_vector(7 downto 0);
		DOUT: out	std_logic_vector(7 downto 0);
end LOGICBOY;

これが、その入出力ピンが記述されたところ、CLK, RST はクロック入力とリセット入力。cherry syn で生成された順序回路は、クロックの立上がりに同期して動く。リセット入力は非同期の負論理、つまり L になるとリセットがかかり、H に戻ると回路が動き出す。

DIN1, DIN2 は入力、DOUT は出力。

よーし、それでは元に戻って、色々書き直して遊んでみよう(tutorial1_3.chc)。

process logicboy(clkin uint#1 clk, rstin uint#1 rst, in uint#8 din1, in uint#8 din2, out uint#8 dout)
{
	while (1) {
		uint#8 d;

		d = din1 + din2;
		dout = d;
		dout = din1 - din2;
	}
}

これも同じ結果になるけど、変数 d を使って din1 + din2 を一旦 d に代入した。

今のバージョンの cherry syn では、C 言語のように

uint#8 d = din1 + din2;

とも書けるようになってる。ただし、変数の宣言は必ず { } で囲まれたブロックの先頭になければいけない。

dout = d;
uint#8 d2 = 2;

とかは出来ない。

さぁ、if 文を使ってみよう!(tutorial1_4.chc)

process logicboy(clkin uint#1 clk, rstin uint#1 rst, in uint#8 din1, in uint#8 din2, out uint#8 dout)
{
	while (1) {
		uint#8 d;

		d = din1 + din2;
		dout = d;

		if (d > 3)
			dout = din1 - din2;
		else
			dout = din1 + din2;
	}
}

まず d に din1 + din2 を代入し dout に出力。そんでもしそれが 3 より大きければ dout に din1-din2 を、そうでなければ din1+din2 を出力する。

ちなみに入力 din1, din2 は、変数じゃなくて入力だから、右辺式に書いたらその都度入力が行われるからね。一度入力して何度も同じ値を使いたいときは、一旦変数に代入しよう。

CDFG を見てみよう。今度はステップ 2 に Else, Then ていうピンクの囲いがある。もちろん、条件によってその中のモノが実行されるという意味。

生成された RTL 回路には、あれ不思議、加減算器が一つしかない。もちろん、実行するサイクルが違えば演算器はシェアできるし、条件が排他的であってもシェアできる。つまり一つで良い。同じように、レジスタのシェアリングも行われる。

面白くなってきたでしょ^^さぁ、今日はここまで。これだけも、活用出来る人はいるんじゃないかな^^

それでは皆さま、さようならー。