always @(posedge tclk or posedge reset) begin if (reset) begin acc<=0; latch<=0; c<=0; z<=0; end else begin if(select[5]) begin casex(ir[7:5]) 3'b000: begin {c,latch}<=acc + d_bus; z<=((acc + d_bus)==4'b0); end 3'b001: begin {c,latch}<=acc - d_bus; z<=((acc - d_bus)==4'b0); end 3'b010: begin {c,latch}<=~(acc & d_bus); z<=(~(acc & d_bus)==4'b0); end 3'b011: begin {c,latch}<=acc << 1; z<=((acc << 1 )==4'b0); end default: latch<=acc; endcase end if(select[6]) acc<=d_bus; end end assign d_bus= (select[1]) ? latch: 4'bz;
always @(posedge tclk or posedge reset) begin if (reset) begin pc<=0; ir<=0; end else begin if(select[7]) pc<=ir[4:0]; else if(select[4]) pc<=pc+5'b1; else if(select[3]) ir[3:0]<=d_bus; else if(select[8]) ir[7:4]<=d_bus; end end assign a_bus=(select[0])? pc: ir[4:0]; assign halt=(ir==8'hff);
always @(posedge sclk or posedge reset) begin if (reset) ss<=3'b000; else case (ss) 3'b000: begin select<=9'b000001001; ss<=3'b001; end // fetch cycle 1 3'b001: begin select<=9'b000010000; ss<=3'b010; end // fetch cycle 2 3'b010: begin select<=9'b100000001; ss<=3'b011; end // fetch cycle 3 3'b011: begin select<=9'b000010000; ss<=3'b100; end // fetch cycle 4 3'b100: // exec cycle 1 casex (ir[7:5]) 3'b0XX: begin select<=9'b000100000; ss<=3'b101; end 3'b100: begin select<=9'b001000000; ss<=3'b000; end 3'b101: begin select<=9'b000100000; ss<=3'b101; end 3'b110: begin if(~c) begin select<=9'b000000000; ss<=3'b000; end if(c) begin select<=9'b010000000; ss<=3'b000; end end 3'b111: begin if(~z) begin select<=9'b010000000; ss<=3'b000; end if(z) begin select<=9'b000000000; ss<=3'b000; end end endcase 3'b101: // exec cycle 2 casex (ir[7:5]) 3'b0XX: begin select<=9'b001000010; ss<=3'b000; end 3'b101: begin select<=9'b000000110; ss<=3'b000; end endcase endcase end