fpga-cpld原理及應(yīng)用課程萬年歷設(shè)計報告_第1頁
已閱讀1頁,還剩8頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、<p>  FPGA-CPLD原理及應(yīng)用課程設(shè)計報告</p><p>  題目: 萬年歷設(shè)計 </p><p>  學(xué)院: 信息與電子工程學(xué)院</p><p>  專業(yè): 電子信息工程</p><p>  學(xué)號: XXXXXXX

2、X</p><p>  姓名: XXXXXX </p><p>  指導(dǎo)老師: XXXXXX</p><p>  時間: 2015.12.20-2015.12.23</p><p><b>  一、摘要</b></p><p>  設(shè)計從系統(tǒng)

3、硬件出發(fā),由CPU、總線、RAM、外接設(shè)備等構(gòu)成SOPC Builder的硬件系統(tǒng),通過Nios II DE2開發(fā)的嵌入式軟件編寫并嵌入SOPC Builder的硬件中實現(xiàn)萬年歷的整體開發(fā)。通過應(yīng)用SoPC Builder開發(fā)工具,設(shè)計者可以擺脫傳統(tǒng)的、易于出錯的軟硬件設(shè)計細節(jié),從而達到加快項目開發(fā)、縮短開發(fā)周期、節(jié)約開發(fā)成本的目的并具有高集成度、設(shè)計靈活和可移植性較好。</p><p>  關(guān)鍵詞:萬年歷 S

4、OPC SOPC Builder Nios II DE2</p><p><b>  二、設(shè)計要求 </b></p><p>  用Nios II DE2 開發(fā)板的LCD顯示電子鐘的日期和時間。LCD分兩行顯示,第1行顯示年、月、日;第2行顯示時、分、秒。用輸入BUTTON[0]來控制LCD行的修改,同時讓Nios II DE2開發(fā)板上的綠色發(fā)光二極管亮滅來表示這

5、個選擇。當(dāng)BUTTON[0]按一下后,LEDG3亮,可以修改年、月和日的數(shù)字;再按一下BUTTON[0]后,LEDG3滅,可以修改時、分和秒的數(shù)字。</p><p>  另外用輸入按鈕BUTTON[3]來控制日期和時間的修改,當(dāng)處于日期修改方式時,每次按動一次BUTTON[3],依次更換“年”、“月”和“日”的修改。當(dāng)處于時間修改方式時,每次按動一次BUTTON[3],依次更換“時”、“分”和“秒”的修改。修改對

6、象被選中后,按動BUTTON[2]輸入按鈕可以增加顯示的數(shù)字;按動BUTTON[1]輸入按鈕可以減少顯示的數(shù)字。</p><p><b>  三、設(shè)計內(nèi)容</b></p><p><b>  1、按鍵信息</b></p><p>  BUTTON[3]:“年”、“月”、“日”或“時”、“分”、“秒”切換鍵</p>

7、;<p>  BUTTON[2]:+鍵</p><p>  BUTTON[1]:-鍵</p><p>  BUTTON[0]:“年”、“月”、“日”與“時”、“分”、“秒”切換鍵</p><p><b>  顯示信息</b></p><p>  LCD_Line1:顯示“年”、“月”、“日” </p&

8、gt;<p>  LCD_Line1:顯示“時”、“分”、“秒”</p><p>  2、SOPC Builder 硬件建立</p><p>  SOPC Builder是在Quartus II里的SOPC Builder進行的,先建立工程,在SOPC Builder里添加硬件,包括CPU ,jtag_uart ,RAM,LCD,PIO,按鍵,LED,以及LCD_ON。<

9、;/p><p>  3、Quartus II硬件處理</p><p>  硬件會自動建立一個頂層模塊,通過建一個原理圖來對對應(yīng)的硬件進行輸入輸出的添加,再鎖定引腳,編譯工程,硬件下載。</p><p>  4、Nios II DE2嵌入軟件編寫</p><p>  在Nios II里建立工程,選擇相應(yīng)的模塊,編寫需要嵌入的軟件,添加缺少的頭文件對

