從最簡的條指令CPU實現了解CPU設計_第1頁
從最簡的條指令CPU實現了解CPU設計_第2頁
從最簡的條指令CPU實現了解CPU設計_第3頁
從最簡的條指令CPU實現了解CPU設計_第4頁
從最簡的條指令CPU實現了解CPU設計_第5頁
已閱讀5頁,還剩76頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第二章CPU設計概論2.0.0從最簡的4條指令CPU,看CPU的設計與測試驗證▲步驟:==>指令集

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

==>周期微操作流程表

==>選定EDA設計系統和HDL語言(如QuartusII…,.v)

==>CPU核設計描述(HDL/圖形)

==>測試程序設計

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

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

--實驗設計到此

==>版圖設計

==>CPU的ASIC芯片生產與測試

==>CPU主板的全面測試驗證包括BOOTOS。--科研設計必須的后續

還有CPU預研時的模擬仿真機(虛擬機,C語言)設計四條指令CPU指令集

ADD

整數加法STA

存數LDA

取數JNC

非進位轉移時序固定2周期架構馮諾曼型、數據地址不復用

特點8bit數據地址復位啟動最簡的4條指令CPU設計2.0.14條指令CPU的指令格式與功能:自定義

controlmodecombinationlogicir[7:0]InstructionRegister單字節指令

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

Acc[7:0]accumulatorregister

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

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

CPU4條:

resetclk

o_a[7:0]

外部地址總線

(也有讀寫地址分開的)

o_d[7:0]

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

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

讀存貯器信號(高有效)

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

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

固定

2周期時序波形圖clk3Tt1t0ckTT=1/fTfMHzf

/3f

/6f

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

4條指令CPU的描述框圖(行為對象)sel_pc_in復位啟動首地址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態門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}

運算器外部數據總線轉移取數外部地址總線存貯器低有效wr

rc2.0.5

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

發rcM→o_d

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

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

發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}

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

sel_to_oa

{2’b00,ir[5:0]}→o_a,發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

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

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

復位啟動: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))//非法態恢復

q<=3'b001;

else

begin

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

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

endendassignck=q[1];//CPU工作脈沖固定2周期:(設計簡單)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;均用移位實現注:周期數與指令長度功能、寄存器傳送級數、脈沖↑↓、結構流水相關2.0.5-2

4條指令CPU的指令操作:復位設置啟動首地址sel_pc_in復位啟動首地址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)//復位包括:上電開關、復位開關、Ctrl+Alt+Del

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

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

直接設置

如0eh2)

固定設置如

3fh+轉移指令到

0eh2)

系虛設置靈活可程序修改真實的啟動首地址

OS:根據可執行文件的文件頭中的程序首地址,用陷阱指令設置,轉移設置Debug:根據可執行文件的文件頭中序首地址,

用邏輯設置

設程序的真實啟動首地址為

0eh轉移2’h0e2.0.5-3

4條指令CPU的指令操作:取指令流程sel_pc_in復位啟動首地址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發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;//發出讀!rc

end

……………..//其它

default:begin

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

end

endcase

end2.0.5-3

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

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

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

復位首址、取指令到ir、pc+1的微操作時序邏輯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取數流程sel_acc_inacc[7:0]acc_en!ck運算器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,發!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取數描述組合邏輯:向存貯器發取數的地址與讀令5'b0110x://t[1]:LADfetchdata

begin

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

rc=1‘b1;

//發出讀!rc

wc=1'b0;

end注:頭、尾省略時序邏輯:取數到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運算器

sel_to_oa

1)

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

發!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加法描述組合邏輯:向存貯器發取第二操作數的地址與讀令5'b0010x://t[1]:ADDfetchdata

begin

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

rc=1‘b1;

//發出讀

!rc

wc=1'b0;

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

begin

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

end注:頭、尾省略,cy--進位2.0.5-54條指令CPU的關鍵時間:Tmin最小周期確定

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

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

+加運算最大時間讀存時間=CPU地址、讀令到芯片延遲

+存貯芯片標稱讀寫時間

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

tmp<=o_d;

t[2]:作加法運算操作

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

