【文章內(nèi)容簡介】
n ponent transfern Port (bclkt,resett,xmit_cmd_p:in std_logic。n txdbuf:in std_logic_vector(7 downto 0)。n txd:out std_logic。n txd_done:out std_logic)。n end ponent。n ponent baudn Port (clk,resetb:in std_logic。n bclk:out std_logic)。n end ponent。n signal b:std_logic。n beginn u1:baud port map(clk=clk32mhz,resetb=reset,bclk=b)。 頂層映射n u2:reciever n port map(bclkr=b,resetr=reset,rxdr=rxd,r_ready=rec_ready,n rbuf=rec_buf)。n u3:transfer n port map(bclkt=b,resett=reset,xmit_cmd_p=xmit_cmd_p_in,n txdbuf=txdbuf_in,txd=txd_out,txd_done=txd_done_out)。end Behavioral 波特率發(fā)生器實際上就是一個分頻器??梢愿鶕?jù)給定的系統(tǒng)時鐘頻率(晶振時鐘)和要求的波特率算出波特率分頻因子,算出的波特率分頻因子作為分頻器的分頻數(shù)。波特率分頻因子可以根據(jù)不同的應(yīng)用需要更改。 文件名:.功能:將外部輸入的32MHz的信號分成頻率為153600Hz的信號。library IEEE。use 。use 。use 。entity baud is Port (clk,resetb:in std_logic。 bclk:out std_logic)。end baud。architecture Behavioral of baud isbeginprocess(clk,resetb)variable t:integer。begin if resetb=39。139。 then t:=0。 bclk=39。039。 復(fù)位 elsif rising_edge(clk) then if t=208 then t:=0。 bclk=39。139。 設(shè)置分頻系數(shù) else t:=t+1。 bclk=39。039。 end if。 end if。end process。end Behavioral。 UART發(fā)送器 由于串行數(shù)據(jù)幀和接收時鐘是異步的,由邏輯1轉(zhuǎn)為邏輯0可以被視為一個數(shù)據(jù)幀的起始位。然而,為了避免毛刺影響,能夠得到正確的起始位信號,必須要求接收到的起始位在波特率時鐘采樣的過程中至少有一半都是屬于邏輯0才可認定接收到的是起始位。由于內(nèi)部采樣時鐘bclk周期(由波特率發(fā)生器產(chǎn)生)是發(fā)送或接收波特率時鐘頻率的16倍,所以起始位需要至少8個連續(xù)bclk周期的邏輯0被接收到,才認為起始位接收到,接著數(shù)據(jù)位和奇偶校驗位將每隔16個bclk周期被采樣一次(即每一個波特率時鐘被采樣一次)。如果起始位的確是16個bclk周期長,那么接下來的數(shù)據(jù)將在每個位的中點處被采樣。 發(fā)送狀態(tài)機一共有5個狀態(tài)n X_IDLE(空閑)n X_START(起始位)n X_WAIT(移位等待)n X_SHIFT(移位)n X_STOP(停止位)X_IDLE狀態(tài)n 當(dāng)UART被復(fù)位信號復(fù)位后,狀態(tài)機將立刻進入這一狀態(tài)。n 在這個狀態(tài)下,UART的發(fā)送器一直在等待一個數(shù)據(jù)幀發(fā)送命令XMIT_CMD。n XMIT_CMD_P信號是對XMIT_CMD的處理,XMIT_CMD_P是一個短脈沖信號。這時由于XMIT_CMD是一個外加信號,在FPGA之外,不可能對XMIT_CMD的脈沖寬度進行限制,如果XMIT_CMD有效在UART發(fā)完一個數(shù)據(jù)幀后仍然有效,那么就會錯誤地被認為,一個新的數(shù)據(jù)發(fā)送命令又到來了,UART發(fā)送器就會再次啟動UART幀的發(fā)送,顯然該幀的發(fā)送是錯誤的。n 在此對XMIT_CMD進行了脈沖寬度的限定,XMIT_CMD_P就是一個處理后的信號。n 當(dāng)XMIT_CMD_P=‘1’,狀態(tài)機轉(zhuǎn)入X_START,準備發(fā)送起始位。X_START狀態(tài):n 在這個狀態(tài)下,UART的發(fā)送器一個位時間寬度的邏輯0信號至TXD,即起始位。緊接著狀態(tài)機轉(zhuǎn)入X_WAIT狀態(tài)。n XCNT16是bclk的計數(shù)器 X_WAIT狀態(tài)n 同UART接收狀態(tài)機中的R_WAIT狀態(tài)類似。 X_SHIFT狀態(tài)n 當(dāng)狀態(tài)機處于這一狀態(tài)時,實現(xiàn)待發(fā)數(shù)據(jù)的并串轉(zhuǎn)換。轉(zhuǎn)換完成立即回到X_WAIT狀態(tài)。X_STOPn 停止位發(fā)送狀態(tài),當(dāng)數(shù)據(jù)幀發(fā)送完畢,狀態(tài)機轉(zhuǎn)入該狀態(tài),并發(fā)送16個bclk周期的邏輯1信號,即1位停止位。n 狀態(tài)機送完停止位后回到X_IDLE狀態(tài),并等待另一個數(shù)據(jù)幀的發(fā)送命令。 UART發(fā)收器程序設(shè)計library IEEE。use 。use 。use 。entity transfer is