從最簡的條指令CPU實(shí)現(xiàn)了解CPU設(shè)計(jì)_第1頁
從最簡的條指令CPU實(shí)現(xiàn)了解CPU設(shè)計(jì)_第2頁
從最簡的條指令CPU實(shí)現(xiàn)了解CPU設(shè)計(jì)_第3頁
從最簡的條指令CPU實(shí)現(xiàn)了解CPU設(shè)計(jì)_第4頁
從最簡的條指令CPU實(shí)現(xiàn)了解CPU設(shè)計(jì)_第5頁
已閱讀5頁,還剩76頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第二章CPU設(shè)計(jì)概論2.0.0從最簡的4條指令CPU,看CPU的設(shè)計(jì)與測(cè)試驗(yàn)證▲步驟:==>指令集

==>CPU架構(gòu)(馮/哈/流水)

==>周期微操作流程表

==>選定EDA設(shè)計(jì)系統(tǒng)和HDL語言(如QuartusII…,.v)

==>CPU核設(shè)計(jì)描述(HDL/圖形)

==>測(cè)試程序設(shè)計(jì)

==>邏輯模擬仿真(頂層圖形/描述文件:CPU核+裝入測(cè)試程序[.mif] 的內(nèi)部RAM)

==>FPGA平臺(tái)下載測(cè)試(平臺(tái)頂層文件調(diào)用CPU核+裝載測(cè)試程序 [.bin]的外部主存或調(diào)用仿真頂層文件)

--實(shí)驗(yàn)設(shè)計(jì)到此

==>版圖設(shè)計(jì)

==>CPU的ASIC芯片生產(chǎn)與測(cè)試

==>CPU主板的全面測(cè)試驗(yàn)證包括BOOTOS。--科研設(shè)計(jì)必須的后續(xù)

還有CPU預(yù)研時(shí)的模擬仿真機(jī)(虛擬機(jī),C語言)設(shè)計(jì)四條指令CPU指令集

ADD

整數(shù)加法STA

存數(shù)LDA

取數(shù)JNC

非進(jìn)位轉(zhuǎn)移時(shí)序固定2周期架構(gòu)馮諾曼型、數(shù)據(jù)地址不復(fù)用

特點(diǎn)8bit數(shù)據(jù)地址復(fù)位啟動(dòng)最簡的4條指令CPU設(shè)計(jì)2.0.14條指令CPU的指令格式與功能:自定義

controlmodecombinationlogicir[7:0]InstructionRegister單字節(jié)指令

ir[7],ir[6]2bitoperationcode(I7,I6)ir[5:0]6bitaddress直接尋址

Acc[7:0]accumulatorregister

ir[7]ir[6]instructionoperation00ADDAcc,addrAcc<=(Acc)+(addr)要先取數(shù)到Acc

01LDAAcc,addrAcc<=(addr)10STAaddr,Accaddr<=Acc11JNCaddrpc<=addr,whenCy=0CyCarryofAdderPC[7:0]programcountert[1:0]2cycleck分頻之后的clock信號(hào)2.0.24條指令CPU的外特性

CPU4條:

resetclk

o_a[7:0]

外部地址總線

(也有讀寫地址分開的)

o_d[7:0]

外部數(shù)據(jù)總線(雙向,也有讀寫數(shù)據(jù)分開的)wc

寫存貯器信號(hào)(高有效,也有非寫即讀的)rc

讀存貯器信號(hào)(高有效)

到存貯器寫命令wr=!(wc&ck),讀允許!rc

到同步存貯器還需要時(shí)鐘,DRAM還有刷新控制2.0.34條指令CPU的周期時(shí)序:

固定

2周期時(shí)序波形圖clk3Tt1t0ckTT=1/fTfMHzf

/3f

/6f

/6取決指令中操作所需的最多周期的指令本時(shí)序用二次移位式3,2分頻實(shí)現(xiàn),保證CPU的工作脈沖CK在周期中部,可使用CK的↑/↓。屬于早期的保守型取指2.0.4

4條指令CPU的描述框圖(行為對(duì)象)sel_pc_in復(fù)位啟動(dòng)首地址o_a[7:0]reset!ckpc_ldpc[7:0]pc_add_1sel_to_oasel_acc_inir_enir[7:0]!ckacc[7:0]acc_en!ckALU[7:0]ADDABFcn8o_d[7:0]wc3態(tài)門resetckclkt[1:0]Timer!ckDQcyADD指令部件2’b00,ir[5:0]!ckrcwrController

Combinationlogicir[7:6]cyir_enpc_ldsel_pc_inADDpc_add_1sel_to_oasel_acc_inacc_enwc5’bxx01x

!(wc&ck)

5’bxx01x

5’b0x10x

5’b11100

5’b0x10x

5’b0110x

5’b0010x

5’b1001x

的非

casex={ir[7:6],t,cy}

運(yùn)算器外部數(shù)據(jù)總線轉(zhuǎn)移取數(shù)外部地址總線存貯器低有效wr

rc2.0.5

4條指令CPU的指令微操作流程圖取指令指令匯編符指令碼地址(6位)指令功能指令執(zhí)行周期微操作及其控制信號(hào)與CLKt[0]操作76543210t[1]說明CASEX=5’bxx01xsel_pc_insel_to_oapc→o_a

發(fā)rcM→o_d

ir_en,!cko_d→irpc_add_1,!ckpc+1→pc加法ADDaddr00xxxxxx(acc)+(addr)=>acc

注:作加法要先將第一操作數(shù)取到累加器CASEX=5’b0010x!sel_to_oa

發(fā)rc{2’b00,ir[5:0]}→o_a,M→o_dADD,!sel_acc_in,en_acc,!ck{1’b0,acc}+{1’b0,o_d}→{cy,acc}

取數(shù)LDAaddr01xxxxxx(addr)=>accCASEX=5’b0110x