取最大值,估計速度可提高一倍。2.0.5-54條指令CPU的指令操作:ADD的設計缺點與改進時序模塊: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右邊的遷移方式類似狀態機時序見后2.0.5-54條指令CPU的指令操作:單倍頻

變周期實現遷移方式:可將周期遷移單設模塊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存數流程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態門運算器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

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

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

的3態緩沖與寫令脈沖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;//數據雙向3態注:頭、尾省略2.0.5-74條指令CPU的指令操作:JNC非進位轉移流程sel_pc_in復位啟動首地址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非進位轉移描述時序邏輯:轉移地址打入程序計數器pc5'b11100://t[1]:JNC

begin

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

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

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

行為對象不考慮具體結構,僅從功能描述,如F=A+B

結構細化用“標準單元”結構實現目標描述,用全加器賦值方式:

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

2)assign、門原語句

3)調庫函數、實例(包括TTL電路)4)3態,雙向實現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****************要看的內部信號

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))//非法態恢復

q<=3'b001;

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

end//此設計保證CK居中,

end//可使用↑↓assign

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

//對輸入同步存貯器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;

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

(VerilogHDL)//combinationlogicpart*****************發地址、讀或寫選通(允許)

always

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

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://缺省項(不用情況)必須要

begin

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

end

endcase

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

ckorposedge

reset)

//用后沿時序充足,異步復位

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

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//時序邏輯不要default(缺省項)

endcase

end

assign

o_d=wc?acc:8'hzz;//STAwrite_dataoutput//或調用3態門、函數庫MaxII最好用74465

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

取指令,CLK1下打入ir[7:0],同時按o_d[7:6]遷移到相應的指令狀態2.相應指令的功能操作,CLK2下打入acc或PC[7:0](JNC,cy=0),同時遷移到狀態S=3’b100取指可見:無明顯周期,實際狀態中隱含時序。而確定狀態數即有多少不可同時進行的微操作是關鍵RESETSadd000Sfi100Slda001Sjnc011Ssta010cy=0?取指10取指時o_d[7:6]1101002.0.1A4條指令CPU的狀態機控制狀態時序2.0.1A4條指令CPU的狀態機控制狀態時序的集中描述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的狀態機控制狀態時序的分散遷移描述2.0.1A4條指令CPU的狀態機控制基本規則取指令:首取主操作碼(區分不同功能指令的部分)在復位主狀態Si,n次指令要據主操作碼下的相應n-1輔助狀態。每取一次指令,狀態遷移到下一次繼續取指令狀態。取完后據主操作碼轉移到相應的首次微操作操作狀態Sm(前面描述狀態后兩位使用操作碼)。不同時的微操作(見流程表)如讀存、送存、地址運算、數據運算、轉移、棧操作、讀/寫寄存器、I/O操作等等確定操作的狀態編碼。操作:

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

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

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

1)根據當前存貯空間使用情況,分配當前程序所允許加載的內存空間的首地址,并計算編譯產生的加載首地址與實際加載的內存空間的首地址的差。

2)調當前程序目標碼到OS系統的緩沖區,以進行予處理。

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

4)OS通過具有中斷和陷進指令(call等)的程序將目標程序的啟動首地址設置到程序計數器(PC或CS、IP)

,接著運行目標程序。(程序內轉移和返回是通過堆棧彈、壓實現)2.0.7-0

仿真與下載的前提有關程序啟動首地址問題2

#重新定位信息記錄或標記了可執行的目標程序代碼在加載內存時依賴“絕對”地址的指令與數據,該“絕對”地址與程序啟動首地址相關,而程序啟動首地址又與操作系統判別將程序可放在內存的何位置即浮動相關)

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

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

則將CPU程序計數器的復位初始化語句改為:

pc_o<=8‘h0e;

//

或3fH+轉移指令到0eH

推薦使用2.0.7-0

仿真與下載的前提有關程序啟動首地址問題32.CPU設計中的驗證的下載測試(仿真類同)續1②由實驗平臺Debug自動判別測試程序文件頭信息、設置程序的啟動首地址,但需要CPU必須有相應的邏輯控制支持。即:

注意:現此法因復雜已基本不用

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

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

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

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

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

