組み合わせ回路の書き方

ご無沙汰です。Version 0.6 から、組み合わせ回路を書けるようになったよ。実は以前から書けたんだけど、使わないクロックやリセットを書かなければいけなかったりしたので、少し改良した。


combinational unisdair (
	in uint#4 pin<38,37,32,31> ph, out uint#4 donly pin<30-27> phl,
	in uint#1 pin<2> en1, out uint#1 donly pin<7> en1l, 
	in uint#1 pin<41> en2, out uint#1 donly pin<8> en2l,
	in uint#1 pin<14> rdr, out uint#1 donly pin<42> tristate rd,
	in uint#1 pin<19> senser, out uint#1 donly pin<39> tristate sense,
	in uint#1 pin<40> wdat, out uint#1 donly pin<18> wdatl,
	out uint#1 pin<20> en1out,
	in uint#1 pin<21> iic,
	in uint#1 pin<22> intdrv,
	in uint#1 pin<5> wreq, out uint#1 donly pin<13> wreql,
	in uint#1 pin<21> c_20,
	in uint#1 pin<43> driveno,
	out uint#1 pin<6> dik35
) {
	uint#1 en1s, en2s, en2ss, intdrvs, c_20s, drivenos;
	uint#4 phs;

	c_20s = c_20;
	intdrvs = intdrv;
	en2ss = en2;
	drivenos = driveno;

	en1s = en1;
	en2s = (!en1s | (c_20s?~en2ss:en2ss));

	phs = ph;
	phl = phs;
	wreql = wreq;
	wdatl = wdat;

	if (c_20s & intdrvs) {
		if (!drivenos) {
			en1out = en1s;
			en1l = 1;
			en2l = en2s;
		} else {
			en1out = en2s;
			en2l = 1;
			en1l = en1s;
		}
	} else {
		en1out = 1;
		en1l = en1s;
		en2l = en2s;
	}

	if ((!en1s) || (!en2s)) {
		if ((!c_20s) | !((intdrvs&(!en1s)&(!drivenos))|(intdrvs&(!en2s)&drivenos))) {
			rd = rdr;
			sense = senser;
		}
	}
	dik35 = 0;
}

これ (tutoroal6_1.chc) は UNISDISK Air のロジックなんだけど、実は組み合わせ回路なんだ。以前はクロック入力に使っていた 43 ピンを、ドライブ番号の切り替え用に使いたかったので、ちゃんと組み合わせ回路を書けるように cherry syn を改良したという訳。

"process" の代わりに "combinational" と書く。記述の本体には while 文は書かずに、論理だけを書く。それだけ^^

まぁ組み合わせ論理なら VHDL で書けるけど、他のプロセスと並べてトップレベルでインスタンスする場合、cherry C で書けた方が便利だからね。

それでは、またお会いしましょう!