*Nios處理器以及外圍接口;
*Quartus II開發軟件;
*GNDUro編譯器;
*基于APEX EP20K200E FPGA的開發板;
*相關的開發例程。
我們使用集成在QuartusII中的SOPC Builder工具來配置生成片上系統。SOPC Builder是一個功能強大的基于圖形界面的片上系統的定義和定制工具,可以在短時間內完成用戶定制的SOPC設計。根據應用的需要,從SOPC Builder庫中選擇IP模塊、存儲器、外圍接口和處理器,并且配置生成一個高集成度的SOPC系統,因而選取以下一些模塊組成片上系統:Nios 32bit CPU、Boot Monitor ROM、Communication UART、debugging UART、Timer、Button PIO、User PIO、LCD PIO、LED PIO、DMA、SPI、Seven Segment PIO、External RAM Bus(Avalon TriState Bridge)、External RAM Interface、External Flash Interface。
同時,SOPC Builder自動產生一些必需的仲裁邏輯來協調系統中以上各個部件的工作,我們將系統的工作頻率設為33MHz。定制完片上系統的硬件后,SOPC Builder還為編寫操作這些片上硬件的軟件代碼提供了一個軟件開發環境,這個軟件環境包括語言頭文件、外圍接口的驅動以及實時操作系統的內核,極大地方便了軟件的開發。
5 系統實現
以下分兩部分來分析和介紹:①在ApexEP20K FPGA中,使用Verilog編寫時鐘和控制信號發生器用于驅動CCD和ADC,并且協調兩者的工作;②使用C語言編寫程序,通過SOPC Builder配置的SPI接口讀取ADC輸出的數據。
5.1 時鐘和控制信號發生器
使用Verilog編寫時鐘和控制信號發生器,用于產生驅動CCD和ADC的時鐘和控制信號。時鐘發生器的工作原理是:使用頻率為33MHz的系統時鐘,作為時鐘發生器的輸入和同步售,用于產生所需的CCD和ADC驅動的時鐘和控制信號。根據系統的要求和CCD以及ADC芯片特性,將產生的CCD時鐘頻率設為1MHz;同時把ADC的時鐘頻率設為33MHz。在時鐘發生器中,還需對產生CCD和ADC兩個高速設備的時鐘和控制信號進行匹配,使得兩者能夠正常地工作。
現在詳細地分析這兩個高速設備如何完成時序的匹配。由于系統中的CCD和ADC都是依靠外加時鐘同步的高速設備,因此,這兩個設備之間的時序的匹配對于能否獲取正確有效的數據來說至關重要。為了使兩個設備協同工作,首先要分析每個設備所需的外加時鐘和控制兩個外加信號,分別是CCD_ROG和CCD_CLK。CCD_ROG信號使得CCD的輸出數據有效,也就是每次從CCD讀取數據時,都要先給CCD_ROG一個低電平,將CCD置光電轉換后的數據一位位地輸出。ADC進行模數轉換也需要兩個外加信號,分別是ADC_CONV和ADC_CLK。ADC_CONV信號使ADC芯片開始進行模數轉換,每次進行轉換前都要給ADC_CONV一個高電平;同時,轉換過程和轉換后的結果輸出在ADC_CLK信號的同步完成。
由于需要先從CCD光電轉換器讀出模擬數據,所以,要通過CCD_ROG給CCD一個長度為t1(t1=4000ns)的低電平。在CCD_ROG重新變為高電平后,CCD就在CCD_CLK信號的同步下輸出數據了,在每個CCD_CLK作用下輸出一個模擬量數據。CCD每次輸出的2087個模擬量分別由33個首部偽數據字段、2048個有效數據和6個尾部偽數據字段組成。其中的2048個有效數據和首部偽數據字段的后20個數據就是我們希望得到的,所以從第14個數據到第2081個數據中的每個模擬量,都通過ADC_CONV(ADC_CONV的高電平寬度為4ns),給出一個高電平啟動ADC;同時,在ADC_CLK的作用下,完成模數轉換過程和數字量輸出。圖4、圖5是時鐘和控制信號發生器的程序流程和仿真時序圖。
5.2 SPI接口的編程
ADC將模擬信號轉換成數字信號后,Nios通過SPI接口讀入這些信號并進行相應的處理。我們通過Quartus II中的SOPC Builder為Nios核配置SPI接口。在我們的系統中,將SPI配置為從設備。軟件通過訪問存儲器中映射的5個16位的寄存器來控制和讀寫SPI接口。讀入的數據通過MOSI引腳逐位進入移位寄存器。通過移位寄存器的移位和緩沖后,一幀數據進入寄存器rxdata,同時將狀態寄存器的rrdy位置1,通過訪問rxdata就得到一幀數據。數據被讀取后,rrdy位自動置回0。如果前一幀數據還未從rxdata讀取,后一幀數據就會將原數據覆蓋,造成錯誤,同時將狀態寄存器的ROE(Read Overwrite Error)位置成1。SPI接口共有4個引腳,分別是MISO(Master Input Slave Output)、MOSI(Master Output Slave Input)、SCLK(同步時鐘)和SS_n。當SS_n為低電平時,從設備可以在SCLK同步作用下讀入數據。系統中的SPI接口是從設備,所以只使用MOSI、SCLK和SS_n三根引腳。圖6是Nios中SPI與ADC的接口示意圖。
從ADS的芯片特性可知,當ADC_CONV在一個高電平的作用下,ADC開始進行模數轉換。ADC_CONV回復到電平后,因為SS_n和ADC_CONV連在一起,所以Nios中的SPI就處于可以讀入數據的狀態了;同時,在ADC_SCK的作用下ADC輸出數據,而SPI也在相同的時鐘SCLK的作用下,通過MOSI讀入數據。為了能夠準確得到數據,還要將SPI寄存器rxdata的位數設為13位。軟件中,我們將通過等待SPI寄存器的rrdy位的置位,來讀取rxdata中的數據,與此同時寄存器中roe的狀態決定此幀數據的讀取過程中是否存在數據溢出現象。以下是相關的讀取數據的軟件代碼。
do{
file://讀一行CCD數據
for(i=0;i<2069;i++){
file://等待,直到準備好
while(spi->np_spistatus&np_spistatus_rrdy_mask)==0)
;
file://從SPI數據寄存器讀數據
c[i]=spi->np_spirxdata;
}
file://讀覆蓋狀態
b=spi->np_spistatus&np_spistatus_roe_mask;
}while(b==8);
結論
本系統經過仿真測試,其功能達到了設計要求,并用HP邏輯分析儀驗證了系統功能。





