組み合わせ回路の書き方

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


combinational unisdair (
	in uint#4 pin<38,37,32,31> ph, out uint#4 pin<30-27> phl,
	in uint#1 pin<2> en1, out uint#1 pin<7> en1l, 
	in uint#1 pin<41> en2, out uint#1 pin<8> en2l,
	in uint#1 pin<14> rdr, out uint#1 pin<42> tristate rd,
	in uint#1 pin<19> senser, out uint#1 pin<39> tristate sense,
	in uint#1 pin<40> wdat, out uint#1 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 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 のロジックなんだけど、実は組み合わせ回路なんだ。"process" の代わりに "combinational" と書く。記述の本体には論理式だけを書く。それだけ^^

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

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