演算回路
2007年6月27日
演算回路の設計図が完成。CPUの機能を少し変更することになりそう。a1/a2レジスタに、shiftとincrementの両方の機能を搭載すると回路が複雑になるため、shiftの演算結果はxレジスタに出力することにする。ここに書いた回路は、shift命令を含んでいる。

(追記:A0-A4はアドレスラインではなく、コマンドの0-4ビット目の間違い)
回路が正しく動作するかどうかのシミュレーションをPHPで組んでみた。回路に該当する部分のソースコードは、以下のとおり。

(追記:A0-A4はアドレスラインではなく、コマンドの0-4ビット目の間違い)
回路が正しく動作するかどうかのシミュレーションをPHPで組んでみた。回路に該当する部分のソースコードは、以下のとおり。
class add_sub extends logic74 {
function add_sub(){
$this->init(func_get_args(),9);
}
function output(){
$com0=$this->inputs[0];
$com1=$this->inputs[1];
$com2=$this->inputs[2];
$com3=$this->inputs[3];
$com4=$this->inputs[4];
$i1=$this->inputs[5];
$i2=$this->inputs[6];
$cl=$this->inputs[7];
$cu=$this->inputs[8];
$xor_1 = new XOR74 ($cl,$i2);
$nand_1 = new NAND74($i1,$i2);
$nor_1 = new NOR74 ($i1,$i2);
$nand_2 = new NAND74($cl,$i2);
$nand_3 = new NAND74($xor_1->output(),$i1);
$nand_4 = new NAND74($cu,$com1);
$nand_5 = new NAND74($cl,NOT74::output($com1));
$nand_6 = new NAND74($nand_2->output(),$nand_3->output());
$nand_7 = new NAND74($xor_1->output(),$com3);
$nand_8 = new NAND74($nand_4->output(),$nand_5->output());
$nand_9 = new NAND74($nand_1->output(),$com0);
$nand_10= new NAND74($nor_1->output(),NOT74::output($com0));
$xor_2 = new XOR74 (1,$nand_7->output());
$xor_3 = new XOR74 ($nand_6->output(),$xor_2->output());
$xor_4 = new XOR74 ($xor_1->output(),$i1);
$nand_11= new NAND74($nand_9->output(),$nand_10->output());
$nand_12= new NAND74($nand_8->output(),NOT74::output($com2));
$nand_13= new NAND74($nand_11->output(),$com2);
$nand_14= new NAND74($nand_12->output(),$nand_13->output());
$nand_15= new NAND74($xor_3->output(),NOT74::output($com4));
$nand_16= new NAND74($i1,$com4);
$nand_17= new NAND74($nand_15->output(),$nand_16->output());
$nand_18= new NAND74($xor_4->output(),NOT74::output($com4));
$nand_19= new NAND74($nand_14->output(),$com4);
$nand_20= new NAND74($nand_18->output(),$nand_19->output());
return array('o'=>$nand_20->output(), 'co'=>$nand_17->output());
}
}