本文從基礎使用開始假褪,說明16bit-CPU中各個參數(shù)的意義款票,同時舉幾個例子谱醇。
基礎使用
.s文件對應massem.pl,basic_microcode文件對應uassem.pl夺蛇,兩個分別編譯出一個.ram文件與兩個.rom文件疚漆。
然后分別向RAM和ROM中Load image以上三個文件,就能夠將你的程序寫入這個CPU開始執(zhí)行了刁赦。
接下來來講ram和rom的編譯語言規(guī)則娶聘,我們不會講如何修改兩個pl文件,只講關于.s文件和basic_microcode文件的文字規(guī)則甚脉,以及整個線路的各引腳作用丸升。
各個元件
ram相關
計算機中有很多種代碼:
- add、mul等屬于計算型0~15 dst型
add r1, r2, r3 #r1=r2+r3
mul r1, r2, r3 #r1=r2*r3
sub r1, r2, r3 #r1=r2-r3
- jnez屬于單數(shù)字型 sti型
jnez r1, aa #跳轉到aa行運行
----------------------------------------
40: addrsel=pc imload=1
aluop=sub op2sel=0
這段是jnez 的底層代碼牺氨,
addrsel=pc對應了'addrsel=pc' => 0 << 7
意思是第0左移七位狡耻,即第八位為0.
addrsel對應的第七第八位是PC的多路復用器的選擇位,對應關系如下
00:pc
01:immed存儲的是jnez第二個參數(shù)
10:alout當前ALU計算輸出
11:sreg當前reg的steg輸出位
imload=1對應了
- sw猴凹、li單數(shù)字賦值 di型
li r5,x
#給寄存器reg中r5位存x
sw r0, 256
#給內存RAM中第256字節(jié)存r0的數(shù)值夷狰,十進制的256是十六進制的100
以上不是用語不是很貼合,但是盡可能做到好理解郊霎。
如何在ram內構造循環(huán)沼头?
ram中任意一行開頭使用以下方式可以存儲一個值在x中,x的值為x所在行书劝。
~~~~
x:~~~~
jnez r1,x
#這段的意思是如果r1进倍!=0,則返回x所在行庄撮,x可是設置為一個數(shù)字背捌,可也以和這段一樣實現(xiàn)一個for循環(huán)
ram常用語句
除了各種語句和其匹配 參數(shù)的調用,還有以下這些:
- a:
在每行開頭使用可以將a=此行行數(shù)洞斯,之后可以用a作為一個數(shù)字參數(shù)使用毡庆,編譯自動識別數(shù)字。 - goto xxx:
到xxx語句烙如,運行完本行就會進入這條語句么抗,編譯出來的decisionROM為xxx語句在controlROM中所在行。 - if z then pcincr else jump
z代表了ALU的z參數(shù)亚铁,pcincr和jump都是語句蝇刀,如果z就是ALU輸出為zero,運行pcincr徘溢,else吞琐,運行jump捆探。
rom
在rom里創(chuàng)建新的語句首先要理解rom控制器每一個輸出控制位置對應的作用。
如何在rom中制作循環(huán)站粟?
我們先來看這段編譯黍图,我們可以看出來,代碼分成了兩個部分奴烙,一部分是后面的語句助被,一部分是前面的數(shù)字,那么前面的數(shù)字代表了什么呢切诀?
后面的語句對應了前面的兩組數(shù)字揩环,兩組數(shù)字前后分別對應了控制cpu線路的control ROM和控制control ROM的decision ROM。
舉個例子幅虑,jnez(40:)的代碼丰滑。
第一句:前側數(shù)字為00004000 8282,其中,00004000對應了二進制的第十五位為1其他為0翘单,控制了imload吨枉;而8282對應了decision輸出兩條數(shù)字82/82,這個數(shù)字通過cond位選擇z\n\c中的一個來選擇是第一條還是第二條哄芜。
(關于znc在ALU段說明)(此時cond位:17貌亭、18位=00)
控制imload作用為讓immed讀入RAM程序中的數(shù)字,這里.s文件中在0006行用loop:存儲了一個數(shù)loop=0006认臊,在編譯.s到.ram中會把loop變成常數(shù)0006來使用圃庭。(上文我的程序有做修改,源文件中l(wèi)oop在0006行)
第二句:進入82行失晴,前側數(shù)字位00000021 8687,其中剧腻,00000021對應了aluop(0001)和op2sel(10),控制ALU用減法涂屁,op2sel控制ALU低位輸入為0000书在;而86/87分別對應下一條指令。
下面是jnez循環(huán)的重點拆又,在RAM接收jnez前7個控制字的時候儒旬,后面數(shù)字字第二組為jnez語法的第一個參數(shù),ALU高位輸入是這個參數(shù)帖族,即r1栈源。
以上,此時ALU計算得r1-0000竖般,計算結果輸出在aluout甚垦,但是ALU中加配了z參數(shù),所以還有一個輸出是z,當輸出為zero時艰亮,z=1闭翩。也就是r1=0,z=1迄埃,其他時候z=0.
所以當r1男杈!=0,下一條指令從86行讀取调俘,r1==0,下一條指令從87行讀取旺垒。
第三句:進入86/87行彩库,前側數(shù)字位00000800 0000/00000a00 0000。對應下一條指令都是0000先蒋,說明要進行下一次輪回了骇钦。
00000800,控制pcload=1竞漾,即pc+1眯搭,進入下一條RAM中的語句。
00000a00业岁,控制pcsle=01鳞仙,pcload=1,pcsle選擇下一條語句為immed中存儲的行數(shù)笔时,第一局中我們將loop作為行數(shù)輸入進了immed中棍好,此時又進入到了loop所在行,完成了循環(huán)允耿。
以上就是jnez語句的解析借笙,現(xiàn)在我們了解了jnez語句在電路和ROM中的運行了,總結出以下幾點:
- immed可以作為我們while循環(huán)的開頭存點
當然较锡,如果要做老師說的第二層业稼,我們就要封裝到ROM中,所以簡單的loop:加jnez語句的應用是不足夠的蚂蕴。作為一個語句低散,所以我們不僅要會使用,我們要理解底層掂墓,然后才能做出jnez級別的語句谦纱。 - z可以作為判斷我們while循環(huán)的跳出判斷
- 通過z改變decisionROM中的下一位選擇,就可以通過線路中(reg或者ram)的數(shù)據(jù)來讓計算機判斷接下來進行的步驟君编。