數(shù)字系統(tǒng)課程設(shè)計報告書基于FPGA的數(shù)字鐘設(shè)計_第1頁
數(shù)字系統(tǒng)課程設(shè)計報告書基于FPGA的數(shù)字鐘設(shè)計_第2頁
數(shù)字系統(tǒng)課程設(shè)計報告書基于FPGA的數(shù)字鐘設(shè)計_第3頁
數(shù)字系統(tǒng)課程設(shè)計報告書基于FPGA的數(shù)字鐘設(shè)計_第4頁
數(shù)字系統(tǒng)課程設(shè)計報告書基于FPGA的數(shù)字鐘設(shè)計_第5頁
已閱讀5頁,還剩18頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、數(shù)字系統(tǒng)課程設(shè)計報告書課題名稱 基于FPGA的數(shù)字鐘設(shè)計院 系姓名學(xué)號 專業(yè)班級指導(dǎo)教師設(shè)計時間目 錄摘要11設(shè)計目的 22設(shè)計內(nèi)容及要求23系統(tǒng)整體方案及設(shè)計原理 34各模塊電路設(shè)計與實現(xiàn) 44.1 分頻模塊設(shè)計與實現(xiàn)4 4.1.1分頻模塊圖 4.1.2分頻模塊程序4.2 計數(shù)器模塊設(shè)計與實現(xiàn)5 4.2.1計數(shù)模塊圖 4.2.2秒計數(shù)器程序 4.2.3分計數(shù)器程序 4.2.4時計數(shù)器程序4.3 1602顯示驅(qū)動模塊設(shè)計與實現(xiàn) 10 4.3.1 1602顯示驅(qū)動模塊圖 4.3.2 1602顯示驅(qū)動模塊程序5系統(tǒng)仿真及硬件下載 175.1系統(tǒng)仿真(步驟,總原理圖,仿真圖)17 5.1.1系統(tǒng)仿真

2、步驟 5.1.2總原理圖 5.1.3仿真圖5.2硬件下載(引腳分配,下載步驟) 18 5.2.1引腳分配 5.2.2下載步驟6設(shè)計總結(jié) 21參考文獻 2120 / 23文檔可自由編輯打印摘要隨著微電子技術(shù)、計算機技術(shù)、半導(dǎo)體技術(shù)的發(fā)展,很多傳統(tǒng)的數(shù)字門電路設(shè)計已經(jīng)被可編程邏輯器件代替。而相對于傳統(tǒng)的模擬控制技術(shù),也被數(shù)字控制系統(tǒng)所代替。作為可編程邏輯器件的硬件描述語言Verilog HDL,由于它具有類似于通用C語言的風(fēng)格,被不少FPGA開發(fā)者所推崇。在數(shù)字控制這個領(lǐng)域,F(xiàn)PGA的應(yīng)用也越來越廣泛,因此,作為硬件描述語言Verilog HDL就顯示出了它的重要性。它是一種全方位的硬件描述語言,

3、具有極強的描述能力,能支持系統(tǒng)行為級、寄存器傳輸級和邏輯門級這三個不同層次的設(shè)計;支持結(jié)構(gòu)、數(shù)據(jù)流、行為三種描述形式的混合描述,覆蓋面廣,抽象能力強,因此在實際應(yīng)用中越來越廣泛。本設(shè)計為一個數(shù)字鐘,一個具有“時”、“分”、“秒”顯示的計時器,(23時59分59秒)。它采用EDA技術(shù),以硬件描述語言Verilog 為系統(tǒng)邏輯描述手段設(shè)計文件,在QUARTUSII工具軟件環(huán)境下,采用自頂向下的設(shè)計方法,由各個基本模塊共同構(gòu)建了一個基于FPGA的數(shù)字鐘。關(guān)鍵詞: 數(shù)字鐘 硬件描述語言Verilog HDL FPGA1. 設(shè)計目的1.掌握利用EDA開發(fā)工具QUARTUSII進行可編程邏輯器件設(shè)計的方法