run=0允許Debug(PC機)訪問主存和設置CPU啟動首地址

禁止CPU時鐘CLK,禁止CPU訪問主存。

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

禁止Debug訪問主存。當run=0、cp↑/↓時:pc<=oa;

設置的啟動首地址2.0.7-0仿真與下載的前提有關程序啟動首地址問題42.CPU設計中的驗證的下載測試(仿真類同)續2②由實驗平臺Debug自動判別測試程序文件頭信息、設置程序的啟動首地址,但需要CPU必須有相應的邏輯控制支持。續

3)有關程序計數器的初始化部分修改

wire

cpu_ck=ck|cp;

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

always@(negedge

cpu_ck

orposedge

reset)//原為ck

beginif

(reset)

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

elseif(run==0)//新增:Debug自動設置啟動首地址

pc_o<=oa;//注意等寬時間上后

else

casex

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

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

對CPU最適宜的仿真是運行全面檢測程序的仿真其條件是:(QuartusII為例)

1)必須設計存貯器調SRAM庫、ROM(FPGA)

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

3)必須設計存放程序目標碼的*.mif文件

4)必須設計仿真波形初始化文件*.vwf

按需要設置輸入,設置輸出“0”或無效,設置雙向/3態為高阻

5)這種仿真的頂層文件有兩種實現方式:

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

cpucore(如cpu4_2t.v)修改

+

調用SRAM實例文件或直接調存貯庫

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

cpu4_2t.v符圖

+RAM庫符圖+

腳符圖+

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

*.v內部不能設計為3態雙向連接,訪存數據需讀/寫分開。

獨有:圖形文件*.gdf/bdf內的部件可設計為3態雙向連接。改法o_d

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

創建sram_mm.v

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

族僅同步型)

2.選Storage\LPM_RAM_DQ,實例名鍵入或瀏覽選擇如sram_mmLPM_RAM_DQ系非寫即讀、讀/寫數據分開、同/異步可選的

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

如cpu4_bin.mif5.Finishsram_mm.v

已創建,就可在描述中調用如下:

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

2.0.7-14條指令CPU的驗證1--邏輯模擬仿真:頂層描述2庫//a2:具有RAM可編程芯片FPGA的SRAM庫函數//

lpm_ram_dq

(同/異步、入出數據分開、非寫即讀)功能參數說明//同步均上升沿↑有效,讀RAM要時延,注意CPU打入寄存器的時序配合。//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—寫入數據;q—讀出數據//DATA/ADDRESS不寄存即不要incolck/outclock,是異步方式//a1:

直接調庫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”時鐘打人寄存器

mm.LPM_WIDTH=8,//數據寬度

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

//mm.LPM_NUMWORD=256,//存貯器單元數

mm.LPM_INDATA="REGISTERED",//數據輸入寄存↑

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

mm.LPM_OUTDATA="UNREGISTERED",//輸出數據不寄

mm.LPM_FILE=“cpu4_bin.mif”,//運行的程序的目標文件hex及路徑

mm.LPM_TYPE=“LPM_RAM_DQ”,//類型:入出數據分開

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↑寄存數據地址,則CPU用ck↓打入累加器、指令寄存器等2.0.7-14條指令CPU的驗證1--邏輯模擬仿真:頂層描述32.0.7-14條指令CPU的驗證1--邏輯模擬仿真:b)頂層圖形CPU模塊存貯器模塊入出引腳庫符號的調入:1.圖中空白處擊鼠標右鍵2.彈出編輯命令對話框-1inserts\Symbol\lib.3,彈出調入符號對話框-2mega…\storage

選符號文件

lpm_ram_dq

OK4.彈出編輯端口/參數對話框選擇存貯器數據地址位數,

讀寫與片選信號,時鐘要?其它參數選擇等….

初始化文件選擇OK該模塊由cpu_sim_mm.v創建

該文包括調用

lpm_ram_dq

lpm_rom

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

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

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

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

文件頭參數地址

SAD;0000編譯填入裝入程序的開始地址二字節,默認0000;0000;0E02編譯填入啟動程序運行首地

溫馨提示

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

評論

0/150

提交評論