




下載本文檔
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
中 第一章緒 第二章國(guó)內(nèi)外背景與設(shè)計(jì)意 第三章內(nèi)存外設(shè)在整個(gè)HCL系統(tǒng)中的位 第四章開(kāi)發(fā)環(huán)境介 第五章內(nèi)存及總線控制器的實(shí) 第六章串口控制器設(shè)計(jì)與實(shí) 第七章LCD的設(shè)計(jì)與實(shí) 第八章串行Flash的控制以及從Flash載入程 第九章流水線的支持模塊設(shè) 第十章未來(lái)的工 第十一章結(jié) 附錄A主要器件實(shí)現(xiàn)代 致 參考文 EmbeddedSystemDevelopment.Thedesignofpipelineandtheimplementationofsomeentitieswhichsupportthepipelinecannotonlyimprovetheperformanceofthesystem,butalsodrawaclearpictureoftheCPUinsidestructure.Inthispaper,wedescribethemethodsofdesigningandimplementationusingVHDLanddiscussaboutthedifficultiesandthesolutionsforthem.Finally,weverifyourdesignedmemoryandperipheraldevicesontheFPGAboardanddiscusswherecanbeimprovedinthefuture.:VHDL,Memory,PeripheralDevices,FPGA,第一章HCLCPUPCPC端。另一方面,這一部分的工作也是相對(duì)獨(dú)立的,現(xiàn)今嵌入式開(kāi)發(fā)已經(jīng)越來(lái)成原理課程的教學(xué)帶來(lái)的幫助。也使得我們可以更清楚的了解到CPU的結(jié)第二章內(nèi)外背景與設(shè)計(jì)意第三章內(nèi)存外設(shè)在整個(gè)HCL中的位3.1HCL如上圖所示,內(nèi)存外設(shè)的內(nèi)容包括內(nèi)存總線控制器(MEM-I/OBusInterface(Memory設(shè)備收發(fā)器(UART)串口數(shù)據(jù)通信設(shè)備(RS232-DCE)LCD控制器(LCDControllerLCD和程序加載器(OSLoader)和串行Flash(SPIFlash其中SPIFlash,Memory,RS232-DCE,LCD是物理設(shè)備(Memory實(shí)際上是FPGA中提供的調(diào)用FPGAVHDL第四章發(fā)環(huán)境介這次畢設(shè)的硬件部分,我們所選用的語(yǔ)言是VHDL(VHSICHardwareDescriptionLanguage)速集成電路硬件描述語(yǔ)言。它是現(xiàn)在在EDA領(lǐng)域包括可編程邏輯器件上編程最為常用的兩種語(yǔ)言之一(另一種是Verilog),同時(shí)IEEEVHDL設(shè)中所使用到的一些重點(diǎn)的VHDL的語(yǔ)法和結(jié)構(gòu)。關(guān)于VHDL語(yǔ)言,在這次畢設(shè)當(dāng)VHDL語(yǔ)言最大的優(yōu)勢(shì)一個(gè)是來(lái)源于思,一個(gè)是來(lái)源于效率上。在思路上,VHDL語(yǔ)言為我們打破了軟件硬件的界限,事實(shí)上,作為一種語(yǔ)言它為像我們這樣的從來(lái)沒(méi)有做過(guò)電路設(shè)計(jì)硬件制作的人提供了一個(gè)很好的從邏輯上對(duì)硬件進(jìn)行描述的平臺(tái)。VHDLEDAEDA使得電子系統(tǒng)現(xiàn)在向集成化、大規(guī)模和高速度等方向發(fā)展。在效率上,VHDL相比于傳統(tǒng)的電原理圖描述VHDL(1)VHDL(2)VHDL語(yǔ)言可讀性強(qiáng),易于修改和發(fā)現(xiàn)錯(cuò)誤(這一點(diǎn)在我們多次的互相修改代碼之中體現(xiàn)最多,讀VHDL(3)ISE(4)VHDL設(shè)計(jì)不依賴于器件(除了在我們本次所使用的XilinxSpartan3estarterFPGAAlteraFPGA在設(shè)計(jì)一個(gè)實(shí)體時(shí),我們需要用到的是實(shí)體。VHDL既支持自底向上的entity實(shí)體名[generic[port(端口表:方式類型;…);]end[entity]Port…的類型有兩種,分別是in和out,用來(lái)區(qū)別這個(gè)接口數(shù)據(jù)的流向,in端口的數(shù)據(jù)對(duì)于實(shí)體來(lái)說(shuō)只能作為用,而out端口的數(shù)據(jù)對(duì)于實(shí)體來(lái)說(shuō)只能寫出。個(gè)什么要的邏輯來(lái)執(zhí)行或者它是一個(gè)什么樣的實(shí)體,這就需要使用結(jié)構(gòu)體(architecture)architectureofend結(jié)構(gòu)體中的語(yǔ)句是對(duì)結(jié)構(gòu)體的功能描述語(yǔ)句中將要用到的信(SIGNAL(TYPE(CONSTANT數(shù)據(jù)流(RTL)輯都是通過(guò)找們通過(guò)結(jié)構(gòu)化的描述(componentportmap)VHDL通過(guò)類比C語(yǔ)言,并不特別的難于理解。所以在這一個(gè)小節(jié)中,簡(jiǎn)單介紹第二個(gè)部分介紹VHDL語(yǔ)言的特色process。4.1值言一樣,變量的賦值是即時(shí)的,但是信號(hào)的賦值則不然(我們?cè)赒uartusII中的(process(void)中的process則不同,它只是在進(jìn)程中的語(yǔ)句之間是順序執(zhí)行的,但是進(jìn)程與進(jìn)特點(diǎn),可以說(shuō),VHDL┇END需要說(shuō)明的是,進(jìn)程是由上面所寫的敏感信號(hào)觸發(fā)的,即敏感信號(hào)表中的(MFCVHDL有許多思想可)第五章存及總線控制器的實(shí)雖然內(nèi)存可以在FPGA中直接通過(guò)大寄存器的方式進(jìn)行模擬,但是這種方式ISE中提供的FPGA中提供的內(nèi)存來(lái)充當(dāng)機(jī)器的內(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)存的寫信號(hào),emAddrBus為讀地址或?qū)懙刂罚琈emDataBusInCPUMemDataBusOut據(jù)MemMode是兩位選擇內(nèi)存的模式取字還是字節(jié)還是雙字等其中字的00。們采用的結(jié)構(gòu)是內(nèi)存組成的。內(nèi)存的輸出分別為MemDataOut0,componentMemory1port(clka:instd_logic;--內(nèi)存工作時(shí)鐘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,其中,信號(hào)clka即內(nèi)存的工作時(shí)鐘,因在上升沿開(kāi)始的,所以我們把MCLK進(jìn)行取反之后再接到clka上。Wea為內(nèi)存的寫允許信號(hào)Addra為操作內(nèi)存的地址,dina為希望寫入內(nèi)存的數(shù)據(jù),doutaMemDataOut0 MemDataOut1,MemDataOut2,MemDataOut3分別發(fā)送到內(nèi)存接收線的相應(yīng)接收線。有兩行8個(gè)單元,假設(shè)它們的是0,1,2,3;4,5,6,7。則當(dāng)我們?cè)趌w$t0,2的時(shí)候,我們需要取的實(shí)際上是3,4,5,6四個(gè)單元,這是跨行的,所以在這個(gè)階段我們需要計(jì)算兩個(gè)值,第一個(gè)值是remainder為的地址(此處為2)和42,減去余數(shù)(此處為2)再和4取余,實(shí)際上得到了行地址。所以,在余數(shù)為2的 的數(shù)據(jù),不過(guò)根據(jù)大端的原則,MemDataBusOut(31downto24)此時(shí)應(yīng)該被賦予的就是MemDataOut2的值了,之后是MemDataOut3MemDataOut00還需要給出寫的控制信號(hào),這個(gè)信號(hào)在MemCtrlBus1,不過(guò)我們并不能簡(jiǎn)單的把這個(gè)信號(hào)抄送給內(nèi)存,因?yàn)檫@在寫一個(gè)word的時(shí)1,而另外兩個(gè)不寫的單元,必須將其信0,否則就會(huì)引起他們數(shù)據(jù)線上的數(shù)據(jù)錯(cuò)誤的寫入內(nèi)存。所以我們?cè)谂袛嗔薓emCtrlBus上的信號(hào)為1確定是寫操作后,根據(jù)MemMode和剛才提到remaindercasectrlMIPS系統(tǒng)中,IO的方式不是孤立的進(jìn)行操作的。而是在內(nèi)存的單元面如我們的設(shè)計(jì)當(dāng)中串口的讀寫口分別在內(nèi)存的80和81兩個(gè)地址從CPU的角度上看對(duì)于這些特殊的內(nèi)存單元進(jìn)行寫入和并沒(méi)有和別的內(nèi)存的單元進(jìn)行寫入和有什么特別大的區(qū)別。不過(guò),在內(nèi)存IO總線控制器(MEM-I/OBUSControllerCPU到相應(yīng)的設(shè)備(如:內(nèi)存,串口,LCD等。因?yàn)橥庠O(shè)按照約定是在系統(tǒng)工作時(shí)沿之前的某一個(gè)時(shí)間又因?yàn)镃PU對(duì)于內(nèi)存的控制信號(hào)是在系統(tǒng)工作時(shí)鐘的上升5.1SysCLK6.25MHzIO線控制器中一個(gè)時(shí)鐘CLK,它的頻率是系統(tǒng)時(shí)鐘的兩倍(12.5MHz,然后讓我們就可以開(kāi)始進(jìn)行內(nèi)存IOCPU存外設(shè),讓他們能夠在SysCLK的下降沿接收到控制信號(hào)和數(shù)據(jù)信號(hào)。此控制器CPU下接口,接收CPU輸入的地址總線的信號(hào)SysAddrBus,寫入數(shù)據(jù)線的信號(hào)SysDataBusIn,控制信號(hào)SysCtrlBus當(dāng)然還有需要發(fā)給CPU數(shù)據(jù)使用的接口信號(hào)時(shí),先對(duì)SysAddrBus上的值是否是80,81,82,83,如果是,則轉(zhuǎn)入相應(yīng)的80先將內(nèi)存寫控制信號(hào)MemCtrlBus和LCD寫控制信號(hào)LCDWrite全部置為0,保證之后對(duì)串口的操作不會(huì)對(duì)他們產(chǎn)生影響然后判斷SysCtrlBus上的值是10還是01,即是否是寫數(shù)據(jù)操作,如果是10,表示是讀操作,則將串口的控制信號(hào)1Mux_Selector10,SysDataBusOut8bitMux_Selector是內(nèi)存IO總線控制器的一個(gè)信號(hào)它在邏輯上做了一個(gè)多路選擇器的作用00時(shí)表示沒(méi)有讀入SysDataBusOut置為全0,01表示從內(nèi)存讀入數(shù)據(jù),10表示從串口進(jìn)數(shù)據(jù),11表示從LCD進(jìn)數(shù)據(jù),當(dāng)然這個(gè)第六章口控制器設(shè)計(jì)與實(shí)本機(jī)外設(shè)采用內(nèi)存的方案(MappedI/O)完成。主要部件有:串行接(LCD我們?cè)贔PGA上實(shí)現(xiàn)了一個(gè)通用串行收發(fā)器(UART)來(lái)實(shí)現(xiàn)對(duì)RS-232接口的接收端工作時(shí)鐘仍然由開(kāi)發(fā)板系統(tǒng)時(shí)鐘分頻得到(工作時(shí)鐘為9600*16Hz。接收時(shí),8發(fā)送端9600*16Hz,發(fā)送時(shí),先將發(fā)送線置為低電平,用于發(fā)送起始位,81(包括開(kāi)始和停止位)16串口特殊寄存(UARTPC,Receiver是串行收發(fā)器的接收端(PC。A8251ControlCPU6.1從外部看如圖所示RS-232串行接口中一共有三根線發(fā)送(RS232_TxD6.2CLK_GeneratorVHDLentityCLK_GeneratorisCLK:instd_logic;TX_RX_CLK:outstd_logicendentity其中,輸入CLK為從開(kāi)發(fā)板上連接過(guò)來(lái)的源時(shí)鐘信號(hào),而TX_RX_CLK為串口當(dāng)中讀寫所需要的讀寫工作時(shí)鐘,因?yàn)槲覀冊(cè)O(shè)定波特率為9600,所以此時(shí)鐘的頻率應(yīng)該是9600*16Hz(16個(gè)讀寫工作時(shí)鐘我們完成一位數(shù)據(jù)的讀寫。用50MHz/(9600*16Hz)我們得到,我們時(shí)鐘的一個(gè)周期應(yīng)該相當(dāng)于326個(gè)CLK的周期。所以我們163個(gè)周期將其置為高電平,在后面的一半周期將它置為低電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讀寫工作時(shí)鐘,RS232_RxD即是RS232的接收線。Rx_Ready信號(hào)代表是否完整的完成了一個(gè)接收流程(即從開(kāi)始位開(kāi)始,到停止位結(jié)束,RxData_Ready則表示8位的數(shù)據(jù)信號(hào)的接收已經(jīng)完成。Dout用來(lái)將接收到數(shù)據(jù)向A8251Control中的的有限狀態(tài)機(jī)共有四個(gè)狀態(tài),空閑狀態(tài)(Idle)(Rx_StopBitVHDL的代碼實(shí)現(xiàn)了上述自,對(duì)于存放目前機(jī)器現(xiàn)態(tài)的Rx_State進(jìn)行case語(yǔ)句分析,如果在空閑狀態(tài),則判斷接收線RS232_RxD是否是低電平(這根線在Rx_State置為Rx_StartBit開(kāi)始接收開(kāi)始位。開(kāi)始位的接收一共持續(xù)16個(gè)Rx_CLK的周期。我們?cè)诘诎藗€(gè)時(shí)鐘上升沿(counter_16=7)時(shí)采樣其值(之Rx_Data狀態(tài),開(kāi)始接收8位數(shù)據(jù)。仍然在第八個(gè)時(shí)鐘上升沿對(duì)于RS232_RxD的值進(jìn)行采樣(如圖所示,圖中第一個(gè)信號(hào)的頻率為9600Hz,是理論上屬于一個(gè)數(shù)據(jù)位的周期(實(shí)際并不需要這根線,第二行是串口的工作時(shí)鐘,頻率為6.3在接收端,我們一個(gè)bit_count的變量,用來(lái)計(jì)算目前接收的是哪一位,并將其放入Rx_Shift_Reg的相應(yīng)位置(Rx_Shift_Reg(bit_count)<=RS232_RxD。Rx_Shift_Reg是中Dout的八位輸出相連。在接收第八位數(shù)據(jù)完成的時(shí)候(即屬于第八位數(shù)據(jù)的第八個(gè)上升沿counter_168Rx_Shift_Reg(DoutA8251ContrlRx_Buffer_Reg所以這個(gè)在這個(gè)時(shí)鐘的上升沿,我們把RxData_Ready信號(hào)置為1A8251Control16(可以再接收數(shù)據(jù)Rx_Ready1A8251ControlA8251Control,A8251Control那邊已經(jīng)有充足的時(shí)間完成了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信號(hào)進(jìn)行接下來(lái)的發(fā)送,n這個(gè)信號(hào)同樣是來(lái)自于CPU中的發(fā)送數(shù)據(jù)寄存器Tx_Shift_Reg的寫信號(hào)(我們把串口CPUEnCPU。Tx_CLKTx_Ready按照串口的規(guī)定,串口的數(shù)據(jù)發(fā)送應(yīng)該在Tx_CLK的下降沿進(jìn)行(即Tx_CLK'EVENTandTx_CLK='0'。事實(shí)上,與接收端相同,發(fā)送端也了一個(gè)四狀態(tài)自。且四個(gè)狀態(tài)相應(yīng)的是空閑狀態(tài)(Idle),發(fā)送開(kāi)始位狀(Tx_StopBit發(fā)送每一個(gè)數(shù)位持續(xù)16個(gè)Tx_CLK在發(fā)送數(shù)據(jù)的過(guò)程中一個(gè)shift_count的計(jì)數(shù),對(duì)于串口發(fā)送線進(jìn)行8個(gè)數(shù)據(jù)位的順序?qū)懭耄≧S232_TxD<=Tx_Shift_Reg(shift_count);)且在最后8個(gè)數(shù)據(jù)發(fā)送完之后將發(fā)送器切換到發(fā)CPU比串口的工作時(shí)鐘快得多,所以,CPUEnTx_CLK接收到CPU發(fā)出的信號(hào)En='1'之后一個(gè)的信號(hào)Start置為'1'樣在串口工作時(shí)鐘的下降沿我們只要判斷Start='1'便讓自進(jìn)入發(fā)送1(Start='1'andTx_State/=Idle,Start信CLKProcess0。Tx_ReadyCPU快的,直接決定了CPU是否可以向串口發(fā)送數(shù)據(jù)。所以其值的至關(guān)重要,如Tx_ReadyEn,StartTx_StateEn='1'或Start='1'CPU0Tx_StateIdleTx_Ready0,不允許Tx_StateIdleEnStart0CPUTx_Ready1表示可以接收新的輸入。這樣便完成了對(duì)于串口發(fā)送端狀態(tài)的。串口控制器主要負(fù)責(zé)和CPU打交道,當(dāng)然同時(shí)它也負(fù)責(zé)串口的一些必要的邏輯。在串口控制器當(dāng)中,我們了兩個(gè)寄存器,一個(gè)寄存器是來(lái)存放串口目前的狀態(tài),Status寄存器一共有八位,具體每一位的含義可以參考[8],最為常用也是重要的,是它的第0Txrdy,用來(lái)表示是否處于發(fā)送狀(101Rxrdy,用來(lái)表示是否接收到一個(gè)有效的數(shù)據(jù)(0表示沒(méi)有,CPU不可進(jìn)行,1表示有CPU可以進(jìn)行。TxrdyTx_Ready進(jìn)行的。不過(guò)Rxrdy這一位卻不是用Rx_Ready的,其原因還是在于CPU始終和串口工作時(shí)鐘的頻率相差甚遠(yuǎn),如圖所示,CPU數(shù)據(jù)的,則CPU必定會(huì)重復(fù)Rx_Buffer_Reg中的值如下圖中的CLK和CPU讀一個(gè)數(shù)據(jù)(實(shí)際上這之中也只有這一個(gè)有效數(shù)據(jù),因此我們有了控制器的Rx_Buffer_Valid這個(gè)信號(hào),和與之為它服務(wù)的一個(gè)鎖信號(hào)RxRdy_Lock6.4Rx_Buffer_ValidRx_Buffer_ValidCPURxrdy_LockRx_Ready1Rx_Buffer_Valid1,表示可以讀數(shù)據(jù),并且將鎖變Rx_Buffer_Lock1,CPURx_Buffer_Valid1Rx_Ready電平時(shí)(證明串口新的一次數(shù)據(jù)又開(kāi)始了將Rxrdy_Lock置回1,等待數(shù)Rx_Buffer_ValidCLK,Rx_Buffer_Valid1,。CPU值的邏輯相對(duì)比較簡(jiǎn)單,在RD='1'時(shí),證明CPU要讀串口數(shù)據(jù)并且由CND控制是取狀態(tài)寄存器Status_Reg還是數(shù)據(jù)寄存器Rx_Buffer_Reg。如果是取狀態(tài)寄存器,則直接把Status_Reg給到Dout線上即可。若是數(shù)據(jù)寄存器(這個(gè)邏輯上是正確的,因?yàn)橐呀?jīng)通過(guò)之前的輪詢發(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進(jìn)行,保證了這一過(guò)程的正確和安全。第七章LCD設(shè)計(jì)與實(shí)LCD,TheSpartan?-3EFPGAStarter的LCD屏幕來(lái)實(shí)現(xiàn)。LCD的控制,主要通過(guò)我們編寫的LCD控制器(LCDController)來(lái)完成。作為一個(gè)顯示設(shè)備,LCDLCD數(shù)據(jù)(雖然LCD可以支持從它的器數(shù)據(jù)。LCD設(shè)計(jì)的主要問(wèn)題在于如何通過(guò)一個(gè)控制器,采用LCD所規(guī)定的接收數(shù)據(jù)的方法,向LCD屏幕進(jìn)LCD7.1LCD其中LCD_RS信號(hào)主要用來(lái)區(qū)分這一次是一次數(shù)據(jù)傳輸操作還是一個(gè)命令的操作,SF_D是四位數(shù)據(jù)的信號(hào),LCD_RW為L(zhǎng)CD的讀寫信號(hào),低電平時(shí)使得LCD接收數(shù)據(jù)的輸入,而高電平時(shí)讓LCD處于讀狀態(tài),顯示數(shù)據(jù)。而LCD_E為讀寫操Interface四個(gè)接口LCD8bit發(fā)送八位令。下面我們先介紹第一個(gè)問(wèn)題。CLOCK,LCD_RS,SF_D[11:8],LCD_RW,LCD_E40nsLCD230nsLCDLCD_ELCD_RSCLD_RW10ns7.2LCDVHDLLCD_RS,SF_D置為需要的值,并同時(shí)把LCD_RW置為低電平,如此持續(xù)LCD_E1230ns(12周期,然后進(jìn)入第三個(gè)狀態(tài),在這個(gè)狀態(tài)中,我們把LCD_E置低10ns(1個(gè)周期最后第四個(gè)狀態(tài)中,LCD_RW重新置為高電平。如此一來(lái),一次4位4。7.3LCD在VHDL中我們需要一個(gè)更大的自這個(gè)自把四位數(shù)據(jù)的發(fā)送看成是一個(gè)狀態(tài)SS,之后1usS(SS狀態(tài)發(fā)送第四位。這樣其實(shí)一個(gè)8位令就發(fā)送40us40us,8在介紹LCD如何進(jìn)行數(shù)據(jù)顯示之前,我們需要了解一下剛才我們使用8位命令傳送方式傳送給LCD的有哪些命令。我們羅列出常用的幾條指令,具體的可7.1LCD0000000001SetDD001 toCGRAMDD101.64ms(82,000SetDDRAMAddressWriteDatatoCGRAMorDDRAM因?yàn)樗麄兊淖預(yù)7都是0,所以可以不寫,在命令中指明A6-A0即可。另外,0x10-0x270x50-0x67,他們寫入之后,如果設(shè)置7.4WriteDatatoCGRAMorDDRAM進(jìn)行寫入。其中的LCD_RS='1'清楚的表示了這一個(gè)操作不是一個(gè)命令,而是一RAMAddress)之外,還要寫入字符對(duì)應(yīng)的Data的編碼D7-D0。這個(gè)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這個(gè)初始化的流程將通過(guò)VHDL的九步狀態(tài)完成,當(dāng)然,其中的7.7LCDFunctionSet0x28訴LCD它自己的行數(shù)等硬件信息。接下來(lái)發(fā)出一條EntryMode指令,這條0x06地址自動(dòng)遞增還是遞減DisplayOn/Off指令,這條0x0C指令,會(huì)告知是否閃動(dòng)光標(biāo)。我們選擇不閃動(dòng)。最后發(fā)出ClearDisplay指令清屏。當(dāng)然清屏指令需要執(zhí)行1.64ms,這之中必須等待。這樣便完成了設(shè)置接下來(lái)就可以指定寫入的位置后開(kāi)始不斷的寫入數(shù)據(jù)讓LCD現(xiàn)實(shí)了。當(dāng)然,除了ClearDisplay要等夠足夠時(shí)間以外,別的指令之間也是需要8第八章串行Flash的控制以及從Flash載入程串行Flash我們使用的是開(kāi)發(fā)板上所帶的一塊STMicroElectrionicM25P16。它主要完成的任務(wù)是我們?cè)O(shè)計(jì)的程序并將其加載到內(nèi)存之中。這樣內(nèi)存就不需要在硬件的編譯階段進(jìn)入內(nèi)存之中了了調(diào)試如下圖所示,M25P16Flash器的主要接口有D,C,^S,Q四個(gè)。其^W,^HOLD信號(hào)已經(jīng)被開(kāi)發(fā)板管理,沒(méi)有連接到FPGA上,所以不是我們關(guān)心的對(duì)象。我們關(guān)心的四個(gè)接口,其中D是接收數(shù)據(jù)的接口,Q是數(shù)據(jù)的出口,C是一個(gè)控制Flash的同步時(shí)鐘,^S是低電平有效的片選信號(hào),用來(lái)選中對(duì)Flash儲(chǔ)8.1Flash與LCD有相似的是,串行Flash也有其自身令和數(shù)據(jù)的寫入邏輯。不同于LCD所使用4位數(shù)據(jù)接口,F(xiàn)lash使用的是串行的,換而言之,它的數(shù)據(jù)時(shí)一位一位進(jìn)行收發(fā)的,對(duì)于Flash的控制指令也是一樣。我們采用兩個(gè)時(shí)鐘來(lái)指導(dǎo)向Flahs發(fā)出數(shù)據(jù)和指令。連接到開(kāi)發(fā)板本身提供的50MHz時(shí)鐘之后,我們把這個(gè)時(shí)鐘分成兩個(gè)時(shí)鐘,頻率除以2一個(gè)(TX_CLK),頻率除以4一個(gè)(SCK/InterCLK在每?jī)蓚€(gè)周期的TX_CLK信號(hào)的上升沿將信號(hào)發(fā)出,則Flash在SCK信號(hào)的下降8.2FlashLCDFlashFlash,F(xiàn)lashspartan3estarter開(kāi)發(fā)板上,SPI總線是由許多SPI外設(shè)所共享的,所以使用串行Flash之前,需要把別的SPI的設(shè)備全部關(guān)閉。按[6]的說(shuō)明,將信號(hào)DAC_CS'1',AMP_CS'1',AD_CONV'0',SF_CE0為'1',F(xiàn)PGA_INIT_B信號(hào)置為'0'。Flash(Flash'1'Flash進(jìn)行寫入之前,只需要對(duì)進(jìn)行寫入的部分清空即可,但是考慮到我們的flash最后的目的是用來(lái)加載程序只放置程序這一個(gè)程序所以我們?cè)趯懭胫皩?duì)其全部擦除,比較方便。在VHDL之中,我們了一個(gè)Programmer_FSM的大狀態(tài)機(jī),用來(lái)大的步驟。其中的連續(xù)狀態(tài)SPI_WREN1,SPI_RDSR1,SPI_WRSR,SPI_RDSR2,SPI_WREN2,SPI_RDSR3,SPI_BE。這個(gè)里面的狀態(tài)時(shí)SPI_WRSR和SPI_BE。前的操作SPI_WREN1和FlashSPI_RDSR1statusWIPSPI_WREN1指令是否執(zhí)行完當(dāng)執(zhí)行完了之后第一個(gè)狀態(tài)開(kāi)始SPI_WRSR狀態(tài)中我們對(duì)Status寄存器進(jìn)行寫入主要是將其的最SRWD置為1Flash10,blck0以做全局的寫入。第二個(gè)的狀態(tài)SPI_BE即是大規(guī)模擦除,在這一步我們把FlashSPI_RDSR4EraseReady信號(hào)從0置為1,通知Receive從串口接收數(shù)據(jù)并寫入Flash我們的要的數(shù)據(jù),是從串口傳輸進(jìn)來(lái)的。而串口的速度比Flash寫512*8bit8.3在Flash控制器中,我們兩個(gè)用作指針的信號(hào)。Recv_ptr表示FlashSPI_ptr0EraseReadyReceive之后,串口開(kāi)始接收數(shù)據(jù)(接收的方法與串口部分描述相同8bitRecv_ptr1mod512(注:因?yàn)閷?duì)緩定,最后一位信號(hào)采用了當(dāng)時(shí)串口接收線上的信號(hào)進(jìn)行直接的寫入。)此時(shí)Programmer_FSMWaitForWRabs(Recv_ptrSPI_ptr)=256即串口指針了256個(gè)8bit。然后我們通過(guò)狀態(tài)SPI_PP緩沖FlashSPIAddress256SPIAddress256Programmer_FSMWaitForWRFlash剛才的章節(jié)我們介紹了Flash的微觀上的1位數(shù)據(jù)接口和宏觀上的接收邏輯這一節(jié)介紹Flash的相關(guān)操作指(比如之前我們所說(shuō)的寫入Flash的操作,需要通過(guò)PageProgram指令來(lái)完成,而對(duì)于狀態(tài)寄存器的寫入,需要通過(guò)WRSR指令來(lái)完成。Flash的指令如下表所示,我們下面來(lái)介紹用來(lái)完成指令發(fā)送邏輯的自MAND因?yàn)閒lash是從D口接收這些指令控制的。 MAND主要的是控制的對(duì)于D口的發(fā)送邏輯。可以發(fā)現(xiàn),指令并不是需要同樣多的過(guò)程來(lái)完成的(這個(gè)情況和CPU中的指令很相似。所以在狀態(tài)機(jī)在經(jīng)過(guò)OPCODEMANDIdleFlash8.4FlashMANDProgrammer_FSM大的狀態(tài)需要運(yùn)行某條指令時(shí),Programmer_FSM狀態(tài)機(jī)先將該指令的操作碼寫入到操作碼的緩存之中,然后會(huì)置StartSPI信號(hào)為高(StartSPI<='1';Opcode_BUFWREN_Opcode;StartSPIMAND機(jī)在Idle狀態(tài)下判別的啟動(dòng)信號(hào),它會(huì)啟動(dòng)執(zhí)行相應(yīng)的邏輯。在此過(guò)程中Programmer_FSM狀態(tài)機(jī)只需要維持StartSPI信號(hào)為0,使之不會(huì)重復(fù)啟動(dòng),然后等待。在接收狀態(tài)寄存器這一個(gè)狀態(tài)中(RECV,在把^S信號(hào)置低后,進(jìn)入一ToIdleMAND^S拉回。Flash向內(nèi)存的邏在將程序的代碼從PC端發(fā)送到Flash之后,我們還需要從Flash把這部分?jǐn)?shù)據(jù)到內(nèi)存當(dāng)中去。這個(gè)工作是通過(guò)OSLoader來(lái)完成的。OSLoader在Flash這個(gè)方面的操作,幾乎是上面所提及的Flash控制器的一個(gè)子集。它在此的opcode確定為"00000011",對(duì)照上表可知,就是一條讀指令(ReadDataBytes我們把上面的MAND自也簡(jiǎn)化為在這一步所使用的幾個(gè)狀(IdleOPCODEADDR,RECV。在使用ReadDataBytes指令后,記錄數(shù)字,每次為256個(gè)8bit(ReadDataBytes指令執(zhí)行后,F(xiàn)lash的輸出端即會(huì)不斷的在上面圖中的InterCLK時(shí)鐘的上升沿向外發(fā)出連續(xù)的1bit的數(shù)據(jù)我們只要在此時(shí)鐘的上升沿從Flash的輸出口SPI_MISO接收到輔助的8位暫存器Aux_Byte8bit存器中的信號(hào)寫入到FIFO中這個(gè)寫入邏輯相對(duì)于一位flash信號(hào)的接收是相當(dāng),是一個(gè)長(zhǎng)度為256的每個(gè)元素為8bit的數(shù)組通過(guò)信號(hào)tail作為其尾指針,我們可以很輕松的控制向其寫入,當(dāng)寫入的數(shù)量達(dá)到256時(shí),此次的即算完成,將Flash的地址加256,我們通過(guò)置ToIdle(和上文一樣)的值完成這次過(guò)程通過(guò)置DataValid信號(hào)的值來(lái)通知整體狀態(tài)機(jī)OSLoader_st將內(nèi)MEM_WR T信號(hào),置初值為9216,用它來(lái)維持整個(gè)的的一個(gè)LED上,這樣外界就可以看到是否完成。在寫入內(nèi)存的過(guò)程中,OSLoaderCPU達(dá)到T11,主要是用來(lái)完成=( T1)MemSrcOSLoaderIO第九章水線的支持模塊設(shè)9.1如上圖所示,MIPSCPU的五步操作分解為獨(dú)立的環(huán)節(jié)。這樣,CPU的狀態(tài)機(jī)需要做一些調(diào)整。原來(lái)的State[1]狀態(tài)將需要將原先的所有指令的狀態(tài)擴(kuò)展到五步(R個(gè)狀態(tài),加存這一步,但是在這一步不執(zhí)行任何實(shí)際操作,然后將被根據(jù)EX/MEM寄存器,MEM/WB寄存器的狀態(tài)值進(jìn)行控制信號(hào)的提供(此部分的工當(dāng)然,要實(shí)現(xiàn)一個(gè)真正能夠使用的MIPS流水線,還需要考慮更為重要的一(forward,(hazard,分為兩種,結(jié)構(gòu)和數(shù)據(jù)。當(dāng)然在MIPS當(dāng)中,結(jié)構(gòu)是并不一個(gè)限制。再有就是數(shù)據(jù)。數(shù)據(jù)分為兩種情況。add$s0,$t0,$t1sub$t2,$s0,$t3這種情況,在順序執(zhí)行的時(shí)候并沒(méi)有問(wèn)題,因?yàn)榈谝粭l指令已經(jīng)在第五步將$s0$s0$s0ALU$s0法指令得到的值是錯(cuò)誤的。這個(gè)情況,我們通過(guò)轉(zhuǎn)發(fā)單元進(jìn)行處理。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寄存器的寫信號(hào),memwbRegWrite為MEM/WB寄存器的寫入信號(hào)。exmWriteRegEX/MEM的寄存器的,memwbWriteReg為MEM/WB階段要寫入的寄存器的值。idexReadOne和idexReadTwo為ID/EX寄存器中存放的要的兩個(gè)寄存器的編號(hào)。aluSelAaluSelB兩個(gè)輸出信號(hào),表示ALU的A口B口對(duì)于數(shù)據(jù)的選擇,,10ALU01表示操作數(shù)來(lái)自MEM/WB圖 exmRegWrite1,EX/MEMmemwbRegWrite1MEM/WB是否被寫,如果這兩個(gè)同時(shí)都被寫入,則先驗(yàn)證idexReadOne,idexReadTwoEX/MEM10,通過(guò)MEM/WB01,進(jìn)00。第二種情況的數(shù)據(jù),就不能通過(guò)轉(zhuǎn)發(fā)來(lái)完成了。比下面的例子lw$t0,20($gp)addi$t0,t0,1$t0我們?nèi)∮?t01Access)的時(shí)候才能得到$t0$t0ALU(結(jié)果是錯(cuò)誤的邏輯。(hazardENTITYhazardPORT(idexmemread:inidexregrt,ifidregrs,ifidregrt:instd_logic_vectordowntopcenable,ifidenable,idexflush:outENDENTITY9.3hazardRTL其中,idexmemread是在idex階段我們發(fā)現(xiàn)這條指令時(shí)是否要內(nèi)存,如果它需要內(nèi)存則我們判斷它的Rt是否與前面的IF/ID階段指令的Rs或者Rt相同,如果相同,我們通過(guò)把pcenable信號(hào)pc寄存器寫入,從而不再有新指令進(jìn)入流水線,同時(shí)又用ifidenable信號(hào)將IF/ID寫入,從而維持這一段的現(xiàn)狀。然后使用idexflush信號(hào)掉ID/EX的值,使得剛才來(lái)的新第十章來(lái)的工第一,內(nèi)存的80,81,82地址,原則上應(yīng)該被用來(lái)到外設(shè),但實(shí)際79開(kāi)始讀一個(gè)word的話,那么這個(gè)將會(huì)被分派到內(nèi)存的當(dāng)中,而真正的內(nèi)存的80,81,82單元的值,與所期望的不相符合,所以應(yīng)該將MemMode這一LCD如果現(xiàn)在LCD使用簡(jiǎn)單的系統(tǒng)調(diào)用進(jìn)行控制,它還非常不穩(wěn)定,需要進(jìn)行校驗(yàn)位和異常我們還沒(méi)有處理。另外和LCD一樣,串口也需要上升到匯編語(yǔ)言對(duì)第十一章行連接后,我們對(duì)整個(gè)工程進(jìn)行了綜合、實(shí)現(xiàn)時(shí)序仿真并最終到了XilinxSpartan3EStarter中。經(jīng)過(guò)小組同學(xué)大量的測(cè)試后,我們發(fā)現(xiàn)對(duì)現(xiàn)在已經(jīng)實(shí)附錄A器件實(shí)現(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一個(gè)停止位)RxData_Ready:outstd_logic;--完整的接收到了一個(gè)數(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í)存放接收數(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直接進(jìn)去接收狀態(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--停止位第七個(gè)了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;(為輪詢?cè)O(shè)計(jì)(與狀態(tài)寄存Rx_Readyinstd_logic;(為輪詢?cè)O(shè)計(jì)(與狀態(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);--接收到一個(gè)有效的數(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ù)寄存器的過(guò)程中只能被程序端取走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)工作時(shí)鐘CLK:instd_logic; --50MHz源輸入時(shí)鐘CND:instd_logic; --
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 寫買樹(shù)木合同范本
- 2025年浙江貨運(yùn)從業(yè)資格證考試試題及答案詳解
- 2025年巴彥淖爾c1貨運(yùn)從業(yè)資格證考試內(nèi)容
- 代理記賬業(yè)務(wù)合同范本
- 繡花施工方案
- 專屬定制鞋合同范本
- 公司收購(gòu)股合同范例
- 養(yǎng)殖土地借用合同范本
- 分包責(zé)任合同范本
- 做餐飲合伙合同范本
- 醫(yī)用氣體施工方案
- 2024 年陜西公務(wù)員考試行測(cè)試題(B 類)
- 【課件】學(xué)校后勤管理工作
- 2025-2030年中國(guó)聚丙烯酰胺(PAM)市場(chǎng)發(fā)展?fàn)顩r及未來(lái)投資戰(zhàn)略決策報(bào)告新版
- 幼兒園師德師風(fēng)培訓(xùn)內(nèi)容
- 課題申報(bào)書(shū):產(chǎn)教融合背景下護(hù)理專業(yè)技能人才“崗課賽證”融通路徑研究
- 住宅小區(qū)消防設(shè)施檢查方案
- 《榜樣9》觀后感心得體會(huì)四
- 沈陽(yáng)市地圖課件
- 伯利茲城大藍(lán)洞
- 物權(quán)法習(xí)題集
評(píng)論
0/150
提交評(píng)論