4、; 2.掌握用FPGA進行計數(shù)器設(shè)計的方法;3.熟練掌握可編程邏輯器件的原理圖輸入層次化設(shè)計方法;4掌握利用QUARTUSII進行軟件仿真及對可編程邏輯器件進行硬件下載的方法;5.進一步鞏固所學(xué)的理論知識,提高運用所學(xué)知識分析和解決實際問題的能力。2.設(shè)計內(nèi)容及要求1.設(shè)計一個具有“時”、“分”、“秒”顯示的計時器,(23時59分59秒);2.“秒電路”、“分電路”均為0059的六十進制計數(shù)、譯碼、顯示電路; 3.“時電路”為0023的二十四進制計數(shù)、譯碼、顯示電路;4.該實驗是基于FPGA的設(shè)計,采用Verilog HDL進行系統(tǒng)功能描述,采用自頂向下的設(shè)計方法,用QUARTUS軟件進行仿真

5、測試。3.系統(tǒng)整體方案及設(shè)計原理如下圖(3.1)所示,該系統(tǒng)框圖由6個模塊組成,分別為:秒、分、時計數(shù)器模塊,分頻器模塊(fp20m),計數(shù)器顯示模塊,1602顯示驅(qū)動模塊( lcd_1602_drive)。工作原理是:基準(zhǔn)脈沖輸入信號同時加到秒、分、時的脈沖輸入端,采用并行計數(shù)的方式,秒的進位接到分的使能端上,分的進位接到時的使能端上,完成秒、分、時的循環(huán)計數(shù)。要求輸入信號有1kHz1Hz時鐘信號、低電平有效的調(diào)秒信號set_state、低電平有效的調(diào)分信號min_state、低電平有效的調(diào)時信號hour_state。圖3.14.各模塊電路設(shè)計與實現(xiàn)4.1 分頻模塊設(shè)計與實現(xiàn)4.1.1分頻模

6、塊圖 圖(4.1)分頻模塊圖4.1.2分頻模塊程序/輸入頻率:20MHz/輸出頻率:1Hz,1000Hzmodule fp20m(clk,clk1,clk4,clk1000,clk6m);input clk;output clk1,clk4,clk1000,clk6m;reg clk1,clk4,clk1000,clk6m;reg 25:0 cnt,cnt1,cnt2,cnt3;always(posedge clk) /1Hz分頻beginif(cnt= 9999999 ) /從0到9999999總共10000000次begin cnt=0;clk1=clk1;/每10000000次翻轉(zhuǎn),周期

7、為20000000次,也就是1Sendelse cnt=cnt+1;endalways(posedge clk) /1000Hz分頻beginif(cnt1=9999) begin cnt1=0;clk1000=clk1000;endelse cnt1=cnt1+1;endalways(posedge clk) /1Hz分頻beginif(cnt2= 1 ) /從0到9999999總共10000000次begin cnt2=0; clk6m=clk6m;/每10000000次翻轉(zhuǎn),周期為20000000次,也就是1Sendelse cnt2=cnt2+1;endalways(posedge c

8、lk) /1Hz分頻beginif(cnt3 = 2499999 ) /從0到9999999總共10000000次begin cnt3=0;clk4=clk4;/每10000000次翻轉(zhuǎn),周期為20000000次,也就是1Sendelse cnt3=cnt3+1;endendmodule4.2 計數(shù)器模塊設(shè)計與實現(xiàn)4.2.1計數(shù)模塊圖圖(4.2)計數(shù)器模塊圖4.2.2秒計數(shù)器程序module sec_count (clk,sec_ten_c,/ 分鐘的十位的進位信號sec_one_set,/小時的個位設(shè)置數(shù)sec_ten_set,/小時的十位設(shè)置數(shù)set_state,/設(shè)置狀態(tài),0的時候計數(shù),

9、1的時候置數(shù)sec_one,/小時的個位sec_ten);/小時的十位input clk;input set_state;input 3:0sec_one_set;input 3:0sec_ten_set;output 3:0sec_one;output 3:0sec_ten;output 3:0sec_ten_c;reg 3:0sec_one;reg 3:0sec_ten;reg 3:0sec_ten_c;reg temp;reg temp2;reg sec_one_c;initialbeginsec_one = 0 ;sec_ten = 0 ;endalways ( posedge clk

10、)begintemp2 =set_state;if(temp2 != set_state & set_state = 0 )beginsec_one = (sec_ten_set*10+sec_one_set)%60)%10;/sec_ten = 8h59)beginsec_one = 0;sec_ten = 0;sec_ten_c = 8h58)beginsec_ten_c =1;endelsebeginsec_ten_c = 9)beginsec_one = 0;sec_ten = sec_ten + 1;endelse sec_one = sec_one + 1 ;endendendEn