sel_to_oa

{2’b00,ir[5:0]}→o_a,發(fā)rc,sel_acc_in,en_acc,!ckM

→o_d

→acc送存STAaddr10xxxxxx(acc)=>addrCASEX=5’b1010x!sel_to_oa

{2’b00,ir[5:0]}→o_a

發(fā)wr,wc打開3態(tài),寫存貯器acc→o_d→M(wr=wc&ck)非進(jìn)位轉(zhuǎn)移JNCaddr11xxxxxxcy=0addr=>pcCASEX=5’b11100sel_pc_in,pc_ld,cy=0,!ck{2’b00,ir[5:0]}→

pc設(shè):CASEX={ir[7:6],t[1:0],Cy}

復(fù)位啟動(dòng):ifreset=1,8’h3f→pc2.0.5-1

4條指令CPU的指令操作:Timer描述(定義聲明省略)3分頻:always@(posedge

clk)

begin

if((q==3'b111)|(q==3'b011)|(q==3'b110)|(q==3'b101)|(q==3‘b000))//非法態(tài)恢復(fù)

q<=3'b001;

else

begin

//保證CK居中,可使用↑↓

q[0]<=q[2];q[1]<=q[0];q[2]<=q[1];

endendassignck=q[1];//CPU工作脈沖固定2周期:(設(shè)計(jì)簡單)always@(posedgeq[0]or

posedge

reset)

beginif(reset)cyc<=2'b00;

else

if

((cyc==2'b11)|(cyc==2'b00))

cyc<=2'b01;else

begincyc[0]<=cyc[1];cyc[1]<=cyc[0];

endendassignt=cyc;均用移位實(shí)現(xiàn)注:周期數(shù)與指令長度功能、寄存器傳送級(jí)數(shù)、脈沖↑↓、結(jié)構(gòu)流水相關(guān)2.0.5-2

4條指令CPU的指令操作:復(fù)位設(shè)置啟動(dòng)首地址sel_pc_in復(fù)位啟動(dòng)首地址reset!ckpc_ldpc[7:0]pc_add_12’b00,ir[5:0]2’h3f條件:reset=1’b1,(t[1:0]==2’b00).描述:always

@(negedge

ckorposedge

reset)

begin

if(reset)//復(fù)位包括:上電開關(guān)、復(fù)位開關(guān)、Ctrl+Alt+Del

pc<=8‘h3f;//firstadderofprogram,or0eh,

else//(3f):放轉(zhuǎn)移指令轉(zhuǎn)到0eh……//PC機(jī)復(fù)位CS=ffffh,IP=0000h即ffff0h,放必轉(zhuǎn)指令指向程序首地址方法復(fù)位:1)

直接設(shè)置

如0eh2)

固定設(shè)置如

3fh+轉(zhuǎn)移指令到

0eh2)

系虛設(shè)置靈活可程序修改真實(shí)的啟動(dòng)首地址

OS:根據(jù)可執(zhí)行文件的文件頭中的程序首地址,用陷阱指令設(shè)置,轉(zhuǎn)移設(shè)置Debug:根據(jù)可執(zhí)行文件的文件頭中序首地址,

用邏輯設(shè)置

設(shè)程序的真實(shí)啟動(dòng)首地址為

0eh轉(zhuǎn)移2’h0e2.0.5-3

4條指令CPU的指令操作:取指令流程sel_pc_in復(fù)位啟動(dòng)首地址reset!ckpc_ldpc[7:0]pc_add_1sel_to_oair_enir[7:0]!cko_d[7:0]指令部件2’b00,ir[5:0]o_a[7:0]casex{ir[7:6],t,cy}

=

5’bxx01x

!ck!rcController

ir[7:6]cyir_enpc_add_1sel_to_oackt[1:0]

sel_to_oa1)pc→o_a發(fā)rc

ir_en,!ck2)M→o_d→irpc_add_1,!ck3)pc+1→pc

always

@(ir[7:0]ortorcyorpcoracc)

begin

casex

({ir[7:6],t,cy})

5'bxx01x://t[0]:fetchinstruction

begin

o_a=pc;

rc=1‘b1;

wc=1’b0;//發(fā)出讀!rc

end

……………..//其它

default:begin

o_a=pc;wc=1'b0;rc=1'b0;

end

endcase

end2.0.5-3

4條指令CPU的指令操作:取指令描述1

向存貯器發(fā)取指令的地址與讀令組合邏輯2.0.5-3

4條指令CPU的指令操作:取指令描述2

復(fù)位首址、取指令到ir、pc+1的微操作時(shí)序邏輯always@(negedgeckor

posedge

reset)

begin

if

(reset)

pc<=8'h3f;//firstadderofprogram

else

casex

({ir[7:6],t,cy})

5'bxx01x://t[0]:fetchinstruction

begin

ir<=o_d;

pc<=pc+1;

end

…………….//其它

endcase

end2.0.5-4

4條指令CPU的指令操作:LDA取數(shù)流程sel_acc_inacc[7:0]acc_en!ck運(yùn)算器o_d[7:0]ALU_Acasex{ir[7:6],t,cy}

=

5’b0110x

!ck!rcController

ir[7:6]cysel_to_oackt[1:0]sel_acc_inacc_en

sel_to_oa

1)

{2’b00,ir[5:0]}→o_a,發(fā)!rc,sel_acc_in,en_acc,!ck2)M

→o_d

→accir_enir[7:0]!cksel_to_oa指令部件o_a[7:0]2’b00,ir[5:0]非2.0.5-44條指令CPU的指令操作:LDA取數(shù)描述組合邏輯:向存貯器發(fā)取數(shù)的地址與讀令5'b0110x://t[1]:LADfetchdata

begin

