




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、一. 設(shè)計要求:1.掌握FPGA的設(shè)計與使用。2.基于FPGA實現(xiàn)與PC機的串口通信。二. 設(shè)計步驟:1.用VHDL語言設(shè)計邏輯電路,再通過QUARTUS II 9.1軟件,將各個模塊的電路封裝成器件,在頂層設(shè)計中通過連線,完成整個系統(tǒng)的設(shè)計。串行通信即串行數(shù)據(jù)傳輸,實現(xiàn)FPGA與PC的串行通信在實際中,特別是在FPGA的調(diào)試中有著很重要的應(yīng)用。調(diào)試過程一般是先進行軟件編程仿真,然后將程序下載到芯片中驗證設(shè)計的正確性,目前還沒有更好的工具可以在下載后實時地對FPGA的工作情況和數(shù)據(jù)進行分析。通過串行通信,可以向FPGA發(fā)控制命令讓其執(zhí)行相應(yīng)的操作,同時把需要的數(shù)據(jù)通過串口發(fā)到PC上進行相應(yīng)的數(shù)
2、據(jù)處理和分析,以此來判斷FPGA是否按設(shè)計要求工作。這樣給FPGA的調(diào)試帶來了很大方便,在不需要DSP等其他額外的硬件條件下,只通過串口就可以完成對FPGA的調(diào)試。本文采用Quartus3.0開發(fā)平臺,使用Altera公司的FPGA,設(shè)計實現(xiàn)了與PC的串行通信。總體設(shè)計主要設(shè)計思想:PC向串口發(fā)送命令,F(xiàn)PGA通過判斷接收的控制字執(zhí)行相應(yīng)的操作,總體框圖如圖1所示。圖1 總體框圖設(shè)計包括三部分:1、通過向I/O端口發(fā)送高低電平以達到控制外部硬件的要求。2、完成芯片內(nèi)部邏輯的變化。3、將需要的數(shù)據(jù)先存起來(一般采用內(nèi)部或外部FIFO),然后通過串口將數(shù)據(jù)發(fā)送到PC,PC將接收的數(shù)據(jù)進行處理和分析
3、。串口采用標準的RS-232協(xié)議,主要參數(shù)的選擇:波特率28800bit/s、8位有效位、無奇偶校驗位、1位停止位??刂颇K主要實現(xiàn)的功能是:判斷從PC接收的數(shù)據(jù),根據(jù)預先設(shè)計的邏輯進行相應(yīng)的狀態(tài)轉(zhuǎn)換。例如:給端口預置一個狀態(tài);送開始發(fā)送的標志位,送準備發(fā)送的數(shù)據(jù);給DDS送配置信號,控制FIFO的讀寫。程序中狀態(tài)機設(shè)計如圖3所示。圖3 狀態(tài)機變換設(shè)計中需要注意的問題波特率的選擇對于串口通信是很重要的,波特率不應(yīng)太大,這樣數(shù)據(jù)才會更穩(wěn)定。整個發(fā)送接收過程中起始位的判別和發(fā)送是數(shù)據(jù)傳輸?shù)那疤?。為了避免誤碼的產(chǎn)生,在FPGA設(shè)計中的串行輸入和輸出端口都應(yīng)該加上一個數(shù)據(jù)鎖存器。仿真結(jié)果clk是時鐘信
4、號(57600 bit/s);start_xmit是開始發(fā)送標志位;sin是串行輸入;datain是并行輸出;read_bit是接收結(jié)束標志位;xmit_bit是發(fā)送結(jié)束標志位;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
5、.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
6、 < 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 <=c
7、lk1 or clk2;end Clk_DIV_arch;設(shè)計中需要將3.6864MHz的時鐘進行64分頻變?yōu)?7600 波特作為其他模塊的時鐘基準。具體實現(xiàn)時采用一個6位計數(shù)器,將計數(shù)器的溢出作為時鐘的輸出即可實現(xiàn)整數(shù)分頻。發(fā)送接收模塊此模塊是整個設(shè)計的核心部分。設(shè)計流程如圖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_log
8、ic; 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)機狀態(tài) signal bits
9、 : std_logic_vector(7 downto 0); 接收數(shù)據(jù)暫存 signal smpCnt : integer range 0 to 7; 8次采樣計數(shù) signal bitCnt : integer range 0 to 15; 接收位數(shù)計數(shù)begin process(reset_n, clk) begin if reset_n = '0' thencurState <= WAIT_START; bits <= (others => '0'); smpCnt <= 0; bitCnt <= 0; elsif ris
10、ing_edge(clk) then case curState is when WAIT_START => if RD_x = '0' then if smpCnt = 3 then curState <= DATA; 3次采樣低電平證明起始位,下一個狀態(tài)接收數(shù)據(jù) smpCnt <= 0; else curState <= WAIT_START; smpCnt <= smpCnt + 1; end if; else curState <= WAIT_START; smpCnt <= 0; end if; bits <= (oth
11、ers => '0'); bitCnt <= 0; when DATA => if smpCnt = 7 then 如果采樣八次,則保存一位數(shù)據(jù) if bitCnt = 7 then 如果已經(jīng)接收八位則下一個狀態(tài)停止接收 curState <= STOP; else curState <= DATA; end if; smpCnt <= 0; bits <= RD_x & bits(7 downto 1); 完成接收 bitCnt <= bitCnt + 1; else curState <= DATA; smpCn
12、t <= smpCnt + 1; bits <= bits; bitCnt <= bitCnt; end if; when STOP => if smpCnt = 7 then curState <= WAIT_START; smpCnt <= 0; else curState <= STOP; smpCnt <= smpCnt + 1; end if; bits <= bits; bitCnt <= 0; when others => curState <= WAIT_START; bits <= (others
13、=> '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
14、dav <= '0' end if;end if;end process;end UART_RX_arch; 接收:判斷接收的串行數(shù)據(jù)sin是否是連續(xù)的兩個0,如果是則進入接收過程;每兩個時鐘周期接收1個比特的數(shù)據(jù),依次接收到01101010,如果接收到停止位表明這個接收過程結(jié)束read_bit=1。根據(jù)串行通信協(xié)議,數(shù)據(jù)是按照先低位,后高位的順序發(fā)送的,所以實際接收的是01010110。發(fā)送:待發(fā)送的并行數(shù)據(jù)為01010110,當start_xmit=1發(fā)送有效,進入發(fā)送過程;首先發(fā)送兩個起始位0,保證長度為兩個時鐘周期,然后依次發(fā)送01101010,每兩個時鐘周期發(fā)送
15、1比特,最后發(fā)送停止位,發(fā)送過程結(jié)束xmit_bit為1。在串行通信中,無論發(fā)送或接收,都必須有時鐘脈沖信號對所傳送的數(shù)據(jù)進行定位和同步控制,設(shè)計中采用的時鐘頻率是波特率的兩倍(57600 bit/s)。接收過程:初始狀態(tài)是等待狀態(tài),當檢測到0時進入檢驗狀態(tài),在檢驗狀態(tài)下如果再檢測到0則進入接收數(shù)據(jù)狀態(tài),當接收完8位比特數(shù)后判斷是否有停止位,如果有則結(jié)束接收過程重新進入等待狀態(tài)。發(fā)送過程:初始狀態(tài)是等待狀態(tài),當接收到開始發(fā)送的信號則進入發(fā)送過程,先發(fā)送起始位,再發(fā)送8位比特數(shù),每位寬度為2個周期,當一個字節(jié)發(fā)送完畢后發(fā)送一個停止位,發(fā)送結(jié)束,重新回到等待狀態(tài)。發(fā)送程序library IEEE;
16、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 (WA
17、IT_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 <= 0; case curState i
18、s when WAIT_START => if EN='0' then curState <=WAIT_START; D_bit <='1' else curState <=DATA; bitCnt <= 0; bits <=Data_in; D_bit <='0' end if; when DATA => if bitCnt = 7 then curState <= STOP; D_bit <= bits(0); else curState <= DATA; bitCnt <= bitCnt + 1; D_bit <= bits(7); bits (7 downto 1)<= bits(6 downto 0); end if; when STOP => if EN='1' then curState <=WAIT_START; D_bit <='1' else curState <=STOP; bits <=Data_in; D_bit <='1' end if
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 玫瑰花購銷合同
- 工業(yè)設(shè)備維修保養(yǎng)服務(wù)合同
- 出售房屋委托代理合同書
- 固體廢物處理處置服務(wù)合同
- 水電接入合同協(xié)議書
- 承包建造船舶合同
- 電子政務(wù)系統(tǒng)合同
- 內(nèi)蒙古北方職業(yè)技術(shù)學院《美容外科學醫(yī)學美容》2023-2024學年第二學期期末試卷
- 遼寧稅務(wù)高等??茖W?!峨姎鈧鲃幼詣涌刂葡到y(tǒng)綜合課程設(shè)計》2023-2024學年第二學期期末試卷
- 大連裝備制造職業(yè)技術(shù)學院《智慧教學與微課制作》2023-2024學年第二學期期末試卷
- 馬工程教材《公共財政概論》PPT-緒論
- GB/T 26752-2020聚丙烯腈基碳纖維
- 民間曲藝戲曲課件
- 基于項目式學習的課程構(gòu)建與實施
- 各級醫(yī)療機構(gòu)醫(yī)院醫(yī)用高壓氧治療技術(shù)管理規(guī)范
- 監(jiān)理人員安全生產(chǎn)職責目標考核與獎罰辦法
- AUMA澳瑪執(zhí)行器內(nèi)部培訓課件
- 加強營房管理的對策
- M系列警報明細表復習課程
- 施工隊結(jié)算單
- 關(guān)于對項目管理的獎懲制度
評論
0/150
提交評論