10、應(yīng)的宏定義,編譯工程,進行軟件下載,在觀察結(jié)果。</p><p><b>  四、設(shè)計步驟</b></p><p>  1、打開Quartus II新建工程</p><p>  2、打開SOPC Builder生成相應(yīng)的硬件如圖所示</p><p><b>  圖1.SoPC配置</b></p

11、><p>  建立好后點擊Generate運行,看是否出錯,然后點擊exit退出。</p><p>  3、在Quartus II中建立圖形文件,調(diào)用剛才生成的硬件系統(tǒng),然后進行引腳配置。</p><p><b>  引腳配置圖如下:</b></p><p><b>  圖2.引腳配置</b></

12、p><p>  然后進行編譯,生成文件如下圖:</p><p><b>  圖3.頂層電路</b></p><p><b>  Nios II運行</b></p><p>  打開Nios II IDE2,建立工程,選擇count_binary模塊,添加一個LCD.h的頂層文件。</p>

13、<p>  LCD.h的頂層文件為:</p><p>  #ifndef _LCD_H_</p><p>  #define _LCD_H_</p><p>  //LCD Module 16*2</p><p>  #define lcd_write_cmd(base,data) IOWR(base, 0, data)&l

14、t;/p><p>  #define lcd_read_cmd(base) IORD(base, 1)</p><p>  #define lcd_write_data(base,data) IOWR(base, 2, data)</p><p>  #define lcd_read_data(base) IORD(base,

15、 3)</p><p>  //==========================</p><p>  void LCD_Init();</p><p>  void LCD_Show_Text(char*Text);</p><p>  void LCD_Line2();</p><p>  void

16、 LCD_Test();</p><p>  //=========================</p><p>  #endif //_LCD_H_</p><p><b>  C語言程序代碼為:</b></p><p>  #include <stdio.h></p><p>

17、;  #include "altera_avalon_pio_regs.h"</p><p>  #include "alt_types.h"</p><p>  #include "system.h"</p><p>  #ifndef _LCD_H_</p><p>  #def

18、ine _LCD_H_</p><p>  //LCD Module 16*2</p><p>  #define lcd_write_cmd(base,data) IOWR(base, 0, data)</p><p>  #define lcd_read_cmd(base) IORD(base, 1)</p><p&

19、gt;  #define lcd_write_data(base,data) IOWR(base, 2, data)</p><p>  #define lcd_read_data(base) IORD(base, 3)</p><p>  //==========================</p><p>  void LCD_

20、Init();</p><p>  void LCD_Show_Text(char*Text);</p><p>  void LCD_Line2();</p><p>  void LCD_Test();</p><p>  //=========================</p><p>  #e

21、ndif //_LCD_H_</p><p>  int year=2015;</p><p>  int month=12;</p><p>  int day=23;</p><p>  int hour=11;</p><p>  int minute=10;</p><p>  int

22、second=21;</p><p>  int selectkey=1;</p><p>  int selectkeylr=1;</p><p><b>  int ms=0;</b></p><p>  int KEY=0;</p><p>  int shift=0,con=0,step=

23、0;</p><p>  //#include "basic_io.h"</p><p>  volatile int edge_capture;</p><p>  void LCD_Init()</p><p><b>  {</b></p><p>  lcd_write

24、_cmd(LCD_BASE,0x38);</p><p>  usleep(2000);</p><p>  lcd_write_cmd(LCD_BASE,0x0C);</p><p>  usleep(2000);</p><p>  lcd_write_cmd(LCD_BASE,0x01);</p><p>  u

25、sleep(2000);</p><p>  lcd_write_cmd(LCD_BASE,0x06);</p><p>  usleep(2000);</p><p>  lcd_write_cmd(LCD_BASE,0x80);</p><p>  usleep(2000);</p><p><b>  

26、}</b></p><p>  void LCD_Show_Text(char*Text)</p><p><b>  {</b></p><p><b>  int i;</b></p><p>  for(i=0;i<strlen(Text);i++)</p>&

27、lt;p><b>  {</b></p><p>  lcd_write_data(LCD_BASE,Text[i]);</p><p>  usleep(2000);</p><p><b>  }</b></p><p><b>  }</b></p>