o_a={2'b00,ir[5:0]};

rc=1‘b1;

//發(fā)出讀!rc

wc=1'b0;

end注:頭、尾省略時(shí)序邏輯:取數(shù)到acc5'b0110x://t[1]:LDAfetchdata

begin

acc<=o_d;

end注:頭、尾省略casex{ir[7:6],t,cy}

=

5’b0010x

2.0.5-5

4條指令CPU的指令操作:ADD加法流程!ck!rcController

ir[7:6]cysel_to_oackt[1:0]sel_acc_inacc_enADDcysel_acc_inacc[7:0]acc_en!ckALU[7:0]ADDABFcn8!ckDQADD運(yùn)算器

sel_to_oa

1)

{2’b00,ir[5:0]}→o_a

發(fā)!rc,2)M

→o_d

→ALU_BADD,!sel_acc_in,en_acc,!ck3){1’b0,acc}+{1’b0,o_d}→{cy,acc}非非ir_enir[7:0]!cko_d[7:0]指令部件2’b00,ir[5:0]sel_to_oao_a[7:0]pco_d2.0.5-54條指令CPU的指令操作:ADD加法描述組合邏輯:向存貯器發(fā)取第二操作數(shù)的地址與讀令5'b0010x://t[1]:ADDfetchdata

begin

o_a={2'b00,ir[5:0]};

rc=1‘b1;

//發(fā)出讀

!rc

wc=1'b0;

end注:頭、尾省略時(shí)序邏輯:作加法,結(jié)果→acc5'b0010x://t[1]:add

begin

{cy,acc}<={1'b0,acc}+{1'b0,o_d};

end注:頭、尾省略,cy--進(jìn)位2.0.5-54條指令CPU的關(guān)鍵時(shí)間:Tmin最小周期確定

本固定周期數(shù)的Tmin取決于ADD加法總操作時(shí)間Tmin理論波形

!clk的邏輯延遲q[0]!ckclkckq[1]q[2]t[0]t[1]實(shí)際波形(延遲+傾斜跳動(dòng))Tmin﹥讀存貯器時(shí)間

+加運(yùn)算最大時(shí)間讀存時(shí)間=CPU地址、讀令到芯片延遲

+存貯芯片標(biāo)稱讀寫時(shí)間

+芯片數(shù)據(jù)讀出到CPU延遲加運(yùn)算最大時(shí)間=最長進(jìn)位鏈時(shí)間clk!ckt[0]t[1]Tmin時(shí)序的另一種設(shè)計(jì):只用clk后跳沿單倍時(shí)鐘移位3分頻移位2分頻缺點(diǎn):從前面Tmin最小周期確定,可以看出,因加法指令(取第二操作數(shù)+加運(yùn)算)把CPU的每條指令的周期時(shí)間都加大許多,速度也就很大降低,這是固定兩周期的缺點(diǎn)。改進(jìn):設(shè)計(jì)變周期時(shí)序,加法指令增加一個(gè)周期t[2]t[1]:類同LDA取數(shù)指令操作,但取到的數(shù)送暫存器tmp

tmp<=o_d;

t[2]:作加法運(yùn)算操作

{cy,acc}<={1'b0,acc}+{1'b0,tmp};Tmin:此時(shí)Tmin最小周期確定,在讀存貯器時(shí)間或加法運(yùn)算最長進(jìn)位鏈時(shí)間上

取最大值,估計(jì)速度可提高一倍。2.0.5-54條指令CPU的指令操作:ADD的設(shè)計(jì)缺點(diǎn)與改進(jìn)時(shí)序模塊:wire

cyc3=(ir[6:7]==2’b00);always@(posedge

clkor

posedgereset)begin

if(reset==1)t<=3'b000;

else

if(t==3'b000)t<=3'b001;

else

begint[0]<=t[1]&!cyc3|t[2]&cyc3;t[1]<=t[0];t[2]<=t[1]&cyc3;

end

end右邊的遷移方式類似狀態(tài)機(jī)時(shí)序見后2.0.5-54條指令CPU的指令操作:單倍頻

變周期實(shí)現(xiàn)遷移方式:可將周期遷移單設(shè)模塊always@(posedge

clkorposedgereset)begin

if(reset==1)t<=3'b001;

else

case

({ir[7:6],t})

5‘bxx001:

pc<=pc+1;ir<=o_d;

t<=3’b010;5‘b00010:tmp<=o_d;

t<=3’b100;

5‘b00100:{cy,acc}<=acc+tmp

t<=3’b001;

5‘b01010:acc<=o_d;

t<=3’b001;

5‘b10010:t<=3’b001;5‘b11010:if(!cy)pc<={2’b00,ir[5:0]}

t<=3’b001;end2.0.5-64條指令CPU的指令操作:STA存數(shù)流程ir_enir[7:0]!cko_d[7:0]指令部件2’b00,ir[5:0]sel_to_oao_a[7:0]acc[7:0]acc_en!ckwc3態(tài)門運(yùn)算器LAU_A!ckwr=!(wc&ck)Controller

ir[7:6]cysel_to_oackt[1:0]

wccasex{ir[7:6],t,cy}

=

5’b1010x

sel_to_oa

1)

{2’b00,ir[5:0]}→o_a

發(fā)

wr,wc打開3態(tài),寫存貯器2)acc→o_d

→M非2.0.5-64條指令CPU的指令操作:STA存數(shù)描述組合邏輯:向存貯器發(fā)送存的地址,寫令打開到o_d

的3態(tài)緩沖與寫令脈沖wr

5'b1010x://t[1]:STASTOREdata

begin

