版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 保密協(xié)議合同的地區(qū)適用
- 設(shè)備租賃合同范本示例模板
- 魚苗供應(yīng)合同
- 政府購買合同打印機(jī)指南
- 砌體勞務(wù)分包合同
- 借款還款合同協(xié)議書格式示例案例
- 真空隔離閥購買合同
- 2024年版二手房賣買合同參考3篇
- 電商平臺(tái)財(cái)務(wù)管理制度的數(shù)字化轉(zhuǎn)型
- 中小學(xué)作業(yè)管理制度的家長參與
- 永康電動(dòng)工具市場行業(yè)報(bào)告
- 護(hù)理病例報(bào)告范文5篇
- 班主任基本功大賽:模擬情景題及參考答案匯編(小學(xué)組)
- 兒童房間管理制度
- 中國石油大學(xué)(華東)2008年化工原理(含答案)考研真題
- 湖南課件大學(xué)
- 2024高校大學(xué)《輔導(dǎo)員》招聘考試題庫
- 景區(qū)智慧充電樁建設(shè)方案
- 培訓(xùn)班授課教師課時(shí)費(fèi)用領(lǐng)取表
- 2023年10月秘書學(xué)概論自考試卷及答案
- 小學(xué)數(shù)學(xué)教育現(xiàn)狀與發(fā)展趨勢(shì)分析
評(píng)論
0/150
提交評(píng)論