28、<p>  void LCD_Line1()</p><p><b>  {</b></p><p>  lcd_write_cmd(LCD_BASE,0x80);</p><p>  usleep(2000);</p><p><b>  }</b></p><p&g

29、t;  void LCD_Line2()</p><p><b>  {</b></p><p>  lcd_write_cmd(LCD_BASE,0xC0);</p><p>  usleep(2000);</p><p><b>  }</b></p><p>  //=

30、=========判斷按鍵=================</p><p>  int push_button(void){</p><p>  if(IORD(KEY_PIO_BASE, 0)==14) {while(1){if(IORD(KEY_PIO_BASE, 0)==15)break;}return 1;}</p><p>  if(IORD(KEY_P

31、IO_BASE, 0)==13) {while(1){if(IORD(KEY_PIO_BASE, 0)==15)break;}return 2;}</p><p>  if(IORD(KEY_PIO_BASE, 0)==11) {while(1){if(IORD(KEY_PIO_BASE, 0)==15)break;}return 3;}</p><p>  if(IORD(KEY_PIO

32、_BASE, 0)==7) {while(1){if(IORD(KEY_PIO_BASE, 0)==15)break;}return 4;}</p><p>  else return 0;</p><p><b>  }</b></p><p>  //==========判斷按鍵=================</p>&

33、lt;p>  //==========修改時間=================</p><p>  void modify(void)</p><p><b>  {</b></p><p>  if(shift==2){//修改時間</p><p>  if(con==0){hour+=step;if(hour

34、>=24||hour<0)hour=0;}</p><p>  else if(con==1){minute+=step;if(minute>=60||minute<0) minute=0;}</p><p>  else if(con==2){second +=step;if(second>=60||second<0) second=0;}</p

35、><p><b>  }</b></p><p>  if(shift==1){//修改date</p><p>  if(con==0) {year+=step;if(year<0)year=0;}</p><p>  else if(con==1){ month+=step;if(month>12||mont

36、h<0)month=0;}</p><p>  else if(con==2) {day +=step;if(day>31||day<0)day=0;}</p><p><b>  }</b></p><p><b>  step=0;</b></p><p><b> 

37、 }</b></p><p>  //==========修改時間=================</p><p>  int main()</p><p><b>  {</b></p><p><b>  while(1){</b></p><p>  if

38、(ms%10==0){</p><p>  if(ms/10==1){//顯示</p><p>  if(shift==1){ //date</p><p>  if(con==0)//year</p><p>  printf(" -%2d-%d\n",month,day);</p><p>

39、;  if(con==1)//month</p><p>  printf("%d- -%d\n",year,day);</p><p>  if(con==2)//day</p><p>  printf("%d-%2d- \n",year,month);</p><p>  printf(&qu

40、ot;%d:%d:%2d\n",hour,minute,second); //time</p><p><b>  }</b></p><p>  if(shift==2){</p><p>  printf("%d-%2d-%d\n",year,month,day);</p><p>  

41、if(con==0)//hour</p><p>  printf(" :%d:%2d\n",minute,second);</p><p>  if(con==1)//minute</p><p>  printf("%d: :%2d\n",hour,second);</p><p>  if(c

42、on==2)//second</p><p>  printf("%d:%d: \n",hour,minute);</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  else {</b></p

43、><p>  printf("%d-%2d-%d\n",year,month,day);</p><p>  printf("%d:%d:%2d\n",hour,minute,second);</p><p><b>  }</b></p><p><b>  }</b