o_a={2'b00,ir[5:0]};

rc=1'b0;

wc=1'b1;

endassign

wr=!(wc&ck);//異步存貯器須寫脈沖

assign

o_d=wc?acc:8’hzz;//數(shù)據(jù)雙向3態(tài)注:頭、尾省略2.0.5-74條指令CPU的指令操作:JNC非進(jìn)位轉(zhuǎn)移流程sel_pc_in復(fù)位啟動(dòng)首地址reset!ckpc_ldpc[7:0]pc_add_1ir_enir[7:0]!cko_d[7:0]指令部件2’b00,ir[5:0]ir_enir[7:0]!ck!ckController

ir[7:6]Cy=0ckt[1:0]sel_pc_in

pc_ld選ircasex{ir[7:6],t,cy}

=

5’b11100

sel_pc_in,pc_ld,cy=0,!ck

1)

{2’b00,ir[5:0]}→pc

2.0.5-74條指令CPU的指令操作:JNC非進(jìn)位轉(zhuǎn)移描述時(shí)序邏輯:轉(zhuǎn)移地址打入程序計(jì)數(shù)器pc5'b11100://t[1]:JNC

begin

pc<={2'b00,ir[5:0]};

end注:頭、尾省略描述形式:分部件或功能模塊,然后分組合與時(shí)序分組合邏輯[含always@()型、assign、門原語句]

與時(shí)序邏輯[always@(clk跳沿)]描述方法:

行為對(duì)象不考慮具體結(jié)構(gòu),僅從功能描述,如F=A+B

結(jié)構(gòu)細(xì)化用“標(biāo)準(zhǔn)單元”結(jié)構(gòu)實(shí)現(xiàn)目標(biāo)描述,用全加器賦值方式:

1)always@()組合、鎖存、時(shí)序塊的if..else、case類等

2)assign、門原語句

3)調(diào)庫函數(shù)、實(shí)例(包括TTL電路)4)3態(tài),雙向?qū)崿F(xiàn)2.0.64條指令CPU的邏輯描述-0(VerilogHDL)

描述形式、方法,賦值方式2.0.64條指令CPU的邏輯描述-1(VerilogHDL)module

cpu4_2t(reset,clk,we,rc,o_d,o_a,_acc,_pc,_ir,_t,_cy,_ck);//declare****************要看的內(nèi)部信號(hào)

input

clk,reset;

output

we;//CPUwritepulse

output

rc;//CPUreadorder

inout

[7:0]

o_d;//outsidedatabus

output[7:0]

o_a;//outsideaddressbus

output_ck;//clockofCPUrunandSYNCofRAM_dq

reg

[7:0]i_a;//insideaddressbus

reg

[7:0]i_d;//insidedatabus

reg

[7:0]acc;//Acc_Reg

reg

[7:0]ir;//instruction_Reg

reg

[7:0]pc;//CPUprogramcounterwichload

reg

wc;//CPUwriteorder

reg

rc;//readenable2.0.64條指令CPU的邏輯描述-2

(VerilogHDL)

reg

cy;//carryofADD

wireck;

wire

[1:0]t;//whensimulation,lookatinternalsignalforimmobile

output

_cy;

//lookatckandcy

output

[7:0]_acc;

//lookatacc

output

[7:0]_ir;

//lookatir

output[7:0]_pc;

//lookatpc

output[1:0]_t;

//lookatt

assign

_acc=acc;

assign

_ir=ir;

assign

_pc=pc;

assign

_t=t;

assign

_ck=ck;

assign

_cy=cy;2.0.64條指令CPU的邏輯描述-3

(VerilogHDL)//Timer

****************reg

[2:0]q;reg

[1:0]cyc;always

@(posedge

clk)

begin

if((q==3'b111)|(q==3'b011)|(q==3'b110)|(q==3'b101)|(q==3‘b000))//非法態(tài)恢復(fù)

q<=3'b001;

elsebeginq[0]<=q[2];q[1]<=q[0];q[2]<=q[1];

end//此設(shè)計(jì)保證CK居中,

end//可使用↑↓assign

ck=q[1];//assignwe=wc&q[1];//對(duì)異步存貯器assignwe=wc;

//對(duì)輸入同步存貯器wire

ck0=q[0];always@(posedge

ck0

or

posedge

reset)

beginif(reset)

cyc<=2'b00;

else

if

((cyc==2'b11)|(cyc==2'b00))

cyc<=2'b01;elsebegin

cyc[0]<=cyc[1];//|(cyc==2’b00)cyc[1]<=cyc[0];

endendassign

t=cyc;

注:可變周期與指令操作碼相關(guān)2.0.64條指令CPU的邏輯描述-4

(VerilogHDL)//combinationlogicpart*****************發(fā)地址、讀或?qū)戇x通(允許)

always

@(ir[7:0]ortorcyorpc)//所有條件、表達(dá)式右邊信號(hào)

begin

casex

({ir[7:6],t,cy})

5'bxx01x://t[0]:fetchinstruction

begin

i_a=pc;

rc=1‘b1;//“1”有效,

wc=1‘b0;//無效的也必須“0”

end

5'b0010x://t[1]:ADDfetchdata

begin

