版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、<p><b> 1 緒論</b></p><p> 1.1 數(shù)據(jù)采集系統(tǒng)的概念和意義</p><p> 信號采集與處理是計算機與外部物理世界連接的橋梁,在科研、生產(chǎn)和人們的日常生活中,經(jīng)常需要測量流量、速度、位移、溫度、壓力、外形等物理量,人們一般通過傳感器把上述物理量轉換成模擬電信號,然后將模擬電信號經(jīng)過放大、濾波、數(shù)模轉換等處理后送入計算機,
2、這就是數(shù)據(jù)采集。數(shù)據(jù)采集技術是信息科學的重要分支,它不僅應用在智能儀器中,而且在現(xiàn)代工業(yè)生產(chǎn)、國防軍事及科學研究等方面都得到廣泛應用,無論是過程控制、狀態(tài)監(jiān)測,還是故障診斷、質(zhì)量檢測,都離不開數(shù)據(jù)采集系統(tǒng)[1-2]。</p><p> 從嚴格意義上說,數(shù)據(jù)采集系統(tǒng)應該是用計算機控制的多路數(shù)據(jù)自動檢測或巡回檢測,并且能夠?qū)?shù)據(jù)實行存儲、處理、分析計算,以及從檢測的數(shù)據(jù)中提取可用的信息,供顯示、記錄、打印或描繪的系
3、統(tǒng)。總之,不論在哪個應用領域中,數(shù)據(jù)的采集與處理越及時,工作效率就越高,取得的經(jīng)濟效益就越大。</p><p> 1.2 數(shù)據(jù)采集系統(tǒng)研究現(xiàn)狀</p><p> 數(shù)據(jù)采集存儲系統(tǒng)目前在環(huán)境感知,圖像處理、語音識別、通信等領域有著廣泛的應用,它用于實時、高速地采集和記錄應用領域的各項參數(shù)信息。隨著應用領域的不斷深入,信號分辨率、采樣率,數(shù)據(jù)存儲容量,存儲時間等要求都大幅提升,設備可靠性
4、和實時性要求也越來越高,因此高精度、高可靠性的大容量數(shù)據(jù)采集存儲系統(tǒng)就顯得尤為重要,而且抗沖擊干擾能力、可擴展性及可移植性等方面因素都必須嚴格考慮處理[3-4]。</p><p> 傳統(tǒng)的數(shù)據(jù)采集系統(tǒng)采用單片機作為微處理器。近年來,數(shù)據(jù)采集系統(tǒng)的控制芯片由原來的單片機逐步發(fā)展到數(shù)字處理芯片DSP(數(shù)字信號處理器),嵌入式芯片等速度更高功能更強的芯片。在高性能數(shù)據(jù)采集系統(tǒng)中,通常采用單片機或DSP作為CPU,控制
5、ADC(模/數(shù)轉換器)、存儲器和其他外圍電路的工作[5]。</p><p> 但基于單片機和DSP設計的數(shù)據(jù)采集系統(tǒng)都有一定的不足:</p><p> 單片機的時鐘頻率較低,各種功能都要靠軟件的運行來實現(xiàn),軟件運行時間在整個采樣時間中占很大的比例,效率低,難以適應高速數(shù)據(jù)采集系統(tǒng)的要求;DSP的運算速度快,擅長處理密集的乘加運算,但很難完成外圍的復雜硬件邏輯控制。</p>
6、<p> FPGA是英文Field-Programmable Gate Array的縮寫,即現(xiàn)場可編程門陣列,它是在PAL、GAL、CPLD等可編程器件的基礎上進一步發(fā)展的產(chǎn)物。它是作為專用集成電路(ASIC)領域中的一種半定制電路而出現(xiàn)的,既解決了定制電路的不足,又克服了原有可編程器件門電路數(shù)有限的缺點。FPGA集成度高,器件密度高達數(shù)千萬門,可完成復雜的時序與組合邏輯電路功能,通過編程,用戶可立刻把一個通用FPGA芯片
7、配置成需要的硬件數(shù)字電路,其內(nèi)部豐富的布線資源也給修改、測試和系統(tǒng)升級提供了極大的方便。</p><p> 隨著電子技術的飛速發(fā)展,F(xiàn)PGA 能有效克服單片機和DSP的缺點,它的全部控制邏輯均由硬件完成,容易實現(xiàn)硬件上的并行工作。FPGA內(nèi)部可以嵌入DSP軟核,增強了系統(tǒng)的數(shù)據(jù)處理能力[6-7];FPGA 還具有時鐘頻率高、內(nèi)部延時小、編程配置靈活的特點,可以集采樣控制、處理、緩存和傳輸于一個芯片內(nèi)實現(xiàn)片上系統(tǒng)
8、,這樣大大提高了系統(tǒng)的可靠性,降低系統(tǒng)成本;同時隨著 IP產(chǎn)業(yè)的崛起,更加縮短了產(chǎn)品的開發(fā)周期和上市時間,有利于在激烈的市場競爭中搶占先機;因此在多路并行高速數(shù)據(jù)采集領域得到廣泛應用。</p><p> 對數(shù)據(jù)采集系統(tǒng)的設計提出兩個方面的要求:一方面,要求接口簡單靈活且有較高的數(shù)據(jù)傳輸率;另一方面,由于通道多、數(shù)據(jù)量較大,要求主機能夠?qū)崟r數(shù)據(jù)做出快速響應,并及時進行分析和處理。一般的數(shù)據(jù)采集系統(tǒng)由多路數(shù)據(jù)選擇
9、器轉換器、數(shù)據(jù)存儲器、單片機控制器以及通信接口電路等A/D組成。傳統(tǒng)的數(shù)據(jù)采集器中的多路數(shù)據(jù)選擇器由多個模擬開關組成,加上轉換器的控制電路及數(shù)據(jù)存儲器,電路所需元A/D器件較多,因此電路板設計的面積較大。如果采用現(xiàn)場可編程門陣列電路實現(xiàn)多路數(shù)據(jù)選擇器、存儲器及外圍的一些FPGA控制電路。不僅可以減小電路板的設計體積,而且最大限度地提高系統(tǒng)的信號采集和處理能力。</p><p> 1.3 主要研究內(nèi)容</p
10、><p> 本課題的主要研究內(nèi)容是,在理解數(shù)據(jù)采集原理的基礎上,設計一個數(shù)據(jù)采集系統(tǒng),對一路數(shù)字信號進行采集,將采集編幀后的數(shù)據(jù)存儲,并通過上位機軟件進行數(shù)據(jù)的分析。</p><p><b> 2 系統(tǒng)總體設計</b></p><p> 圖2.1 系統(tǒng)整體結構圖</p><p> 本設計的系統(tǒng)框圖如圖2.1所示。&
11、lt;/p><p> 該系統(tǒng)由422接口模塊、FPGA控制模塊、信號存儲模塊、USB通訊模塊以及外圍電路組成。其中,USB通信模塊的設計利用了已有的研究成果。</p><p> 422接口負責接收外部的RS-422數(shù)字量信號,并將其送入FPGA采集。FPGA將讀取到的數(shù)字量信號先進行數(shù)據(jù)編幀處理,接著存入外部FIFO中,最后控制存儲于外部FLASH之中。電路的整個時序由邏輯控制模塊協(xié)調(diào)控制
12、。</p><p> FPGA控制模塊由FPGA及外圍電路組成。FPGA是控制模塊的核心部分,完成數(shù)據(jù)信號的采集、緩沖和傳輸控制。該設計方案選用FPGA作為主模塊,主要是考慮FPGA現(xiàn)場可編程特性,使用靈活方便,能夠降低硬件電路設計難度。</p><p> 信號存儲模塊在系統(tǒng)中主要完成數(shù)字信息的存儲。閃存(FLASH Memory)具有體積小、功耗低和數(shù)據(jù)不易丟失的特點,可用來實現(xiàn)存儲
13、器的功能。把采集到的數(shù)據(jù)緩存到外部FIFO中。當FIFO半滿后,F(xiàn)PGA讀取FIFO中的數(shù)據(jù)寫入FLASH存儲器中。</p><p> USB接口模塊實現(xiàn)FPGA與上位機之間的通信,完成上位機控制命令與Flash存儲數(shù)據(jù)的傳送。</p><p> 3 系統(tǒng)硬件電路的設計</p><p> 3.1 主要器件的選擇</p><p>
14、3.1.1 FPGA芯片的選擇</p><p> FPGA采用Xilinx 公司的Spartan-Ⅱ系列FPGA 中的XC2S100-6PQ208實現(xiàn)。XCF01SVO20作為EPROM,TPS70358作為供電芯片。XC2S100-6PQ208的核心電壓為2.5V,I/O口電壓為3.3V,具有與通用5V數(shù)字電路直接連接的能力。速度等級是-6,采用PQFP封裝類型,管腳數(shù)有208個,最大可用的用戶I/O數(shù)為1
15、40個。系統(tǒng)門數(shù)有100000個,邏輯單元數(shù)(LC)為2700個;切片數(shù)(Slice)為1200個;BlockRAM有10個,是完全同步的雙端口RAM,總容量為40K;分布式RAM位總數(shù)是38400 bits[8]。斷電后,程序會保留在FPGA中,不會清除,使應用更加方便。</p><p> 3.1.2 數(shù)字通信接口芯片的選擇</p><p> 數(shù)字通信接口選擇MAX490芯片,MA
16、X490是MAXIM公司生產(chǎn)的差分平衡型收發(fā)器芯片。集成片內(nèi)包含1個驅(qū)動器和1個接收器.適合于RS-485及RS-422通信標準。無誤差傳輸數(shù)據(jù)的速率可達2.5Mb/s,若通信速率為100kb/s時,通信距離可達1200m[9]。</p><p> 3.1.3 外部FIFO的選擇</p><p> 本設計采用FIFO數(shù)據(jù)緩存器。FIFO是指先入先出隊列(First Input Fir
17、st Output,F(xiàn)IFO),這是一種傳統(tǒng)的按順序執(zhí)行方法,先進入的指令先完成并引退,跟著才執(zhí)行第二條指令。FIFO與普通存儲器的區(qū)別是沒有外部讀寫地址線,這樣使用起來非常簡單,但缺點就是只能順序?qū)懭霐?shù)據(jù),順序的讀出數(shù)據(jù),其數(shù)據(jù)地址由內(nèi)部讀寫指針自動加1完成,不能像普通存儲器那樣可以由地址線決定讀取或?qū)懭肽硞€指定的地址。</p><p> IDT7206是一種先進先出的雙端口數(shù)據(jù)緩存器。該器件使用一個滿標志(
18、FF)和一個空標志(EF)來檢測其存儲狀態(tài),通過W引腳和R引腳來控制數(shù)據(jù)的存儲和讀取。該設備提供了9位寬度的數(shù)據(jù)存儲輸入輸出和一個控制作為用戶的選擇校驗位。其時序如圖3.1所示。</p><p> 需要注意的是,IDT7206是一個單向的FIFO雙端口存儲器。即只能由D0~D8輸入數(shù)據(jù),由Q0-Q8輸出數(shù)據(jù),所以讀、寫控制線只有一套。也就是說不能作為雙向的數(shù)據(jù)傳送。另外因為這是一個FIFO(先入先出)存儲器,所
19、以沒有絕對地址的概念,只有讀指針和寫指針的相對位置。當相對位置為0時,表明存儲器空;為所用的存儲器的寫操</p><p> 圖3.1 IDT7206時序圖容量時,表明存儲器已滿。</p><p> 作:只要FF標志不為0,就可以進行寫操作,且可以與讀操作同時進行。每寫一次數(shù)據(jù),寫指針自動加一,當寫指針與讀指針的相對位置為存儲器的容量時,標志FF清零。當FF標志為0時,所進行的任何寫操作
20、都不會改變存儲器中的數(shù)據(jù),也不會改變寫指針的值。此時的寫禁止由內(nèi)部控制。</p><p> 讀操作:只要EF標志不為0,就可以進行讀操作,且可以與寫操作同時進行。每讀一次數(shù)據(jù),讀指針自動加一,當讀指針與寫指針的相對位置為0時,標志EF清零。當EF標志為0時,所進行的任何讀操作都不會改變讀指針,且讀出的數(shù)據(jù)都為0FFH。即數(shù)據(jù)總線呈現(xiàn)高阻[10]。</p><p> 3.1.4 USB
21、設計模塊的選擇</p><p> USB接口采用基于Cypress公司生產(chǎn)的EZ-USB FX2系列中的CY7C68013,是目前市面上第一塊符合USB2.0標準的USB控制器。EZ-USB FX2 芯片包括1個8051處理器、1個串行接口引擎(SIE)、1個USB收發(fā)器、8.5KB片上RAM,4KB FIFO存儲器以及1個通用可編程接口(GPIF)。FX2是一個全面集成的解決方案,它占用的電路板空間更少,開發(fā)
22、時間更短[11]。</p><p> CY7C68013采用編程接口GPIF模式??删幊探涌贕PIF是主機方式,可以由軟件設置讀寫控制波形,靈活性很大,幾乎可以對任何8/16bit接口的控制器、存儲器和總線進行數(shù)據(jù)的主動讀寫,使用非常靈活,只要輸出信號和就緒信號作相應的組合,就可以實現(xiàn)多種復雜的控制時序。</p><p> 3.2 硬件電路各模塊的設計</p><
23、p> 3.2.1 FPGA外圍電路 </p><p><b> ?。?)電源轉換電路</b></p><p> XC2S100的管腳電壓為3.3V,內(nèi)核電壓為2.5V,因此本設計中采用一片TPS70358來實現(xiàn)5V到3.3V和2.5V的轉換,以滿足XC2S100的供電要求。當EN腳連接到一個低電平時該器件開始工作。SEQ控制哪個輸出電壓通道(VOUT1或V
24、OUT2)先打開。當裝置被啟用并且SEQ為高電平時,VOUT2先打開,VOUT1保持關閉,當其值達到VOUT2輸出電壓的83%時VOUT1打開。如果VOUT2被拉低于83%(即過載條件)則VOUT1關閉。</p><p> 電源轉換電路如圖3.2所示:</p><p> 圖3.2 電源轉換電路</p><p><b> ?。?)時鐘電路</b&
25、gt;</p><p> XC2S100上有4個全局時鐘輸入端口,GCLK0、GCLK1、GCLK2和GCLK3,在此僅使用GCLK0。本系統(tǒng)采用40MHz的晶體振蕩器產(chǎn)生時鐘信號。其余3個時鐘輸入端都接地以防止干擾。時鐘電路如下圖。</p><p> 圖3.3 FPGA時鐘電路</p><p><b> ?。?)配置電路</b></
26、p><p> 在Xilinx的FPGA中采用了SRAM制造工藝,需要提供外部存儲器PROM、EPROM、Flash等來存儲FPGA的下載文件,上電后數(shù)據(jù)會自動下載到FPGA內(nèi)部,對FPGA進行配置。</p><p> 本設計中選用主串模式,在主串模式中必須使用Xilinx公司專用的PROM。XC2S100的配置文件大小為781,216位,選擇XCF01SV020作為配置PROM。在該模式下
27、,F(xiàn)PGA產(chǎn)生配置時鐘CCLK驅(qū)動外部串行PROM,F(xiàn)PGA將PROM中數(shù)據(jù)讀入片內(nèi)編程RAM中,配置完成后,F(xiàn)PGA進入工作狀態(tài)。第一次數(shù)據(jù)下載通過Xilinx公司提供的開發(fā)軟件ISE將配置文件燒寫到XCF01SVO20中,此后每次上電后,XCF01SVO20會在CCLK的驅(qū)動下將配置數(shù)據(jù)寫入FPGA的內(nèi)部配置存儲器。</p><p> 配置電路的原理圖如圖3.4所示。</p><p>
28、; 圖3.4 FPGA配置電路</p><p> 其中,配置電路與FPGA相接時須接入4.7K的上拉電阻,以保證電路的正常工作。</p><p><b> ?。?)去耦電路</b></p><p> 在每個電路芯片的電源引腳上都要并接一個去耦電容,其作用是降低電路中因負載變化而引起的噪聲、減少干擾信號并使信號穩(wěn)定。下圖是本模塊中FPGA的
29、VCCINT引腳與VCCO引腳的去耦接法。</p><p><b> 圖3.5 去耦電容</b></p><p> 電路中其他芯片也相應的接去耦電容。</p><p> 3.2.2 數(shù)字信號采集電路</p><p> 單路數(shù)字量接口如圖3.6所示。Rs422總線是現(xiàn)在廣泛應用的工業(yè)總線,許多儀器用422總線進行
30、通信[12]。由于所采集輸入的數(shù)字量信號是采用RS-422差分信號電氣特性傳輸?shù)?,故MAX490芯片負責將輸入的差分信號還原成單端數(shù)字量信號,其最大波特率可達到2.5Mbps,滿足數(shù)字量傳輸速率要求。電阻R是根據(jù)傳輸距離與介質(zhì)而加入的接收匹配阻抗,可有效減少信號反射與衰減。 </p><p> 圖3.6 數(shù)字量采集接口</p><p> 3.2.3 外部FIFO緩存電路</p&
31、gt;<p> 使用IDT7206作為采集數(shù)據(jù)緩存。硬件電路如圖3.7。</p><p> IDT7206是一個單向的FIFO雙端口存儲器。即只能由D0~D8輸入,系統(tǒng)只要求8位數(shù)據(jù),所以對于IDT7206的數(shù)據(jù)位,只用前8位即可。.</p><p> 數(shù)據(jù)輸入和輸出端均只使用前8位(Q0~Q7、D0~D7);讀允許信號R由FPGA的控制信號提供;寫允許信號W由FPGA
32、輸入,當W為低時,將轉換后的數(shù)據(jù)存入IDT7206;復位信號RS由FPGA控制,當RS輸入為低電平時器件開始復位,其內(nèi)部讀和寫都將回到初始位置且RS上升沿來臨之前讀信號和寫信號都將保持高電平。</p><p> 圖3.7 IDT7206緩存電路</p><p> 3.3 電路板的設計</p><p> 3.3.1 電路原理圖設計</p>&l
33、t;p> 在繪制電路原理圖時,需要注意以下幾個問題:首先,在繪制電路原理圖之前,應該將電氣格點和鎖定格點設置為開啟狀態(tài),可以避免導線與器件引腳產(chǎn)生的虛連接。其次,在完成電路圖的繪制后,進行電氣規(guī)則檢查(ERC)是一項非常重要的工作。根據(jù)設計要求,在電氣規(guī)則檢查矩陣中,設置相應的電氣警告和電氣錯誤的條件,ERC就可以全面的分析原理圖的常見錯誤和無效的電氣連接,如未連接的電源實體、懸空的輸入管腳、輸出管腳連接在電源上等。ERC的沖突
34、點在原理圖上的相應位置以高亮顯示的形式逐一標出,并記錄到ERC報告文件中。本系統(tǒng)的電路原理圖見附錄A。</p><p> 3.3.2 PCB設計</p><p> 在印刷電路板的設計過程中,應該遵循一些設計的基本原則,否則會使系統(tǒng)工作不穩(wěn)定甚至不能正常工作,一般的解決辦法包括布局設計、布線設計。</p><p><b> ?。?)布局設計</b
35、></p><p> 考慮到本設計中元器件比較多,所以我按照以下方法進行布局。首先,按電氣性能合理分區(qū),完成同一功能的器件應相對集中,并調(diào)整各元器件以保證連線最為簡潔;同時,調(diào)整各功能模塊間的相對位置,使功能塊間的連線最簡潔。其次,本設計中電源和地濾波電路中的去耦電容較多,在放置去耦電容時,應將電容盡量靠近電源、接地引腳。</p><p><b> (2)布線設計<
36、;/b></p><p> 布線是整個PCB設計中最重要的工序,這將直接影響著PCB板的性能好壞。在該系統(tǒng)的PCB設計中,全板使用手工布線,首先注意到該設計中成組的信號線主要是數(shù)據(jù)線和地址線。所以在元器件位置確定后,應該先完成它們的布線,盡可能做到成組、平行分布,同時應盡可能的短,之后再進行各種控制信號的布線。最后處理電源和接地引腳。在布線時,應按照地線>電源線>信號線的關系加寬電源、地線寬度,地線及電源
37、線的典型線寬值為40Mil。采用45º的折線布線,以減小高頻信號的輻射。最后在版圖布線完成后,對布線進行優(yōu)化;同時,經(jīng)初步網(wǎng)絡檢查和DRC檢查無誤后,對未布線區(qū)域進行地線填充[13]。</p><p> 4 系統(tǒng)軟件設計 </p><p> 該系統(tǒng)的軟件設計主要指FPGA軟件設計。FPGA軟件采用模塊化設計方法,利用VHDL語言開發(fā),設計框圖如下。</p>&
38、lt;p> 圖4.1 數(shù)字量采集框圖</p><p><b> 4.1 數(shù)據(jù)采集</b></p><p> 422接口的系統(tǒng)頂層圖為:</p><p> 圖4.2 數(shù)字量接口系統(tǒng)頂層圖</p><p> 其中:數(shù)字量接口采用RS485異步串行數(shù)據(jù)通信接口。一個完整的UART接口包括發(fā)送模塊和接收模塊,具
39、體到本次設計,數(shù)字量接口和工作模式選擇接口使用UART的接收模塊。</p><p> UART串行數(shù)據(jù)格式如下圖所示,串行數(shù)據(jù)包括8位數(shù)據(jù)、l位起始位、l位結束位、l位校驗位,共11位。</p><p> 圖4.3 UART串行數(shù)據(jù)格式</p><p> 系統(tǒng)接收的外部數(shù)字量數(shù)據(jù),由于傳輸距離較遠,很容易引進各種干擾信號:系統(tǒng)</p><p
40、> 內(nèi)部的一些關鍵信號,不可避免會受到雜波的干擾,導致一些信號會出現(xiàn)干擾、噪聲[14]。為了讓系統(tǒng)有效準確,必須采取有效的措施抑制該信號的干擾信號,本設計中采用消抖技術。對于信號消抖有軟件和硬件兩種方式,硬件消抖有多種方法,長線電纜這一類板外信號因干擾造成的大的抖動可以采用積分電路具有施密特功能的門電路(如74HC14)來消除[15]。同樣在軟件方面,可以用VHDL實現(xiàn)類似的辦法。對于小于觸發(fā)器建立時間的抖動可以用時鐘打一下實現(xiàn)
41、濾波,但較大的抖動,可以采用延時比較法。延時比較法的思想就是N個系統(tǒng)時鐘周期內(nèi)讀取的數(shù)據(jù)相同時我們認為收到了一個穩(wěn)定的數(shù)據(jù),否則認為是過渡態(tài),予以消除。其中N要根據(jù)實際情況變化,延時比較法的流程圖如圖4.4。設S1為受擾信號,S2為經(jīng)過消抖處理后要輸出的信號。</p><p> 圖4.4 延時比較法流程圖</p><p> 下面給出用VHDL實現(xiàn)的延時消抖,同時給出仿真結果,是經(jīng)過延時
42、比較后的仿真圖,bclk為實際輸出的時鐘信號,可以看到lclk的抖動被消除了。因此,延時比較法能有效地消除抖動。</p><p> entity xiaodou is</p><p> port (fosc : in std_logic; </p><p> lclk : in std_logic; </p>
43、<p> bclk : out std_logic); </p><p> end xiaodou;</p><p> architecture Behavioral of xiaodou is</p><p> signal count : std_logic_vector(1 downto 0);
44、 </p><p> signal dout : std_logic; </p><p> signal rstcnt : std_logic_vector(17 downto 0):="000000000000000000";</p><p> signal rst
45、 : std_logic; </p><p><b> begin</b></p><p> process ( fosc,rstcnt )------reset1</p><p><b> begin</b></p><p> if rstcnt = "1111
46、11111111111111" then</p><p> rstcnt <= rstcnt;</p><p> rst <= '0';</p><p> elsif fosc'event and fosc ='1' then</p><p> rstcnt <
47、= rstcnt + 1;</p><p> rst <= '1';</p><p><b> end if;</b></p><p> end process;</p><p> process (fosc,rst)</p><p><b> begin
48、</b></p><p> if rst = '1' then</p><p> rxout <= '1';</p><p> elsif fosc ' event and fosc = '1' then</p><p> if (lclk = '0
49、39;) and (count(1) = '0') and (dout = '1') then</p><p> dout <= '1';</p><p> count <= count+1;</p><p> elsif (lclk = '0') and (count(1) =
50、39;1') and (dout = '1') then</p><p> dout <= '0';</p><p> count <= "00";</p><p> elsif (lclk = '1') and (count(1) = '0') and (
51、dout = '0') then</p><p> dout <= '0';</p><p> count <= count+1;</p><p> elsif (lclk = '1') and (count(1) = '1') and (dout = '0') the
52、n</p><p> dout <= '1';</p><p> count <= "00";</p><p><b> else</b></p><p> bclk <= dout;</p><p> count <= &qu
53、ot;00";</p><p><b> end if;</b></p><p><b> end if;</b></p><p> end process;</p><p> end Behavioral;</p><p> 仿真結果如下圖所示:<
54、/p><p> 圖4.5 消抖仿真結果</p><p><b> 4.2 數(shù)據(jù)存儲</b></p><p> 4.2.1 FLASH存儲器無效塊檢測</p><p> 本設計中的數(shù)據(jù)存儲模塊使用的是SAMSUNG公司的NAND型Flash K9K8G08UOA,由于在出廠時NAND結構的Flash芯片就可能存在一
55、位或多位無效位的壞塊,這種情況在NAND型Flash中是不可避免的。另外在使用過程中也可能會產(chǎn)生無效塊,如果對Flash中的無效塊進行讀寫操作,在檢測其編程或擦除是否結束時,F(xiàn)lash反饋的狀態(tài)信息就會出錯,這樣可能會使上位機軟件進入死循環(huán),造成數(shù)據(jù)的丟失和誤碼,為了保證數(shù)據(jù)的完整性和有效性,在對Flash讀寫操作之前必須對Flash進行無效塊檢查,在對Flash進行檢測時,首先要建立無效塊信息表,并判斷此塊是否為有效塊,然后再對Fla
56、sh進行讀寫操作。整個無效塊檢測流程如圖4.6所示:首先進行程序初始化設置,然后進行塊擦除,塊擦除結束判斷是否成功,若擦除不成功則此塊為無效塊,并在此無效塊的第1頁和第2頁的第2048個字節(jié)寫入0X00,表示此塊為無效塊,接著塊地址遞增,進行下一塊的擦除,整個過程如此循環(huán),直到檢測完最后一塊為止。</p><p> 圖4.6 無效塊檢測流程圖</p><p> 4.2.2 數(shù)據(jù)的存儲
57、</p><p> 數(shù)字量信號在采集過程中存儲于一片外部FIFO中,緩沖數(shù)字量數(shù)據(jù)。邏輯控制單元FPGA檢測 FIFO的半滿信號,F(xiàn)IFO半滿后,將該片F(xiàn)IFO中已寫入的數(shù)據(jù)存入Flash的指定區(qū)域中。數(shù)據(jù)存儲具體流程如圖4.7所示:</p><p> 圖4.7 數(shù)據(jù)存儲流程</p><p><b> 電路及系統(tǒng)調(diào)試</b></p&
58、gt;<p> 將程序下載到芯片以后,硬件部分連接至上位機,用上位機來設置信號源,實現(xiàn)遞增、遞減或固定值的數(shù)字量信號,如圖5.1所示。</p><p> 圖5.1 信號源設置圖</p><p> 當信號源發(fā)出一組遞增的數(shù)字量信號時,采集存儲結果如下圖5.2。</p><p> 圖5.2 采集的遞增數(shù)據(jù)</p><p>
59、 當信號源發(fā)出一組遞減的數(shù)字量信號時,采集存儲結果如下圖5.3。</p><p> 圖5.3 采集的遞減數(shù)據(jù)</p><p> 當信號源發(fā)出一組固定的數(shù)字量信號時,采集存儲結果如下圖5.4。</p><p> 圖5.4 采集的固定數(shù)據(jù)</p><p> 由上述圖可以看出采集存儲的數(shù)據(jù)沒有問題,數(shù)據(jù)符合編幀的要求,幀格式為“04+6F+
60、反碼+原碼”。</p><p><b> 總結</b></p><p> 本文介紹了對一路數(shù)字信號采編的電路設計。首先對數(shù)據(jù)采集作了簡要概述,介紹了數(shù)據(jù)采集的發(fā)展現(xiàn)狀和前景,然后提出了本次設計的目的與要求;其次針對整個系統(tǒng)的組成框架,詳細闡述了每一個部分的原理和設計,以及在設計軟件中的實際操作,最后簡要分析了調(diào)試的結果和問題。</p><p&g
61、t; 本設計經(jīng)過了細致的方案設計,分層次分模塊的硬件設計,最終達到了設計之初所要達到的指標,基本上完成了所要設計的內(nèi)容。但由于經(jīng)驗較少,在設計中還是遇到了不少問題,如由于外電路的干擾,電路不穩(wěn)定等因素,導致采集到的波形稍有嚴重。</p><p> 就數(shù)據(jù)采集系統(tǒng)來說,已經(jīng)具備了采集編幀、分析數(shù)據(jù)等功能。但由于本設計還處于初級實驗間段。在以后設計電路的時候應考慮到外部電路的干擾,只有外部電路穩(wěn)定,才能更好的減小
62、波形的誤差。</p><p> 經(jīng)過這次的畢業(yè)設計,使我學到如何解決在設計中所遇問題的方法,鞏固了我在大學四年中學到的知識,鍛煉了我的實踐動手能力,而且擴展了我的視野,但是同時看到了自己的許多不足,希望自己可以在以后的工作和學習中得到克服改正。</p><p><b> 附錄A 系統(tǒng)原理圖</b></p><p><b> 附錄
63、B 部分程序</b></p><p> 以下均省略了對庫的定義</p><p> library IEEE;</p><p> use IEEE.STD_LOGIC_1164.ALL;</p><p> use IEEE.STD_LOGIC_ARITH.ALL;</p><p> use IEE
64、E.STD_LOGIC_UNSIGNED.ALL;</p><p> 1. 數(shù)字信號接收部分</p><p> entity rxslow is</p><p> port(mclkx16 : in std_logic; </p><p> rx : in std_logic; </p>
65、<p> reset : in std_logic; </p><p> jl : in std_logic_vector(1 downto 0);</p><p> rxrdy : out std_logic; </p><p> data : out std_logic_v
66、ector(7 downto 0);</p><p> neibu_rxrdy : out std_logic; </p><p> neibu_data : out std_logic_vector(7 downto 0)</p><p><b> ); </b></p><
67、;p> end rxslow;</p><p> architecture Behavioral of rxslow is</p><p> signal cnt : integer range 0 to 175; </p><p> signal flag : std_lo
68、gic;</p><p> signal stop : std_logic; </p><p> signal tmp_data : std_logic_vector(7 downto 0); </p><p> --signal temp_data : std
69、_logic_vector(7 downto 0); </p><p><b> begin</b></p><p> process (mclkx16, reset)</p><p><b> begin</b></p><p> if reset = '1' then&l
70、t;/p><p> flag <= '1';</p><p> elsif (mclkx16='1') and (mclkx16'event) then</p><p> if cnt = 166 then</p><p> flag <= '1';</p>
71、<p> elsif rx = '0' then</p><p> flag <= '0';</p><p><b> end if;</b></p><p><b> end if;</b></p><p> end process;&l
72、t;/p><p> process (mclkx16, reset)</p><p><b> begin</b></p><p> if reset = '1' then</p><p><b> cnt <= 0;</b></p><p> e
73、lsif (mclkx16='1') and (mclkx16'event) then</p><p> if flag = '1' then</p><p> --if cnt = 163 then</p><p><b> cnt <= 0;</b></p><
74、p> elsif flag = '0' then</p><p> --else</p><p> cnt <= cnt + 1;</p><p><b> end if;</b></p><p><b> end if;</b></p>
75、<p> end process;</p><p> process (mclkx16, reset)</p><p><b> begin</b></p><p> if reset = '1' then</p><p> data <= "00000000"
76、;;</p><p> rxrdy<= '1';</p><p> stop<='0';</p><p> --temp_data <= "00000000";</p><p> elsif (mclkx16='1') and (mclkx16
77、'event) then</p><p> if cnt = 23 then</p><p> tmp_data(0)<= rx;</p><p> elsif cnt = 38 then</p><p> tmp_data(1)<= rx;</p><p> elsif cnt = 53
78、 then</p><p> tmp_data(2)<= rx;</p><p> elsif cnt = 68 then</p><p> tmp_data(3)<= rx;</p><p> elsif cnt = 83 then</p><p> tmp_data(4)<= rx;&l
79、t;/p><p> elsif cnt = 98 then</p><p> tmp_data(5)<= rx;</p><p> elsif cnt = 113 then</p><p> tmp_data(6)<= rx;</p><p> elsif cnt = 128 then</p&g
80、t;<p> tmp_data(7)<= rx;</p><p> --temp_data <=temp_data+1;</p><p> elsif cnt = 129 then</p><p> --data <= tmp_data;</p><p> neibu_data &
81、lt;= tmp_data;</p><p> --data <= tmp_data;</p><p> elsif cnt = 158 then</p><p> ifrx='1' then</p><p> stop<='1';</p><p>
82、elsif rx='0' then</p><p> stop<='0';</p><p><b> end if;</b></p><p> elsif cnt = 159 then</p><p> data <= "00000100" ;
83、 -----04</p><p> if jl(0)='1' then </p><p> ifstop='1'then </p><p> rxrdy<= '0';</p><p><b> else</b></p>
84、;<p> rxrdy<= '1';</p><p><b> end if;</b></p><p><b> end if;</b></p><p> if jl(1)='1' then</p><p> ifstop='1
85、'then </p><p> neibu_rxrdy<= '0';</p><p><b> else</b></p><p> neibu_rxrdy<= '1';</p><p><b> end if;</b&
86、gt;</p><p><b> end if;</b></p><p> elsif cnt = 160 then </p><p> rxrdy<= '1';</p><p> neibu_rxrdy<= '1'; </p><p
87、> elsif cnt = 161 then</p><p> data <= "01101111"; --6F</p><p> if jl(0)='1' then </p><p> ifstop='1'then </p><p>
88、 rxrdy<= '0';</p><p><b> else</b></p><p> rxrdy<= '1';</p><p><b> end if;</b></p><p><b> end if;</b></
89、p><p> elsif cnt = 162 then</p><p> rxrdy<= '1';</p><p> elsif cnt = 163 then</p><p> data <= not tmp_data;------反碼</p><p> if jl(0)='
90、;1' then </p><p> ifstop='1'then </p><p> rxrdy<= '0';</p><p><b> else</b></p><p> rxrdy<= '1';</p&g
91、t;<p><b> end if;</b></p><p><b> end if;</b></p><p> elsif cnt = 164 then</p><p> rxrdy<= '1';</p><p> elsif cnt = 165 t
92、hen</p><p> data <= tmp_data;</p><p> if jl(0)='1' then </p><p> ifstop='1'then </p><p> rxrdy<= '0';</p><p&
93、gt;<b> else</b></p><p> rxrdy<= '1';</p><p><b> end if;</b></p><p><b> end if;</b></p><p> elsif cnt = 166 then<
94、/p><p> rxrdy<= '1';</p><p><b> end if;</b></p><p><b> end if;</b></p><p> end process;</p><p> end Behavioral;</p&
95、gt;<p> 2. 數(shù)字信號分頻部分</p><p> entity fp22 is</p><p><b> port(</b></p><p> clk :in std_logic;--40M時鐘信號輸入 </p><p>
96、 clkout : out std_logic --1.8181M 16倍波特率</p><p><b> );</b></p><p><b> end fp22;</b></p><p> architecture rtl of fp22 is</p><p>
97、 signalcount1:integer range 0 to 10:=0 ;--輸出時鐘計數(shù)信號</p><p> signal temp : std_logic :='0';</p><p><b> begin</b></p><p> process (clk)--</p&
98、gt;<p><b> begin</b></p><p> if (clk'event and clk = '1') then</p><p> if(count1 = 10)then</p><p> count1 <= 0;</p><p> temp &l
99、t;= not temp;</p><p><b> else</b></p><p> count1 <= count1 + 1;</p><p><b> end if;</b></p><p> clkout<= temp; </p><p&g
100、t;<b> end if;</b></p><p> end process;</p><p><b> end rtl;</b></p><p><b> 3.數(shù)據(jù)存儲部分</b></p><p> when swr0 =>--initialize
101、 </p><p> s_state <= swr1;</p><p> when swr1 =>s_state <= swr68;</p><p> when swr68 =></p><p> s_state <= swr69;</p>
102、<p> when swr69 =></p><p> s_state <= swr70;</p><p> when swr70 =></p><p> s_state <= swr71;</p><p> when swr71 =></p><p> s_sta
103、te <= swr2;</p><p> when swr2=> </p><p> f_cle <= '1';</p><p> flash_data <="01100000";--write 0x60H command</p><p> s_state <
104、= swr3;</p><p> when swr3 =></p><p> f_we <= '0';</p><p> s_state <= szde1;</p><p> when szde1 =></p><p> s_state <= szde2;<
105、/p><p> when szde2 =></p><p> s_state <= swr4;</p><p> when swr4 =></p><p> f_we <= '1';</p><p> s_state <= swr5;</p><p
106、> when swr5 =>--write row1 address</p><p> f_cle<='0';</p><p> f_ale<='1';</p><p> flash_data(5 downto 0) <= "000000";</p&
107、gt;<p> flash_data(7 downto 6) <= w_countbs_er(1 downto 0); </p><p> s_state <= szde3;</p><p> when szde3 =></p><p> s_state <= swr6;</p><p>
108、when swr6=></p><p> f_we <= '0';</p><p> s_state <= szde4;</p><p> when szde4 =></p><p> s_state <= szde5;</p><p> when szde5 =
109、></p><p> s_state <= swr7;</p><p> when swr7 =></p><p> f_we <= '1';</p><p> s_state <= swr8;</p><p> when swr8 =>--wri
110、te row2 addressflash_data <= w_countbs_er(9 downto 2); </p><p> s_state <= szde6;</p><p> when szde6 =></p><p> s_state <= swr9;</p><p>
111、when swr9 =></p><p> f_we <= '0';</p><p> s_state <= szde7;</p><p> when szde7 =></p><p> s_state <= szde8;</p><p> when szde8
112、=></p><p> s_state <= swr10;</p><p> when swr10 =></p><p> f_we <= '1';</p><p> s_state <= swr11;</p><p> when swr11 =>
113、--write row3 address</p><p> flash_data <= "00000"&w_countbs_er(12 downto 10); s_state <= szde9;</p><p> when szde9 =></p><p> s_state <= sw
114、r12;</p><p> when swr12 =></p><p> f_we <= '0';</p><p> s_state <= szde10;</p><p> when szde10 =></p><p> s_state <= szde11;<
115、;/p><p> when szde11 =></p><p> s_state <= swr13;</p><p> when swr13 =></p><p> f_we <= '1';</p><p> s_state <= swr14;</p>
116、<p> when swr14 =>--write 0xd0H command</p><p> f_ale <= '0';</p><p> f_cle <= '1';</p><p> flash_data <= "11010000";</
117、p><p> s_state <= szde12;</p><p> when szde12 =></p><p> s_state <= swr15;</p><p> when swr15 =></p><p> f_we <= '0';</p>&
118、lt;p> s_state <= szde13;</p><p> when szde13 =></p><p> s_state <= szde14;</p><p> when szde14 =></p><p> s_state <= swr16;</p><p>
119、 when swr16 =></p><p> f_we <= '1';</p><p> s_state <= swr17;</p><p> when swr17 =></p><p> f_cle<='0';</p><p> rb_dela
120、ys <="11111"; </p><p> s_state <= swr18; </p><p> when swr18 => </p><p> rb_delays <= rb_delays -1; </p><p> s_state <= swr19;
121、 </p><p> when swr19 => </p><p> if rb_delays="00000" then </p><p> s_state <= swr20;</p><p> e_cnt <= "00000000000000000"
122、;; </p><p> else </p><p> s_state <= swr18; </p><p> end if; </p><p> when swr20 =></p><p> --if er_dl
123、="111111" then</p><p> if er_dl="111111" or e_cnt = "11111111111111111"then</p><p> s_state <= swr104;</p><p><b> else</b>&
124、lt;/p><p> s_state <= swr20;</p><p> e_cnt<= e_cnt + 1;</p><p><b> end if;</b></p><p> when swr104 =>------------------------檢查擦除成功沒</p>
125、;<p> f_cle <= '1';</p><p> flash_data <="01110000";--write 0x70H command</p><p> s_state <= swr105;</p><p> when swr105 =></p><
126、p> f_we <= '0';</p><p> s_state <= szde15;</p><p> when szde15 =></p><p> s_state <= szde16;</p><p> when szde16 =></p><p>
127、 s_state <= swr106;</p><p> when swr106 =></p><p> f_we <= '1';</p><p> s_state <= swr107;</p><p> when swr107 =></p><p> f_cle
128、 <= '0';</p><p> d_dir<='1';</p><p> rb_delays <="00111"; </p><p> s_state <= swr108; </p><p> when swr108 =>
溫馨提示
- 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 畢業(yè)設計--數(shù)字信號發(fā)生器的電路設計
- 數(shù)字陀螺中數(shù)字信號處理電路設計.pdf
- 數(shù)字信號處理畢業(yè)論文
- 調(diào)幅信號產(chǎn)生電路設計【畢業(yè)論文】
- 用數(shù)字邏輯電路設計產(chǎn)生各種數(shù)字信號
- 數(shù)字信號發(fā)生器的設計畢業(yè)論文
- 數(shù)字顯示穩(wěn)壓電路設計【畢業(yè)論文】
- 8路數(shù)字電壓表畢業(yè)論文
- 基于數(shù)字信號處理器tmsf的逆變電路設計
- 數(shù)字信號處理器應用電路設計研究.pdf
- 畢業(yè)論文--數(shù)字信號載波傳輸?shù)膍atlab仿真
- 畢業(yè)論文:關于多功能數(shù)字鐘電路設計
- 畢業(yè)論文:關于多功能數(shù)字鐘電路設計
- 紅外遙控電路設計畢業(yè)論文
- 音頻放大電路設計畢業(yè)論文
- 畢業(yè)論文—高性能數(shù)字乘法器芯片電路設計
- led驅(qū)動電路設計【畢業(yè)論文】
- 紅外遙控電路設計畢業(yè)論文
- 畢業(yè)論文(設計)-交通燈數(shù)字控制電路設計
- 畢業(yè)論文---直流穩(wěn)壓源電路設計
評論
0/150
提交評論