用STC單片機制作萬能的或非門邏輯處理器-可處理所有的門電路組合復雜運算-全球首發!
可將世界上所有的數字電路轉換成或非門電路線路連接組合使用該模擬器完成。
是目前世界上制作原理最簡單的,功能最強大的CPU處理器。
只要世界上任意一種編程語言支持數組、循環、判斷、計算功能即可100%成功移植。
世界上所有的數字電路都是由大量的邏輯門 包括與門、或門、非門3種基本邏輯門組成。
世界上所有的復雜運算功能都是通過大量的邏輯門組合運算自動完成。
可修改為更高位的地址寬度,但需要容量更大容量的存儲器。
使用純與非門、或非門電路即可組成與門、或門、非門。
所有CPU內部邏輯門組合數據轉換成或非門組合數據即可移植到該模擬器里。
使用或非門組成的數字電路對每一根接線進行編號并且寫入ROM即可完成編程功能。
8051指令集單片機型號任意直接編譯即可,其余指令集可能需要修改頭文件以及程序源碼或者根據該CPU指令執行過進行移植與編寫,
支持世界上任何平臺指令集的CPU模擬,只要容量足夠就可以準確無誤的模擬。
與門:全1出1,有0出0 燈座上有個開關,插線板上有另一個開關,兩個開關必須打開燈泡即可點亮,否則無法點亮。
或門:有1出1,全0出0 兩個并聯的開關打開其中一個后燈泡就能點亮,兩個開關全部關閉后則無法點亮。
非門:進1出0 進0出1 燈泡并聯開關,開關打開后由于電源短路的電阻小于燈泡電阻,燈泡熄滅,否則就能點亮。
使用以上三種基本邏輯門組合即可實現世界上各種復雜的運算。
異或門:相異出1,相同出0,全0出0,全1出0,否則出1。
同或門:異或門輸出串聯非門,相同出1,相異出0,全0出1,全1出1,否則出0。
與非門:與門輸出串聯非門,全1出0 有0出1。
或非門:或門輸出串聯非門,有1出0 全0出1。
世界上所有的數據的計算、存儲、傳輸、等在數納秒的時間內自動完成的事件都是由無數個基本邏輯門組合而實現。
邏輯電路分為兩大類:分別是組合邏輯電路和時序邏輯電路。
組合邏輯電路不包含記憶存儲功能,具有固定的真值表。
例如:全加器、全減器、乘法器、除法器、譯碼器、數據選擇器、數據分配器、數字大小比較器、BCD代碼轉換器等。
時序邏輯電路是一種具有記憶儲存功能的邏輯電路。
例如:計數器、鎖存器、觸發器、寄存器、存儲器等。
P0~P7口直接與RAM地址0~7(字節)連接。
ROM共768字節,RAM共256位(32字節)。
每條指令共3字節(共256條指令)。
指令格式:輸入地址1 輸出地址 輸入地址2。
指令執行過程:
從輸入地址1和輸入地址2,送入RAM的地址線,根據地址找到RAM位數據。
經過或非比較后將結果寫入輸出地址,結果1位位值經過該地址寫回并覆蓋RAM。
觸發程序計數器加3,繼續根據以上方法執行下面的指令。
程序計數器大于等于768或遇到0xFF指令則清零,從頭執行指令。
可改成16位或更高位寬度以支持更大規模或非門運算。
1條指令的字節數=位數/8*3
需要的RAM字節數=2^位數/8
需要的ROM字節數=1條指令的字節數*2^位數
8位需要32B的RAM和786B的ROM。
16位需要8KB的RAM和384KB的ROM。
24位需要2MB的RAM和144MB的ROM。
32位需要512MB的RAM和48GB的ROM。
48位需要32TB的RAM和4.5PB的ROM。
以此類推。
以32位為例,每秒循環執行1次所有指令則為1Hz的指令循環周期。
每秒執行1條指令的時間為指令周期,指令周期約為4.3Ghz,循環執行所有指令的周期為1Hz。
若循環周期需要達到1Mhz,指令周期判斷器,RAM和ROM的響應頻率必須達到4.3Phz左右即可。
ROM門電路原理:
非門: 0x00 0x01 0x00 0xFF 0xFF 0xFF
0x00與0x00的值進行了或非比較,結果寫入0x01 或非門的兩個輸入端接在一起就是非門 地址0x01的輸出與0x00相反。
非門高頻振蕩器:0x00 0x00 0x00 0xFF 0xFF 0xFF
0x00與0x00的值進行了或非比較,結果放入0x00中,由于原有值與寫入的值相反,即可形成高頻振蕩信號,具體輸出頻率與
指令執行時間有關。
以下所有2進1出門電路全是0x00 和0x01是輸入端,0x02是輸出端 。
或非門:0x00 0x02 0x01 0xFF 0xFF 0xFF
0x00 與0x01的值進行或非比較,結果寫入0x02
與門:0x00 0x03 0x00 0x01 0x04 0x01 0x03 0x02 0x04 0xFF 0xFF 0xFF
0x00 的 反向值寫入0x03,0x01的反向值寫入0x04,0x03與0x04經過或非比較,結果寫入0x02地址。
與門是或非門輸入兩端各自串聯兩個非門,用兩個或非門兩端接在一起代替非門。
或門:0x00 0x03 0x01 0x03 0x02 0x03 0xFF 0xFF 0xFF
0x00 與0x01 的值進行了或非比較,結果寫入0x03,再與0x03和0x03的值進行比較,結果寫入0x02地址。
或門是或非門輸出端串聯一個非門而組成。
與非門:0x00 0x03 0x00 0x01 0x04 0x01 0x03 0x05 0x04 0x05 0x02 0x05 0xFF 0xFF 0xFF
與非門是與門輸出串聯非門組成。
異或門:0x00 0x03 0x00 0x01 0x04 0x01 0x03 0x05 0x04
0x05 0x06 0x05 0x06 0x07 0x06 0x00 0x08 0x01
0x08 0x09 0x08 0x09 0x0A 0x09 0x07 0x02 0x0A
0xFF 0xFF 0xFF
異或門是與非門和或門并聯,兩個輸出端再接入與門而組成。
同或門:0x00 0x03 0x00 0x01 0x04 0x01 0x03 0x05 0x04
0x05 0x06 0x05 0x06 0x07 0x06 0x00 0x08 0x01
0x08 0x09 0x08 0x09 0x0A 0x09 0x07 0x0B 0x0A
0x0B 0x02 0x0B 0xFF 0xFF 0xFF
同或門是異或門輸出端串聯一個非門而組成。
以上0xFF是清零PC指針的指令,一但有指令訪問該地址進行讀寫操作,該地址的數據不但不能被寫入,而且PC指針就會清零
重頭執行,不會清除RAM數據。
程序加密執行方法:
內部運算數據可以寫在任何地址,將讀寫數據的地址全部隨機交換打亂即可,不包含主要輸入輸出地址以及0xFF,
不影響正常的執行。
比如將0x12地址變成0x34,0x34地址變成0x12,0x12與0x34進行交換,以此類推。
ROM中的原有的0x12變成了0x34,0x34變成了0x12,不能直接替換否則所有0x34會變成0x12而導致
程序無法執行。
手工執行指令方法:
畫1張16x16的表格并且打印,并且行列標上0~F,里面用鉛筆寫滿0,表示RAM。
畫1張ROM圖紙并且標注通過PC指針找到指令的方法。
指令執行方法:
比如取到1條指令:0xAB 0xCD 0xEF
在RAM中指定0xAB坐標找到數字0
在RAM中指定0xEF坐標找到數字0
通過或非門全0出1,有1出0的判斷后。
將數字1放回RAM的0xCD的坐標地址中,如果值不同則使用橡皮擦除該值并且重新寫入新值。
所有指令循環執行多遍后,這張表示RAM的紙會被橡皮擦除無數次。
在特定地址的值是輸入或輸出值,改變這些值,指令執行完畢后,輸出的值也會改變。
其余地址的值不能隨意改變避免計算出錯。
遇到指令中包含0xFF則從頭執行指令,不清除RAM數據即可。
若軟硬件存在bug以及意見建議請在樓下回復謝謝合作!
根據以上門電路組合設計實現的8位全加器:
這些地址由ROM數據決定,修改地址入口需要修改ROM。
8位全加器 輸入地址入口:
其余地址的值不可修改,否則計算可能會出錯。
執行前先修改以下地址的值:
0x00~0x07 被加數
0x08~0x0F 加數
0x19 進位輸入
所有指令執行完畢后從以下地址讀取計算結果:
0x10~0x17 和
0x18 進位輸出
程序源碼:
- #include "reg51.h" //定義頭文件reg51.h
- #include "intrins.h" //定義頭文件intrins.h
- sfr P4=0xC0; //定義P4口寄存器
- sfr P5=0xC8; //定義P5口寄存器
- sfr P6=0xE8; //定義P6口寄存器
- sfr P7=0xF8; //定義P7口寄存器
- unsigned char code rom[768] = { //ROM數據 8位全加器 帶進位輸入輸出 只讀數組 固定768字節
- 0x00, 0x31, 0x00, 0x08, 0x33, 0x08, 0x00, 0x34, 0x08, 0x31, 0x35, 0x33, 0x35, 0x36, 0x34, 0x08,
- 0x37, 0x08, 0x00, 0x38, 0x00, 0x37, 0x39, 0x38, 0x19, 0x3B, 0x19, 0x36, 0x3C, 0x36, 0x19, 0x3D,
- 0x36, 0x3B, 0x3E, 0x3C, 0x3E, 0x10, 0x3D, 0x36, 0x40, 0x36, 0x19, 0x41, 0x19, 0x40, 0x42, 0x41,
- 0x39, 0x43, 0x42, 0x43, 0x44, 0x43, 0x01, 0x60, 0x01, 0x09, 0x62, 0x09, 0x01, 0x63, 0x09, 0x60,
- 0x64, 0x62, 0x64, 0x65, 0x63, 0x09, 0x66, 0x09, 0x01, 0x67, 0x01, 0x66, 0x68, 0x67, 0x44, 0x69,
- 0x44, 0x65, 0x6A, 0x65, 0x44, 0x6B, 0x65, 0x69, 0x6C, 0x6A, 0x6C, 0x11, 0x6B, 0x65, 0x6E, 0x65,
- 0x44, 0x6F, 0x44, 0x6E, 0x70, 0x6F, 0x68, 0x71, 0x70, 0x71, 0x72, 0x71, 0x02, 0x74, 0x02, 0x0A,
- 0x76, 0x0A, 0x02, 0x77, 0x0A, 0x74, 0x78, 0x76, 0x78, 0x79, 0x77, 0x0A, 0x7A, 0x0A, 0x02, 0x7B,
- 0x02, 0x7A, 0x7C, 0x7B, 0x72, 0x7D, 0x72, 0x79, 0x7E, 0x79, 0x72, 0x7F, 0x79, 0x7D, 0x80, 0x7E,
- 0x80, 0x12, 0x7F, 0x79, 0x82, 0x79, 0x72, 0x83, 0x72, 0x82, 0x84, 0x83, 0x7C, 0x85, 0x84, 0x85,
- 0x86, 0x85, 0x03, 0x88, 0x03, 0x0B, 0x8A, 0x0B, 0x03, 0x8B, 0x0B, 0x88, 0x8C, 0x8A, 0x8C, 0x8D,
- 0x8B, 0x0B, 0x8E, 0x0B, 0x03, 0x8F, 0x03, 0x8E, 0x90, 0x8F, 0x86, 0x91, 0x86, 0x8D, 0x92, 0x8D,
- 0x86, 0x93, 0x8D, 0x91, 0x94, 0x92, 0x94, 0x13, 0x93, 0x8D, 0x96, 0x8D, 0x86, 0x97, 0x86, 0x96,
- 0x98, 0x97, 0x90, 0x99, 0x98, 0x99, 0x9A, 0x99, 0x04, 0x9C, 0x04, 0x0C, 0x9E, 0x0C, 0x04, 0x9F,
- 0x0C, 0x9C, 0xA0, 0x9E, 0xA0, 0xA1, 0x9F, 0x0C, 0xA2, 0x0C, 0x04, 0xA3, 0x04, 0xA2, 0xA4, 0xA3,
- 0x9A, 0xA5, 0x9A, 0xA1, 0xA6, 0xA1, 0x9A, 0xA7, 0xA1, 0xA5, 0xA8, 0xA6, 0xA8, 0x14, 0xA7, 0xA1,
- 0xAA, 0xA1, 0x9A, 0xAB, 0x9A, 0xAA, 0xAC, 0xAB, 0xA4, 0xAD, 0xAC, 0xAD, 0xAE, 0xAD, 0x05, 0xB0,
- 0x05, 0x0D, 0xB2, 0x0D, 0x05, 0xB3, 0x0D, 0xB0, 0xB4, 0xB2, 0xB4, 0xB5, 0xB3, 0x0D, 0xB6, 0x0D,
- 0x05, 0xB7, 0x05, 0xB6, 0xB8, 0xB7, 0xAE, 0xB9, 0xAE, 0xB5, 0xBA, 0xB5, 0xAE, 0xBB, 0xB5, 0xB9,
- 0xBC, 0xBA, 0xBC, 0x15, 0xBB, 0xB5, 0xBE, 0xB5, 0xAE, 0xBF, 0xAE, 0xBE, 0xC0, 0xBF, 0xB8, 0xC1,
- 0xC0, 0xC1, 0xC2, 0xC1, 0x06, 0xC4, 0x06, 0x0E, 0xC6, 0x0E, 0x06, 0xC7, 0x0E, 0xC4, 0xC8, 0xC6,
- 0xC8, 0xC9, 0xC7, 0x0E, 0xCA, 0x0E, 0x06, 0xCB, 0x06, 0xCA, 0xCC, 0xCB, 0xC2, 0xCD, 0xC2, 0xC9,
- 0xCE, 0xC9, 0xC2, 0xCF, 0xC9, 0xCD, 0xD0, 0xCE, 0xD0, 0x16, 0xCF, 0xC9, 0xD2, 0xC9, 0xC2, 0xD3,
- 0xC2, 0xD2, 0xD4, 0xD3, 0xCC, 0xD5, 0xD4, 0xD5, 0xD6, 0xD5, 0x07, 0xD8, 0x07, 0x0F, 0xDA, 0x0F,
- 0x07, 0xDB, 0x0F, 0xD8, 0xDC, 0xDA, 0xDC, 0xDD, 0xDB, 0x0F, 0xDE, 0x0F, 0x07, 0xDF, 0x07, 0xDE,
- 0xE0, 0xDF, 0xD6, 0xE1, 0xD6, 0xDD, 0xE2, 0xDD, 0xD6, 0xE3, 0xDD, 0xE1, 0xE4, 0xE2, 0xE4, 0x17,
- 0xE3, 0xDD, 0xE6, 0xDD, 0xD6, 0xE7, 0xD6, 0xE6, 0xE8, 0xE7, 0xE0, 0xE9, 0xE8, 0xE9, 0x18, 0xE9,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
- };
- unsigned char ram[32]; //32字節RAM 共256位
- unsigned int pc=0; //程序指針 取值范圍:0~768
- //由于C51不能直接定義位數組,所以這里只能通過移位處理實現位數組。
- bit read_ram(unsigned char a){ //RAM讀數據
- unsigned char b=a>>3; //獲取該位對應的字節
- unsigned char c=a&7; //獲取該字節對應的位
- return (1<<c&ram[b])>>c; //返回位數據
-
- }
- void write_ram(unsigned char a,bit d){ //RAM寫數據
- unsigned char b=a>>3; //獲取該位對應的字節
- unsigned char c=a&7; //獲取該字節對應的位
- bit e=(1<<c&ram[b])>>c; //獲取該位數據
- if(d == 0){ //要寫的位為0
- if(e==1){ //位讀取到1
- ram[b]-=1<<c; //該位數據置0
- }
- } else { //要寫的位為1
- if(e==0){ //位讀取到0
- ram[b]+=1<<c; //該位數據置1
- }
- }
-
- }
- void cpu_reset(){ //cpu復位
- P0=0;P1=0;P2=0;P3=0; //P0~P3口全置低電平
- P4=0;P5=0;P6=0;P7=0; //P4~P7口全置低電平
- for(pc=0;pc<32;pc++){ //循環32次清零所有RAM
- ram[pc]=0; //RAM字節清零
- }
- pc=0; //pc指針清零
- }
- void main(){ //主函數
- cpu_reset(); //cpu復位
- while(1){ //死循環
- //將IO口數據寫入RAM
- ram[0]=P0;ram[1]=P1;ram[2]=P2;ram[3]=P3; //將P0~P3口數據送入RAM地址0~3
- ram[4]=P4;ram[5]=P5;ram[6]=P6;ram[7]=P7; //將P4~P7口數據送人RAM地址4~7
- if(rom[pc] == 0xFF || rom[pc+1] == 0xFF || rom[pc+2] == 0xFF){ //指令中遇到0xFF則清零pc指針
- pc=0;
- }
- if(read_ram(rom[pc]) == 0 && read_ram(rom[pc+2]) == 0){ //全0出1
- write_ram(rom[pc+1],1); //將數值1寫入RAM
- } else { //有1出0
- write_ram(rom[pc+1],0); //將數值0寫入RAM
- }
- pc+=3; //pc指針加3
- if(pc%3 != 0){ //pc指針取余3不等于0
- cpu_reset();//cpu復位,避免出現錯誤
- }
- if(pc >= 768){ //pc指針大于等于768
- pc=0; //pc指針清零
- }
- //將RAM數據寫入IO口
- P0=ram[0];P1=ram[1];P2=ram[2];P3=ram[3]; //將RAM數據0~3送入IO口P0~P3
- P4=ram[4];P5=ram[5];P6=ram[6];P7=ram[7]; //將RAM數據4~7送入IO口P4~P7
- }
- }
復制代碼 |