i_a={2'b00,ir[5:0]};

rc=1'b1;

wc=1'b0;

end2.0.64條指令CPU的邏輯描述-5

(VerilogHDL)5‘b0110x://t[1]:LDAfetchdata接前combinationlogicpart

begin

i_a={2'b00,ir[5:0]};

rc=1'b1;wc=1'b0;

end5'b1010x://t[1]:STAwritedata

begin

i_a={2'b00,ir[5:0]};

wc=1'b1;rc=1'b0;

end

default://缺省項(xiàng)(不用情況)必須要

begin

i_a=pc;wc=1'b0;rc=1'b0;

end

endcase

end2.0.64條指令CPU的邏輯描述-6(VerilogHDL)//timinglogicpart*****************************always@(negedge

ckorposedge

reset)

//用后沿時(shí)序充足,異步復(fù)位

begin//用<=賦值符合通常概念,不會(huì)出問題

if

(reset)

pc<=8‘h3f;//resetseuupfirstadderofprogramrun

else

casex

({ir[7:6],t,cy})

5'bxx01x://t[0]:fetchinstruction

begin

ir<=o_d;pc<=pc+1;

end

5'b0010x://t[1]:add

begin

{cy,acc}<={1'b0,acc}+{1'b0,o_d};

end2.0.64條指令CPU的邏輯描述-7(VerilogHDL)

5‘b0110x://t[1]:LDAfetchdata接前timinglogicpart

begin

acc<=o_d;

end

5'b11100://t[1]:JNC

begin

pc<={2'b00,ir[5:0]};

end//時(shí)序邏輯不要default(缺省項(xiàng))

endcase

end

assign

o_d=wc?acc:8'hzz;//STAwrite_dataoutput//或調(diào)用3態(tài)門、函數(shù)庫MaxII最好用74465

endmodule狀態(tài)機(jī)控制是包括CPU在內(nèi)的所有控制的控制原理,特別是在“CPU”出現(xiàn)之前,如電梯、機(jī)床等各種自動(dòng)控制技術(shù),就上述最簡的4條指令CPU設(shè)計(jì),有5個(gè)狀態(tài)遷移:5個(gè)狀態(tài)用3位表示S[2:0]1.復(fù)位進(jìn)入取指令狀態(tài)S=3’b100,

取指令,CLK1下打入ir[7:0],同時(shí)按o_d[7:6]遷移到相應(yīng)的指令狀態(tài)2.相應(yīng)指令的功能操作,CLK2下打入acc或PC[7:0](JNC,cy=0),同時(shí)遷移到狀態(tài)S=3’b100取指可見:無明顯周期,實(shí)際狀態(tài)中隱含時(shí)序。而確定狀態(tài)數(shù)即有多少不可同時(shí)進(jìn)行的微操作是關(guān)鍵RESETSadd000Sfi100Slda001Sjnc011Ssta010cy=0?取指10取指時(shí)o_d[7:6]1101002.0.1A4條指令CPU的狀態(tài)機(jī)控制狀態(tài)時(shí)序2.0.1A4條指令CPU的狀態(tài)機(jī)控制狀態(tài)時(shí)序的集中描述always

@(negedge

clk

orposedge

reset)

beginif

(reset)s<=3'b100;

elseif

((s==3'b100))

begin

ir<=o_d;s<={1'b0,o_d[7:6]};//statetoperinstruction

end

elseif((s[2]==0))

s<=3'b100;//returnstateoffetchinstruction

endalways

@(posedge

clk

orposedge

reset)

beginif

(reset)

begin

pc_o<=8'h0e;s<=4'b100;

endelsecasex

(s)

3'b100://fetchinstruction

begin

irh<=o_d[7:0];

pc_o<=pc_o+1;

s<={1'b0,o_d[7:5]};

end3'b000://add+

begin

{cy,acc}<={1'b0,acc}+{1'b0,o_d[7:0]};s<=3'b100;

end

3'b001://LDAfetchdata

begin

acc<=o_d;s<=3'b100;

end

3'b010://STAwritedata

begin

s<=3'b100;

end

3'b011://JNC

begin

if

(!cy)

pc_o<={2'b00,ir[5:0]};s<=3'b100;

endend

endcase

2.0.1A4條指令CPU的狀態(tài)機(jī)控制狀態(tài)時(shí)序的分散遷移描述2.0.1A4條指令CPU的狀態(tài)機(jī)控制基本規(guī)則取指令:首取主操作碼(區(qū)分不同功能指令的部分)在復(fù)位主狀態(tài)Si,n次指令要據(jù)主操作碼下的相應(yīng)n-1輔助狀態(tài)。每取一次指令,狀態(tài)遷移到下一次繼續(xù)取指令狀態(tài)。取完后據(jù)主操作碼轉(zhuǎn)移到相應(yīng)的首次微操作操作狀態(tài)Sm(前面描述狀態(tài)后兩位使用操作碼)。不同時(shí)的微操作(見流程表)如讀存、送存、地址運(yùn)算、數(shù)據(jù)運(yùn)算、轉(zhuǎn)移、棧操作、讀/寫寄存器、I/O操作等等確定操作的狀態(tài)編碼。操作:

case({S,OP輔}),分組合、時(shí)序邏輯,而狀態(tài)遷移僅發(fā)生在時(shí)序邏輯,見下:在某狀態(tài)下如Sm

,begin同時(shí)的多個(gè)微操作語句后,狀態(tài)遷移到下步必須的、且不同時(shí)的微操作狀態(tài)end。每條指令最后的微操作結(jié)束,狀態(tài)遷移到取指令主操作碼狀態(tài)Si,又開始取指令,…(循環(huán))狀態(tài)時(shí)序在并行流水站上不適用,而用于沖突仲裁控制上。參考代碼與作業(yè)Maxii下面的參考代碼:E:\instance\veriloghdl\maxii\cpu4\cpu4_new\cpu4s參考文檔:E:\實(shí)驗(yàn)教材\6_相關(guān)軟件使用與手冊(cè)\QuartusII\自編\1_MiitoQii移植須知.doc作業(yè)一:移植代碼到quartus

下面,進(jìn)行仿真(把異步的MEM訪問,改成同步時(shí)序,注意存儲(chǔ)器使用mif文件進(jìn)行初始化的問題)。作業(yè)二:使用狀態(tài)機(jī)設(shè)計(jì)分散遷移模式編寫一個(gè)CPU4,仿真結(jié)果應(yīng)與作業(yè)一相同。作業(yè)三參考E:\Platform_SW\cpu_usb_old\cpu_example\new_design\cpu_chip\cpu8tv.v完成一個(gè)8條指令的基于狀態(tài)機(jī)的實(shí)現(xiàn)的CPU?;贓:\實(shí)驗(yàn)教材\2_計(jì)算機(jī)原理\實(shí)驗(yàn)內(nèi)容與參考\cpu檢測(cè)程序或目標(biāo)碼\cputest_8.asm和cputest_8.bin創(chuàng)建一個(gè)mif文件。使用該mif文件初始化存儲(chǔ)器。參考cpu4s的實(shí)現(xiàn),需要?jiǎng)?chuàng)建一個(gè)bdf文件,包含CPU、存儲(chǔ)器。運(yùn)行仿真之后,要求結(jié)果與cputest_8.asm中要求的一致(檢查仿真的memory)。2.0.7-0仿真與下載的前提有關(guān)程序啟動(dòng)首地址問題11.操作系統(tǒng)下的計(jì)算機(jī)的啟動(dòng)與程序運(yùn)行在開機(jī)時(shí),由上電復(fù)位初始化設(shè)置程序計(jì)數(shù)器(PC或CS+IP)為指向BIOS(ROM)內(nèi)程序啟動(dòng)首地址,隨后開始運(yùn)行BIOS程序,直到引導(dǎo)操作系統(tǒng)(加載OS原理類同下)。在操作系統(tǒng)下,是由操作系統(tǒng)判別要加載的目標(biāo)程序如.exe文件的文件頭和重定位程序映象信息(包括編譯產(chǎn)生的加載首地址、啟動(dòng)首地址、長度及其浮動(dòng)控制等等)進(jìn)行以下處理:

1)根據(jù)當(dāng)前存貯空間使用情況,分配當(dāng)前程序所允許加載的內(nèi)存空間的首地址,并計(jì)算編譯產(chǎn)生的加載首地址與實(shí)際加載的內(nèi)存空間的首地址的差。

2)調(diào)當(dāng)前程序目標(biāo)碼到OS系統(tǒng)的緩沖區(qū),以進(jìn)行予處理。

3)計(jì)算并修改目標(biāo)碼中依賴“絕對(duì)”地址的指令與數(shù)據(jù)的地址值(通常加或減這個(gè)差,或訪存前用地址查表法獲得需要的地址)。將經(jīng)過處理的程序目標(biāo)碼加載到允許加載的內(nèi)存空間。

4)OS通過具有中斷和陷進(jìn)指令(call等)的程序?qū)⒛繕?biāo)程序的啟動(dòng)首地址設(shè)置到程序計(jì)數(shù)器(PC或CS、IP)

