konglp題目HCL系統(tǒng)內(nèi)存外設實現(xiàn)和流水初步設計_第1頁
konglp題目HCL系統(tǒng)內(nèi)存外設實現(xiàn)和流水初步設計_第2頁
konglp題目HCL系統(tǒng)內(nèi)存外設實現(xiàn)和流水初步設計_第3頁
konglp題目HCL系統(tǒng)內(nèi)存外設實現(xiàn)和流水初步設計_第4頁
konglp題目HCL系統(tǒng)內(nèi)存外設實現(xiàn)和流水初步設計_第5頁
已閱讀5頁,還剩93頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

中 第一章緒 第二章國內(nèi)外背景與設計意 第三章內(nèi)存外設在整個HCL系統(tǒng)中的位 第四章開發(fā)環(huán)境介 第五章內(nèi)存及總線控制器的實 第六章串口控制器設計與實 第七章LCD的設計與實 第八章串行Flash的控制以及從Flash載入程 第九章流水線的支持模塊設 第十章未來的工 第十一章結(jié) 附錄A主要器件實現(xiàn)代 致 參考文 EmbeddedSystemDevelopment.Thedesignofpipelineandtheimplementationofsomeentitieswhichsupportthepipelinecannotonlyimprovetheperformanceofthesystem,butalsodrawaclearpictureoftheCPUinsidestructure.Inthispaper,wedescribethemethodsofdesigningandimplementationusingVHDLanddiscussaboutthedifficultiesandthesolutionsforthem.Finally,weverifyourdesignedmemoryandperipheraldevicesontheFPGAboardanddiscusswherecanbeimprovedinthefuture.:VHDL,Memory,PeripheralDevices,FPGA,第一章HCLCPUPCPC端。另一方面,這一部分的工作也是相對獨立的,現(xiàn)今嵌入式開發(fā)已經(jīng)越來成原理課程的教學帶來的幫助。也使得我們可以更清楚的了解到CPU的結(jié)第二章內(nèi)外背景與設計意第三章內(nèi)存外設在整個HCL中的位3.1HCL如上圖所示,內(nèi)存外設的內(nèi)容包括內(nèi)存總線控制器(MEM-I/OBusInterface(Memory設備收發(fā)器(UART)串口數(shù)據(jù)通信設備(RS232-DCE)LCD控制器(LCDControllerLCD和程序加載器(OSLoader)和串行Flash(SPIFlash其中SPIFlash,Memory,RS232-DCE,LCD是物理設備(Memory實際上是FPGA中提供的調(diào)用FPGAVHDL第四章發(fā)環(huán)境介這次畢設的硬件部分,我們所選用的語言是VHDL(VHSICHardwareDescriptionLanguage)速集成電路硬件描述語言。它是現(xiàn)在在EDA領域包括可編程邏輯器件上編程最為常用的兩種語言之一(另一種是Verilog),同時IEEEVHDL設中所使用到的一些重點的VHDL的語法和結(jié)構(gòu)。關于VHDL語言,在這次畢設當VHDL語言最大的優(yōu)勢一個是來源于思,一個是來源于效率上。在思路上,VHDL語言為我們打破了軟件硬件的界限,事實上,作為一種語言它為像我們這樣的從來沒有做過電路設計硬件制作的人提供了一個很好的從邏輯上對硬件進行描述的平臺。VHDLEDAEDA使得電子系統(tǒng)現(xiàn)在向集成化、大規(guī)模和高速度等方向發(fā)展。在效率上,VHDL相比于傳統(tǒng)的電原理圖描述VHDL(1)VHDL(2)VHDL語言可讀性強,易于修改和發(fā)現(xiàn)錯誤(這一點在我們多次的互相修改代碼之中體現(xiàn)最多,讀VHDL(3)ISE(4)VHDL設計不依賴于器件(除了在我們本次所使用的XilinxSpartan3estarterFPGAAlteraFPGA在設計一個實體時,我們需要用到的是實體。VHDL既支持自底向上的entity實體名[generic[port(端口表:方式類型;…);]end[entity]Port…的類型有兩種,分別是in和out,用來區(qū)別這個接口數(shù)據(jù)的流向,in端口的數(shù)據(jù)對于實體來說只能作為用,而out端口的數(shù)據(jù)對于實體來說只能寫出。個什么要的邏輯來執(zhí)行或者它是一個什么樣的實體,這就需要使用結(jié)構(gòu)體(architecture)architectureofend結(jié)構(gòu)體中的語句是對結(jié)構(gòu)體的功能描述語句中將要用到的信(SIGNAL(TYPE(CONSTANT數(shù)據(jù)流(RTL)輯都是通過找們通過結(jié)構(gòu)化的描述(componentportmap)VHDL通過類比C語言,并不特別的難于理解。所以在這一個小節(jié)中,簡單介紹第二個部分介紹VHDL語言的特色process。4.1值言一樣,變量的賦值是即時的,但是信號的賦值則不然(我們在QuartusII中的(process(void)中的process則不同,它只是在進程中的語句之間是順序執(zhí)行的,但是進程與進特點,可以說,VHDL┇END需要說明的是,進程是由上面所寫的敏感信號觸發(fā)的,即敏感信號表中的(MFCVHDL有許多思想可)第五章存及總線控制器的實雖然內(nèi)存可以在FPGA中直接通過大寄存器的方式進行模擬,但是這種方式ISE中提供的FPGA中提供的內(nèi)存來充當機器的內(nèi)存并且使用MemoryInterfaceMemoryInterfaceVHDLentityMemory_InterfaceisMCLK:instd_logic;MemCtrlBus:instd_logic;MemAddrBus:instd_logic_vector(31downto0);MemDataBusIn:instd_logic_vector(31downto0);MemDataBusOut:outstd_logic_vector(31downto0);MemMode:instd_logic_vector(1downto0)其中,MCLKmemoryclockCPU為6.25MHz。MemCtrlBus為內(nèi)存的寫信號,emAddrBus為讀地址或?qū)懙刂罚琈emDataBusInCPUMemDataBusOut據(jù)MemMode是兩位選擇內(nèi)存的模式取字還是字節(jié)還是雙字等其中字的00。們采用的結(jié)構(gòu)是內(nèi)存組成的。內(nèi)存的輸出分別為MemDataOut0,componentMemory1port(clka:instd_logic;--內(nèi)存工作時鐘wea:instd_logic_vector(0downto0);addra:instd_logic_vector(12downto0);dina:instd_logic_vector(7downto0);douta:outstd_logic_vector(7downto0));endcomponent每一片內(nèi)存的大小都是8bit*2K,其中,信號clka即內(nèi)存的工作時鐘,因在上升沿開始的,所以我們把MCLK進行取反之后再接到clka上。Wea為內(nèi)存的寫允許信號Addra為操作內(nèi)存的地址,dina為希望寫入內(nèi)存的數(shù)據(jù),doutaMemDataOut0 MemDataOut1,MemDataOut2,MemDataOut3分別發(fā)送到內(nèi)存接收線的相應接收線。有兩行8個單元,假設它們的是0,1,2,3;4,5,6,7。則當我們在lw$t0,2的時候,我們需要取的實際上是3,4,5,6四個單元,這是跨行的,所以在這個階段我們需要計算兩個值,第一個值是remainder為的地址(此處為2)和42,減去余數(shù)(此處為2)再和4取余,實際上得到了行地址。所以,在余數(shù)為2的 的數(shù)據(jù),不過根據(jù)大端的原則,MemDataBusOut(31downto24)此時應該被賦予的就是MemDataOut2的值了,之后是MemDataOut3MemDataOut00還需要給出寫的控制信號,這個信號在MemCtrlBus1,不過我們并不能簡單的把這個信號抄送給內(nèi)存,因為這在寫一個word的時1,而另外兩個不寫的單元,必須將其信0,否則就會引起他們數(shù)據(jù)線上的數(shù)據(jù)錯誤的寫入內(nèi)存。所以我們在判斷了MemCtrlBus上的信號為1確定是寫操作后,根據(jù)MemMode和剛才提到remaindercasectrlMIPS系統(tǒng)中,IO的方式不是孤立的進行操作的。而是在內(nèi)存的單元面如我們的設計當中串口的讀寫口分別在內(nèi)存的80和81兩個地址從CPU的角度上看對于這些特殊的內(nèi)存單元進行寫入和并沒有和別的內(nèi)存的單元進行寫入和有什么特別大的區(qū)別。不過,在內(nèi)存IO總線控制器(MEM-I/OBUSControllerCPU到相應的設備(如:內(nèi)存,串口,LCD等。因為外設按照約定是在系統(tǒng)工作時沿之前的某一個時間又因為CPU對于內(nèi)存的控制信號是在系統(tǒng)工作時鐘的上升5.1SysCLK6.25MHzIO線控制器中一個時鐘CLK,它的頻率是系統(tǒng)時鐘的兩倍(12.5MHz,然后讓我們就可以開始進行內(nèi)存IOCPU存外設,讓他們能夠在SysCLK的下降沿接收到控制信號和數(shù)據(jù)信號。此控制器CPU下接口,接收CPU輸入的地址總線的信號SysAddrBus,寫入數(shù)據(jù)線的信號SysDataBusIn,控制信號SysCtrlBus當然還有需要發(fā)給CPU數(shù)據(jù)使用的接口信號時,先對SysAddrBus上的值是否是80,81,82,83,如果是,則轉(zhuǎn)入相應的80先將內(nèi)存寫控制信號MemCtrlBus和LCD寫控制信號LCDWrite全部置為0,保證之后對串口的操作不會對他們產(chǎn)生影響然后判斷SysCtrlBus上的值是10還是01,即是否是寫數(shù)據(jù)操作,如果是10,表示是讀操作,則將串口的控制信號1Mux_Selector10,SysDataBusOut8bitMux_Selector是內(nèi)存IO總線控制器的一個信號它在邏輯上做了一個多路選擇器的作用00時表示沒有讀入SysDataBusOut置為全0,01表示從內(nèi)存讀入數(shù)據(jù),10表示從串口進數(shù)據(jù),11表示從LCD進數(shù)據(jù),當然這個第六章口控制器設計與實本機外設采用內(nèi)存的方案(MappedI/O)完成。主要部件有:串行接(LCD我們在FPGA上實現(xiàn)了一個通用串行收發(fā)器(UART)來實現(xiàn)對RS-232接口的接收端工作時鐘仍然由開發(fā)板系統(tǒng)時鐘分頻得到(工作時鐘為9600*16Hz。接收時,8發(fā)送端9600*16Hz,發(fā)送時,先將發(fā)送線置為低電平,用于發(fā)送起始位,81(包括開始和停止位)16串口特殊寄存(UARTPC,Receiver是串行收發(fā)器的接收端(PC。A8251ControlCPU6.1從外部看如圖所示RS-232串行接口中一共有三根線發(fā)送(RS232_TxD6.2CLK_GeneratorVHDLentityCLK_GeneratorisCLK:instd_logic;TX_RX_CLK:outstd_logicendentity其中,輸入CLK為從開發(fā)板上連接過來的源時鐘信號,而TX_RX_CLK為串口當中讀寫所需要的讀寫工作時鐘,因為我們設定波特率為9600,所以此時鐘的頻率應該是9600*16Hz(16個讀寫工作時鐘我們完成一位數(shù)據(jù)的讀寫。用50MHz/(9600*16Hz)我們得到,我們時鐘的一個周期應該相當于326個CLK的周期。所以我們163個周期將其置為高電平,在后面的一半周期將它置為低電TX_RX_CLKVHDLentityReceiverisRst:Rx_CLK:instd_logic;RS232_RxD:instd_logic;Rx_Ready:outstd_logic;RxData_Ready:outstd_logic;Dout:outstd_logic_vector(7downtoendentity(Reset,Rx_CLK讀寫工作時鐘,RS232_RxD即是RS232的接收線。Rx_Ready信號代表是否完整的完成了一個接收流程(即從開始位開始,到停止位結(jié)束,RxData_Ready則表示8位的數(shù)據(jù)信號的接收已經(jīng)完成。Dout用來將接收到數(shù)據(jù)向A8251Control中的的有限狀態(tài)機共有四個狀態(tài),空閑狀態(tài)(Idle)(Rx_StopBitVHDL的代碼實現(xiàn)了上述自,對于存放目前機器現(xiàn)態(tài)的Rx_State進行case語句分析,如果在空閑狀態(tài),則判斷接收線RS232_RxD是否是低電平(這根線在Rx_State置為Rx_StartBit開始接收開始位。開始位的接收一共持續(xù)16個Rx_CLK的周期。我們在第八個時鐘上升沿(counter_16=7)時采樣其值(之Rx_Data狀態(tài),開始接收8位數(shù)據(jù)。仍然在第八個時鐘上升沿對于RS232_RxD的值進行采樣(如圖所示,圖中第一個信號的頻率為9600Hz,是理論上屬于一個數(shù)據(jù)位的周期(實際并不需要這根線,第二行是串口的工作時鐘,頻率為6.3在接收端,我們一個bit_count的變量,用來計算目前接收的是哪一位,并將其放入Rx_Shift_Reg的相應位置(Rx_Shift_Reg(bit_count)<=RS232_RxD。Rx_Shift_Reg是中Dout的八位輸出相連。在接收第八位數(shù)據(jù)完成的時候(即屬于第八位數(shù)據(jù)的第八個上升沿counter_168Rx_Shift_Reg(DoutA8251ContrlRx_Buffer_Reg所以這個在這個時鐘的上升沿,我們把RxData_Ready信號置為1A8251Control16(可以再接收數(shù)據(jù)Rx_Ready1A8251ControlA8251Control,A8251Control那邊已經(jīng)有充足的時間完成了DataRxData_Ready0。entityTransmitterisCLK:instd_logic;Tx_CLK:instd_logic;En:instd_logic;Rst:inDin:instd_logic_vector(7downto0);Tx_Ready:outstd_logic;RS232_TxD:outendentityCLKCPUCPUDin信號進行接下來的發(fā)送,n這個信號同樣是來自于CPU中的發(fā)送數(shù)據(jù)寄存器Tx_Shift_Reg的寫信號(我們把串口CPUEnCPU。Tx_CLKTx_Ready按照串口的規(guī)定,串口的數(shù)據(jù)發(fā)送應該在Tx_CLK的下降沿進行(即Tx_CLK'EVENTandTx_CLK='0'。事實上,與接收端相同,發(fā)送端也了一個四狀態(tài)自。且四個狀態(tài)相應的是空閑狀態(tài)(Idle),發(fā)送開始位狀(Tx_StopBit發(fā)送每一個數(shù)位持續(xù)16個Tx_CLK在發(fā)送數(shù)據(jù)的過程中一個shift_count的計數(shù),對于串口發(fā)送線進行8個數(shù)據(jù)位的順序?qū)懭耄≧S232_TxD<=Tx_Shift_Reg(shift_count);)且在最后8個數(shù)據(jù)發(fā)送完之后將發(fā)送器切換到發(fā)CPU比串口的工作時鐘快得多,所以,CPUEnTx_CLK接收到CPU發(fā)出的信號En='1'之后一個的信號Start置為'1'樣在串口工作時鐘的下降沿我們只要判斷Start='1'便讓自進入發(fā)送1(Start='1'andTx_State/=Idle,Start信CLKProcess0。Tx_ReadyCPU快的,直接決定了CPU是否可以向串口發(fā)送數(shù)據(jù)。所以其值的至關重要,如Tx_ReadyEn,StartTx_StateEn='1'或Start='1'CPU0Tx_StateIdleTx_Ready0,不允許Tx_StateIdleEnStart0CPUTx_Ready1表示可以接收新的輸入。這樣便完成了對于串口發(fā)送端狀態(tài)的。串口控制器主要負責和CPU打交道,當然同時它也負責串口的一些必要的邏輯。在串口控制器當中,我們了兩個寄存器,一個寄存器是來存放串口目前的狀態(tài),Status寄存器一共有八位,具體每一位的含義可以參考[8],最為常用也是重要的,是它的第0Txrdy,用來表示是否處于發(fā)送狀(101Rxrdy,用來表示是否接收到一個有效的數(shù)據(jù)(0表示沒有,CPU不可進行,1表示有CPU可以進行。TxrdyTx_Ready進行的。不過Rxrdy這一位卻不是用Rx_Ready的,其原因還是在于CPU始終和串口工作時鐘的頻率相差甚遠,如圖所示,CPU數(shù)據(jù)的,則CPU必定會重復Rx_Buffer_Reg中的值如下圖中的CLK和CPU讀一個數(shù)據(jù)(實際上這之中也只有這一個有效數(shù)據(jù),因此我們有了控制器的Rx_Buffer_Valid這個信號,和與之為它服務的一個鎖信號RxRdy_Lock6.4Rx_Buffer_ValidRx_Buffer_ValidCPURxrdy_LockRx_Ready1Rx_Buffer_Valid1,表示可以讀數(shù)據(jù),并且將鎖變Rx_Buffer_Lock1,CPURx_Buffer_Valid1Rx_Ready電平時(證明串口新的一次數(shù)據(jù)又開始了將Rxrdy_Lock置回1,等待數(shù)Rx_Buffer_ValidCLK,Rx_Buffer_Valid1,。CPU值的邏輯相對比較簡單,在RD='1'時,證明CPU要讀串口數(shù)據(jù)并且由CND控制是取狀態(tài)寄存器Status_Reg還是數(shù)據(jù)寄存器Rx_Buffer_Reg。如果是取狀態(tài)寄存器,則直接把Status_Reg給到Dout線上即可。若是數(shù)據(jù)寄存器(這個邏輯上是正確的,因為已經(jīng)通過之前的輪詢發(fā)現(xiàn)可以讀,則將Rx_Buffer_Reg的值放上DoutRx_Buffer_Valid置為0,表示已經(jīng)完成了這次數(shù)據(jù)的。Rx_Buffer_RegRx_Shift_Reg8RxData_Ready1,Rx_Buffer_RegRx_Ready1,Rx_Buffer_RegCPU進行,保證了這一過程的正確和安全。第七章LCD設計與實LCD,TheSpartan?-3EFPGAStarter的LCD屏幕來實現(xiàn)。LCD的控制,主要通過我們編寫的LCD控制器(LCDController)來完成。作為一個顯示設備,LCDLCD數(shù)據(jù)(雖然LCD可以支持從它的器數(shù)據(jù)。LCD設計的主要問題在于如何通過一個控制器,采用LCD所規(guī)定的接收數(shù)據(jù)的方法,向LCD屏幕進LCD7.1LCD其中LCD_RS信號主要用來區(qū)分這一次是一次數(shù)據(jù)傳輸操作還是一個命令的操作,SF_D是四位數(shù)據(jù)的信號,LCD_RW為LCD的讀寫信號,低電平時使得LCD接收數(shù)據(jù)的輸入,而高電平時讓LCD處于讀狀態(tài),顯示數(shù)據(jù)。而LCD_E為讀寫操Interface四個接口LCD8bit發(fā)送八位令。下面我們先介紹第一個問題。CLOCK,LCD_RS,SF_D[11:8],LCD_RW,LCD_E40nsLCD230nsLCDLCD_ELCD_RSCLD_RW10ns7.2LCDVHDLLCD_RS,SF_D置為需要的值,并同時把LCD_RW置為低電平,如此持續(xù)LCD_E1230ns(12周期,然后進入第三個狀態(tài),在這個狀態(tài)中,我們把LCD_E置低10ns(1個周期最后第四個狀態(tài)中,LCD_RW重新置為高電平。如此一來,一次4位4。7.3LCD在VHDL中我們需要一個更大的自這個自把四位數(shù)據(jù)的發(fā)送看成是一個狀態(tài)SS,之后1usS(SS狀態(tài)發(fā)送第四位。這樣其實一個8位令就發(fā)送40us40us,8在介紹LCD如何進行數(shù)據(jù)顯示之前,我們需要了解一下剛才我們使用8位命令傳送方式傳送給LCD的有哪些命令。我們羅列出常用的幾條指令,具體的可7.1LCD0000000001SetDD001 toCGRAMDD101.64ms(82,000SetDDRAMAddressWriteDatatoCGRAMorDDRAM因為他們的最A7都是0,所以可以不寫,在命令中指明A6-A0即可。另外,0x10-0x270x50-0x67,他們寫入之后,如果設置7.4WriteDatatoCGRAMorDDRAM進行寫入。其中的LCD_RS='1'清楚的表示了這一個操作不是一個命令,而是一RAMAddress)之外,還要寫入字符對應的Data的編碼D7-D0。這個LCD屏可以ASCIID7-D0ASCII7.5LCDLCD7.6LCDSF_D<11:8>0x3,LCD_E12(一4bit)4.1ms(205000SF_D<11:8>0x3,LCD_E12(一4bit)100us(50004bit)等待40us(20004bit)40us(2000這個初始化的流程將通過VHDL的九步狀態(tài)完成,當然,其中的7.7LCDFunctionSet0x28訴LCD它自己的行數(shù)等硬件信息。接下來發(fā)出一條EntryMode指令,這條0x06地址自動遞增還是遞減DisplayOn/Off指令,這條0x0C指令,會告知是否閃動光標。我們選擇不閃動。最后發(fā)出ClearDisplay指令清屏。當然清屏指令需要執(zhí)行1.64ms,這之中必須等待。這樣便完成了設置接下來就可以指定寫入的位置后開始不斷的寫入數(shù)據(jù)讓LCD現(xiàn)實了。當然,除了ClearDisplay要等夠足夠時間以外,別的指令之間也是需要8第八章串行Flash的控制以及從Flash載入程串行Flash我們使用的是開發(fā)板上所帶的一塊STMicroElectrionicM25P16。它主要完成的任務是我們設計的程序并將其加載到內(nèi)存之中。這樣內(nèi)存就不需要在硬件的編譯階段進入內(nèi)存之中了了調(diào)試如下圖所示,M25P16Flash器的主要接口有D,C,^S,Q四個。其^W,^HOLD信號已經(jīng)被開發(fā)板管理,沒有連接到FPGA上,所以不是我們關心的對象。我們關心的四個接口,其中D是接收數(shù)據(jù)的接口,Q是數(shù)據(jù)的出口,C是一個控制Flash的同步時鐘,^S是低電平有效的片選信號,用來選中對Flash儲8.1Flash與LCD有相似的是,串行Flash也有其自身令和數(shù)據(jù)的寫入邏輯。不同于LCD所使用4位數(shù)據(jù)接口,F(xiàn)lash使用的是串行的,換而言之,它的數(shù)據(jù)時一位一位進行收發(fā)的,對于Flash的控制指令也是一樣。我們采用兩個時鐘來指導向Flahs發(fā)出數(shù)據(jù)和指令。連接到開發(fā)板本身提供的50MHz時鐘之后,我們把這個時鐘分成兩個時鐘,頻率除以2一個(TX_CLK),頻率除以4一個(SCK/InterCLK在每兩個周期的TX_CLK信號的上升沿將信號發(fā)出,則Flash在SCK信號的下降8.2FlashLCDFlashFlash,F(xiàn)lashspartan3estarter開發(fā)板上,SPI總線是由許多SPI外設所共享的,所以使用串行Flash之前,需要把別的SPI的設備全部關閉。按[6]的說明,將信號DAC_CS'1',AMP_CS'1',AD_CONV'0',SF_CE0為'1',F(xiàn)PGA_INIT_B信號置為'0'。Flash(Flash'1'Flash進行寫入之前,只需要對進行寫入的部分清空即可,但是考慮到我們的flash最后的目的是用來加載程序只放置程序這一個程序所以我們在寫入之前對其全部擦除,比較方便。在VHDL之中,我們了一個Programmer_FSM的大狀態(tài)機,用來大的步驟。其中的連續(xù)狀態(tài)SPI_WREN1,SPI_RDSR1,SPI_WRSR,SPI_RDSR2,SPI_WREN2,SPI_RDSR3,SPI_BE。這個里面的狀態(tài)時SPI_WRSR和SPI_BE。前的操作SPI_WREN1和FlashSPI_RDSR1statusWIPSPI_WREN1指令是否執(zhí)行完當執(zhí)行完了之后第一個狀態(tài)開始SPI_WRSR狀態(tài)中我們對Status寄存器進行寫入主要是將其的最SRWD置為1Flash10,blck0以做全局的寫入。第二個的狀態(tài)SPI_BE即是大規(guī)模擦除,在這一步我們把FlashSPI_RDSR4EraseReady信號從0置為1,通知Receive從串口接收數(shù)據(jù)并寫入Flash我們的要的數(shù)據(jù),是從串口傳輸進來的。而串口的速度比Flash寫512*8bit8.3在Flash控制器中,我們兩個用作指針的信號。Recv_ptr表示FlashSPI_ptr0EraseReadyReceive之后,串口開始接收數(shù)據(jù)(接收的方法與串口部分描述相同8bitRecv_ptr1mod512(注:因為對緩定,最后一位信號采用了當時串口接收線上的信號進行直接的寫入。)此時Programmer_FSMWaitForWRabs(Recv_ptrSPI_ptr)=256即串口指針了256個8bit。然后我們通過狀態(tài)SPI_PP緩沖FlashSPIAddress256SPIAddress256Programmer_FSMWaitForWRFlash剛才的章節(jié)我們介紹了Flash的微觀上的1位數(shù)據(jù)接口和宏觀上的接收邏輯這一節(jié)介紹Flash的相關操作指(比如之前我們所說的寫入Flash的操作,需要通過PageProgram指令來完成,而對于狀態(tài)寄存器的寫入,需要通過WRSR指令來完成。Flash的指令如下表所示,我們下面來介紹用來完成指令發(fā)送邏輯的自MAND因為flash是從D口接收這些指令控制的。 MAND主要的是控制的對于D口的發(fā)送邏輯??梢园l(fā)現(xiàn),指令并不是需要同樣多的過程來完成的(這個情況和CPU中的指令很相似。所以在狀態(tài)機在經(jīng)過OPCODEMANDIdleFlash8.4FlashMANDProgrammer_FSM大的狀態(tài)需要運行某條指令時,Programmer_FSM狀態(tài)機先將該指令的操作碼寫入到操作碼的緩存之中,然后會置StartSPI信號為高(StartSPI<='1';Opcode_BUFWREN_Opcode;StartSPIMAND機在Idle狀態(tài)下判別的啟動信號,它會啟動執(zhí)行相應的邏輯。在此過程中Programmer_FSM狀態(tài)機只需要維持StartSPI信號為0,使之不會重復啟動,然后等待。在接收狀態(tài)寄存器這一個狀態(tài)中(RECV,在把^S信號置低后,進入一ToIdleMAND^S拉回。Flash向內(nèi)存的邏在將程序的代碼從PC端發(fā)送到Flash之后,我們還需要從Flash把這部分數(shù)據(jù)到內(nèi)存當中去。這個工作是通過OSLoader來完成的。OSLoader在Flash這個方面的操作,幾乎是上面所提及的Flash控制器的一個子集。它在此的opcode確定為"00000011",對照上表可知,就是一條讀指令(ReadDataBytes我們把上面的MAND自也簡化為在這一步所使用的幾個狀(IdleOPCODEADDR,RECV。在使用ReadDataBytes指令后,記錄數(shù)字,每次為256個8bit(ReadDataBytes指令執(zhí)行后,F(xiàn)lash的輸出端即會不斷的在上面圖中的InterCLK時鐘的上升沿向外發(fā)出連續(xù)的1bit的數(shù)據(jù)我們只要在此時鐘的上升沿從Flash的輸出口SPI_MISO接收到輔助的8位暫存器Aux_Byte8bit存器中的信號寫入到FIFO中這個寫入邏輯相對于一位flash信號的接收是相當,是一個長度為256的每個元素為8bit的數(shù)組通過信號tail作為其尾指針,我們可以很輕松的控制向其寫入,當寫入的數(shù)量達到256時,此次的即算完成,將Flash的地址加256,我們通過置ToIdle(和上文一樣)的值完成這次過程通過置DataValid信號的值來通知整體狀態(tài)機OSLoader_st將內(nèi)MEM_WR T信號,置初值為9216,用它來維持整個的的一個LED上,這樣外界就可以看到是否完成。在寫入內(nèi)存的過程中,OSLoaderCPU達到T11,主要是用來完成=( T1)MemSrcOSLoaderIO第九章水線的支持模塊設9.1如上圖所示,MIPSCPU的五步操作分解為獨立的環(huán)節(jié)。這樣,CPU的狀態(tài)機需要做一些調(diào)整。原來的State[1]狀態(tài)將需要將原先的所有指令的狀態(tài)擴展到五步(R個狀態(tài),加存這一步,但是在這一步不執(zhí)行任何實際操作,然后將被根據(jù)EX/MEM寄存器,MEM/WB寄存器的狀態(tài)值進行控制信號的提供(此部分的工當然,要實現(xiàn)一個真正能夠使用的MIPS流水線,還需要考慮更為重要的一(forward,(hazard,分為兩種,結(jié)構(gòu)和數(shù)據(jù)。當然在MIPS當中,結(jié)構(gòu)是并不一個限制。再有就是數(shù)據(jù)。數(shù)據(jù)分為兩種情況。add$s0,$t0,$t1sub$t2,$s0,$t3這種情況,在順序執(zhí)行的時候并沒有問題,因為第一條指令已經(jīng)在第五步將$s0$s0$s0ALU$s0法指令得到的值是錯誤的。這個情況,我們通過轉(zhuǎn)發(fā)單元進行處理。forwardVHDLENTITYforwardPORT(exmRegWrite,memwbRegWrite:inexmWriteReg,memwbWriteReg:instd_logic_vector(4downto0);idexReadOne,idexReadTwo:instd_logic_vector(4downto0);aluSelA,aluSelB:outstd_logic_vector(1downto0));ENDENTITY其中,exmRegWrite為EX/MEM寄存器的寫信號,memwbRegWrite為MEM/WB寄存器的寫入信號。exmWriteRegEX/MEM的寄存器的,memwbWriteReg為MEM/WB階段要寫入的寄存器的值。idexReadOne和idexReadTwo為ID/EX寄存器中存放的要的兩個寄存器的編號。aluSelAaluSelB兩個輸出信號,表示ALU的A口B口對于數(shù)據(jù)的選擇,,10ALU01表示操作數(shù)來自MEM/WB圖 exmRegWrite1,EX/MEMmemwbRegWrite1MEM/WB是否被寫,如果這兩個同時都被寫入,則先驗證idexReadOne,idexReadTwoEX/MEM10,通過MEM/WB01,進00。第二種情況的數(shù)據(jù),就不能通過轉(zhuǎn)發(fā)來完成了。比下面的例子lw$t0,20($gp)addi$t0,t0,1$t0我們?nèi)∮?t01Access)的時候才能得到$t0$t0ALU(結(jié)果是錯誤的邏輯。(hazardENTITYhazardPORT(idexmemread:inidexregrt,ifidregrs,ifidregrt:instd_logic_vectordowntopcenable,ifidenable,idexflush:outENDENTITY9.3hazardRTL其中,idexmemread是在idex階段我們發(fā)現(xiàn)這條指令時是否要內(nèi)存,如果它需要內(nèi)存則我們判斷它的Rt是否與前面的IF/ID階段指令的Rs或者Rt相同,如果相同,我們通過把pcenable信號pc寄存器寫入,從而不再有新指令進入流水線,同時又用ifidenable信號將IF/ID寫入,從而維持這一段的現(xiàn)狀。然后使用idexflush信號掉ID/EX的值,使得剛才來的新第十章來的工第一,內(nèi)存的80,81,82地址,原則上應該被用來到外設,但實際79開始讀一個word的話,那么這個將會被分派到內(nèi)存的當中,而真正的內(nèi)存的80,81,82單元的值,與所期望的不相符合,所以應該將MemMode這一LCD如果現(xiàn)在LCD使用簡單的系統(tǒng)調(diào)用進行控制,它還非常不穩(wěn)定,需要進行校驗位和異常我們還沒有處理。另外和LCD一樣,串口也需要上升到匯編語言對第十一章行連接后,我們對整個工程進行了綜合、實現(xiàn)時序仿真并最終到了XilinxSpartan3EStarter中。經(jīng)過小組同學大量的測試后,我們發(fā)現(xiàn)對現(xiàn)在已經(jīng)實附錄A器件實現(xiàn)代entityMemory_InterfaceisMCLK:instd_logic;MemCtrlBus:instd_logic;MemAddrBus:instd_logic_vector(31downto0);MemDataBusIn:instd_logic_vector(31downto0);MemDataBusOut:outstd_logic_vector(31downto0);MemMode:instd_logic_vector(1downto0)endentityarchitectureBehavioralofMemory_InterfaceissignalNMCLK:std_logic;signalMemCtrl0:std_logic_vector(0downto0);signalMemCtrl1:std_logic_vector(0downto0);signalMemCtrl2:std_logic_vector(0downto0);signalMemCtrl3:std_logic_vector(0downto0);signalMemAddr0:std_logic_vector(12downto0);signalMemAddr1:std_logic_vector(12downto0);signalMemAddr2:std_logic_vector(12downto0);signalMemAddr3:std_logic_vector(12downto0);signalMemDataIn0:std_logic_vector(7downto0);signalMemDataIn1:std_logic_vector(7downto0);signalMemDataIn2:std_logic_vector(7downto0);signalMemDataIn3:std_logic_vector(7downto0);signalMemDataOut0:std_logic_vector(7downto0);signalMemDataOut1:std_logic_vector(7downto0);signalMemDataOut2:std_logic_vector(7downtosignalMemDataOut3:std_logic_vector(7downtocomponentMemory0port(clka:inwea:instd_logic_vector(0downto0);addra:instd_logic_vector(12downto0);dina:instd_logic_vector(7downto0);douta:outstd_logic_vector(7downto0));endcomponentcomponentMemory1port(clka:inwea:instd_logic_vector(0downto0);addra:instd_logic_vector(12downto0);dina:instd_logic_vector(7downto0);douta:outstd_logic_vector(7downto0));endcomponentcomponentMemory2port(clka:inwea:instd_logic_vector(0downto0);addra:instd_logic_vector(12downto0);dina:instd_logic_vector(7downto0);douta:outstd_logic_vector(7downto0));endcomponentcomponentMemory3port(clka:inwea:instd_logic_vector(0downto0);addra:instd_logic_vector(12downto0);dina:instd_logic_vector(7downto0);douta:outstd_logic_vector(7downto0));endcomponentMemory3;NMCLK<=notvariableremainder:integerrange0to3;variablebase:integerrange0to8188;remainder:=CONV_INTEGER(MemAddrBus)modbase:=(CONV_INTEGER(MemAddrBus)-remainder)/4;caseremainderiswhen0ifMemMode="00"MemDataBusOut(31downto24)<=MemDataOut0;MemDataBusOut(23downto16)<=MemDataOut1;MemDataBusOut(15downto8)<=MemDataOut2;MemDataBusOut(7downto0)<=MemDataOut3;elsifMemMode="01"MemDataBusOut(31downto24)<=(others=>'0');MemDataBusOut(23downto16)<=(others=>'0');MemDataBusOut(15downto8)<=MemDataOut0;MemDataBusOut(7downto0)<=MemDataOut1;elsifMemMode="10"MemDataBusOut(31downto24)<=(others=>'0');MemDataBusOut(23downto16)<=(others=>'0');MemDataBusOut(15downto8)<=(others=>'0');MemDataBusOut(7downto0)<=MemDataOut0;endif;when1=>ifMemMode="00"MemDataBusOut(31downto24)<=MemDataOut1;MemDataBusOut(23downto16)<=MemDataOut2;MemDataBusOut(15downto8)<=MemDataOut3;MemDataBusOut(7downto0)<=MemDataOut0;elsifMemMode="01"MemDataBusOut(31downto24)<=(others=>'0');MemDataBusOut(23downto16)<=(others=>'0');MemDataBusOut(15downto8)<=MemDataOut1;MemDataBusOut(7downto0)<=MemDataOut2;elsifMemMode="10"MemDataBusOut(31downto24)<=(others=>'0');MemDataBusOut(23downto16)<=(others=>'0');MemDataBusOut(15downto8)<=(others=>'0');MemDataBusOut(7downto0)<=MemDataOut1;endif;when2=>ifMemMode="00"MemDataBusOut(31downto24)<=MemDataOut2;MemDataBusOut(23downto16)<=MemDataOut3;MemDataBusOut(15downto8)<=MemDataOut0;MemDataBusOut(7downto0)<=MemDataOut1;elsifMemMode="01"MemDataBusOut(31downto24)<=(others=>'0');MemDataBusOut(23downto16)<=(others=>'0');MemDataBusOut(15downto8)<=MemDataOut2;MemDataBusOut(7downto0)<=MemDataOut3;elsifMemMode="10"MemDataBusOut(31downto24)<=(others=>'0');MemDataBusOut(23downto16)<=(others=>'0');MemDataBusOut(15downto8)<=(others=>'0');MemDataBusOut(7downto0)<=MemDataOut2;endif;when3=>ifMemMode="00"MemDataBusOut(31downto24)<=MemDataOut3;MemDataBusOut(23downto16)<=MemDataOut0;MemDataBusOut(15downto8)<=MemDataOut1;MemDataBusOut(7downto0)<=MemDataOut2;elsifMemMode="01"MemDataBusOut(31downto24)<=(others=>'0');MemDataBusOut(23downto16)<=(others=>'0');MemDataBusOut(15downto8)<=MemDataOut3;MemDataBusOut(7downto0)<=MemDataOut0;elsifMemMode="10"MemDataBusOut(31downto24)<=(others=>'0');MemDataBusOut(23downto16)<=(others=>'0');MemDataBusOut(15downto8)<=(others=>'0');MemDataBusOut(7downto0)<=MemDataOut3;endwhenothers=>null;endcase;endprocessvariableremainder:integerrange0to3;variablebase:integerrange0to8188;remainder:=CONV_INTEGER(MemAddrBus)modbase:=(CONV_INTEGER(MemAddrBus)-remainder)/4;caseremainderiswhen0MemAddr0<=CONV_STD_LOGIC_VECTOR((base),13);MemAddr1<=CONV_STD_LOGIC_VECTOR((base),13);MemAddr2<=CONV_STD_LOGIC_VECTOR((base),13);MemAddr3<=when1MemAddr0<=CONV_STD_LOGIC_VECTOR((base+MemAddr1<=CONV_STD_LOGIC_VECTOR((base),13);MemAddr2<=CONV_STD_LOGIC_VECTOR((base),13);MemAddr3<=when2MemAddr0<=CONV_STD_LOGIC_VECTOR((base+1),13);MemAddr1<=CONV_STD_LOGIC_VECTOR((base+1),13);MemAddr2<=CONV_STD_LOGIC_VECTOR((base),13);MemAddr3<=CONV_STD_LOGIC_VECTOR((base),13);when3MemAddr0<=CONV_STD_LOGIC_VECTOR((base+1),13);MemAddr1<=CONV_STD_LOGIC_VECTOR((base+1),13);MemAddr2<=CONV_STD_LOGIC_VECTOR((base+1),13);MemAddr3<=CONV_STD_LOGIC_VECTOR((base),13);whenothers=>null;endcase;--MemoryReadoperationifMemCtrlBus='0'MemCtrl0(0)<=MemCtrl1(0)<=MemCtrl2(0)<=MemCtrl3(0)<=MemDataIn0<=(others=>'0');MemDataIn1<=(others=>'0');MemDataIn2<=(others=>'0');MemDataIn3<=(others=>--MemoryWriteoperationelsifMemCtrlBus='1'--WordifMemMode="00"thenMemCtrl0(0)<=MemCtrl1(0)<=MemCtrl2(0)<=MemCtrl3(0)<=caseremainderwhen0MemDataIn0<=MemDataBusIn(31downto24);MemDataIn1<=MemDataBusIn(23downto16);MemDataIn2<=MemDataBusIn(15downto8);MemDataIn3<=MemDataBusIn(7downto0);when1MemDataIn1<=MemDataBusIn(31downto24);MemDataIn2<=MemDataBusIn(23downto16);MemDataIn3<=MemDataBusIn(15downto8);MemDataIn0<=MemDataBusIn(7downto0);when2MemDataIn2<=MemDataBusIn(31downto24);MemDataIn3<=MemDataBusIn(23downto16);MemDataIn0<=MemDataBusIn(15downto8);MemDataIn1<=MemDataBusIn(7downto0);when3MemDataIn3<=MemDataBusIn(31downto24);MemDataIn0<=MemDataBusIn(23downto16);MemDataIn1<=MemDataBusIn(15downto8);MemDataIn2<=MemDataBusIn(7downto0);whenothers=>null;endcase;--HalfWordoperationelsifMemMode="01"thencaseremainderiswhen0=>MemDataIn0<=MemDataBusIn(15downto8);MemDataIn1<=MemDataBusIn(7downto0);MemDataIn2<=(others=>'0');MemDataIn3<=(others=>'0');when1MemDataIn1<=MemDataBusIn(15downto8);MemDataIn2<=MemDataBusIn(7downto0);MemDataIn3<=(others=>'0');MemDataIn0<=(others=>'0');when2=>MemDataIn2<=MemDataBusIn(15downto8);MemDataIn3<=MemDataBusIn(7downto0);MemDataIn0<=(others=>'0');MemDataIn1<=(others=>'0');when3MemDataIn3<=MemDataBusIn(15downto8);MemDataIn0<=MemDataBusIn(7downto0);MemDataIn1<=(others=>'0');MemDataIn2<=(others=>'0');whenothers=>null;endcase;caseremainderiswhen0=>MemCtrl0(0)<=MemCtrl1(0)<=MemCtrl2(0)<=MemCtrl3(0)<=when1MemCtrl0(0)<=MemCtrl1(0)<=MemCtrl2(0)<=MemCtrl3(0)<=when2MemCtrl0(0)<=MemCtrl1(0)<=MemCtrl2(0)<=MemCtrl3(0)<=when3MemCtrl0(0)<=MemCtrl1(0)<=MemCtrl2(0)<=MemCtrl3(0)<=whenothers=>null;endcase;--ByteelsifMemMode="10"thencaseremainderiswhen0MemDataIn0<=MemDataBusIn(7downto0);MemDataIn1<=(others=>'0');MemDataIn2<=(others=>'0');MemDataIn3<=(others=>'0');when1MemDataIn1<=MemDataBusIn(7downto0);MemDataIn2<=(others=>'0');MemDataIn3<=(others=>'0');MemDataIn0<=(others=>'0');when2MemDataIn2<=MemDataBusIn(7downto0);MemDataIn3<=(others=>'0');MemDataIn0<=(others=>'0');MemDataIn1<=(others=>'0');when3MemDataIn3<=MemDataBusIn(7downto0);MemDataIn0<=(others=>'0');MemDataIn1<=(others=>'0');MemDataIn2<=(others=>'0');whenothers=>null;endcase;caseremainderiswhen0=>MemCtrl0(0)<=MemCtrl1(0)<=MemCtrl2(0)<=MemCtrl3(0)<=when1MemCtrl0(0)<=MemCtrl1(0)<=MemCtrl2(0)<=MemCtrl3(0)<=when2MemCtrl0(0)<=MemCtrl1(0)<=MemCtrl2(0)<=MemCtrl3(0)<=when3MemCtrl0(0)<=MemCtrl1(0)<=MemCtrl2(0)<=MemCtrl3(0)<=whenothers=>null;endcase;endif;endif;endprocessMEM0:Memory0portmapclka=>NMCLK,wea=>MemCtrl0,addra=>MemAddr0,dina=>MemDataIn0,douta=>MEM1:Memory1portmapclka=>NMCLK,wea=>MemCtrl1,addra=>dina=>MemDataIn1,douta=>MEM2:Memory2portmapclka=>NMCLK,wea=>MemCtrl2,addra=>MemAddr2,dina=>MemDataIn2,douta=>MEM3:Memory3portmapclka=>NMCLK,wea=>MemCtrl3,addra=>MemAddr3,dina=>MemDataIn3,douta=>endarchitectureentityCLK_GeneratorisCLK:inTX_RX_CLK:outstd_logic--BaudrateendentityarchitecturebehavofCLK_Generatorsignalcounter:integerrange0to325:=ifCLK'EVENTandCLK='1'thenifcounter=162thenTX_RX_CLK<=counter<=counter+1;elsifcounter=325thenTX_RX_CLK<=counter<=0;counter<=counter+1;endif;endif;endprocess;endarchitectureentityReceiverisRst:Rx_CLK:instd_logic;--Rx_CLKis16timesBaudrateRS232_RxD:instd_logic;Rx_Readyoutstd_logic;面的ready一個停止位)RxData_Ready:outstd_logic;--完整的接收到了一個數(shù)據(jù)Doutoutstd_logic_vector(7downto0)ControlendentityarchitecturebehavofReceiver--StatesofthetypeRx_FSMis(Idle,Rx_StartBit,Rx_Data,Rx_StopBit);signalRx_State:Rx_FSM:=signalRx_Shift_Regstd_logic_vector(7downto0);--零時存放接收數(shù)Dout<=variablebit_count:integerrange0to7:=0;variablecounter_16:integerrange0to15:=0;--ResetoperationifRst='1'thencounter_16:=bit_count:=Rx_Ready<=RxData_Ready<='0';Rx_State<=Idle;elsifRx_CLK'EVENTandRx_CLK='1'thencaseRx_StateiswhenIdleifRS232_RxD='0' --Start

Rx_State<=Rx_StartBit;endif;counter_16:=bit_count:=Rx_Ready<=RxData_Ready<='0';whenRx_StartBit=>ifcounter_167then直接進去接收狀態(tài)(0Rx_State<=endcounter_16:=counter_16+1;whenRx_Data=>--Sampleonthe8thrisingCLKifcounter_16=7thenRx_Shift_Reg(bit_count)<=RS232_RxD;bit_count:=bit_count+1;ifbit_count=0then8Rx_StateRx_StopBit;endif;endcounter_16:=counter_16+1;whenRx_StopBit=>ifcounter_168thenRxData_Ready'1';readycounter_16:=counter_16+1;elsifcounter_167then--停止位第七個了Rx_State<=Idle;--回空閑counter_16:=Rx_Ready'1';1(這位是狀態(tài)寄存器中的一位先傳完數(shù)據(jù)再置狀態(tài)位)RxData_Ready<='0';counter_16:=counter_16+endwhenothers=>null;endcase;endendprocessRECEIVE;endarchitecturebehav;entityA8251ControlisCLK:instd_logic; --6.25MHzclockCND:instd_logic;WR:instd_logic;RD:instd_logic;Rst:inTx_Readyinstd_logic;(為輪詢設計(與狀態(tài)寄存Rx_Readyinstd_logic;(為輪詢設計(與狀態(tài)寄存RxData_Ready:inRx_Data:instd_logic_vector(7downto0);Tx_Data:outstd_logic_vector(7downto0);Request_Tx:outstd_logic;Din:instd_logic_vector(7downto0);Dout:outstd_logic_vector(7downtoendentityarchitecturebehavofA8251ControlsignalStatus_Reg:std_logic_vector(7downtosignalRx_Buffer_Regstd_logic_vector(7downto0);buffersignalRxrdy_Lock:std_logic:='0';signalRx_Buffer_Valid:std_logic:='0';aliasTxrdyisStatus_Reg(0);10aliasRxrdyisStatus_Reg(1);--接收到一個有效的數(shù)據(jù)01aliasTxemptyisStatus_Reg(2);aliasParityErrorisaliasOverrunErrorisStatus_Reg(4);aliasFramingErrorisStatus_Reg(5);aliasSynBrkisStatus_Reg(6);aliasDataSetrdyisStatus_Reg(7);STATUS_SET:process(Rst,Tx_Ready,Rx_Buffer_Valid)--InitializationifRst='1'thenTxrdy<='1';Rxrdy<=Txempty<=ParityError<=OverrunError<=FramingError<=SynBrk<=DataSetrdy<='1';--SetTxreadyifTx_Ready'1'then(與狀態(tài)寄存器同步)Txrdy<='1';Txempty<=elsifTx_Ready'0'then--(與狀態(tài)寄存器同步)Txrdy<='0';Txempty<='0';endif;--SetRxreadyifRx_Buffer_Valid='0'thenRxrdy<='0';elsifRx_Buffer_Valid='1'thenRxrdy<='1';endif;endif;endprocessRequest_Tx<=WR;endprocessTx_Data<=ifRst='1'Rx_Buffer_Reg<=(others=>'0');elsifCLK'EVENTandCLK='1'thenifRxData_Ready'1'thenReceiverdatareadyReceiverRx_ReadyRx_Buffer_Reg<=Rx_Data;endif;endendprocess ifCLK'EVENTandCLK='0'ifRxrdy_Lock'0'andRx_Ready'1'thenRxrdy_LockRx_VaildRx_CLK也就是一次讀數(shù)據(jù)寄存器的過程中只能被程序端取走Rx_Buffer_Valid<=RxRdy_Lock<=elsifRx_Ready='0'then--一次成功完成之后把鎖打RxRdy_Lock<='0';endif;ifRD='1'ifCND='1'Dout<=elsifCND='0'Dout<=Rx_Buffer_Reg;Rx_Buffer_Valid<=endelsifRD='0'Dout<=(others=>'0');endif;endendprocessRD_REG;endarchitectureentityIn8251AisSYSCLK:instd_logic; --6.25MHz系統(tǒng)工作時鐘CLK:instd_logic; --50MHz源輸入時鐘CND:instd_logic; --

溫馨提示

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

最新文檔

評論

0/150

提交評論