王發(fā)棟 杜慧玲 史翔
摘 要: 給出一種基于FPGA的8051MCU的IP核設(shè)計(jì)方案,指令集與標(biāo)準(zhǔn)8051系列處理器完全兼容。采用譯碼——執(zhí)行兩級(jí)流水結(jié)構(gòu),并通過了仿真與綜合,理論速度較傳統(tǒng)8051MCU有6~10倍的提升。針對(duì)CISC流水線設(shè)計(jì)的復(fù)雜性,提出了一種高效的實(shí)現(xiàn)方案,可以使執(zhí)行結(jié)構(gòu)近滿狀態(tài)運(yùn)行,且簡便有效地解決了傳統(tǒng)流水線所必須面對(duì)的三種沖突。設(shè)計(jì)采用Verilog HDL語言描述,并采用ModelsimSE 6.2進(jìn)行功能和時(shí)序驗(yàn)證,將代碼下載到Xilinx公司的FPGA上進(jìn)行物理驗(yàn)證,測試了一個(gè)LED流水燈程序,結(jié)果表明軟核達(dá)到了預(yù)期的效果。
關(guān)鍵字: 8051微處理器; 流水線; FPGA; 控制冒險(xiǎn)
中圖分類號(hào): TN710?34 文獻(xiàn)標(biāo)識(shí)碼: A 文章編號(hào): 1004?373X(2014)05?0080?03
0 引 言
自51單片機(jī)應(yīng)用以來,對(duì)其進(jìn)行功能改進(jìn)和性能提升的芯片設(shè)計(jì)層出不窮。但由于其CISC的架構(gòu),對(duì)其流水線化始終局限于將CISC指令轉(zhuǎn)換為可以在一周期內(nèi)完成的類RISC指令,然后使用RISC指令流水作業(yè)的方式,這雖然可以讓多條指令同時(shí)執(zhí)行,但增加了譯碼結(jié)構(gòu)的復(fù)雜程度,而且需要復(fù)雜的控制邏輯解決指令同時(shí)執(zhí)行帶來的傳統(tǒng)流水線所必須面對(duì)的三種沖突。本文原創(chuàng)性地提出一種新的實(shí)現(xiàn)方案,該方案解決了這三種沖突,且在FPGA的平臺(tái)下最大限度地做到填充執(zhí)行結(jié)構(gòu),使得指令可以流暢運(yùn)行。
1 MCU結(jié)構(gòu)與FPGA平臺(tái)
本文設(shè)計(jì)的8051 IP核是與傳統(tǒng)8051指令集兼容的MCU內(nèi)核,不包含定時(shí)器等模塊但通過總線預(yù)留接口。其結(jié)構(gòu)如圖1所示。
(1)譯碼器。負(fù)責(zé)將讀入的指令譯成可供流水線執(zhí)行結(jié)構(gòu)執(zhí)行的控制碼,同時(shí)向其發(fā)送執(zhí)行所需的地址和數(shù)據(jù)。它包含4個(gè)控制碼隊(duì)列,在譯碼過程中循環(huán)地向四個(gè)隊(duì)列中寫入當(dāng)前指令的控制碼,因此可以不必等待指令執(zhí)行完畢再繼續(xù)下一條指令的譯碼。
(2)流水線執(zhí)行結(jié)構(gòu)。讀取譯碼器發(fā)出的控制碼并進(jìn)行相應(yīng)的操作。主要完成對(duì)地址單元的讀寫,數(shù)據(jù)總線的操作和PC的控制。
(3)ALU算術(shù)邏輯運(yùn)算單元。完成8位整數(shù)的四則運(yùn)算和邏輯運(yùn)算,同時(shí)內(nèi)置了位尋址單元,具有位運(yùn)算的功能。
(4)256 B的RAM單元。其中低128 B是連續(xù)的RAM空間,高128 B是特殊功能寄存器SFR,被分散在各模塊中。
(5) 216 B的ROM單元。指令存儲(chǔ)空間,存儲(chǔ)指令和表格。
設(shè)計(jì)采用Xilinx XCV300芯片,可以使用Xilinx公司提供的BlockRam。它不消耗邏輯資源,且可以實(shí)現(xiàn)雙通道讀寫,增大了內(nèi)部總線的帶寬。同時(shí),該型可以使用Xilinx提供的乘法器和除法器,有效地縮短了乘法和除法操作的時(shí)間。
2 流水線設(shè)計(jì)及性能分析
2.1 CISC指令流水化的控制碼方案
51單片機(jī)采用的是CISC架構(gòu),其指令長度從1~3 B不等,指令執(zhí)行周期也不固定,對(duì)其直接進(jìn)行流水化控制邏輯復(fù)雜,難度較大。吸收傳統(tǒng)CISC流水化實(shí)現(xiàn)方案的積極因素,針對(duì)FPGA平臺(tái)的特定結(jié)構(gòu),對(duì)其進(jìn)行改進(jìn)??傮w思路是將其轉(zhuǎn)換為可單周期執(zhí)行的指令,稱其為控制碼,將它發(fā)送給流水執(zhí)行部件,但不像傳統(tǒng)流水線的方式去流水,而是進(jìn)行單指令流水,即對(duì)指令A(yù)轉(zhuǎn)換的指令[a(0)-a(n)]進(jìn)行流水,在A指令的全部次級(jí)指令執(zhí)行完畢前,不允許其他指令進(jìn)入流水線。這樣避免了流水線的結(jié)構(gòu)沖突和數(shù)據(jù)沖突,對(duì)于控制沖突,由于PC在執(zhí)行轉(zhuǎn)移指令前不會(huì)改變,譯碼仍然是順序譯碼,即相當(dāng)于默認(rèn)跳轉(zhuǎn)不成功。若預(yù)測失敗,則流水線暫停跳轉(zhuǎn)后第一條指令的字節(jié)數(shù)個(gè)周期。在中斷到來時(shí),自動(dòng)生成保存當(dāng)前PC的控制碼,同時(shí)清空控制碼隊(duì)列并跳轉(zhuǎn)到中斷執(zhí)行程序。
2.2 與傳統(tǒng)流水線方案的對(duì)比
流水線思想的最終目的,實(shí)質(zhì)上是盡量并行化地使用MCU的全部資源。因此這里提出兩條觀點(diǎn):
(1) 不完全流水線化的執(zhí)行結(jié)構(gòu)若能保證資源的充分使用,因其指令周期較流水化的指令周期短,故其整體效率與流暢的流水線相近。
(2) 盡力避免流水線沖突使得指令運(yùn)行流暢,不能流暢運(yùn)行的流水線其效率可能低于無流水的執(zhí)行結(jié)構(gòu)。
前面提到,與傳統(tǒng)流水線不同,這里采取的方案是單指令流水,其實(shí)質(zhì)是將譯碼和執(zhí)行分開,讓兩者并行運(yùn)行。當(dāng)指令周期與所執(zhí)行指令的平均字節(jié)數(shù)即譯碼周期相等時(shí),流水線恰好可以無中斷地運(yùn)行。在FPGA平臺(tái)下,通過對(duì)控制碼的優(yōu)化設(shè)計(jì),將指令的平均周期控制在兩個(gè)時(shí)鐘周期,與51指令集的平均字節(jié)數(shù)相同,符合提出的理論。同時(shí),在譯碼器中設(shè)置了4個(gè)控制碼隊(duì)列,保證了在字節(jié)?周期數(shù)不匹配時(shí)能夠有足夠的空間進(jìn)行自動(dòng)的調(diào)節(jié)。
3 流水線體系結(jié)構(gòu)
(1) 控制碼定義
對(duì)其指令行為進(jìn)行分析,給出譯碼器發(fā)送給流水線執(zhí)行結(jié)構(gòu)的控制碼定義。控制碼共19位,其中前3位是控制流水線執(zhí)行器讀取源地址、目的地址及操作數(shù)的。第4~9位控制A通道的尋址和數(shù)據(jù)讀寫,第10~15位控制B通道的尋址和數(shù)據(jù)讀寫。第16、17位控制將立即數(shù)發(fā)送到A或B通道上,第18、19位控制ALU模塊讀取A或B通道上的數(shù)據(jù)。
(2) 地址、立即數(shù)與其他信息
指令執(zhí)行需要的地址、立即數(shù)信息由譯碼器發(fā)送給流水線執(zhí)行器,流水線執(zhí)行器根據(jù)控制碼決定是否讀入信息。其中立即數(shù)和目的地址兩個(gè)字節(jié)也可以存放控制轉(zhuǎn)移類指令所需的PC地址和偏移地址。
(3) ALU控制碼
定義了一組控制碼,發(fā)送到ALU控制其執(zhí)行相關(guān)的運(yùn)算操作。由于ALU運(yùn)算通常在指令執(zhí)行的后期,為縮短指令執(zhí)行周期,采用了提前發(fā)送,內(nèi)部緩存的延遲方式達(dá)到同步。
(4) 雙通道下的指令時(shí)序設(shè)計(jì)特點(diǎn)
前面已經(jīng)提到,設(shè)計(jì)所采用的FPGA有雙通道的Blockram,將兩個(gè)通道分別稱為A通道和B通道,雙通道增加了系統(tǒng)內(nèi)部總線的帶寬,也給數(shù)據(jù)通路的設(shè)計(jì)帶來了很大的方便。例如對(duì)于數(shù)據(jù)傳送類指令,可以在上升沿從A通道讀出數(shù)據(jù),在下降沿向B通道中寫入,使得指令在一個(gè)時(shí)鐘周期內(nèi)完成。這也是除指令流水化執(zhí)行以外,提高設(shè)計(jì)性能的一個(gè)重要因素。
4 流水線的實(shí)現(xiàn)與沖突的解決
流水線結(jié)構(gòu)存在著三種冒險(xiǎn),即結(jié)構(gòu)冒險(xiǎn)、控制冒險(xiǎn)和數(shù)據(jù)冒險(xiǎn)。結(jié)構(gòu)冒險(xiǎn)指不同的指令在同一時(shí)間對(duì)同一硬件資源提出了使用的申請(qǐng),從而產(chǎn)生了沖突;控制冒險(xiǎn)發(fā)生在控制轉(zhuǎn)移類指令所需的條件是流水線中尚未得到的結(jié)果,因此必須等待該結(jié)果得出后才能執(zhí)行;數(shù)據(jù)冒險(xiǎn)則主要指“未寫先讀”,即后面的指令所需的源操作數(shù)是前面指令的目的操作數(shù),因此產(chǎn)生了錯(cuò)誤。
在本設(shè)計(jì)中,由于采用單指令流水方案,因此避免了結(jié)構(gòu)冒險(xiǎn)和數(shù)據(jù)冒險(xiǎn)。對(duì)于控制冒險(xiǎn),譯碼器的預(yù)測策略是總是認(rèn)為跳轉(zhuǎn)不成功,即不改變PC,繼續(xù)譯碼。若預(yù)測成功,則流水線無停滯地執(zhí)行;若預(yù)測失敗,則譯碼器首先清空全部控制碼隊(duì)列,然后再進(jìn)行新的譯碼,流水線將阻塞新的程序段第一條指令的字節(jié)數(shù)個(gè)周期。
5 設(shè)計(jì)仿真與綜合結(jié)果
6 結(jié) 語
本文針對(duì)8051的CISC指令集和FPGA平臺(tái)的特點(diǎn),提出了一種新的CISC流水化執(zhí)行方案,實(shí)現(xiàn)了51指令的流水化執(zhí)行并解決了流水化所要面對(duì)的三種冒險(xiǎn)。設(shè)計(jì)代碼采用Verilog?HDL編寫,仿真測試和綜合的結(jié)果表明,該設(shè)計(jì)邏輯正確,系統(tǒng)參數(shù)達(dá)到了要求。
參考文獻(xiàn)
[1] Atmel. AT89C51 8?bit microcontroller with 2K bytes flash [M]. USA: Atmel, 2008.
[2] 尚笠,葛元慶,周潤德.80C51微處理器嵌入式內(nèi)核的設(shè)計(jì)研究[J].微電子學(xué),2000,30(1):28?30.
[3] PATTERSON D A, HENNESSY J L.計(jì)算機(jī)組成與設(shè)計(jì)?軟件硬件接口[M].鄭緯民,譯.2版.北京:機(jī)械工業(yè)出版社,2012.
[4] Xilinx. Dual?port block memory core v6.3 [EB/OL]. [2005?08?31]. http://www.xilinx.com/support/documentation/ip_documentation/dp_block_mem.pdf.
[5] THIMMANNAGARI C M R. CPU design: answers to frequently asked questions [M]. USA: Springer, 2005.
[6] 李亞民.計(jì)算機(jī)組成原理與系統(tǒng)結(jié)構(gòu)[M].北京:清華大學(xué)出版社,1999.
[7] 周寧寧,劉勝.基于FPGA技術(shù)的CPU的設(shè)計(jì)與實(shí)現(xiàn)[J].南京郵電學(xué)院學(xué)報(bào),2003,23(1):77?79.
[8] 孟現(xiàn)元,錢偉康.FPGA嵌入式系統(tǒng)設(shè)計(jì)[M].北京:電子工業(yè)出版社,2007.
[9] 倪繼利,陳曦,李輝.CPU源代碼分析與芯片設(shè)計(jì)及Linux移植[M].北京:電子工業(yè)出版社,2007.
[10] SIMIC J, TERAN S. 8051 core specification [DB/OL].(2001?09?25)[2013?01?21]. http: //www.opencores.org.
前面已經(jīng)提到,設(shè)計(jì)所采用的FPGA有雙通道的Blockram,將兩個(gè)通道分別稱為A通道和B通道,雙通道增加了系統(tǒng)內(nèi)部總線的帶寬,也給數(shù)據(jù)通路的設(shè)計(jì)帶來了很大的方便。例如對(duì)于數(shù)據(jù)傳送類指令,可以在上升沿從A通道讀出數(shù)據(jù),在下降沿向B通道中寫入,使得指令在一個(gè)時(shí)鐘周期內(nèi)完成。這也是除指令流水化執(zhí)行以外,提高設(shè)計(jì)性能的一個(gè)重要因素。
4 流水線的實(shí)現(xiàn)與沖突的解決
流水線結(jié)構(gòu)存在著三種冒險(xiǎn),即結(jié)構(gòu)冒險(xiǎn)、控制冒險(xiǎn)和數(shù)據(jù)冒險(xiǎn)。結(jié)構(gòu)冒險(xiǎn)指不同的指令在同一時(shí)間對(duì)同一硬件資源提出了使用的申請(qǐng),從而產(chǎn)生了沖突;控制冒險(xiǎn)發(fā)生在控制轉(zhuǎn)移類指令所需的條件是流水線中尚未得到的結(jié)果,因此必須等待該結(jié)果得出后才能執(zhí)行;數(shù)據(jù)冒險(xiǎn)則主要指“未寫先讀”,即后面的指令所需的源操作數(shù)是前面指令的目的操作數(shù),因此產(chǎn)生了錯(cuò)誤。
在本設(shè)計(jì)中,由于采用單指令流水方案,因此避免了結(jié)構(gòu)冒險(xiǎn)和數(shù)據(jù)冒險(xiǎn)。對(duì)于控制冒險(xiǎn),譯碼器的預(yù)測策略是總是認(rèn)為跳轉(zhuǎn)不成功,即不改變PC,繼續(xù)譯碼。若預(yù)測成功,則流水線無停滯地執(zhí)行;若預(yù)測失敗,則譯碼器首先清空全部控制碼隊(duì)列,然后再進(jìn)行新的譯碼,流水線將阻塞新的程序段第一條指令的字節(jié)數(shù)個(gè)周期。
5 設(shè)計(jì)仿真與綜合結(jié)果
6 結(jié) 語
本文針對(duì)8051的CISC指令集和FPGA平臺(tái)的特點(diǎn),提出了一種新的CISC流水化執(zhí)行方案,實(shí)現(xiàn)了51指令的流水化執(zhí)行并解決了流水化所要面對(duì)的三種冒險(xiǎn)。設(shè)計(jì)代碼采用Verilog?HDL編寫,仿真測試和綜合的結(jié)果表明,該設(shè)計(jì)邏輯正確,系統(tǒng)參數(shù)達(dá)到了要求。
參考文獻(xiàn)
[1] Atmel. AT89C51 8?bit microcontroller with 2K bytes flash [M]. USA: Atmel, 2008.
[2] 尚笠,葛元慶,周潤德.80C51微處理器嵌入式內(nèi)核的設(shè)計(jì)研究[J].微電子學(xué),2000,30(1):28?30.
[3] PATTERSON D A, HENNESSY J L.計(jì)算機(jī)組成與設(shè)計(jì)?軟件硬件接口[M].鄭緯民,譯.2版.北京:機(jī)械工業(yè)出版社,2012.
[4] Xilinx. Dual?port block memory core v6.3 [EB/OL]. [2005?08?31]. http://www.xilinx.com/support/documentation/ip_documentation/dp_block_mem.pdf.
[5] THIMMANNAGARI C M R. CPU design: answers to frequently asked questions [M]. USA: Springer, 2005.
[6] 李亞民.計(jì)算機(jī)組成原理與系統(tǒng)結(jié)構(gòu)[M].北京:清華大學(xué)出版社,1999.
[7] 周寧寧,劉勝.基于FPGA技術(shù)的CPU的設(shè)計(jì)與實(shí)現(xiàn)[J].南京郵電學(xué)院學(xué)報(bào),2003,23(1):77?79.
[8] 孟現(xiàn)元,錢偉康.FPGA嵌入式系統(tǒng)設(shè)計(jì)[M].北京:電子工業(yè)出版社,2007.
[9] 倪繼利,陳曦,李輝.CPU源代碼分析與芯片設(shè)計(jì)及Linux移植[M].北京:電子工業(yè)出版社,2007.
[10] SIMIC J, TERAN S. 8051 core specification [DB/OL].(2001?09?25)[2013?01?21]. http: //www.opencores.org.
前面已經(jīng)提到,設(shè)計(jì)所采用的FPGA有雙通道的Blockram,將兩個(gè)通道分別稱為A通道和B通道,雙通道增加了系統(tǒng)內(nèi)部總線的帶寬,也給數(shù)據(jù)通路的設(shè)計(jì)帶來了很大的方便。例如對(duì)于數(shù)據(jù)傳送類指令,可以在上升沿從A通道讀出數(shù)據(jù),在下降沿向B通道中寫入,使得指令在一個(gè)時(shí)鐘周期內(nèi)完成。這也是除指令流水化執(zhí)行以外,提高設(shè)計(jì)性能的一個(gè)重要因素。
4 流水線的實(shí)現(xiàn)與沖突的解決
流水線結(jié)構(gòu)存在著三種冒險(xiǎn),即結(jié)構(gòu)冒險(xiǎn)、控制冒險(xiǎn)和數(shù)據(jù)冒險(xiǎn)。結(jié)構(gòu)冒險(xiǎn)指不同的指令在同一時(shí)間對(duì)同一硬件資源提出了使用的申請(qǐng),從而產(chǎn)生了沖突;控制冒險(xiǎn)發(fā)生在控制轉(zhuǎn)移類指令所需的條件是流水線中尚未得到的結(jié)果,因此必須等待該結(jié)果得出后才能執(zhí)行;數(shù)據(jù)冒險(xiǎn)則主要指“未寫先讀”,即后面的指令所需的源操作數(shù)是前面指令的目的操作數(shù),因此產(chǎn)生了錯(cuò)誤。
在本設(shè)計(jì)中,由于采用單指令流水方案,因此避免了結(jié)構(gòu)冒險(xiǎn)和數(shù)據(jù)冒險(xiǎn)。對(duì)于控制冒險(xiǎn),譯碼器的預(yù)測策略是總是認(rèn)為跳轉(zhuǎn)不成功,即不改變PC,繼續(xù)譯碼。若預(yù)測成功,則流水線無停滯地執(zhí)行;若預(yù)測失敗,則譯碼器首先清空全部控制碼隊(duì)列,然后再進(jìn)行新的譯碼,流水線將阻塞新的程序段第一條指令的字節(jié)數(shù)個(gè)周期。
5 設(shè)計(jì)仿真與綜合結(jié)果
6 結(jié) 語
本文針對(duì)8051的CISC指令集和FPGA平臺(tái)的特點(diǎn),提出了一種新的CISC流水化執(zhí)行方案,實(shí)現(xiàn)了51指令的流水化執(zhí)行并解決了流水化所要面對(duì)的三種冒險(xiǎn)。設(shè)計(jì)代碼采用Verilog?HDL編寫,仿真測試和綜合的結(jié)果表明,該設(shè)計(jì)邏輯正確,系統(tǒng)參數(shù)達(dá)到了要求。
參考文獻(xiàn)
[1] Atmel. AT89C51 8?bit microcontroller with 2K bytes flash [M]. USA: Atmel, 2008.
[2] 尚笠,葛元慶,周潤德.80C51微處理器嵌入式內(nèi)核的設(shè)計(jì)研究[J].微電子學(xué),2000,30(1):28?30.
[3] PATTERSON D A, HENNESSY J L.計(jì)算機(jī)組成與設(shè)計(jì)?軟件硬件接口[M].鄭緯民,譯.2版.北京:機(jī)械工業(yè)出版社,2012.
[4] Xilinx. Dual?port block memory core v6.3 [EB/OL]. [2005?08?31]. http://www.xilinx.com/support/documentation/ip_documentation/dp_block_mem.pdf.
[5] THIMMANNAGARI C M R. CPU design: answers to frequently asked questions [M]. USA: Springer, 2005.
[6] 李亞民.計(jì)算機(jī)組成原理與系統(tǒng)結(jié)構(gòu)[M].北京:清華大學(xué)出版社,1999.
[7] 周寧寧,劉勝.基于FPGA技術(shù)的CPU的設(shè)計(jì)與實(shí)現(xiàn)[J].南京郵電學(xué)院學(xué)報(bào),2003,23(1):77?79.
[8] 孟現(xiàn)元,錢偉康.FPGA嵌入式系統(tǒng)設(shè)計(jì)[M].北京:電子工業(yè)出版社,2007.
[9] 倪繼利,陳曦,李輝.CPU源代碼分析與芯片設(shè)計(jì)及Linux移植[M].北京:電子工業(yè)出版社,2007.
[10] SIMIC J, TERAN S. 8051 core specification [DB/OL].(2001?09?25)[2013?01?21]. http: //www.opencores.org.