,接著運(yùn)行目標(biāo)程序。(程序內(nèi)轉(zhuǎn)移和返回是通過堆棧彈、壓實(shí)現(xiàn))2.0.7-0

仿真與下載的前提有關(guān)程序啟動(dòng)首地址問題2

#重新定位信息記錄或標(biāo)記了可執(zhí)行的目標(biāo)程序代碼在加載內(nèi)存時(shí)依賴“絕對(duì)”地址的指令與數(shù)據(jù),該“絕對(duì)”地址與程序啟動(dòng)首地址相關(guān),而程序啟動(dòng)首地址又與操作系統(tǒng)判別將程序可放在內(nèi)存的何位置即浮動(dòng)相關(guān))

#中斷和陷進(jìn)指令可設(shè)置程序計(jì)數(shù)器值的指令,CPU必須有相應(yīng)的邏輯控制支持。2.CPU設(shè)計(jì)中的驗(yàn)證的下載測(cè)試(仿真類同)CPU設(shè)計(jì)中的驗(yàn)證下載測(cè)試,此時(shí)尚沒有BIOS和OS,為了運(yùn)行測(cè)試程序,同樣必須在啟動(dòng)測(cè)試程序前,設(shè)置程序計(jì)數(shù)器PC(或IP)為測(cè)試程序的啟動(dòng)首地址。目前使用與上述類似的2種方法:推薦使用下述①,因簡單。①復(fù)位(在Debug下實(shí)際是軟復(fù)位)初始化設(shè)置程序計(jì)數(shù)器(因儀器電源已打開,不可用上電復(fù)位邏輯了),但必須知道CPU測(cè)試程序的啟動(dòng)首地址,并注意平臺(tái)地址是雙向的處理。同②1)

例如本例程序可直接是0eH,也可3fH+轉(zhuǎn)移指令到0eH

則將CPU程序計(jì)數(shù)器的復(fù)位初始化語句改為:

pc_o<=8‘h0e;

//

或3fH+轉(zhuǎn)移指令到0eH

推薦使用2.0.7-0

仿真與下載的前提有關(guān)程序啟動(dòng)首地址問題32.CPU設(shè)計(jì)中的驗(yàn)證的下載測(cè)試(仿真類同)續(xù)1②由實(shí)驗(yàn)平臺(tái)Debug自動(dòng)判別測(cè)試程序文件頭信息、設(shè)置程序的啟動(dòng)首地址,但需要CPU必須有相應(yīng)的邏輯控制支持。即:

注意:現(xiàn)此法因復(fù)雜已基本不用

1)cpu模塊的出入信號(hào)表內(nèi)增加(……run,cp,oa)若在cpu模塊的地址o_a屬性僅是輸出時(shí),必須要oa輸入,因頂層模板地址A_[]是雙向,所以必須頂層模板必須增加語句:

assignA_[7:0]=run?o_a[7:0]:8’hzz;

調(diào)用端口增加:.oa(A_[7:0);

如cpu模塊的地址o_a屬性是雙向,則不用增加oa。

2)屬性聲明增加input:CPU運(yùn)行run,脈沖cp,輸入地址oa;

run=0允許Debug(PC機(jī))訪問主存和設(shè)置CPU啟動(dòng)首地址

禁止CPU時(shí)鐘CLK,禁止CPU訪問主存。

run=1打開CPU時(shí)鐘CLK,允許CPU工作和訪問主存,

禁止Debug訪問主存。當(dāng)run=0、cp↑/↓時(shí):pc<=oa;

