指令译码电路(取指令) - 每个时钟周期的脉冲来临时,就进行一次取指令、译码、并执行 - 被译码后,相应的电路执行指令预设的动作进行操作
这个译码电路相当有5个输入,共2的5次方种输入可能性,6个输出,2的6次方种输出可能性。然而仔细分析之下,我们需要的有意义的操作指令和相应的输出无外乎以下这些情况。
所以,总的运行架构框图如图所示
这个指令译码电路,设计过程看起来稍显复杂,然而它只是一个与时序无关的纯组合逻辑电路。参照表格所列,将所有输出结果用采用数字电子技术课本中的最小与或表达式写下,并运用包括德摩根定律在内的逻辑代数定律适度整理后,权衡器件选择和数量,就可得出如下最终的译码电路。
最后是编程指令集
TD4 中定义了十二种类型的指令,这里汇总了所有指令的列表。下图右端所示的 SelB、SelA、Ld0、Ld1、Ld2、Ld3 表示根据操作码和标志创建的解码信号。
将立即数数据传送到 A 寄存器。 在运行时,它不受 C 标志的影响。执行后,C 标志变为 0。
将立即数传送到 B 寄存器。 在运行时,它不受 C 标志的影响。执行后,C 标志变为 0。
将 B 寄存器传送到 A 寄存器。 在运行时,它不受 C 标志的影响。执行后,C 标志变为 0。
将 A 寄存器转移到 B 寄存器。 在运行时,它不受 C 标志的影响。执行后,C 标志变为 0。
将立即数添加到 A 寄存器。 在运行时,它不受 C 标志的影响。执行后,当发生进位时,C 标志设置为 1。
将立即数添加到 B 寄存器。 在运行时,它不受 C 标志的影响。执行后,当发生进位时,C 标志设置为 1。
将数据从输入端口传输到 A 寄存器。 在运行时,它不受 C 标志的影响。执行后,C 标志变为 0。
将数据从输入端口传输到 B 寄存器。 在运行时,它不受 C 标志的影响。执行后,C 标志变为 0。
将立即数据传输到输出端口。 在运行时,它不受 C 标志的影响。执行后,C 标志变为 0。
B 将寄存器转发到输出端口。 在运行时,它不受 C 标志的影响。执行后,C 标志变为 0。
跳转到立即数指示的地址。 在运行时,它不受 C 标志的影响。执行后,C 标志变为 0。
当 C 标志为 0 时,它跳转到立即数所指示的地址。当 C 标志为 1 时,什么都不做。 在运行时,C 标志会更改行为。执行后,C 标志变为 0。
Arduino替代ROM程序data bus from D2 to D9 address bit from D10 to D13 //// ROM emulator for TTL based 4-bit CPUbyte prog[16];//void setup() { byte i;for(i=0;i<16;i++){ prog=0;}//// initialize program/////////program part of 4-bit CPU/////////////////simple blinking/////////prog[0b0000]=0b10110011;//prog[0b0001]=0b10110110;//prog[0b0010]=0b10111100;//prog[0b0011]=0b10111000;//prog[0b0100]=0b10111000;//prog[0b0101]=0b10111100;//prog[0b0110]=0b10110110;//prog[0b0111]=0b10110011;//prog[0b1000]=0b10110001;//prog[0b1001]=0b11110000;////////////////////////////////////////////other commands////0011abcd: MOV "abcd" to A register////0111abcd: MOV "abcd" to B register////00010000: MOV B register to A register////01000000: MOV A register to B register////0000abcd: ADD "abcd" to A register////0101abcd: ADD "abcd" to B register////00100000: MOV input port (DIP switch) to A register////01110000: MOV input port (DIP switch) to B register////1011abcd: MOV "abcd" to output port (LED)////10010000: MOV B register to output port (LED)////1111abcd: JMP to "abcd"////1110abcd: IF C \neq = 0 JMP to "abcd"//// other details can be found in the book....prog[0b0000]=0b10110001; //OUT(1011) "0001" to LEDprog[0b0001]=0b10110010; //OUT(1011) "0010" to LEDprog[0b0010]=0b10110100; // same till 0b1110prog[0b0011]=0b10111000;prog[0b0100]=0b10111001;prog[0b0101]=0b10111010;prog[0b0110]=0b10111100;prog[0b0111]=0b10111101;prog[0b1000]=0b10111110;prog[0b1001]=0b10111111;prog[0b1010]=0b10110000;prog[0b1011]=0b10111111;prog[0b1100]=0b10110000;prog[0b1101]=0b10111111;prog[0b1110]=0b10110000;prog[0b1111]=0b11110000; // JMP(1111) to "0000" first of program Serial.begin(9600);//// address bit from D10 to D13 for(i=10; i<14; i++){ pinMode(i, INPUT); }//// data bus from D2 to D9 for(i=2; i<10; i++){ pinMode(i, OUTPUT); } }// the loop function runs over and over again forevervoid loop() { boolean A[5],b[8]; byte i,command_data; byte temp1;// address read A[0]=digitalRead(10); A[1]=digitalRead(11); A[2]=digitalRead(12); A[3]=digitalRead(13); i=A[0]+2*A[1]+4*A[2]+8*A[3]; // Serial.println(i); command_data=prog; //Serial.println(command_data);/// converting to each bit b[0]=command_data & 0b00000001; b[1]=(command_data & 0b00000010); b[2]=(command_data & 0b00000100); b[3]=(command_data & 0b00001000); b[4]=(command_data & 0b00010000); b[5]=(command_data & 0b00100000); b[6]=(command_data & 0b01000000); b[7]=(command_data & 0b10000000);/////// for(i=2;i<10;i++){ temp1=i+1; digitalWrite(i,b[i-2]); }}
参考书籍:
|