




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、浙 江 理 工 大 學(xué) 畢業(yè)論文(設(shè)計(jì))誠(chéng)信聲明 我謹(jǐn)在此保證:本人所寫的畢業(yè)論文(設(shè)計(jì)),凡引用他人的研 究成果均已在參考文獻(xiàn)或注釋中列出。論文(設(shè)計(jì))主體均由本人獨(dú) 立完成,沒(méi)有抄襲、剽竊他人已經(jīng)發(fā)表或未發(fā)表的研究成果行為。 如出現(xiàn)以上違反知識(shí)產(chǎn)權(quán)的情況,本人愿意承擔(dān)相應(yīng)的責(zé)任。 聲明人(簽名): 年 月 日 摘 要 mcs-51 單片機(jī)是在一塊芯片中集成了 cpu、ram、rom、定時(shí)器/計(jì)數(shù)器和多功 能 i/o 等一臺(tái)計(jì)算機(jī)所需要的基本功能部件,是業(yè)界廣泛使用的單片機(jī)系列?;?fpga 平臺(tái)的 8051 單片機(jī) cpu 核與傳統(tǒng) mcs-51 單片機(jī)完全兼容,但速度約為傳統(tǒng)單 片機(jī)的
2、 20 倍,且在 fpga 內(nèi)可輕松的集成許多高性能系統(tǒng)功能,這將使系統(tǒng)的設(shè)計(jì) 效率和系統(tǒng)性能獲得極大的提高,這也是現(xiàn)代電子設(shè)計(jì)技術(shù)的發(fā)展方向。本課題用 硬件描述語(yǔ)言設(shè)計(jì) mcs-51 cpu 核,從 cpu 的總體結(jié)構(gòu)到局部功能的實(shí)現(xiàn)采用了自頂 向下的設(shè)計(jì)方法和模塊化的設(shè)計(jì)思想,利用 fpga,設(shè)計(jì)實(shí)現(xiàn)了八位 cpu 核。本設(shè)計(jì) 的 cpu 兼容 51 指令,在時(shí)鐘頻率和指令的執(zhí)行效率指標(biāo)上均優(yōu)于傳統(tǒng)的 mcs- 51cpu。本設(shè)計(jì)以硬件描述語(yǔ)言代碼形式存在,可與任何綜合庫(kù)、工藝庫(kù)以及 fpga 結(jié)合開(kāi)發(fā)出用戶需要的固核和硬核,可讀性好,易于擴(kuò)展使用,易于升級(jí),比較有 實(shí)用價(jià)值。本設(shè)計(jì)通過(guò)
3、fpga 驗(yàn)證。 關(guān)鍵字:verilog hdl; cpu; fpga abstract mcs-51 mcu is a single chip integrated cpu, ram, rom, timer / counters and multi-function i / o such as a computers basic features required, is the industrys widely used microcontroller series. 8051 fpga-based cpu platform with the traditional core is ful
4、ly compatible with mcs-51 microcontroller, but the speed is about 20 times that of traditional single chip, and the fpga can be easily integrated within a number of high- performance system functions, which will enable the design of the system efficiency and system be greatly improved performance, w
5、hich is the development of modern electronic design direction. the issue with the hardware description language design mcs-51 cpu core, from the cpu to the local function of the overall structure of the realization of using top-down design and modular design, the use of fpga, design and implementati
6、on of the eight cpu cores. the cpu model in this paper can execute the mcs-51mcu assemble language instruction sets, and is better than the traditional mcs-51 mcu on both clock frequency and the execution efficiency of the instruction. this design was existed in a form of hdl source code,which can b
7、e reused in many soc designsthis model can be read easily, updated easily and extended freely, so it has a practical value in soc designthis design was implemented on fpga. keywords:keywords: verilog hdl ; cpu ; fpga 目目 錄錄 摘 要 abstract 第 1 章 緒論.1 1.1 選題背景1 1.2 國(guó)內(nèi)外發(fā)展及現(xiàn)狀1 1.3 課題的主要內(nèi)容2 第 2 章 cpu 的結(jié)構(gòu)及設(shè)計(jì)
8、.4 2.1 cpu 的簡(jiǎn)介4 2.2 cpu 的結(jié)構(gòu)4 2.2.1 時(shí)鐘發(fā)生器.4 2.2.2 指令寄存器.5 2.2.3 累加器.6 2.2.4 算術(shù)運(yùn)算器.6 2.2.5 數(shù)據(jù)控制器.7 2.2.6 地址多路器8 2.2.7 程序計(jì)數(shù)器8 2.2.8 狀態(tài)控制器.9 2.2.9 外圍模塊.11 第 3 章 cpu 的功能.13 3.1 cpu 的操作.13 3.1.1 系統(tǒng)的復(fù)位和啟動(dòng)操作.13 3.1.2 總線讀操作.13 3.1.3 總線寫操作13 3.2 cpu 的尋址方式和指令集 14 3.3 匯編14 第 4 章 cpu 的仿真和驗(yàn)證.16 4.1 cpu 模塊的仿真 16 4
9、.2 cpu 模塊的綜合 18 4.3 cpu 模塊的優(yōu)化和優(yōu)局布線 25 第 5 章 總結(jié)和展望.27 參考文獻(xiàn).28 致 謝29 附 錄30 第 1 章 緒論 1.1 選題背景 單片機(jī)自從被推出后開(kāi)始迅速發(fā)展,應(yīng)用領(lǐng)域也在不斷擴(kuò)大,現(xiàn)己成為微型計(jì) 算機(jī)的重要分支,單片機(jī)處理數(shù)據(jù)的能力在不斷提高,速度也越來(lái)越快,長(zhǎng)期以來(lái)被 廣泛的應(yīng)用在各領(lǐng)域。 同時(shí)隨著集成電路和計(jì)算機(jī)技術(shù)的飛速發(fā)展,電子設(shè)計(jì)自動(dòng) 化(eda)以計(jì)算機(jī)的硬件和軟件為基本的工作平臺(tái),已經(jīng)發(fā)展成為可以代 替設(shè)計(jì)者 完成電子系統(tǒng)設(shè)計(jì)的重要工具。其中 fpga 是一種新興的可編程邏輯器件(pld),與其 它可編程邏輯器件(pld)相
10、比,具有更高的密度、更快的工作速度和更大的編程靈活 性。fpga 是一種新興的可編程邏輯器件,可以取代現(xiàn)有的全部微機(jī)接口芯片,實(shí)現(xiàn) 微機(jī)系統(tǒng)中的存儲(chǔ)器、地址譯碼等多種功能,具有更高的密度、更快的工作速度和 更大的編程靈活性,被廣泛應(yīng)用于各種電子類產(chǎn)品中。單片機(jī)具有性能價(jià)格比高、 功能靈活、易于人機(jī)對(duì)話、良好的數(shù)據(jù)處理能力特點(diǎn);fpga 則具有高速、高可靠以 及開(kāi)發(fā)便捷、規(guī)范等優(yōu)點(diǎn)。以此兩類器件相結(jié)合的電路結(jié)構(gòu)會(huì)有很多的發(fā)展空間。 基于 fpga 的高密度、高速度、現(xiàn)場(chǎng)可編程的能力和單片機(jī)強(qiáng)大的數(shù)據(jù)處理功能 設(shè)計(jì)的 cpu 采用了與傳統(tǒng)單片機(jī)不同的實(shí)現(xiàn)架構(gòu),利用 fpga 的邊沿觸發(fā)的特點(diǎn),單
11、周期單指令,因而無(wú)論在時(shí)鐘頻率還是在匯編指令的執(zhí)行效率上都明顯優(yōu)于傳統(tǒng)的 mcs-51 單片機(jī)。這個(gè)設(shè)計(jì)的擴(kuò)展接口控制器部分很好地?cái)U(kuò)充了傳統(tǒng)單片機(jī)的功能, 而且由于具有 較好的可移植性,可以只利用擴(kuò)展接口控制器部分實(shí)現(xiàn)對(duì)現(xiàn)有的單片 機(jī)進(jìn)行升級(jí),節(jié)約更換高性能 cpu 而帶來(lái)的產(chǎn)品提升,達(dá)到適應(yīng)新的要求。目前以 硬件描述語(yǔ)言所完成的電路設(shè)計(jì),可以經(jīng)過(guò)簡(jiǎn)單的綜合與布局,快速的燒錄至 fpga 上進(jìn)行測(cè)試,是現(xiàn)代 ic 設(shè)計(jì)驗(yàn)證的技術(shù)主流。 1.2 國(guó)內(nèi)外發(fā)展及現(xiàn)狀 微控制器簡(jiǎn)稱 mcu,又稱單片機(jī),是指將計(jì)算機(jī)的 cpu、ram、rom、定時(shí)計(jì)數(shù) 器和多種 io 接口集 成在一塊芯片上,形成芯片級(jí)
12、的計(jì)算機(jī)。單片機(jī)的出現(xiàn)的初 衷是面向工業(yè)控制,目前它己經(jīng)廣泛應(yīng)用于各個(gè)領(lǐng)域及各個(gè)行業(yè)。 1976 年 intel 公司推出低檔 8 位單片機(jī) (mcs-48 系列)。在 1980 年 intel 公司 推出了 比 mcs-48 系列性能更為優(yōu)越的 8 位單片機(jī) 8051(mcs-51 系列)。1983 年 intel 公司又推 出了 cmos 型 80c51、16 位單片機(jī) 5096(mcs-96 系列)。眾多公司先 后推出了 32 位單片機(jī)、 64 位單片機(jī)。盡管單片機(jī)的設(shè)計(jì)技術(shù)在不斷的發(fā)展,處理 能力越來(lái)越強(qiáng),從 4 位到 8 位,再到 16 位、32 位,甚至出現(xiàn)了 64 位,但有一個(gè)現(xiàn)
13、 象卻十分有趣,8 位單片機(jī)在經(jīng)歷了 三十多年之后,依然顯示出強(qiáng)大而旺盛的生命 力,其市場(chǎng)占有率一直高居榜首。與從 8 位機(jī)迅速向 16 位、32 位、64 位過(guò)渡的通 用計(jì)算機(jī)相比,8 位微控制器從 20 世紀(jì) 70 年代初期誕生至今,雖歷經(jīng)從單片微型 計(jì)算機(jī)到微控制器、單片機(jī)和 soc 的變遷, 8 位機(jī)始終是嵌入式低端應(yīng)用的主要機(jī) 型,而且在未來(lái)相當(dāng)長(zhǎng)的時(shí)間里,仍會(huì)保持這個(gè)勢(shì)頭。這是因?yàn)榍度胧较到y(tǒng)和通用 計(jì)算機(jī)系統(tǒng)有完全不同的應(yīng)用特性,從而走向完全不同的技術(shù)發(fā)展道路。在 8 位單 片機(jī)能基本滿足其響應(yīng)速度要求后,數(shù)據(jù)寬度不是技術(shù)發(fā)展的主要矛盾。因此 8 位 微控制器會(huì)穩(wěn)定下來(lái),其技術(shù)發(fā)展
14、方向轉(zhuǎn)為最大限度地滿足對(duì)象的采集、控制、可 靠性和低功耗等品質(zhì)要求。鑒于嵌入式低端應(yīng)用對(duì)象的有限響應(yīng)要求,嵌入式系統(tǒng) 低端應(yīng)用的巨大市場(chǎng)及 8 位機(jī)具有的速度潛力,可以預(yù)計(jì)在未來(lái)相當(dāng)長(zhǎng)的時(shí)間內(nèi), 8 位機(jī)仍然是嵌入式應(yīng)用中的主流機(jī)型。 現(xiàn)今市場(chǎng)上流行的典型的 8 位微控制器,與傳統(tǒng)的 8 位單片機(jī)相比,大多數(shù) 是由 veriloghdl 實(shí)現(xiàn)的軟處理器 ip core,可以在各種 fpga 上實(shí)現(xiàn),設(shè)計(jì)靈活方 便而且易于進(jìn)行功能擴(kuò)展。因此,這些單片機(jī)將在基于可編程邏輯的應(yīng)用領(lǐng)域中發(fā) 揮積極的作用。各大單片機(jī)廠家都推出了自己的 8 位單片機(jī)內(nèi)核,如飛思卡爾的 rs08 內(nèi)核、nec 的 78k0
15、、actel 的 corc8051、mkcrochip 的 pic 內(nèi)核等。因此研究 8 位單片機(jī)內(nèi)核具有廣泛的現(xiàn)實(shí)意義。由于其具有較高的處理性能和較少的資源占 用,故具有更加廣泛的應(yīng)用前景。 13 課題的工作內(nèi)容 本次畢業(yè)設(shè)計(jì)主要是對(duì) mcs-51 單片機(jī) 進(jìn)行研究。用硬件描述語(yǔ)言設(shè)計(jì) mcs- 51 cpu 核,對(duì)于 cpu 核的結(jié)構(gòu)進(jìn)行深入了解和認(rèn)知,討論并設(shè)計(jì) cpu 的運(yùn)算邏輯單 元、取址模塊、譯碼執(zhí)行模塊,確定正確的方案。對(duì)于硬件描述語(yǔ)言和相關(guān)仿真軟 件進(jìn)行討論確定,并調(diào)試代碼,仿真通過(guò)。以 mcs-51 系列單片機(jī)的指令集為藍(lán)本, 利用原理框圖和硬件描述語(yǔ)言的輸入方式完成實(shí)現(xiàn)了處
16、理器的各種功能。在 asic 或者 fpga 上進(jìn)行測(cè)試,完成所需要的邏輯功能。課題工作內(nèi)容如下,共分為以下 幾步: (1)確定 cpu 的總體結(jié)構(gòu),劃分與定義各個(gè)層次模塊的結(jié)構(gòu)和功能。根據(jù)設(shè)計(jì) 的需要設(shè)計(jì) cpu 體系架構(gòu)形式,并選取與 mcs-51 兼容的指令集作為設(shè)計(jì)的指令集。 (2)研究 mcs-51cpu 的硬件架構(gòu)及所有指令的工作過(guò)程,深入理解工作 原理和 設(shè)計(jì)方法,完成各個(gè)層次模塊功能的劃分與定義。 (3)使用硬件描述語(yǔ)言對(duì) cpu 核進(jìn)行具體的描述,書寫代碼。 (4) 調(diào)試代碼,仿真通過(guò)。搭建測(cè)試平臺(tái),對(duì)設(shè)計(jì)完成的 cpu 進(jìn)行完備的功能 測(cè)試。 (5) 對(duì)通過(guò)功能測(cè)試的進(jìn)行優(yōu)
17、化、布局布線,進(jìn)行硬件驗(yàn)證。 第 2 章 cpu 的結(jié)構(gòu)及設(shè)計(jì) 2.1 cpu 的簡(jiǎn)介 cpu 是一個(gè)復(fù)雜的數(shù)字邏輯電路,包含八個(gè)基本部件: 1) 時(shí)鐘發(fā)生器 2) 指令寄存器 3) 累加器 4) 算術(shù)邏輯運(yùn)算單元 5) 數(shù)據(jù)控制器 6) 狀態(tài)控制器 7) 程序計(jì)數(shù)器 8) 地址多路器 各部件的具體結(jié)構(gòu)和邏輯關(guān)系在下面的小節(jié)里逐一進(jìn)行介紹。 2.2 cpu 的結(jié)構(gòu) 2.2.1 時(shí)鐘發(fā)生器 圖圖 2-12-1 時(shí)鐘發(fā)生器時(shí)鐘發(fā)生器 時(shí)鐘發(fā)生器 clkgen (如圖 2-1 所示)利用外來(lái)時(shí)鐘信號(hào) clk 來(lái)生成一系列 時(shí)鐘信號(hào) clk1、fetch、alu_clk 送往 cpu 的其他部件。其中
18、 fetch 是外來(lái)時(shí)鐘 clk 的八分頻信號(hào)。利用 fetch 的上升沿來(lái)觸發(fā) cpu 控制器開(kāi)始執(zhí)行一條指令,同 時(shí) fetch 信號(hào)還將控制地址多路器輸出指令地址和數(shù)據(jù)地址。clk1 信號(hào)用作指令寄 存器、累加器、狀態(tài)控制器的時(shí)鐘信號(hào)。alu_clk 則用于觸發(fā)算術(shù)邏輯運(yùn)算單元。 時(shí)鐘發(fā)生器 clkgen 的波形見(jiàn)下圖 2-2 所示: 其 verilog hdl 程序見(jiàn)下面的模塊: 2.2.2 指令寄存器 圖圖 2 2- -3 3 指指令令寄寄存存器器 指令寄存器如圖 2-3 所示,主要用于寄存指令。 指令寄存器的觸發(fā)時(shí)鐘是 clk1,在 clk1 的正沿觸發(fā)下,寄存器將數(shù)據(jù)總線送 來(lái)的
19、指令存入高 8 位或低 8 位寄存器中。但并不是每個(gè) clk1 的上升沿都寄存數(shù)據(jù)總 線的數(shù)據(jù),因?yàn)閿?shù)據(jù)總線上有時(shí)傳輸指令,有時(shí)傳輸數(shù)據(jù)。什么時(shí)候寄存,什么時(shí) 候不寄存由 cpu 狀態(tài)控制器的 load_ir 信號(hào)控制。load_ir 信號(hào)通過(guò) ena 口輸入到 data7:0 rst ena clk1 opc_iraddrs15:0 register instruction register data7:0 load_ir clk1 reset opcode2:0 ir_addr12:0 clk clk1 clk2 clk4 fetch alu_clk 圖圖 2 2- -2 2 時(shí)時(shí)鐘鐘發(fā)發(fā)
20、生生器器 c cl lk kg ge en n 的的波波形形 指令寄存器。復(fù)位后,指令寄存器被清為零。 每條指令為 2 個(gè)字節(jié),即 16 位。高 3 位是操作碼,低 13 位是地址。 (cpu 的地 址總線為 13 位,尋址空間為 8k 字節(jié)。 )本設(shè)計(jì)的數(shù)據(jù)總線為 8 位,所以每條指令需 取兩次。先取高 8 位,后取低 8 位。而當(dāng)前取的是高 8 位還是低 8 位,由變量 state 記錄。state 為零表示取的高 8 位,存入高 8 位寄存器,同時(shí)將變量 state 置 為 1。下次再寄存時(shí),由于 state 為 1,可知取的是低 8 位,存入低 8 位寄存器中。 2.2.3 累加器 圖
21、圖 2-42-4 累加器累加器 累加器如圖 2-4 所示,用于存放當(dāng)前的結(jié)果,它也是雙目運(yùn)算其中一個(gè)數(shù)據(jù)來(lái) 源。復(fù)位后,累加器的值是零。當(dāng)累加器通過(guò) ena 口收到來(lái)自 cpu 狀態(tài)控制器 load_acc 信號(hào)時(shí),在 clk1 時(shí)鐘正跳沿時(shí)就收到來(lái)自于數(shù)據(jù)總線的數(shù)據(jù)。 2.2.4 算術(shù)運(yùn)算器 data7:0 rst ena clk1 accum7:0 accumulator accumulator alu_out7:0 load_acc clk1 rst accum7:0 data7:0 accum7:0 alu_clock opcode2:0 zero alu_out7:0 alu dat
22、a7:0 accum7:0 zero alu_out7:0 alu_clockopcode2:0 圖圖 2-52-5 算術(shù)運(yùn)算器算術(shù)運(yùn)算器 算術(shù)邏輯運(yùn)算單元(如圖 2-5 所示) 根據(jù)輸入的 8 種不同操作碼分別實(shí)現(xiàn)相 應(yīng)的加、與、異或、跳轉(zhuǎn)等 8 種基本操作運(yùn)算。利用這幾種基本運(yùn)算可以實(shí)現(xiàn)很多 種其它運(yùn)算以及邏輯判斷等操作。 2.2.5 數(shù)據(jù)控制器 圖圖 2-62-6 數(shù)據(jù)控制器數(shù)據(jù)控制器 數(shù)據(jù)控制器如圖 2-6,它的作用是控制累加器數(shù)據(jù)輸出,由于數(shù)據(jù)總線是各種 操作時(shí)傳送數(shù)據(jù)的公共通道,不同的情況下傳送不同的內(nèi)容。有時(shí)要傳輸指令,有 時(shí)要傳送 ram 區(qū)或接口的數(shù)據(jù)。累加器的數(shù)據(jù)只有在需要
23、往 ram 區(qū)或端口寫時(shí)才允 許輸出,否則應(yīng)呈現(xiàn)高阻態(tài),以允許其它部件使用數(shù)據(jù)總線。 所以任何部件往總線 上輸出數(shù)據(jù)時(shí),都需要一控制信號(hào)。而此控制信號(hào)的啟、停,則由 cpu 狀態(tài)控制器 輸出的各信號(hào)控制決定。數(shù)據(jù)控制器何時(shí)輸出累加器的數(shù)據(jù)則由狀態(tài)控制器輸出的 控制信號(hào) datactl_ena 決定。 2.2.6 地址多路器 datactl in7:0 data_ena data7:0 alu_out7:0 datactl_ena data7:0 addr pc_addr12 : 0 ir_addr12 : 0 fetch addr12 : 0 pc_addr12 : 0 ir_addr12 :
24、 0 fetch addr12 : 0 圖圖 2-72-7 地址多路器地址多路器 地址多路器如圖 2-7,它用于選擇輸出的地址是 pc(程序計(jì)數(shù))地址還是數(shù)據(jù)/ 端口地址。每個(gè)指令周期的前 4 個(gè)時(shí)鐘周期用于從 rom 中讀取指令,輸出的應(yīng)是 pc 地址。后 4 個(gè)時(shí)鐘周期用于對(duì) ram 或端口的讀寫,該地址由指令中給出。地址的選 擇輸出信號(hào)由時(shí)鐘信號(hào)的 8 分頻信號(hào) fetch 提供。 2.2.7 程序計(jì)數(shù)器 counter ir_addr12 : 0 load clock rst pc_addr12 : 0 pc_addr12 : 0 ir_addr12 : 0 load_pc inc_p
25、c reset 圖圖 2 2- -8 8 程程序序計(jì)計(jì)數(shù)數(shù)器器 程序計(jì)數(shù)器如圖 2-8,它用于提供指令地址。以便讀取指令,指令按地址順 序存放在存儲(chǔ)器中。有兩種途徑可形成指令地址:其一是順序執(zhí)行的情況,其二 是遇到要改變順序執(zhí)行程序的情況,例如執(zhí)行 jmp 指令后,需要形成新的指令地 址。下面就來(lái)詳細(xì)說(shuō)明 pc 地址是如何建立的。 復(fù)位后,指令指針為零,即每次 cpu 重新啟動(dòng)將從 rom 的零地址開(kāi)始讀取指令 并執(zhí)行。每條指令執(zhí)行完需 2 個(gè)時(shí)鐘,這時(shí) pc_addr 已被增 2,指向下一條指令。 (因?yàn)槊織l指令占兩個(gè)字節(jié)。 )如果正執(zhí)行的指令是跳轉(zhuǎn)語(yǔ)句,這時(shí) cpu 狀態(tài)控制器 將會(huì)輸出
26、load_pc 信號(hào),通過(guò) load 口進(jìn)入程序計(jì)數(shù)器。程序計(jì)數(shù)器(pc_addr)將 裝入目標(biāo)地址(ir_addr) ,而不是增 2。 2.2.8 狀態(tài)控制器 圖圖 2 2- -9 9 狀狀態(tài)態(tài)控控制制器器 狀態(tài)控制器如圖 2-9,它由兩部分組成: 1)狀態(tài)機(jī)(上圖中的 machine 部分) 2)狀態(tài)控制器(上圖中的machinectl部分) 狀態(tài)機(jī)控制器接受復(fù)位信號(hào) rst,當(dāng) rst 有效時(shí)通過(guò)信號(hào) ena 使其為 0,輸入 到狀態(tài)機(jī)中停止?fàn)顟B(tài)機(jī)的工作。 狀態(tài)控制器的 veriloghdl 程序見(jiàn)下面模塊: /-/ module machinectl( ena, fetch, rst)
27、; output ena; input fetch, rst; reg ena; always (posedge fetch or posedge rst) begin if(rst) ena=0; else ena=1; end endmodule /-/ 狀態(tài)機(jī)是 cpu 的控制核心,用于產(chǎn)生一系列的控制信號(hào),啟動(dòng)或停止某些部件。 clk1 opcode2:0 int_flag enaena fetch rst machinectl clk1 zero zero fetch rst opcode2:0 int_flag inc_pc load_acc load_pc rd wr load_
28、ir halt datactl_ena inc_pc load_acc load_pc mem_rd mem_wr load_ir halt datactl_ena machine cpu 何時(shí)進(jìn)行讀指令讀寫 i/o 端口,ram 區(qū)等操作,都是由狀態(tài)機(jī)來(lái)控制的。狀 態(tài)機(jī)的當(dāng)前狀態(tài),由變量 state 記錄,state 的值就是當(dāng)前這個(gè)指令周期中已經(jīng) 過(guò)的時(shí)鐘數(shù)(從零計(jì)起) 。 指令周期是由 8 個(gè)時(shí)鐘周期組成,每個(gè)時(shí)鐘周期都要完成固定的操作。 1)第0個(gè)時(shí)鐘,因?yàn)閏pu狀態(tài)控制器的輸出: rd和load_ir為高電平,其余均為 低電平。指令寄存器寄存由 rom送來(lái)的高8位指令代碼。 2)第1
29、個(gè)時(shí)鐘,與上一時(shí)鐘相比只是 inc_pc從0變?yōu)?故pc增1,rom送來(lái)低8位 指令代碼,指令寄存器寄存該 8位代碼。 3)第2個(gè)時(shí)鐘,空操作。 4)第3個(gè)時(shí)鐘,pc增1,指向下一條指令。若操作符為 hlt,則輸出信號(hào)hlt為 高。如果操作符不為 hlt,除了pc增一外(指向下一條指令),其它各控制線輸出 為零。 5)第4個(gè)時(shí)鐘,若操作符為 and、add、xor或lda,讀相應(yīng)地址的數(shù)據(jù);若為 jmp,將目的地址送給程序計(jì)數(shù)器;若為 sto,輸出累加器數(shù)據(jù)。 6)第5個(gè)時(shí)鐘,若操作符為 andd、add或xorr,算術(shù)運(yùn)算器就進(jìn)行相應(yīng)的運(yùn) 算;若為lda,就把數(shù)據(jù)通過(guò)算術(shù)運(yùn)算器送給累加器;若
30、為 skz,先判斷累加器的 值是否為0,如果為0,pc就增1,否則保持原值;若為 jmp,鎖存目的地址;若為 sto,將數(shù)據(jù)寫入地址處。 7)第6個(gè)時(shí)鐘,空操作。 8)第7個(gè)時(shí)鐘,若操作符為skz且累加器值為0,則pc值再增1,跳過(guò)一條指令,否 則pc無(wú)變化。 2.2.9 外圍模塊 為了對(duì) cpu 進(jìn)行測(cè)試,需要有存儲(chǔ)測(cè)試程序的 rom 和裝載數(shù)據(jù)的 ram、地址 譯碼器。 (1).地址譯碼器 module addr_decode( addr, rom_sel, ram_sel); output rom_sel, ram_sel; input 12:0 addr; reg rom_sel, r
31、am_sel; always ( addr ) begin casex(addr) 13b1_1xxx_xxxx_xxxx:rom_sel,ram_sel=2b01; 13b0_xxxx_xxxx_xxxx:rom_sel,ram_sel=2b10; 13b1_0 xxx_xxxx_xxxx:rom_sel,ram_sel=2b10; default:rom_sel,ram_sel=2b00; endcase end endmodule 地址譯碼器用于產(chǎn)生選通信號(hào),選通 rom 或 ram。 ffffh-1800h ram 1800h-0000h rom (2).ram 和 rom modul
32、e ram( data, addr, ena, read, write ); inout 7:0 data; input 9:0 addr; input ena; input read, write; reg 7:0 ram 10h3ff:0; assign data = ( read always (posedge write) begin ramaddr=data; end endmodule module rom( data, addr, read, ena ); output 7:0 data; input 12:0 addr; input read, ena; reg 7:0 mem
33、ory 13h1fff:0; wire 7:0 data; assign data= ( read endmodule rom 用于裝載測(cè)試程序,可讀不可寫。 ram 用于存放數(shù)據(jù),可讀可寫。 第 3 章 cpu 的功能 3.1 cpu 操作 一個(gè)微機(jī)系統(tǒng)為了完成自身的功能,需要 cpu 執(zhí)行許多操作。以下是 cpu 的 主要操作: (1)系統(tǒng)的復(fù)位和啟動(dòng)操作; (2)總線讀操作; (3)總線寫操作。 3.1.1 系統(tǒng)的復(fù)位和啟動(dòng)操作 cpu 的復(fù)位和啟動(dòng)操作是通過(guò) reset 引腳的信號(hào)觸發(fā)執(zhí)行的。當(dāng) reset 信號(hào) 一進(jìn)入高電平, cpu 就會(huì)結(jié)束現(xiàn)行操作,并且只要 reset 停留在高
34、電平狀態(tài), cpu 就維持在復(fù)位狀態(tài)。在復(fù)位狀態(tài), cpu 各內(nèi)部寄存器都被設(shè)為初值,全部為 零。數(shù)據(jù)總線為高阻態(tài),地址總線為 0000h,所有控制信號(hào)均為無(wú)效狀態(tài)。 reset 回到低電平后,接著到來(lái)的第一個(gè) fetch 上升沿將啟動(dòng) risc_cpu 開(kāi)始工 作,從 rom 的 000 處開(kāi)始讀取指令并執(zhí)行相應(yīng)操作。 3.1.2 總線讀操作 每個(gè)指令周期的前 0-3 個(gè)時(shí)鐘周期用于讀指令,在狀態(tài)控制器一節(jié)中已詳細(xì) 講述,這里就不再重復(fù)。第 3.5 個(gè)周期處,存儲(chǔ)器或端口地址就輸出到地址總線 上,第 4-6 個(gè)時(shí)鐘周期,讀信號(hào) rd 有效,數(shù)據(jù)送到數(shù)據(jù)總線上,以備累加器鎖 存,或參與算術(shù)、邏
35、輯運(yùn)算。第 7 個(gè)時(shí)鐘周期,讀信號(hào)無(wú)效,第 7.5 個(gè)周期, 地址總線輸出 pc 地址,為下一個(gè)指令做好準(zhǔn)備。 3.1.3 總線寫操作 每個(gè)指令周期的第 3.5 個(gè)時(shí)鐘周期處,寫的地址就建立了,第 4 個(gè)時(shí)鐘周期輸 出數(shù)據(jù),第 5 個(gè)時(shí)鐘周期輸出寫信號(hào)。至第 6 個(gè)時(shí)鐘結(jié)束,數(shù)據(jù)無(wú)效,第 7.5 時(shí)鐘 地址輸出為 pc 地址,為下一個(gè)指令周期做好準(zhǔn)備。 3.2 cpu 尋址方式和指令集 cpu 的指令格式如下圖 3-1 所示: 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 指令 地址 圖圖 3 3- -1 1 c cp pu u 的的指指令令格格式式 它的指令系統(tǒng)
36、僅由 8 條指令組成。 1) hlt 停機(jī)操作。該操作將空一個(gè)指令周期,即 8個(gè)時(shí)鐘周期。 2) skz 為零跳過(guò)下一條語(yǔ)句。該操作先判斷當(dāng)前 alu中的結(jié)果是否為零,若 是零就跳過(guò)下一條語(yǔ)句,否則繼續(xù)執(zhí)行。 3) add 相加。該操作將累加器中的值與地址所指的存儲(chǔ)器或端口的數(shù)據(jù)相 加,結(jié)果仍送回累加器中。 4) and 相與。該操作將累加器的值與地址所指的存儲(chǔ)器或端口的數(shù)據(jù)相與, 結(jié)果仍送回累加器中。 5) xor 異或。該操作將累加器的值與指令中給出地址的數(shù)據(jù)異或,結(jié)果仍送 回累加器中。 6) lda 讀數(shù)據(jù)。該操作將指令中給出地址的數(shù)據(jù)放入累加器。 7) sto 寫數(shù)據(jù)。該操作將累加器的
37、數(shù)據(jù)放入指令中給出的地址。 8) jmp 無(wú)條件跳轉(zhuǎn)語(yǔ)句。該操作將跳轉(zhuǎn)至指令給出的目的地址,繼續(xù)執(zhí)行。 cpu 是 8 位微處理器,一律采用直接尋址方式,即數(shù)據(jù)總是放在存儲(chǔ)器中,尋址 單元的地址由指令直接給出。這是最簡(jiǎn)單的尋址方式。 3.3 匯 編 匯編程序是為了調(diào)試軟核而開(kāi)發(fā)的,手工編寫機(jī)器碼很容易出錯(cuò)并且工作量很 大。在調(diào)試過(guò)程中修改指令集時(shí),匯編程序也要作相應(yīng)的修改。所以要求編譯器的 結(jié)構(gòu)簡(jiǎn)單性能可靠,在程序中必要的地方可以用堆疊代碼方法實(shí)現(xiàn),不必考慮編程 技巧和匯編器效率問(wèn)題。匯編程序用于測(cè)試 cpu 的基本指令集,如果 cpu 的各條指 令執(zhí)行正確,停止在 hlt 指令處。如果程序在
38、其它地址暫停運(yùn)行,則有一個(gè)指令出 錯(cuò)。程序中,符號(hào)后的十六進(jìn)制表示存儲(chǔ)器的地址,每行的/后表示注釋。下面是 本文設(shè)計(jì)的一小段程序代碼,編譯好的匯編機(jī)器代碼裝入虛擬 rom,要參加運(yùn)算的 數(shù)據(jù)裝入虛擬 ram 就可以開(kāi)始進(jìn)行仿真。 機(jī)器碼 地址 匯編助記符 注釋 00 /地址聲明 101_11000 /00 begin: lda data_2 0000_0001 011_11000 /02 and data_3 0000_0010 100_11000 /04 xor data_2 0000_0001 001_00000 /06 skz 0000_0000 000_00000 /08 hlt /a
39、nd doest work 第 4 章 cpu 模塊的仿真和驗(yàn)證 4.1 cpu 模塊的仿真 為了對(duì)所設(shè)計(jì)的 cpu 模型進(jìn)行驗(yàn)證,需要把 cpu 包裝在一個(gè)模塊下,這樣其內(nèi) 部連線就隱蔽起來(lái),從系統(tǒng)的角度看就顯得簡(jiǎn)潔,還需要建立一些必要的外圍器件 模型,例如儲(chǔ)存程序用的 rom 模型、儲(chǔ)存數(shù)據(jù)用的 ram 和地址譯碼器等。這些模型 都可以用 veriloghdl 描述,由于不需要綜合成具體的電路只要保證功能和接口信號(hào) 正確就能用于仿真。也就是說(shuō),用虛擬器件來(lái)代替真實(shí)的器件對(duì)所設(shè)計(jì)的 cpu 模型進(jìn) 行驗(yàn)證,檢查各條指令是否執(zhí)行正確,與外圍電路的數(shù)據(jù)交換是否正常??稍谙旅?的仿真中來(lái)代替真實(shí)的
40、器件,用于驗(yàn)證 cpu 模型是否能正確地運(yùn)行裝入 rom 和 ram 的程序。在 cpu 的電路圖上加上這些外圍電路把有關(guān)的電路接通,見(jiàn)圖 4-1。最核 心的就是的左邊 rsc 模塊,對(duì)指令的譯碼和執(zhí)行都是在 rsc 模塊內(nèi)部完成的,而且 rsc 模塊還對(duì)其余三個(gè)模塊進(jìn)行控制。 圖右上角是一塊有著 256 個(gè)字節(jié)的裝載數(shù)據(jù) 的 ram,rsc 有四個(gè)信號(hào)對(duì)它實(shí)現(xiàn)了讀寫操作。第一個(gè)信號(hào)就是寫使能 write_ram; 第二個(gè)信號(hào)就是讀使能 read_ram;第三個(gè)信號(hào)是 ram 的地址信號(hào) _addr_ram;最后一個(gè)就是通用數(shù)據(jù)總線 data_ram。圖右下角是一 個(gè)存儲(chǔ)測(cè)試程序的 rom 存
41、儲(chǔ)器,因其容量為 4k,有 12 根地址線,命名為 addr_rom;數(shù)據(jù)輸出為 data_rom . 另外在左下角有一個(gè) addr_decode 模塊,命名為 addr ,有 2 個(gè)數(shù)據(jù)線 ram_sel 和 rom_sel 分別 連接著 ram 模塊和 rom 模塊。同時(shí)也可以用 veriloghdl 模塊調(diào)用的方法把這些外圍 電路的模塊連接上,這跟用真實(shí)的電路器件調(diào)試情況很類似。 圖圖 4-14-1 cpucpu 總體模塊圖總體模塊圖 按照 cpu 總體模塊圖,可實(shí)現(xiàn) cpu 模塊的仿真。步驟如下:首先按照表示各 模塊之間連線的電路圖編制測(cè)試文件,即定義 verilog 的 wire 變
42、量作為連線,連接 各功能模塊之間的引腳,并將輸入信號(hào)引入,輸出信號(hào)引出。如若需要,可加入必 要的語(yǔ)句顯示提示信息。例如, cpu 的測(cè)試文件就是 cputop.v。其次,使用仿真 軟件進(jìn)行仿真, ,以下介紹 modelsim 的使用。在進(jìn)入 modelsim 的環(huán)境之后,在 file 項(xiàng)選擇 change direction 來(lái)確定編制的文件所在的目錄,然后在 design 項(xiàng)選 擇或創(chuàng)建一個(gè) library,完成后即可開(kāi)始編譯。在 design 項(xiàng)選 compile項(xiàng),進(jìn)入編 譯環(huán)境,選定要編譯的文件進(jìn)行編譯。完成編譯后,還是在 compile項(xiàng),選擇 load new design 項(xiàng),選
43、中編譯后提示的 top module 的名字,然后開(kāi)始仿真。在 view 項(xiàng)可選波形顯示,信號(hào)選擇,功能和操作簡(jiǎn)單明了,下圖 4-2 這是 modelsim se6.0 進(jìn)行波形仿真的結(jié)果。在 ise 中可以運(yùn)行 timing analyzer 生成詳細(xì)的時(shí)序 報(bào)告,本設(shè)計(jì)中 minimum period: 12.032ns (maximum frequency: 83.112mhz), minimum input arrival time before clock: 6.479ns,maximum output required time after clock: 9.767ns。 圖圖 4
44、-24-2 仿真時(shí)序圖仿真時(shí)序圖 4.2 cpu 模塊的綜合 在對(duì)所設(shè)計(jì)的 cpu 模型進(jìn)行驗(yàn)證后,如沒(méi)有發(fā)現(xiàn)問(wèn)題就可開(kāi)始做下一步的工作 即綜合。綜合工作往往要分階段來(lái)進(jìn)行,這樣便于發(fā)現(xiàn)問(wèn)題。 所謂分階段就是指: 第一階段:先對(duì)構(gòu)成 cpu 模型的各個(gè)子模塊,如狀態(tài)控制機(jī)模塊(包括 machine 模塊,machinectl 模塊) 、指令寄存器模塊( register 模塊) 、算術(shù)邏 輯運(yùn)算單元模塊( alu 模塊)等,分別加以綜合以檢查其可綜合性,綜合后及時(shí) 進(jìn)行后仿真,這樣便于及時(shí)發(fā)現(xiàn)錯(cuò)誤,及時(shí)改進(jìn)。 第二階段:把要綜合的模塊從仿真測(cè)試信號(hào)模塊和虛擬外圍電路模型(如 rom 模塊、ra
45、m 模塊、顯示部件模塊等)中分離出來(lái),組成一個(gè)獨(dú)立的模塊,其中 包括了所有需要綜合的模塊。然后給這個(gè)大模塊起一個(gè)名字,如本章中的例子, 我們要綜合的只是 cpu 并不包括虛擬外圍電路,可以給這一模塊起一個(gè)名字,例 如稱它為 rsc_chip 模塊。如用電路圖描述的話,我們還需給它的引腳加上標(biāo)準(zhǔn)的 引腳部件并加標(biāo)記,見(jiàn)圖 4-3。 圖圖 4-34-3 rscrsc 模塊模塊 第三階段:加載需要綜合的模塊到綜合器,本例所使用的綜合器是 synplify, 選定的 fpga 是 altera flex10k,針對(duì)它的庫(kù)進(jìn)行綜合。 也可以使用 quartusii 或其他綜合工具進(jìn)行綜合。綜合器綜合的結(jié)
46、果會(huì)產(chǎn)生一 系列的文件,其中有一個(gè)文件報(bào)告用了所使用的基本單元,各部件的時(shí)間參數(shù)以 及綜合的過(guò)程。見(jiàn)下面的報(bào)告 ,它就是這個(gè) cpu 芯片所用的綜合報(bào)告,綜合所用 的庫(kù)為 altera flex10k 系列的 fpga 庫(kù),約定的失蹤頻率為 80mhz。 /- cpu 芯片綜合結(jié)果報(bào)告開(kāi)始 -/ #program:synplify pro 8.1 #os:windows_nt $ start of compile #fri jul 01 10:11:03 2009 synplify verilog compiler, version 3.1.0, build 049r,built may 3
47、2005 copyright (c) 1994-2005, synplicity inc. all rights reserved i:”c:program filesynplicityfpga_81libalteraaltera.v” i:”c:program filesynplicityfpga_81libalteraaltera_mf.v” i:”c:program filesynplicityfpga_81libalteraaltera_lpm.v” i:”c:vlogexeex17_2cpu.v” i:”c: vlogexeex17_2cpu.v”:“c:vlogexeex17_2c
48、lk_gen.v” i:”c: vlogexeex17_2cpu.v”:“c:vlogexeex17_2accum.v” verilog syntax check successful! compiler output is up to date. no re-compile necessary selecting top level module cpu n:”c:vlogexeex17_2clk_gen.v”:2:7:2:13synthesizing module clk_gen n: cl201:“c:vlogexeex17_2clk_gen.v”:18:0:18:5trying to
49、extract state machine for register state extracted state machine for register state state machine has 9 reachable states with original encodings of: 00000000 00000001 00000010 n:”c:vlogexeex17_2register.v”:4:7:4:14synthesizing module register n: cl201:“c:vlogexeex17_2machine.v”:44:0:44:5trying to ex
50、tract state machine for register state extracted state machine for register state state machine has 8 reachable states with original encodings of: 000 001 010 n:”c:vlogexeex17_2datactl.v”:11:7:11:13synthesizing module datactl n:”c:vlogexeex17_2adr.v”:10:8:10:10synthesizing module adr end process too
51、k 0h:00m:01s realtime,0h:00m:01s cputime #fri jul 01 10:11:03 2009 # version8.1 synplicity altera technology mapper,version8.1.0,build 539r,built may 6 2005 copyright(c)1994-2005,synplicity inc. all rights reserved automatic dissolve at startup in view:work.cup(verilog) of m_counter(counter) automat
52、ic dissolve at startup in view:work.cpu(verilog) of m_adr(adr) rtl optimization done. n:”c:vlogexeex17_2counter.v”:19:0:19:5found counter in view:work.cpu(verilog) inst m_counter.pc_addr12:0 encoding state machine work.clk_gen(verilog)-state8:0 original code-new code 00000000-000000000 00000001-0000
53、00011 encoding state machine work.machine_synplcty(verilog)-state7:0 original code-new code001-00000011 writing analyst data base c:vlogexeex17_2rev_1cpu.srm writing verilog netlist and constraint files writing.vqm output for quartus writing cross reference file for quartus to c:vlogex
54、eex17_2rev_1cpu.xrf writing verilog simulation files found clock cpuclk with period 12.50ns found clock machineinc_pc_derived_clock with period 12.50ns #start of timing report# #timing report written on fri jul 01 10:11:03 2009 top view: cpu requested frequency: 80.0mhz wire load mode: top paths req
55、uested: 5 constraint file(s): n:mt195this timing report estimates place and route data.please look at the place and route timing report for final timing. n:mt197clock constraints cover only ff-to-ff paths associated with the clock. performance summary * worst slack in design:10.158 requested estimat
56、ed requested estimate clock clock starting clock frequency frequency period period slack type group . cpuclk 80.0mhz 427.0mhz 12.500 2.342 10.158 inferred inferrd_clkgroup_0 machineinc_pc_derived_clock 80.0mhz 427.0mhz 12.500 2.342 10.158 derived inferrd_clkgroup_0 clock relationships * detailed rep
57、ort for clock:cpuclk starting points with worst slack * starting arrival instance reference type pin net time slack clock m_accum.accum0 cpuclk stratixii_lcell_ff regout accum_0 0.095 10.158 m_accum.accum1 cpuclk stratixii_lcell_ff regout accum_1 0.095 10.194 ending points with worst slack * worst p
58、ath information * path information for path number 1: requested period: 12.500 -setup time: 0.403 =required time: 12.097 -propagation time: 1.939 =slack (critical): 10.158 number of logic level(s): 9 starting point: m_accum.accum0/regout ending point: m_alu.alu_out7/adatasdata the start point is clo
59、cked by cpuclkrisingon pin clk the end point is clocked by cpuclkrisingon pin clk instance/net pin pin arrival no. of name type name dir delay time fan out(s) m_accum.accum0 stratixii_lcell_ff regout out 0.095 0.095 accum_0 net - - 0.621 - 4 m_alu.un2_alu_out_carry_0 stratixii_lcell_comb dataf in 0.
60、716 m_alu.un2_alu_out_carry_0 stratixii_lcell_comb cout out 0.312 1.028 un2_alu_out_carry_0 net - - 0.000 1 m_alu.un2_alu_out_carry_1 stratixii_lcell_comb cin in 1.028 - total path delay(propagation time+setup) of 2.342 is 1.307(55.8%)logic and 1.035(44.2%) route. detailed report for clock:machine_s
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二年級(jí)下冊(cè)數(shù)學(xué)教案-8.1評(píng)選吉祥物∣北師大版
- 六年級(jí)上冊(cè)數(shù)學(xué)教案-數(shù)學(xué)好玩 3 比賽場(chǎng)次|北師大版
- 六年級(jí)上數(shù)學(xué)教案-列方程解稍復(fù)雜的百分?jǐn)?shù)實(shí)際問(wèn)題-蘇教版
- (??家族e(cuò)題)2022-2023學(xué)年三年級(jí)上冊(cè)期末高頻考點(diǎn)數(shù)學(xué)試卷(北師大版)
- 2025年云南省建筑安全員《A證》考試題庫(kù)
- 2024年氯氟氰菊酯項(xiàng)目資金申請(qǐng)報(bào)告代可行性研究報(bào)告
- 2024年電氣機(jī)械及器材項(xiàng)目投資申請(qǐng)報(bào)告
- 2025年濟(jì)南工程職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)適應(yīng)性測(cè)試題庫(kù)帶答案
- 2025年福州職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)傾向性測(cè)試題庫(kù)一套
- 2025年桂林師范高等??茖W(xué)校單招職業(yè)技能測(cè)試題庫(kù)完美版
- 全冊(cè)(教學(xué)設(shè)計(jì))-蘇教版勞動(dòng)六年級(jí)下冊(cè)
- 【淺談小學(xué)英語(yǔ)教學(xué)中的德育滲透3800字(論文)】
- 尺寸鏈的計(jì)算表格
- 夏玉米套種辣椒技術(shù)
- 2023年江蘇省南京市市場(chǎng)監(jiān)督管理局所屬事業(yè)單位招聘5人(共500題含答案解析)筆試歷年難、易錯(cuò)考點(diǎn)試題含答案附詳解
- 絕緣電阻測(cè)試儀安全操作規(guī)程
- DB6101T 197-2022 藤蔓類尾菜堆肥技術(shù)規(guī)程
- 《生僻字》歌詞(帶拼音解釋)
- 西藏房屋建筑工程竣工材料全套表格
- 品管圈基本知識(shí)
- 物業(yè)項(xiàng)目保潔服務(wù)質(zhì)量保證及安全保障措施(標(biāo)書專用)參考借鑒范本
評(píng)論
0/150
提交評(píng)論