11、dmodule4.2.3分計數(shù)器程序module min_count (clk, sec_ten_c, min_ten_c, / 分鐘的十位的進位信號 min_one_set, /小時的個位設(shè)置數(shù) min_ten_set, /小時的十位設(shè)置數(shù) set_state, /設(shè)置狀態(tài),0的時候計數(shù),1的時候置數(shù) min_one, /小時的個位 min_ten); /小時的十位input clk;input set_state;input 3:0min_one_set;input 3:0min_ten_set;input 3:0sec_ten_c;output 3:0min_one;output 3:0

12、min_ten;output 3:0min_ten_c;reg 3:0min_one;reg 3:0min_ten;reg 3:0min_ten_c;reg temp;reg temp2;reg min_one_c;initialbeginmin_one = 0 ;min_ten = 0 ;endalways ( posedge clk)begin temp2 =set_state; if(temp2 != set_state & set_state = 0 ) begin min_one = (min_ten_set*10+min_one_set)%60)%10; / min_ten = 8

13、h59)beginmin_one = 0;min_ten = 0;min_ten_c = 8h58)beginmin_ten_c =1;endelsebegin min_ten_c = 9)beginmin_one = 0;min_ten = min_ten + 1;endelse min_one = min_one + 1 ;end endtemp = sec_ten_c;endEndmodule4.2.4時計數(shù)器程序module hour_count (clk, min_ten_c, / 分鐘的十位的進位信號 hour_one_set, /小時的個位設(shè)置數(shù) hour_ten_set, /小

14、時的十位設(shè)置數(shù) set_state, /設(shè)置狀態(tài),0的時候計數(shù),1的時候置數(shù) hour_one, /小時的個位 hour_ten); /小時的十位input clk;input set_state;input 3:0hour_one_set;input 3:0hour_ten_set;input 3:0min_ten_c;output 3:0hour_one;output 3:0hour_ten;reg 3:0hour_one;reg 3:0hour_ten;reg temp;reg temp2;reg hour_one_c;initialbeginhour_one = 0 ;hour_ten

15、 = 0 ;endalways ( posedge clk)begin temp2 =set_state; if(temp2 != set_state & set_state = 0 ) begin hour_one = (hour_ten_set*10+hour_one_set)%60)%10; / hour_ten = 8h23)beginhour_one = 0;hour_ten = 9)beginhour_one = 0;hour_ten = hour_ten + 1;endelse hour_one = hour_one + 1 ;end endtemp = min_ten_c;en

16、dendmodule4.3 1602顯示驅(qū)動模塊設(shè)計與實現(xiàn)4.3.1 1602顯示驅(qū)動模塊圖 圖(4.3)4.3.2 1602顯示驅(qū)動模塊程序module lcd_1602_drive(clk, /500Hz時鐘set_state,second_one_set,second_ten_set,minute_one_set,minute_ten_set,hour_one_set,hour_ten_set,second_one,second_ten,minute_one,minute_ten,hour_one,hour_ten,rs,rw,en,data);input clk;input set_s

17、tate;input 3:0 second_one_set,second_ten_set;input 3:0 minute_one_set,minute_ten_set;input 3:0 hour_one_set,hour_ten_set;input 3:0 second_one,second_ten;input 3:0 minute_one,minute_ten;input 3:0 hour_one,hour_ten;output rs,rw,en;reg rs,rw,en;output 7:0 data;reg 7:0 data; reg 7:0 seg1,seg2,next;reg 3

18、1:0 data_clock;reg 39:0 data_chars;reg 27:0 counter,counter1,counter2;reg 0:7 m10:0; wire31:0 data_clock1;wire31:0 set_clock;parameter chars=CLOCK;parameter state0= 8d0,camd0= 8d1,state1= 8d2,camd1= 8d3,state2= 8d4,camd2= 8d5,state3= 8d6,camd3= 8d7,state4= 8d8,camd4= 8d9,state5= 8d10,data0= 8d11,sta