設(shè)置的啟動(dòng)首地址2.0.7-0仿真與下載的前提有關(guān)程序啟動(dòng)首地址問題42.CPU設(shè)計(jì)中的驗(yàn)證的下載測(cè)試(仿真類同)續(xù)2②由實(shí)驗(yàn)平臺(tái)Debug自動(dòng)判別測(cè)試程序文件頭信息、設(shè)置程序的啟動(dòng)首地址,但需要CPU必須有相應(yīng)的邏輯控制支持。續(xù)

3)有關(guān)程序計(jì)數(shù)器的初始化部分修改

wire

cpu_ck=ck|cp;

//cp是下降的后沿有效,所以下面是negedge_ck

always@(negedge

cpu_ck

orposedge

reset)//原為ck

beginif

(reset)

pc_o<=8‘h000;//或3f或0e,可刪除,時(shí)間上先

elseif(run==0)//新增:Debug自動(dòng)設(shè)置啟動(dòng)首地址

pc_o<=oa;//注意等寬時(shí)間上后

else

casex

({ir,t,….})……

此法非特殊情況下不使用若程序計(jì)數(shù)器是74161函數(shù)實(shí)現(xiàn),則打入脈沖和裝入條件均要合成,2.0.7-14條指令CPU的驗(yàn)證1--邏輯模擬仿真基礎(chǔ)

對(duì)CPU最適宜的仿真是運(yùn)行全面檢測(cè)程序的仿真其條件是:(QuartusII為例)

1)必須設(shè)計(jì)存貯器調(diào)SRAM庫、ROM(FPGA)

也可設(shè)計(jì)寄存器堆、固接高/低多選擇電路(CPLD,相當(dāng)ROM)2)必須設(shè)計(jì)全面檢測(cè)程序,須編譯為目標(biāo)碼

3)必須設(shè)計(jì)存放程序目標(biāo)碼的*.mif文件

4)必須設(shè)計(jì)仿真波形初始化文件*.vwf

按需要設(shè)置輸入,設(shè)置輸出“0”或無效,設(shè)置雙向/3態(tài)為高阻

5)這種仿真的頂層文件有兩種實(shí)現(xiàn)方式:

a)以描述文件.v為頂層模板--不推薦

cpucore(如cpu4_2t.v)修改

+

調(diào)用SRAM實(shí)例文件或直接調(diào)存貯庫

b)以圖形如cpu4_2tb.bdf為頂層模板(推薦),其組成:

cpu4_2t.v符圖

+RAM庫符圖+

腳符圖+

連線,名2.0.7-14條指令CPU的驗(yàn)證1--邏輯模擬仿真:頂層描述1a)直接修改cpu4_2t.v為仿真用文件,文件中調(diào)用實(shí)例:改因—仿真時(shí),CPU訪問的存貯器是FPGA芯片內(nèi)部的SRAM,因此

*.v內(nèi)部不能設(shè)計(jì)為3態(tài)雙向連接,訪存數(shù)據(jù)需讀/寫分開。

獨(dú)有:圖形文件*.gdf/bdf內(nèi)的部件可設(shè)計(jì)為3態(tài)雙向連接。改法o_d

改為SRAM讀出數(shù),acc(累加器輸出)是SRAM寫入數(shù),同時(shí)注銷數(shù)據(jù)3態(tài)輸出語句。然后調(diào)入SRAM實(shí)例。a1:調(diào)入RAM實(shí)例:先用File\MegaWizardPlug-InManager

創(chuàng)建sram_mm.v

文件,步驟如下:(MII,QII類同)1.選Create…(選器件注意:Cyclone

族僅同步型)

2.選Storage\LPM_RAM_DQ,實(shí)例名鍵入或?yàn)g覽選擇如sram_mmLPM_RAM_DQ系非寫即讀、讀/寫數(shù)據(jù)分開、同/異步可選的

3.數(shù)據(jù)寬度如8,地址寬度如8,均選不寄存(即異步,不要clock)4.選存貯器初始化文件即測(cè)試程序碼

如cpu4_bin.mif5.Finishsram_mm.v

已創(chuàng)建,就可在描述中調(diào)用如下:

