已閱讀5頁,還剩5頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
一. 設(shè)計(jì)要求:1.掌握FPGA的設(shè)計(jì)與使用。2.基于FPGA實(shí)現(xiàn)與PC機(jī)的串口通信。二. 設(shè)計(jì)步驟:1.用VHDL語言設(shè)計(jì)邏輯電路,再通過QUARTUS II 9.1軟件,將各個(gè)模塊的電路封裝成器件,在頂層設(shè)計(jì)中通過連線,完成整個(gè)系統(tǒng)的設(shè)計(jì)。串行通信即串行數(shù)據(jù)傳輸,實(shí)現(xiàn)FPGA與PC的串行通信在實(shí)際中,特別是在FPGA的調(diào)試中有著很重要的應(yīng)用。調(diào)試過程一般是先進(jìn)行軟件編程仿真,然后將程序下載到芯片中驗(yàn)證設(shè)計(jì)的正確性,目前還沒有更好的工具可以在下載后實(shí)時(shí)地對FPGA的工作情況和數(shù)據(jù)進(jìn)行分析。通過串行通信,可以向FPGA發(fā)控制命令讓其執(zhí)行相應(yīng)的操作,同時(shí)把需要的數(shù)據(jù)通過串口發(fā)到PC上進(jìn)行相應(yīng)的數(shù)據(jù)處理和分析,以此來判斷FPGA是否按設(shè)計(jì)要求工作。這樣給FPGA的調(diào)試帶來了很大方便,在不需要DSP等其他額外的硬件條件下,只通過串口就可以完成對FPGA的調(diào)試。本文采用Quartus3.0開發(fā)平臺(tái),使用Altera公司的FPGA,設(shè)計(jì)實(shí)現(xiàn)了與PC的串行通信。總體設(shè)計(jì)主要設(shè)計(jì)思想:PC向串口發(fā)送命令,F(xiàn)PGA通過判斷接收的控制字執(zhí)行相應(yīng)的操作,總體框圖如圖1所示。圖1 總體框圖設(shè)計(jì)包括三部分:1、通過向I/O端口發(fā)送高低電平以達(dá)到控制外部硬件的要求。2、完成芯片內(nèi)部邏輯的變化。3、將需要的數(shù)據(jù)先存起來(一般采用內(nèi)部或外部FIFO),然后通過串口將數(shù)據(jù)發(fā)送到PC,PC將接收的數(shù)據(jù)進(jìn)行處理和分析。串口采用標(biāo)準(zhǔn)的RS-232協(xié)議,主要參數(shù)的選擇:波特率28800bit/s、8位有效位、無奇偶校驗(yàn)位、1位停止位。控制模塊主要實(shí)現(xiàn)的功能是:判斷從PC接收的數(shù)據(jù),根據(jù)預(yù)先設(shè)計(jì)的邏輯進(jìn)行相應(yīng)的狀態(tài)轉(zhuǎn)換。例如:給端口預(yù)置一個(gè)狀態(tài);送開始發(fā)送的標(biāo)志位,送準(zhǔn)備發(fā)送的數(shù)據(jù);給DDS送配置信號(hào),控制FIFO的讀寫。程序中狀態(tài)機(jī)設(shè)計(jì)如圖3所示。圖3 狀態(tài)機(jī)變換設(shè)計(jì)中需要注意的問題波特率的選擇對于串口通信是很重要的,波特率不應(yīng)太大,這樣數(shù)據(jù)才會(huì)更穩(wěn)定。整個(gè)發(fā)送接收過程中起始位的判別和發(fā)送是數(shù)據(jù)傳輸?shù)那疤帷榱吮苊庹`碼的產(chǎn)生,在FPGA設(shè)計(jì)中的串行輸入和輸出端口都應(yīng)該加上一個(gè)數(shù)據(jù)鎖存器。仿真結(jié)果clk是時(shí)鐘信號(hào)(57600 bit/s);start_xmit是開始發(fā)送標(biāo)志位;sin是串行輸入;datain是并行輸出;read_bit是接收結(jié)束標(biāo)志位;xmit_bit是發(fā)送結(jié)束標(biāo)志位;sout是串行輸出;dataout是并行輸出;rcv_bit 是接收位數(shù)寄存器。發(fā)送接收模塊主要完成把從sin端口接收的串行數(shù)據(jù)變?yōu)椴⑿袛?shù)據(jù)送給dataout;把并行數(shù)據(jù)datain變成串行數(shù)據(jù)通過sout端口串行發(fā)送。分頻模塊library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_arith.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity Clk_DIV is port (clk : in std_logic; CLK_O : out std_logic );end Clk_DIV;architecture Clk_DIV_arch of Clk_DIV issignal clk1,clk2 : std_logic; signal s1,s2 : integer range 0 to 53; beginprocess(clk)beginif rising_edge(clk) then if s1 53 then s1= s1+1; else s1=0; end if; if s1 28 then clk1 = 1; else clk1 = 0; end if; end if;end process;process(clk)beginif falling_edge(clk) then if s2 53 then s2= s2+1; else s2=0; end if; if s2 28 then clk2 = 1; else clk2 = 0; end if; end if;end process;CLK_O =clk1 or clk2;end Clk_DIV_arch;設(shè)計(jì)中需要將3.6864MHz的時(shí)鐘進(jìn)行64分頻變?yōu)?7600 波特作為其他模塊的時(shí)鐘基準(zhǔn)。具體實(shí)現(xiàn)時(shí)采用一個(gè)6位計(jì)數(shù)器,將計(jì)數(shù)器的溢出作為時(shí)鐘的輸出即可實(shí)現(xiàn)整數(shù)分頻。發(fā)送接收模塊此模塊是整個(gè)設(shè)計(jì)的核心部分。設(shè)計(jì)流程如圖2所示。圖2 發(fā)送接收流程圖library IEEE;use IEEE.std_logic_1164.all;use IEEE.std_logic_arith.all;use IEEE.std_logic_unsigned.all;entity UART_RX is port ( reset_n : in std_logic; clk : in std_logic; RD_x : in std_logic; RD_x,接收數(shù)據(jù)線 dout : out std_logic_vector(7 downto 0); 模塊接收到得1字節(jié)數(shù)據(jù) dav : out std_logic 傳輸成功應(yīng)答 );end UART_RX;architecture UART_RX_arch of UART_RX is type UART_RX_STATE_TYPE is (WAIT_START, DATA, STOP); signal curState : UART_RX_STATE_TYPE; 接收狀態(tài)機(jī)狀態(tài) signal bits : std_logic_vector(7 downto 0); 接收數(shù)據(jù)暫存 signal smpCnt : integer range 0 to 7; 8次采樣計(jì)數(shù) signal bitCnt : integer range 0 to 15; 接收位數(shù)計(jì)數(shù)begin process(reset_n, clk) begin if reset_n = 0 thencurState = WAIT_START; bits 0); smpCnt = 0; bitCnt if RD_x = 0 then if smpCnt = 3 then curState = DATA; 3次采樣低電平證明起始位,下一個(gè)狀態(tài)接收數(shù)據(jù) smpCnt = 0; else curState = WAIT_START; smpCnt = smpCnt + 1; end if; else curState = WAIT_START; smpCnt = 0; end if; bits 0); bitCnt if smpCnt = 7 then 如果采樣八次,則保存一位數(shù)據(jù) if bitCnt = 7 then 如果已經(jīng)接收八位則下一個(gè)狀態(tài)停止接收 curState = STOP; else curState = DATA; end if; smpCnt = 0; bits = RD_x & bits(7 downto 1); 完成接收 bitCnt = bitCnt + 1; else curState = DATA; smpCnt = smpCnt + 1; bits = bits; bitCnt if smpCnt = 7 then curState = WAIT_START; smpCnt = 0; else curState = STOP; smpCnt = smpCnt + 1; end if; bits = bits; bitCnt curState = WAIT_START; bits 0); smpCnt = 0; bitCnt = 0; end case;end if;end process;dout = bits; process(reset_n, clk) beginif reset_n = 0 then dav = 0; elsif rising_edge(clk) then if curState = STOP and smpCnt = 7 and RD_x = 1 then dav = 1; 應(yīng)答接收成功 else dav = 0; end if;end if;end process;end UART_RX_arch; 接收:判斷接收的串行數(shù)據(jù)sin是否是連續(xù)的兩個(gè)0,如果是則進(jìn)入接收過程;每兩個(gè)時(shí)鐘周期接收1個(gè)比特的數(shù)據(jù),依次接收到,如果接收到停止位表明這個(gè)接收過程結(jié)束read_bit=1。根據(jù)串行通信協(xié)議,數(shù)據(jù)是按照先低位,后高位的順序發(fā)送的,所以實(shí)際接收的是。發(fā)送:待發(fā)送的并行數(shù)據(jù)為,當(dāng)start_xmit=1發(fā)送有效,進(jìn)入發(fā)送過程;首先發(fā)送兩個(gè)起始位0,保證長度為兩個(gè)時(shí)鐘周期,然后依次發(fā)送,每兩個(gè)時(shí)鐘周期發(fā)送1比特,最后發(fā)送停止位,發(fā)送過程結(jié)束xmit_bit為1。在串行通信中,無論發(fā)送或接收,都必須有時(shí)鐘脈沖信號(hào)對所傳送的數(shù)據(jù)進(jìn)行定位和同步控制,設(shè)計(jì)中采用的時(shí)鐘頻率是波特率的兩倍(57600 bit/s)。接收過程:初始狀態(tài)是等待狀態(tài),當(dāng)檢測到0時(shí)進(jìn)入檢驗(yàn)狀態(tài),在檢驗(yàn)狀態(tài)下如果再檢測到0則進(jìn)入接收數(shù)據(jù)狀態(tài),當(dāng)接收完8位比特?cái)?shù)后判斷是否有停止位,如果有則結(jié)束接收過程重新進(jìn)入等待狀態(tài)。發(fā)送過程:初始狀態(tài)是等待狀態(tài),當(dāng)接收到開始發(fā)送的信號(hào)則進(jìn)入發(fā)送過程,先發(fā)送起始位,再發(fā)送8位比特?cái)?shù),每位寬度為2個(gè)周期,當(dāng)一個(gè)字節(jié)發(fā)送完畢后發(fā)送一個(gè)停止位,發(fā)送結(jié)束,重新回到等待狀態(tài)。發(fā)送程序library IEEE;use IEEE.std_logic_1164.all;use IEEE.std_logic_arith.all;use IEEE.std_logic_unsigned.all;entity UART_TX is port ( EN : in std_logic; clk : in std_logic; TD_x : out std_logic; Data_in : in std_logic_vector(7 downto 0) );end UART_TX;architecture UART_TX_arch of UART_TX istype UART_TX_STATE_TYPE is (WAIT_START, DATA, STOP);signal curState : UART_TX_STATE_TYPE; signal bits : std_logic_vector(7 downto 0);signal D_bit : std_logic;signal bitCnt : integer range 0 to 7;signal i : integer range 0 to 7;beginprocess(EN, clk)begin if rising_edge(clk) then i = i+1; if i=7 then i if EN=0 then curState =WAIT_START; D_bit =1; else curState =DATA; bitCnt = 0; bits =Data_in; D_bit if bitCnt = 7 then curState = STOP; D_bit = bits(0); else curState = DATA; bitCnt = bitCnt + 1; D_bit = bits(7); bits (7 downto 1) if EN=1 then curState =WAIT_START; D_bit =1; else curState =STOP; bits =Data_in; D_bit null; end case; end if;end if;TD_x =D_bit; end process; end UART_TX_arch; 圖5中clk是時(shí)鐘信號(hào);a是PC發(fā)來的16進(jìn)制的控制字,也就是圖4中的并行輸出dataout; ma1cnt、ma2cnt、ma3cnt是三個(gè)寄存器;clrr是系統(tǒng)清零信號(hào);ddsclr是DDS配置信號(hào);fifo_clk,fifo_rd,fifo_wr,ram_rst是FIFO的時(shí)鐘、讀、寫、清零信號(hào);start_xmit是發(fā)送開始標(biāo)志位;b是準(zhǔn)備發(fā)送的數(shù)據(jù)。當(dāng)接收a為1時(shí),fifo_wr置1;當(dāng)a為18時(shí),把ma1cnt的值送到b。其他的操作類似,主要是端口的置位,F(xiàn)IFO讀寫狀態(tài)的控制。圖5 發(fā)送
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 銀行資金調(diào)配指南
- 防水工程維護(hù)設(shè)計(jì)合同
- 環(huán)保設(shè)施三方施工合同
- 醫(yī)療保健中心租賃合同模板
- 2024年資產(chǎn)托管經(jīng)營合同3篇
- 2024年防水工程培訓(xùn)分包協(xié)議3篇
- 山東省農(nóng)業(yè)設(shè)施裝修工程合同模板
- 2025油漆采購合同2
- 2025年度環(huán)境風(fēng)險(xiǎn)評估與監(jiān)測合同書模板
- 2024年度工程貸款擔(dān)保合同3篇
- 北京市西城區(qū)2022-2023學(xué)年三年級(jí)上學(xué)期英語期末試卷(含聽力音頻)
- 電動(dòng)托盤搬運(yùn)車操作規(guī)程范文(2篇)
- 教育部中國特色學(xué)徒制課題:基于中國特色學(xué)徒制的“金教師”團(tuán)隊(duì)建設(shè)研究
- 【MOOC】輪滑高級(jí)教程-東北大學(xué) 中國大學(xué)慕課MOOC答案
- 2024年醫(yī)院副院長工作總結(jié)范文(2篇)
- 【MOOC】診斷學(xué)-山東大學(xué) 中國大學(xué)慕課MOOC答案
- 周1530安全教育記錄
- 建筑工程管理與實(shí)務(wù)二級(jí)建造師考試試卷及解答參考
- 中國非遺文化魚燈介紹2
- 村集體經(jīng)濟(jì)入股分紅協(xié)議書
- 人體寄生蟲表格總結(jié)超全(原蟲部分)
評論
0/150
提交評論