19、te6= 8d12,camd5= 8d13,state7= 8d14,data1= 8d15,state8= 8d16;initialbeginm0 =8b0011_0000;/字符“0”代碼m1 =8b0011_0001;/字符“1”代碼m2 =8b0011_0010;/字符“2”代碼m3 =8b0011_0011;/字符“3”代碼m4 =8b0011_0100;/字符“4”代碼m5 =8b0011_0101;/字符“5”代碼m6 =8b0011_0110;/字符“6”代碼m7 =8b0011_0111;/字符“7”代碼m8 =8b0011_1000;/字符“8”代碼m9 =8b0011_1

20、001;/字符“9”代碼m10=8b0011_1010;/字符“:”代碼 end Assigndata_clock1=hour_ten,hour_one,4d10,minute_ten,minute_one,4d10,second_ten,second_one; /8assign set_clock=hour_ten_set,hour_one_set,4d10,minute_ten_set,minute_one_set,4d10,second_ten_set,second_one_set; /8always(posedge clk)beginif(set_state=0)begincase(n

21、ext)/ 初始化/*state0: begin rs=0; rw=0; data=8h38; en=1; next=camd0; /8位總線,顯示2行 5*7 seg1=8b1000_0101; /第一行首地址 seg2=8b1100_0011; /第二行首地址 endcamd0: begin en=0; rw=1; next=state1; endstate1: begin rs=0; rw=0; data=8h0c; en=1; next=camd1; end /顯示器打開,無光標(biāo),光標(biāo)不閃爍camd1: begin en=0; rw=1; next=state2; endstate2:

22、 begin rs=0; rw=0; data=8h06; en=1; next=camd2; end /寫入新數(shù)據(jù)光標(biāo)右移,寫入新數(shù)據(jù)后顯示屏不移動camd2: begin en=0; rw=1; next=state3; endstate3: begin rs=0; rw=0; data=8h01; en=1; next=camd3; end /清屏camd3: begin en=0; rw=1; next=state4; end/*/ 第一行,顯示CLOCK/*state4:beginrs=0;rw=0;data=seg1;en=1;next=camd4;/if(seg1=8b1000_

23、0101) seg1=8b1000_0111; /可在此處,設(shè)置讓CLOCLK動態(tài)顯示/else seg1=seg1-1b1;endcamd4:beginen=0;rw=1;next=state5;data_chars=chars;endstate5:beginrs=1;rw=0;data=data_chars39:32;en=1;next=data0;enddata0:beginif(counter1=5) begin next=state6;counter1=0;endelse begin en=0;rw=1;counter1=counter1+1; data_chars=(data_ch

24、ars8);next=state5;endend/*/ 第二行顯示,時間/*state6:beginrs=0;rw=0;data=seg2;en=1;next=camd5;/if(seg1=8b1000_0101) seg1=8b1000_0111; /可在此處,設(shè)置讓CLOCLK動態(tài)顯示/else seg1=seg1-1b1;endcamd5:beginen=0;rw=1;next=state7;data_clock=data_clock1;endstate7:beginrs=1;rw=0;data=mdata_clock31:28;en=1;next=data1;enddata1:begi

25、nif(counter2=8) begin next=state8;counter2=0;endelse begin en=0;rw=1;counter2=counter2+1; data_clock=(data_clock4);next=state7;endend/*/ 延遲處理/*state8:beginif(counter=100) begin counter=0; next=state3;endelse counter=counter+1;end/*endcaseendif(set_state = 1)begincase(next)/ 初始化/*state0: begin rs=0;

26、rw=0; data=8h38; en=1; next=camd0; /8位總線,顯示2行 5*7 seg1=8b1000_0101; /第一行首地址 seg2=8b1100_0011; /第二行首地址 endcamd0: begin en=0; rw=1; next=state1; endstate1: begin rs=0; rw=0; data=8h0c; en=1; next=camd1; end /顯示器打開,無光標(biāo),光標(biāo)不閃爍camd1: begin en=0; rw=1; next=state2; endstate2: begin rs=0; rw=0; data=8h06; e

27、n=1; next=camd2; end /寫入新數(shù)據(jù)光標(biāo)右移,寫入新數(shù)據(jù)后顯示屏不移動camd2: begin en=0; rw=1; next=state3; endstate3: begin rs=0; rw=0; data=8h01; en=1; next=camd3; end /清屏camd3: begin en=0; rw=1; next=state4; end/*/ 第一行,顯示CLOCK/*state4:beginrs=0;rw=0;data=seg1;en=1;next=camd4;/if(seg1=8b1000_0101) seg1=8b1000_0111; /可在此處,設(shè)

28、置讓CLOCLK動態(tài)顯示/else seg1=seg1-1b1;endcamd4:beginen=0;rw=1;next=state5;data_chars=chars;endstate5:beginrs=1;rw=0;data=data_chars39:32;en=1;next=data0;enddata0:beginif(counter1=5) begin next=state6;counter1=0;endelse begin en=0;rw=1;counter1=counter1+1; data_chars=(data_chars8);next=state5;endend/*/ 第二行

