TD4CPU-Arduino配合74系列芯片自制CPU-2-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2403|回复: 2

TD4CPU-Arduino配合74系列芯片自制CPU-2

[复制链接]
发表于 2021-6-24 17:35 | 显示全部楼层 |阅读模式
指令译码电路(取指令)
- 每个时钟周期的脉冲来临时,就进行一次取指令、译码、并执行
- 被译码后,相应的电路执行指令预设的动作进行操作


这个译码电路相当有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]);    }}

参考书籍:




发表于 2021-6-24 23:04 | 显示全部楼层
这书有年头了,看样子是 2003 年的:

https://book.douban.com/subject/11604370/
 楼主| 发表于 2021-6-25 04:13 | 显示全部楼层
t3486784401 发表于 2021-6-24 23:04
这书有年头了,看样子是 2003 年的:

https://book.douban.com/subject/11604370/

没错,但是非常经典,而且国内没太多推广的。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 09:30 , Processed in 0.189773 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表