多功能數(shù)字鐘 說 明 - 嚴格按照模板進行書寫。自己可以自行修改標題的題目
- 關于字體:
- 題目:三號黑體加粗。
- 正文:小四號宋體,行距為1.25倍。
- 嚴禁抄襲和雷同,一經(jīng)發(fā)現(xiàn),成績即判定為不及格。!
- 設計需要提交“電子稿”和“打印稿”;
- “打印稿”包括封面、說明(即本頁內容)、設計內容三部分;訂書機左邊裝訂。
- “電子稿”上交:文件名為 “FPGA課程設計報告-班級-學號-姓名.doc”,所有報告發(fā)送給班長,由班長統(tǒng)一打包后統(tǒng)一發(fā)送到付小倩老師。
- “打印稿”由班長收齊后交到:12教305辦公室;
第一章 緒論 關鍵詞:FPGA,數(shù)字鐘 第二章 FPGA的相關介紹 2.1 FPGA概述 2.2 FPGA特點 2.3 FPGA設計注意 第三章 Quartus II與Verilog HDL相關介紹 3.1 Quartus II 3.2 Verilog HDL 第四章 設計方案 4.1數(shù)字鐘的工作原理 4.2 按鍵消抖 4.3時鐘復位 4.4時鐘校時 4.5數(shù)碼管顯示模塊。 第五章 方案實現(xiàn)與驗證 5.1產(chǎn)生秒脈沖 5.2秒個位進位 5.3按鍵消抖 5.4復位按鍵設置 5.5 數(shù)碼管顯示。 5.6 RTL結構總圖 第六章 實驗總結 第七章 Verilog HDL源代碼附錄
第一章 緒論現(xiàn)代社會的標志之一就是信息產(chǎn)品的廣泛使用,而且是產(chǎn)品的性能越來越強,復雜程度越來越高,更新步伐越來越快。支撐信息電子產(chǎn)品高速發(fā)展的基礎就是微電子制造工藝水平的提高和電子產(chǎn)品設計開發(fā)技術的發(fā)展。前者以微細加工技術為代表,而后者的代表就是電子設計自動化(electronic design automatic, EDA)技術。 本設計采用的VHDL是一種全方位的硬件描述語言,具有極強的描述能力,能支持系統(tǒng)行為級、寄存器傳輸級和邏輯門級這三個不同層次的設計;支持結構、數(shù)據(jù)流、行為三種描述形式的混合描述,覆蓋面廣,抽象能力強,因此在實際應用中越來越廣泛。ASIC是專用的系統(tǒng)集成電路,是一種帶有邏輯處理的加速處理器;而FPGA是特殊的ASIC芯片,與其它的ASIC芯片相比,它具有設計開發(fā)周期短、設計制造成本低、開發(fā)工具先進、標準產(chǎn)品無需測試、質量穩(wěn)定以及可實時在線檢測等優(yōu)點。 在控制系統(tǒng)中,鍵盤是常用的人機交換接口,當所設置的功能鍵或數(shù)字鍵按下的時候,系統(tǒng)應該完成該鍵所對應的功能。因此,按鍵信息輸入是與軟件結構密切相關的過程。根據(jù)鍵盤結構的不同,采用不同的編碼方法,但無論有無編碼以及采用什么樣的編碼,最后都要轉換成為相應的鍵值,以實現(xiàn)按鍵功能程序的轉移。[1] 鐘表的數(shù)字化給人們生產(chǎn)生活帶來了極大的方便,而且大大地擴展了鐘表原先的報時功能。諸如定時自動報警、定時啟閉電路、定時開關烘箱、通斷動力設備,甚至各種定時電氣的自動啟用等,所有這些都是以鐘表數(shù)字化為基礎的。因此研究數(shù)字鐘以及擴大其應用有著非常現(xiàn)實的意義。
第二章 FPGA的相關介紹
FPGA(Field-Programmable Gate Array),即現(xiàn)場可編程門陣列,它是在PAL、GAL、CPLD等可編程器件的基礎上進一步發(fā)展的產(chǎn)物。它是作為專用集成電路(ASIC)領域中的一種半定制電路而出現(xiàn)的,既解決了定制電路的不足,又克服了原有可編程器件門電路數(shù)有限的缺點。 2.1 FPGA概述
系統(tǒng)設計師可以根據(jù)需要通過可編輯的連接把FPGA內部的邏輯塊連接起來,就好像一個電路試驗板被放在了一個芯片里。一個出廠后的成品FPGA的邏輯塊和連接可以按照設計者而改變,所以FPGA可以完成所需要的邏輯功能。 FPGA一般由3種可編程電路和一個用于存放編程數(shù)據(jù)的靜態(tài)存儲器SRAM組成。這3種可編程電路是:可編程邏輯模塊(CLB--Configurable Logic Block)、輸入/輸出模塊(IOB--I/O Block)和互連資源(IR—Interconnect Resource)。可編程邏輯模塊CLB是實現(xiàn)邏輯功能的基本單元,它們通常規(guī)則的排列成一個陣列,散布于整個芯片;可編程輸入/輸出模塊(IOB)主要完成芯片上的邏輯與外部封裝腳的接口,它通常排列在芯片的四周;可編程互連資源包括各種長度的連接線段和一些可編程連接開關,它們將各個CLB之間或CLB、IOB之間以及IOB之間連接起來,構成特定功能的電路。 FPGA一般來說比ASIC(專用集成芯片)的速度要慢,無法完成復雜的設計,而且消耗更多的電能。但是他們也有很多的優(yōu)點比如可以快速成品,可以被修改來改正程序中的錯誤和更便宜的造價。廠商也可能會提供便宜的但是編輯能力差的FPGA。因為這些芯片有比較差的可編輯能力,所以這些設計的開發(fā)是在普通的FPGA上完成的,然后將設計轉移到一個類似于ASIC的芯片上。另外一種方法是用CPLD(復雜可編程邏輯器件備)。
2.2 FPGA特點
FPGA的基本特點主要有: 1)采用FPGA設計ASIC電路,用戶不需要投片生產(chǎn),就能得到合用的芯片。 2)FPGA可做其它全定制或半定制ASIC電路的中試樣片。 3)FPGA內部有豐富的觸發(fā)器和I/O引腳。 4)FPGA是ASIC電路中設計周期最短、開發(fā)費用最低、風險最小的器件之一。 5)FPGA采用高速CHMOS工藝,功耗低,可以與CMOS、TTL電平兼容。 可以說,F(xiàn)PGA芯片是小批量系統(tǒng)提高系統(tǒng)集成度、可靠性的最佳選擇之一。 編程互連資源IR可以將FPGA內部的CLB和CLB之間、CLB和IOB之間連接起來,構成各種具有復雜功能的系統(tǒng)。 FPGA是由存放在片內RAM中的程序來設置其工作狀態(tài)的,因此,工作時需要對片內的RAM進行編程。用戶可以根據(jù)不同的配置模式,采用不同的編程方式。 加電時,F(xiàn)PGA芯片將EPROM中數(shù)據(jù)讀入片內編程RAM中,配置完成后,F(xiàn)PGA進入工作狀態(tài)。掉電后,F(xiàn)PGA恢復成白片,內部邏輯關系消失,因此,F(xiàn)PGA能夠反復使用。FPGA的編程無須專用的FPGA編程器,只須用通用的EPROM、PROM編程器即可。當需要修改FPGA功能時,只需換一片EPROM即可。這樣,同一片F(xiàn)PGA,不同的編程數(shù)據(jù),可以產(chǎn)生不同的電路功能。因此,F(xiàn)PGA的使用非常靈活。 FPGA有多種配置模式:并行主模式為一片F(xiàn)PGA加一片EPROM的方式;主從模式可以支持一片PROM編程多片F(xiàn)PGA;串行模式可以采用串行PROM編程FPGA;外設模式可以將FPGA作為微處理器的外設,由微處理器對其編程。
2.3 FPGA設計注意
不管你是一名邏輯設計師、硬件工程師或系統(tǒng)工程師,甚或擁有所有這些頭銜,只要你在任何一種高速和多協(xié)議的復雜系統(tǒng)中使用了FPGA,你就很可能需要努力解決好器件配置、電源管理、IP集成、信號完整性和其他的一些關鍵設計問題。不過,你不必獨自面對這些挑戰(zhàn),因為在當前業(yè)內領先的FPGA公司里工作的應用工程師每天都會面對這些問題,而且他們已經(jīng)提出了一些將令你的設計工作變得更輕松的設計指導原則和解決方案。
本次實驗所采用的FPGA器件是Altera Cyclone V 5CSEMA5F31C6N 
FPGA實物圖
FPGA數(shù)碼管介紹,每節(jié)數(shù)碼管低電平點亮高電平熄滅。
LED序號如下圖所示:

根據(jù)上圖所示的順序,可以得出顯示的數(shù)組代碼。
4'd0: HEX0=7'b1000000; //0 低電平點亮高電平熄滅 4'd1: HEX0=7'b1111001; //1 4'd2: HEX0=7'b0100100; //2 4'd3: HEX0=7'b0110000; //3 4'd4: HEX0=7'b0011001; //4 4'd5: HEX0=7'b0010010; //5 4'd6: HEX0=7'b0000010; //6 4'd7: HEX0=7'b1111000; //7 4'd8: HEX0=7'b0000000; //8 4'd9: HEX0=7'b0010000; //9 default: HEX0=7'b1111111; //不符合條件的顯示零
第三章 Quartus II與Verilog HDL相關介紹3.1 Quartus IIQuartus II 是Altera公司的綜合性PLD/FPGA開發(fā)軟件,原理圖、VHDL、VerilogHDL以及AHDL(Altera Hardware 支持Description Language)等多種設計輸入形式,內嵌自有的綜合器以及仿真器,可以完成從設計輸入到硬件配置的完整PLD設計流程。 Quartus II支持Altera的IP核,包含了LPM/MegaFunction宏功能模塊庫,使用戶可以充分利用成熟的模塊,簡化了設計的復雜性、加快了設計速度。對第三方EDA工具的良好支持也使用戶可以在設計流程的各個階段使用熟悉的第三方EDA工具。 Quartus II 軟件擁有友好的界面,使用便捷,功能強大,當中可編程邏輯設計環(huán)境采用完成集成化,是先進的EDA工具軟件。該軟件具備諸多特點(例如:開放性,與結構無聯(lián)系,多平臺設計,完全集成化,設計庫豐富、工具模塊化等),支持原理圖、VHDL、VerilogHDL以及AHDL等多種設計輸入形式。Quartus II能夠在多系統(tǒng)上使用,為用戶的設計方式提供了完善的圖形界面。具有運行速度快,界面統(tǒng)一,功能集中,學用簡單等特點。
3.2 Verilog HDL
Verilog HDL是一種硬件描述語言(HDL:Hardware Description Language),以文本形式來描述數(shù)字系統(tǒng)硬件的結構和行為的語言,用它可以表示邏輯電路圖、邏輯表達式,還可以表示數(shù)字邏輯系統(tǒng)所完成的邏輯功能。 Verilog HDL和VHDL是世界上最流行的兩種硬件描述語言,都是在20世紀80年代中期開發(fā)出來的。前者由Gateway Design Automation公司(該公司于1989年被Cadence公司收購)開發(fā)。兩種HDL均為IEEE標準。
第四章 設計方案4.1數(shù)字鐘的工作原理
振蕩器產(chǎn)生穩(wěn)定的高頻脈沖信號,作為數(shù)字鐘的時間基準,然后經(jīng)過分頻器輸出標準秒脈沖。秒計數(shù)器滿60后向分計數(shù)器進位,分計數(shù)器滿60后向小時計數(shù)器進位,小時計數(shù)器按照“24翻0”規(guī)律計數(shù)。計數(shù)滿后各計數(shù)器清零,重新計數(shù)。計數(shù)器的輸出分別經(jīng)譯碼器送數(shù)碼管顯示。計時出現(xiàn)誤差時,可以用校時電路校時、校分?刂菩盘栍扇齻獨立按鍵輸入。輸入信號選擇FPGA器件上的50MHZ時鐘信號。 4.2 按鍵消抖
因為按鍵的物理結構并非理想式開關,在按鍵按下后會在一個很短的時間內出現(xiàn)電平抖動的情況,因此需要對按鍵進行消抖處理。這里的按鍵消抖與單片機中的按鍵消抖問題有所不同,不能采用延時的方法進行按鍵消抖,這里我選用對時鐘脈沖計數(shù)的方式來判斷按鍵是否按下。采用50MHZ時鐘信號,實測160ms的消抖時長較為合適,即8000000個時鐘上升沿。 4.3時鐘復位
按下復位按鍵后,所有位清零。
4.4時鐘校時
時鐘計時過程中,可對時鐘進行校時。本次設計不考慮對秒位進行校時,分鐘的個位和小時的個位加到10時會自動進位,因此只對分鐘的個位和小時的個位設置可以加1的校時按鈕,即可實現(xiàn)校時功能。整體比較容易實現(xiàn)。
4.5數(shù)碼管顯示模塊。
選擇需要顯示的時鐘位數(shù)作為敏感詞,用上述給出的顯示代碼對時鐘的每一位分別進行顯示處理。 第五章 方案實現(xiàn)與驗證5.1產(chǎn)生秒脈沖
always@(posedge clk) //敏感詞為50MHZ時鐘上升沿 。。。。。。 count=count+1; if(count==32'd50000000) //產(chǎn)生一個一秒的脈沖, begin count=0; count_s0=count_s0+1; //秒個位計數(shù) end
如代碼展現(xiàn),當計數(shù)器count記到50000000個時鐘上升沿的時候,向秒個位進1.
5.2秒個位進位
if(count_s0==4'd10) begin count_s0=0; count_s1=count_s1+1; //產(chǎn)生秒十位進位 end
當秒的個位計數(shù)到10的時候,向秒的十位進位。
5.3按鍵消抖
if (!inrst_m0)
count0=count0+1; if(count0==32'd8000000 && !inrst_m0) begin count0=0; count_m0=count_m0+1; end 對時鐘秒沖進行計數(shù),計數(shù)達到8000000時,判斷此時的電平是否為0,若還是為0,則判斷按鍵按下,執(zhí)行分鐘個位加1操作。
5.4復位按鍵設置
begin if (!reset) //按鍵按下為邏輯0 begin count=0; //復位置零 count_s0=0;count_s1=0; count_m0=0;count_m1=0; count_h0=0;count_h1=0; end else
復位按鍵按下后所有位置零。
5.5 數(shù)碼管顯示。
always@(count_s0) //秒個位顯示 begin case(count_s0) 4'd0: HEX0=7'b1000000; //0 低電平點亮高電平熄滅 4'd1: HEX0=7'b1111001; //1 4'd2: HEX0=7'b0100100; //2 4'd3: HEX0=7'b0110000; //3 4'd4: HEX0=7'b0011001; //4 4'd5: HEX0=7'b0010010; //5 4'd6: HEX0=7'b0000010; //6 4'd7: HEX0=7'b1111000; //7 4'd8: HEX0=7'b0000000; //8 4'd9: HEX0=7'b0010000; //9 default: HEX0=7'b1111111; //不符合條件的顯示零 endcase end 5.6 RTL結構總圖
顯示部分如下圖:

判斷主體如下圖:
部分引腳圖展現(xiàn)

最終實驗現(xiàn)象:
其實本次的多功能數(shù)字鐘設計其實應該還有很多其他的方法,比如用到外部中斷功能進行時鐘的校時,采用按鍵輸入加數(shù)碼管閃爍的方式進行校時位的選擇,但限于時間較短,這部分知識空白,所以本次設計實有所缺陷。
經(jīng)歷了本次FPGA的設計,有很多感受,首先就是看了一點數(shù)字鐘設計方面的資料,遇到很多不理解的地方,于是就需要再和同學進行研究討論,在討論的過程中,能聽到其他人的思路,感覺特別有意思,同樣的功能,實現(xiàn)的方法有許許多多,努力把自己的想法實現(xiàn),或是選擇一種你喜歡的設計借鑒一下,兩者都是很好的選擇。
通過這次設計實驗,著實培養(yǎng)了我們獨立思考、解決問題的能力,從最一開始的一籌莫展,沒有一點思路,感覺像平底拔樓一樣,從兩手空空到產(chǎn)生一個控制電路,從無到有,這是創(chuàng)造的力量。同時,和其他同學討論的過程也很重要,
要說的還有就是最后實驗成功的喜悅是無可替代的,就好像你親手種的果樹長出了果實,養(yǎng)的雞下了雞蛋,是一種創(chuàng)造的喜悅,整個心就像是一個大箱子里面放著一塊糖,隱隱約約總能感覺到一絲甜蜜。
數(shù)碼管顯示的數(shù)字鐘是常見的技術,這次基于FPGA的多功能數(shù)字鐘設計具有很高的工程價值和現(xiàn)實意義。讓我們將知識服務于生活,將知識用于實踐,鍛煉了我們發(fā)現(xiàn)問題解決問題的能力。
這次FPGA的多功能數(shù)字鐘設計,加深了我們對FPGA設計的理解,培養(yǎng)了我們的邏輯思維和動手操作能力,使我們將知識與技能鏈接起來,使我們每個人的都在不斷進步,提高了專業(yè)技能,提高了動手實踐的綜合能力。
- module clock (reset,inrst_m0,inrst_h0,clk,HEX0,HEX1,HEX2,HEX3,HEX4,HEX5);
- input clk,reset,inrst_m0,inrst_h0;
- output reg [6:0] HEX0,HEX1,HEX2,HEX3,HEX4,HEX5;
- reg [31:0] count=0,count0=0,count1=0; //實際寬度為25
- reg [3:0] count_s0=0,count_s1=0,
- count_m0=0,count_m1=0,
- count_h0=0,count_h1=0;
- always@(posedge clk)
- begin
- if (!inrst_m0)
- count0=count0+1;
- if(count0==32'd8000000 && !inrst_m0)//按鍵消抖
- begin
- count0=0;
- count_m0=count_m0+1;
- end
- if (!inrst_h0)
- count1=count1+1;
- if(count1==32'd8000000 && !inrst_h0)
- begin
- count1=0;
- count_h0=count_h0+1;
- end
- if (!reset) //按鍵按下為邏輯0
- begin
- count=0; //復位置零
- count_s0=0;count_s1=0;
- count_m0=0;count_m1=0;
- count_h0=0;count_h1=0;
- end
- else
- count=count+1;
- if(count==32'd50000000) //產(chǎn)生一個一秒的脈沖,
- begin
- count=0;
- count_s0=count_s0+1; //秒個位計數(shù)
- end
- else
- if(count_s0==4'd10)
- begin
- count_s0=0;
- count_s1=count_s1+1; //產(chǎn)生秒十位進位
- end
- else
- if(count_s1==4'd6)
- begin
- count_s1=0;
- count_m0=count_m0+1;
- end
- else
- if(count_m0==4'd10) //分個位計數(shù)
- begin
- count_m0=0;
- count_m1=count_m1+1;
- end
- else
- if(count_m1==4'd6) //分十位計數(shù)
- begin
- count_m1=0;
- count_h0=count_h0+1;
- end
- else
- if(count_h0==4'd10) //時個位計數(shù)
- begin
- count_h0=0;
- count_h1=count_h1+1;
- end
- else
- if(count_h0==4 && count_h1==2) //滿24判斷
- begin
- count_h0=0;
- count_h1=0;
- end
-
- end
-
- always@(count_s0) //秒個位顯示
- begin
- case(count_s0)
- 4'd0: HEX0=7'b1000000; //0 低電平點亮高電平熄滅
- 4'd1: HEX0=7'b1111001; //1
- 4'd2: HEX0=7'b0100100; //2
- 4'd3: HEX0=7'b0110000; //3
- 4'd4: HEX0=7'b0011001; //4
- 4'd5: HEX0=7'b0010010; //5
- 4'd6: HEX0=7'b0000010; //6
- 4'd7: HEX0=7'b1111000; //7
- 4'd8: HEX0=7'b0000000; //8
- 4'd9: HEX0=7'b0010000; //9
- default: HEX0=7'b1111111; //不符合條件的顯示零
- endcase
- end
-
- always@(count_s1) //秒十位顯示
- begin
- case(count_s1)
- 4'd0: HEX1=7'b1000000; //0 低電平點亮高電平熄滅
- 4'd1: HEX1=7'b1111001; //1
- 4'd2: HEX1=7'b0100100; //2
- 4'd3: HEX1=7'b0110000; //3
- 4'd4: HEX1=7'b0011001; //4
- 4'd5: HEX1=7'b0010010; //5
- default: HEX1=7'b1111111; //不符合條件的顯示零
- endcase
- end
-
- always@(count_m0) //分個位顯示
- begin
- case(count_m0)
- 4'd0: HEX2=7'b1000000; //0 低電平點亮高電平熄滅
- 4'd1: HEX2=7'b1111001; //1
- 4'd2: HEX2=7'b0100100; //2
- 4'd3: HEX2=7'b0110000; //3
- 4'd4: HEX2=7'b0011001; //4
- 4'd5: HEX2=7'b0010010; //5
- 4'd6: HEX2=7'b0000010; //6
- 4'd7: HEX2=7'b1111000; //7
- 4'd8: HEX2=7'b0000000; //8
- 4'd9: HEX2=7'b0010000; //9
- default: HEX2=7'b1111111; //不符合條件的顯示零
- endcase
- end
- always@(count_m1) //分十位顯示
- begin
- case(count_m1)
- 4'd0: HEX3=7'b1000000; //0 低電平點亮高電平熄滅
- 4'd1: HEX3=7'b1111001; //1
- 4'd2: HEX3=7'b0100100; //2
- 4'd3: HEX3=7'b0110000; //3
- 4'd4: HEX3=7'b0011001; //4
- 4'd5: HEX3=7'b0010010; //5
- default: HEX3=7'b1111111; //不符合條件的顯示零
- endcase
- end
- always@(count_h0) //時個位顯示
- begin
- case(count_h0)
- 4'd0: HEX4=7'b1000000; //0 低電平點亮高電平熄滅
- 4'd1: HEX4=7'b1111001; //1
- 4'd2: HEX4=7'b0100100; //2
- 4'd3: HEX4=7'b0110000; //3
- 4'd4: HEX4=7'b0011001; //4
- 4'd5: HEX4=7'b0010010; //5
- 4'd6: HEX4=7'b0000010; //6
- 4'd7: HEX4=7'b1111000; //7
- 4'd8: HEX4=7'b0000000; //8
- 4'd9: HEX4=7'b0010000; //9
- default: HEX4=7'b1111111; //不符合條件的顯示零
- endcase
- End
-
- always@(count_h1) //時十位顯示
- begin
- case(count_h1)
- 4'd0: HEX5=7'b1000000; //0 低電平點亮高電平熄滅
- 4'd1: HEX5=7'b1111001; //1
- 4'd2: HEX5=7'b0100100; //2
- default: HEX5=7'b1111111; //不符合條件的顯示零
- endcase
- end
-
- endmodule
復制代碼
完整的Word格式文檔51黑下載地址:
FPGA課程設計多功能數(shù)字鐘.doc
(2.32 MB, 下載次數(shù): 84)
2018-6-28 17:15 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|