29、顯示,時間/*state6:beginrs=0;rw=0;data=seg2;en=1;next=camd5;/if(seg1=8b1000_0101) seg1=8b1000_0111; /可在此處,設(shè)置讓CLOCLK動態(tài)顯示/else seg1=seg1-1b1;endcamd5:beginen=0;rw=1;next=state7;data_clock=set_clock;endstate7:beginrs=1;rw=0;data=mdata_clock31:28;en=1;next=data1;enddata1:beginif(counter2=8) begin next=state8

30、;counter2=0;endelse begin en=0;rw=1;counter2=counter2+1; data_clock=(data_clock4);next=state7;endend/*/ 延遲處理/*state8:beginif(counter=100) begin counter=0; next=state3;endelse counter=counter+1;end/*endcaseendendEndmodule5. 系統(tǒng)仿真及硬件下載5.1系統(tǒng)仿真5.1.1系統(tǒng)仿真步驟(1)建立project項目,在軟件主窗口單擊File菜單后,單擊New選項,選擇Verilog H

31、DL File選項。(2)單擊OK進入空白的文本編輯區(qū),進行文本編輯。(3)V文件名必須與模塊名相同,將dff1.v文件設(shè)置為頂層文件,ProjectSet as Top-level Entity。(4)單擊編譯器快捷方式按鈕,完成編譯后,彈 出菜單報告錯誤和警告數(shù)目,并生成編譯報告。(5)利用v文件生成原理圖模塊。在v文件編輯界面中,Creat Symbol Files for Curent File.(6)打開project 項目,新建波形仿真文件;在建立的波形文件左側(cè)一欄中,點擊鼠標(biāo)右鍵,在彈出菜單中選擇 Insert Node or Bus。(7)在出現(xiàn)的圖中,選擇Node Finde

32、r,將打開Node Finder 對話框,本試驗對輸入輸出的管腳信號進行仿真,所以在Filter 中選擇 Pins:all,點擊List 按鈕。(8)在圖左欄中選擇需要進行仿真的端口通過中間的按鈕加入到右欄中,點擊OK,端口加入到波形文件中。(8)選擇一段波形,通過左邊的設(shè)置工具條,給出需要的值,設(shè)置完成激勵波形,保存。(9)設(shè)置為功能仿真:AssignmentTiming Analysis Settings-Simulator SettingsSimulation mode 選擇Functional, 生成網(wǎng)絡(luò)表ProcessingGenerate Functional Simulation Netlist;點擊快捷按鈕,開始仿真,完成后得到波形。5.1.2總原理圖圖(5.1)5.1.3仿真圖圖(5.2)5.2硬件下載5.2.1引腳分配(1)根據(jù)硬件接口設(shè)計,對芯片管腳進行綁定。選擇Assignments菜單下Pins選項;(2)雙擊對應(yīng)管腳后Location空白框,出現(xiàn)下拉菜單中選擇要綁定的管腳, 圖(5.3)5.2.2下載步驟(

溫馨提示

  • 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(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

提交評論