古老CPU啟示錄-MC14500 1位CPU(ICU 簡介 在20世紀80年代4位、8位CPU逐漸成為主流,但是當時的CPU發展還處于探索階段,所以各種“奇葩”的CPU都有出現,今天給大家帶來1-bit CPU MC14500和GI SBA。兩者差不多以MC14500為例看下這款“奇葩”CPU。 MC14500是一種工業控制單元(ICU),也被認為是1位處理器。它由摩托羅拉(Motorola)生產,但幾年前已停止生產。如今,MC14500已經被價格合理的FPGA取代了,包括其所有外設和程序存儲器。至今仍存在使用MC14500設計的不同原因: 1、為舊的MC14500計算機創建備件; 2、重復使用MC14500軟件; 3、FPGA開發(VHDL代碼=》電子專家)與應用程序(應用工程師)之間的分離; 4、低成本PLC替代品; 5、在現代FPGA上運行具有歷史意義的東西很有趣; 6、使用FPGA的學習項目。
特點:
(1)16條指令;
(2)編程容易;
(3)容易掌握,不需要特殊的技術人員;
(4)由于使用外部存儲器,系統變得容易;
(5)能滿足用戶的特定需求,具有豐富的靈活性;
(6)能滿足用戶的特定需求,具有豐富的靈活性;
(7)能夠擴展以適應所有系統的規模和復雜程度;
(8)能夠進行程序設計;
(9)B系列C-MOS符合JEDE規格;
(10)噪音容限大;
(11)不工作時漏電流小;
(12)工作電壓3~18V;
(13)時鐘頻率范圍廣,一般工作頻率1MHz(VDD=5V,一個時鐘執行一條指令);
(14)信號輸入和TTL互換;
(15)將判斷作為中心工作,超過微處理器的性能;
(16)應用范圍廣,由繼電器回路開始的邏輯判斷處理到中速度的串行數據處理,還能減輕超負荷的微處理器系統的工作。
MC14500允許使用IO地址讀取輸入位。該位可以使用4位指令和內部1位結果寄存器RR進行處理。結果可以寫入IO地址的輸出位。 輸入和輸出數據位可以是物理輸入和輸出,其中可以連接電線,但它們可以連接到其他設備作為RAM或定時器。 IO的尋址完全在MC14500外部完成。MC14500的所選指令的4位和外部IO多路復用器的IO地址行導致程序存儲器的數據寬度。MC14500使用術語“內存字”來表示從程序內存中輸出的數據。本文檔使用術語“command”作為“memory word”的同義詞。因此,命令由兩部分組成:指令和IO地址。 由于IO地址在MC14500的外部,因此不同實現之間的命令可能不同。此外,命令中4個指令位的位置也取決于設計。指令位可能占用命令中的高位或低位。 MC14500不包含從程序存儲器中尋址要處理的命令的程序計數器。因此,MC14500設計的程序計數器位數可能不同。
程序內存或命令的寬度是指令的4位加上IOaddress行數。小型MC14500設計將使用8位寬的程序存儲器,能夠選擇多達16個IO地址。由于這并不多,許多MC14500設計使用12位寬的程序存儲器,可以選擇多達256個IO地址。12位寬的程序存儲器使用過去存在的4位寬的ROM設備。其他MC14500設計使用8位寬的程序存儲器,但是每個MC14500命令有兩個字節被讀取,因此形成了一個16位寬的命令,能夠尋址多達4096個IO地址線,用于物理IO、單位寬RAM和定時器硬件。在MC14500設計中,從程序存儲器中讀取兩次會產生另一種變化,從程序中讀取的第一個字節可能在一種設計中是低字節,但在另一種設計中是命令的高字節。
利用MC14500搭建的外圍系統:
MC14500模擬器
MC14500模擬器使用web技術和javascript來獨立于平臺,并且在將來也可以使用。這種實現的一個缺點是javascript模擬器不能訪問用戶的文件系統或硬件。
模擬器在支持svg的瀏覽器上運行。
按下“步進”按鈕意味著下降的時鐘邊緣,因此MC14500加載指令和輸入數據。 釋放“步進”按鈕意味著上升的時鐘邊緣,因此MC14500寫入數據。程序計數器增加。在程序存儲器訪問時間之后,下一條指令和IO地址出現在MC14500和輸出、輸入或RAM上。 詳細的介紹就不過多贅述,網上還有利用Python進行匯編程序和反匯編程序的介紹。
FPGA實現
利用MC14500搭建的CPU 從上面的介紹可以看出MC14500和FPGA有很多相似的地方,接下來就用FPGA實現一下這款單比特CPU。
module mc14500b( input clk, input rst, input [3:0] i_inst, input i_data, output reg write = 0, output reg jmp = 0 , output reg rtn = 0, output reg flag0 = 0, output reg flagf = 0, output reg o_rr = 0, output reg o_data = 0 ); reg ien = 0, oen = 0; reg skip = 0; always @(negedge clk or posedge rst) begin
// Reset any flags from last clock. jmp 《= 0; rtn 《= 0; flag0 《= 0; flagf 《= 0; write 《= 0;
// FIX this it‘s not right technically. if (rst) begin
// reset behavior. reset internal flags and ignore clock. ien 《= 0; oen 《= 0; o_rr 《= 0; skip 《= 0; end else begin if (~skip) begin // skip case(i_inst) 4’b0000 : flag0 《= 1;
// NOPO 4‘b0001 : o_rr 《= ien & i_data; // LD 4’b0010 : o_rr 《= ien & ~i_data; // LDC 4‘b0011 : o_rr 《= ien & (i_data & o_rr); // AND 4’b0100 : o_rr 《= ien & (~i_data & o_rr); // NAND 4‘b0101 : o_rr 《= ien & (i_data | o_rr);
// OR 4’b0110 : o_rr 《= ien & (~i_data | o_rr); // NOR 4‘b0111 : o_rr 《= ien & (o_rr == i_data);
// XNOR 4’b1000 : begin // STO // DATA -》 RR, WRITE -》 1 for a clock (if oen is allowed)。 o_data 《= oen & o_rr; write 《= oen; end 4‘b1001 : begin // STOC
// DATA -》 ~RR, WRITE -》 1 for a clock. o_data 《= ~o_rr; write 《= oen; end 4’b1010 : ien 《= i_data; 4‘b1011 : oen 《= i_data; 4’b1100 : jmp 《= 1; 4‘b1101 : begin
// RTN rtn 《= 1; skip 《= 1; end 4’b1110 : skip 《= ~o_rr; 4‘b1111 : flagf 《= 1; endcase end else begin
// reset skip flag after clocking with skip once. skip 《= 0; end end end // neg edge// always @(posedge clk) begin// write 《= 0;// endendmodule
原文標題:你見過1-bit CPU嗎?
文章出處:【微信公眾號:OpenFPGA】歡迎添加關注!文章轉載請注明出處。
責任編輯:haq
-
FPGA
+關注
關注
1630文章
21778瀏覽量
604814 -
cpu
+關注
關注
68文章
10892瀏覽量
212467
原文標題:你見過1-bit CPU嗎?
文章出處:【微信號:Open_FPGA,微信公眾號:OpenFPGA】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論