44、></p><p>  usleep(50000);</p><p><b>  ms++;</b></p><p>  if(ms==20){</p><p><b>  ms=0;</b></p><p><b>  second++;</b>

45、</p><p><b>  }</b></p><p>  if(second==60){</p><p><b>  minute++;</b></p><p><b>  second=0;</b></p><p>  if(minute==60)

46、{</p><p><b>  minute=0;</b></p><p><b>  hour++;</b></p><p>  if(hour==24){</p><p><b>  hour=0;</b></p><p><b>  da

47、y++;</b></p><p>  if(day==31){</p><p><b>  day=1;</b></p><p><b>  month++;</b></p><p>  if(month==12){</p><p><b>  mont

48、h=1;</b></p><p><b>  year++;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b&g

49、t;  }</b></p><p><b>  }</b></p><p>  //=============檢測按鍵</p><p>  KEY=push_button();</p><p>  switch(KEY){</p><p>  case 1: shift++;if(sh

50、ift>=3)shift=0; break;</p><p>  case 2: step=1;break;</p><p>  case 3: step=-1;break;</p><p>  case 4: con++;if(con>=3)con=0; break;</p><p>  default :break;</

51、p><p><b>  }</b></p><p><b>  modify();</b></p><p>  //=============檢測按鍵</p><p><b>  }</b></p><p><b>  return 0;</

52、b></p><p><b>  }</b></p><p>  連接開發(fā)板,將文件下載到開發(fā)板,運行文件檢驗是否正確。</p><p>  檢查錯誤并修改,知道結(jié)果正確。 </p><p>  五、運行情況與問題分析</p><p>  1、建立工程時,注意不能出現(xiàn)中文或者空格,且工程

53、名需與文件名一致,選定芯片;</p><p>  2、在生成CPU硬件系統(tǒng)時,定義端口時,需注意設(shè)定端口輸入與輸出的位寬,需與程序定義的數(shù)值一致,否則運行溢出報錯,須修改;</p><p>  3、建立圖形文件后,需進行編譯,出現(xiàn)錯誤得返回原理圖核對,找到錯誤修改后重新編譯;</p><p>  4、進行引腳鎖定時,注意引腳文件的編寫,否則選擇引腳文件點擊Run后會

54、不成功,從而影響后面程序的調(diào)試;</p><p>  5、當(dāng)日數(shù)為31時,調(diào)節(jié)月份日期不會隨機改變,就會出現(xiàn)4月31日等錯誤,加入程序段但是還是沒有完成跳變;</p><p>  6、程序中閃爍程序段、跳變程序段不執(zhí)行,程序還需后續(xù)修改;</p><p><b>  7、實物圖</b></p><p><b>

55、  圖4.實物圖</b></p><p><b>  六、結(jié)論</b></p><p>  采用NIOSⅡ集成開發(fā)環(huán)境提供的快捷開發(fā)手段,在Cyclone 1C6Q240C8芯片上創(chuàng)建了一個用戶定制CPU和外設(shè)的片上系統(tǒng),同時完成對液晶顯示器和LED的編程控制。整個系統(tǒng)充分體現(xiàn)了SOPC設(shè)計方法的靈活性,設(shè)計時只定制系統(tǒng)需要的外設(shè)器件接口,避免過多的外圍電

56、路和器件造成體積、功耗的增多和可靠性的下降。由于采用軟核結(jié)構(gòu),方便系統(tǒng)的升級和擴展,而不必硬件改版,節(jié)約了成本,加快開發(fā)進度,縮短了產(chǎn)品的開發(fā)周期。</p><p><b>  七、心得體會</b></p><p>  經(jīng)過本次SoPC課程設(shè)計實驗,使我對QuartusⅡ與NiosⅡDE2以及開發(fā)板的使用更加熟練,并且初步掌握了FPGA從理論設(shè)計到硬件開發(fā)的流程,詳細

57、了解了萬年歷的軟件設(shè)計跟硬件設(shè)計的整個過程。在課程設(shè)計的過程中,遇到了一些以前沒有出現(xiàn)過的問題,例如:課程設(shè)計指導(dǎo)書上的電路圖中多了一個引腳LCD_ON,這個引腳是不需要的,但是沒有檢查出來錯誤,導(dǎo)致開發(fā)板無法顯示時間,后來在老師的指導(dǎo)下,才知道了問題所在。萬年歷的程序的編寫也花費了很多時間,諸如此類的問題還有很多,后來在自己的努力和同學(xué)的幫助下完成了本次課程設(shè)計,從而使得自己的理論知識與實踐能力得到了提升,這次經(jīng)歷是大學(xué)中的一次寶貴的

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論