\sram_mmmemory(.address(o_a),.we(wr),//調(diào)sram_mm.v.data(o_d),.q(q_in));

2.0.7-14條指令CPU的驗(yàn)證1--邏輯模擬仿真:頂層描述2庫//a2:具有RAM可編程芯片F(xiàn)PGA的SRAM庫函數(shù)//

lpm_ram_dq

(同/異步、入出數(shù)據(jù)分開、非寫即讀)功能參數(shù)說明//同步均上升沿↑有效,讀RAM要時(shí)延,注意CPU打入寄存器的時(shí)序配合。//FUNCTIONlpm_ram_dq

(address[LPM_WIDTHAD-1..0],we,//inclock,outclock,data[LPM_WIDTH-1..0])//WITH(LPM_WIDTH,//LPM_WIDTHAD,//LPM_NUMWORDS,//LPM_FILE,//LPM_INDATA,//LPM_ADDRESS_CONTROL,//LPM_OUTDATA)//….//RETURNS(q[LPM_WIDTH-1..0]);//we--是寫令高有效;data—寫入數(shù)據(jù);q—讀出數(shù)據(jù)//DATA/ADDRESS不寄存即不要incolck/outclock,是異步方式//a1:

直接調(diào)庫lpm_ram_dq,輸入同步型描述段如下:\lpm_ram_dq

mm(.address(o_a),.we(write),//cpuoutputo_a,o_d.data(o_d),.q(q_in).inclock(ck));//cpuinputq_in

defparam

//“UNREGISTERED”即指不用“UN”時(shí)鐘打人寄存器

mm.LPM_WIDTH=8,//數(shù)據(jù)寬度

mm.LPM_WIDTHAD=8,//地址寬度

//mm.LPM_NUMWORD=256,//存貯器單元數(shù)

mm.LPM_INDATA="REGISTERED",//數(shù)據(jù)輸入寄存↑

mm.LPM_ADDRESS_CONTROL=“REGISTERED”,//地址輸入寄存↑

mm.LPM_OUTDATA="UNREGISTERED",//輸出數(shù)據(jù)不寄

mm.LPM_FILE=“cpu4_bin.mif”,//運(yùn)行的程序的目標(biāo)文件hex及路徑

mm.LPM_TYPE=“LPM_RAM_DQ”,//類型:入出數(shù)據(jù)分開

mm.USE_EAB=“ON”;

//FPGA隱藏塊使用,也可不用

mm.LPM_HINT="USED",//ENABLE_RUNTIME_MODneed,defaultis"UNUSED"

mm.ENABLE_RUNTIME_MOD="YES",//In-SystemMemoryContent

//Editorenable,"NO"--ban

mm.INSTANCE_NAME="MEM";//InstanceID//如inclock=ck↑寄存數(shù)據(jù)地址,則CPU用ck↓打入累加器、指令寄存器等2.0.7-14條指令CPU的驗(yàn)證1--邏輯模擬仿真:頂層描述32.0.7-14條指令CPU的驗(yàn)證1--邏輯模擬仿真:b)頂層圖形CPU模塊存貯器模塊入出引腳庫符號(hào)的調(diào)入:1.圖中空白處擊鼠標(biāo)右鍵2.彈出編輯命令對(duì)話框-1inserts\Symbol\lib.3,彈出調(diào)入符號(hào)對(duì)話框-2mega…\storage

選符號(hào)文件

lpm_ram_dq

OK4.彈出編輯端口/參數(shù)對(duì)話框選擇存貯器數(shù)據(jù)地址位數(shù),

讀寫與片選信號(hào),時(shí)鐘要?其它參數(shù)選擇等….

初始化文件選擇OK該模塊由cpu_sim_mm.v創(chuàng)建

該文包括調(diào)用

lpm_ram_dq

lpm_rom

及數(shù)據(jù)雙向描述主存+微存3態(tài)緩沖Cyclone讀/寫數(shù)據(jù)分開轉(zhuǎn)成雙向的通用方式cpu4_2tb.bdf圖形仿真模板通過編譯的cpu4_2t.v,用File\CreateDefaultSymbol創(chuàng)建、調(diào)入非寫即讀輸入同步256cell時(shí)延約20ns仿真時(shí),常用的FPGA_RAM存貯模塊類型--取決芯片與庫類及參數(shù)設(shè)置2.0.7-14條指令CPU的驗(yàn)證1--邏輯模擬仿真:b)頂層圖形入/出時(shí)鐘4.同步讀/寫數(shù)據(jù)與地址均分開(dp)型11.上圖片的RAM模塊是輸入寄存同步型,也可據(jù)需要設(shè)置為是輸入輸出均寄存同步型3.

同步讀/寫數(shù)據(jù)分開(dq)型2.異步數(shù)據(jù)雙向(IO)型輸出可寄存/不寄存寫/讀分開非寫即讀非寫即讀非寫即讀讀/寫時(shí)鐘輸出可寄存/不寄存dp型沒有在系統(tǒng)存貯器內(nèi)容編輯功能讀/寫數(shù)據(jù)分開轉(zhuǎn)成雙向的通用方式ep1c12ep1c12o_aep1c12CycloneCycloneCycloneEPF10K系列FPGA5.同步讀/寫數(shù)據(jù)與地址均分開(dp)型2為了方便同學(xué),實(shí)驗(yàn)時(shí),邏輯模擬仿真的頂層圖形模板文件*.gdf/bdf和仿真波形初始化文件*.scf/vwf,目標(biāo)文件*.qpf,均由實(shí)驗(yàn)室提供,使用方法步驟如下:模板文件:cpu_4tg.gdf/cpu4_2tb.bdf

用自己設(shè)計(jì)的cpu4_2t.v→創(chuàng)建目標(biāo)→分配引腳足夠的器件(最好與平臺(tái)ep1c12Q240相同,如因仿真輸出觀察的引腳多而不夠時(shí),分配同家族Cyclone多引腳的)→成功編譯→創(chuàng)建其符號(hào)文件cpu4_2t.bsf。將其與cpu4_2t.v均拷貝到仿真模板文件夾(覆蓋原來的,原cpu4_2t.v是空文件)→打開頂層圖形文件cpu4_2tb.bdf→選中圖中的CPU模塊→刪除→右擊圖中空處→選擇Insert/Symbol…→打開,Project→選自己的cpu4_2t.v.bsf→調(diào)入放原刪除處→調(diào)整修改(注意:若自設(shè)計(jì)的輸出、名稱、排序等可能與模板中CPU不全相同,則需移動(dòng)或增刪輸出引腳,修改數(shù)組寬度,注意信號(hào)類型屬性寬度一致性,切勿搞錯(cuò))→編譯目標(biāo)*.qpf,成功→仿真→看仿真波形→在仿真報(bào)告窗口,擊

存貯器項(xiàng),看內(nèi)容與結(jié)果。若結(jié)果不正確,則結(jié)合程序,從結(jié)果與波形分析查找原因,直到排除。通常先看取指令對(duì)否?然后,看取數(shù)對(duì)否?執(zhí)行對(duì)否?2.0.7-14條指令CPU的驗(yàn)證1--邏輯模擬仿真:b)頂層圖形頂層圖形模板的使用2.0.7-14條指令CPU的驗(yàn)證1CPU檢測(cè)程序Cpu4_test.asm指令碼為高2位:00加,01取數(shù),10存數(shù),11非進(jìn)位轉(zhuǎn)

文件頭參數(shù)地址

SAD;0000編譯填入裝入程序的開始地址二字節(jié),默認(rèn)0000;0000;0E02編譯填入啟動(dòng)程序運(yùn)行首地

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論