引言 FPGA 是現(xiàn)場可編程門陣列(Field Programmable Gate Array)的簡稱。FPGA器件及其開發(fā)系統(tǒng)是開發(fā)大規(guī)模數(shù)字集成電路的新技術。它利用計算機輔助設計,繪制出實現(xiàn)用戶邏輯的原理圖、編輯布爾方程或用硬件描述語言等方式作為設計輸入;然后經(jīng)一系列轉(zhuǎn)換程序、自動布局布線、模擬仿真的過程;最后生成配置FPGA器件的數(shù)據(jù)文件,對FPGA器件初始化。這樣就實現(xiàn)了滿足用戶要求的專用集成電路,真正達到了用戶自行設計、自行研制和自行生產(chǎn)集成電路的目的。 FPGA是一種半定制的集成電路,其特點是直接面向用戶,具有極大的靈活性和通用性,開發(fā)效率高,硬件測試和實現(xiàn)快捷,工作可靠性好而且技術維護簡單。 隨著電子技術的發(fā)展,集成電路的規(guī)模越來越大,復雜程度也越來越高。對于如此大規(guī)模的和復雜程度的電路設計問題,傳統(tǒng)的門級描述方法顯得過于瑣碎和難以管理。而VHDL語言具有強大的功能,覆蓋面廣,描述能力強,可用于從門級、電路級直至系統(tǒng)級的描述、仿真和綜合。下面簡要介紹了VHDL語言。 VHDL的英文全名是Very-High-Speed Intergrated Circuit Hardware Description Language誕生于1982年。1987年底,VHDL被IEEE和美國國防部確認為標準硬件描述語言。自IEEE公布了VHDL的標準版本,IEEE-1076(簡稱87版)之后,各EDA公司相繼推出了自己的VHDL設計環(huán)境,或宣布自己的設計工具可以和VHDL接口。此后VHDL在電子設計領域得到了廣泛的接受,并逐步取代了原有的非標準的硬件描述語言。1993年,IEEE對VHDL進行了修訂,從更高的抽象層次和系統(tǒng)描述能力上擴展VHDL的內(nèi)容,公布了新版本的VHDL,即IEEE標準的1076-1993版本(簡稱93版)。現(xiàn)在,VHDL和Verilog作為IEEE的工業(yè)標準硬件描述語言,又得到眾多EDA公司的支持。在電子工程領域,已成為事實上的通用硬件描述語言。有專家認為:在新的世紀中,VHDL與Verilog語言將承擔起大部分的數(shù)字系統(tǒng)設計任務。VHDL主要用于描述數(shù)字系統(tǒng)的結(jié)構、行為、功能和接口。除了含有許多具有硬件特征的語句外,VHDL的語言形式和描述風格與句法是十分類似于一般的計算機高級語言。VHDL的程序結(jié)構特點是將一項工程設計——或稱設計實體(可以是一個元件,一個電路模塊或一個系統(tǒng))分成外部(或稱可視部分,及端口)和內(nèi)部(或稱不可視部分),即設計實體的內(nèi)部功能和算法完成部分。在對一個設計實體定義了外部界面后,一旦其內(nèi)部開發(fā)完成后,其它的設計就可以直接調(diào)用這個實體。這種將設計實體分成內(nèi)外部分的概念是VHDL系統(tǒng)設計的基本點。 Quartus II是Altera公司推出的CPLD/FPGA集成化開發(fā)軟件,可以完成設計輸入、邏輯綜合、布局與布線、仿真、時序分析、硬件配置完整的PLD設計流程。QuartusⅡ提供了多種設計輸入方式、快速的編譯和直接易懂的器件編程。具有友好的用戶界面, 快速的綜合速度和更優(yōu)化的綜合和適配功能。Quartus II自帶宏功能模塊庫,大大減輕了用戶的工作量,加快設計速度。Quartus II 內(nèi)置仿真器可以在工程中仿真任何設計。可進行功能仿真、時序仿真來檢驗設計的邏輯功能和計算設計的內(nèi)部定時是否符合設計。仿真器可以仿真整個設計,或仿真設計的任何部分。支持可編程系統(tǒng)(SOPC)和大規(guī)模FPGA設計開發(fā),集系統(tǒng)級設計、嵌入式軟件開發(fā)、可編程邏輯設計于一體,是一種綜合性的開發(fā)平臺。 該軟件支持Altera公司的Stratix Ⅱ、Stratix GX、Stratix、MAX3000A、MAX 7000B、MAX 7000AE、MAX Ⅱ、FLEX6000、FLEX10K系列、Cyclone、CycloneⅡ、APEX Ⅱ、APEX20K和ACEX1K系列。 1 整體設計方案 設計基于FPGA的計數(shù)器,要求顯示1個0-9999的四位計數(shù)器,可以由4個模塊為10的十進制計數(shù)器級聯(lián)而成,所以可以顯示的頻率范圍是1-9999HZ。因此頻率計的功能分割成四個模塊:分頻計、計數(shù)器、輸出鎖存器和譯碼顯示電路。各個模塊均用VHDL語言描述并用QuartusⅡ進行仿真。本設計采用數(shù)控分頻計可以對信號實現(xiàn)不同分頻比輸出信號作為計數(shù)器輸入。鎖存器由一個外部脈沖控制可以控制顯示部分顯示周期。當系統(tǒng)正常工作時,輸入信號標提供頻率,經(jīng)過分頻器分頻,產(chǎn)生計數(shù)信號送入計數(shù)器模塊,計數(shù)模塊對輸入的脈沖個數(shù)進行計數(shù)數(shù)結(jié)束后將計數(shù)結(jié)果送入鎖存器中,保證系統(tǒng)可以穩(wěn)定顯示數(shù)據(jù),計數(shù)結(jié)果能夠顯示在七段數(shù)碼顯示管上。 
圖1-1整體設計方案 2各功能模塊設計及仿真 2.1分頻器的設計 2.1.1分頻器設計原理 嵌入式設備品種繁多而且性能差異也十分巨大。有些嵌入式設備如VoIP電話,簡單的車載系統(tǒng),簡單的機頂盒等,由于它們的任務單一,功能簡單,因此計算能力和存儲空間都很有限。采用這些設備進行移植顯然是不現(xiàn)實的。因此,在嵌入式設備的選擇上,本項目將移植的目標設備定位在具有一定計算能力和存儲空間的中高端嵌入式設備上。比較有代表性的嵌入式設備包括:中高端PDA,中高端智能電話,中高端機頂盒等。此外,為了加快移植的速度,減短開發(fā)周期,因此,將嵌入式設備的硬件平臺選擇為X86體系結(jié)構的硬件平臺。在數(shù)字邏輯電路設計中,分頻器是一種基本電路,通過分頻可以得到需要的時鐘頻率。常見的分頻器有二進制分頻器、偶數(shù)次分頻器、奇數(shù)次分頻器、占空比可調(diào)的分頻器和小數(shù)分頻器。分頻的方法很多最常見的就是利用加法器對時鐘信號進行分頻,當然也可以利用一些專用的電路結(jié)構來實現(xiàn)。 數(shù)控分頻器的功能是在輸入端給定不同數(shù)據(jù)時,將對輸入的時鐘信號有不同的分頻比,對于一個N分頻器,分頻出的時鐘周期是原時鐘周期的N倍,頻率變?yōu)樵瓉淼?/N。對于一個8位計數(shù)器,如果輸入數(shù)D,然后啟動計數(shù)器工作,則經(jīng)過D倍的時鐘周期計數(shù)器溢出時,輸出full變?yōu)楦唠娖剑僖詅ull為敏感信號,對fout進行取反操作,如此N=2D。計數(shù)一次后,再重新計數(shù),反復進行直至輸入被賦予新值。對于數(shù)控分頻數(shù)器,裝載不同的計數(shù)初始值時,會有不同頻率的溢出信號,從而得到不同的輸出。數(shù)控分頻器是利用計數(shù)值可并行預置的加法計數(shù)器設計完成的。 2.1.2源程序及波形仿真 module clk_gen (clk_33m, //system input clock; rst, //system reset; clk_1, //output 1hz clock clk_8, //output 8hz clock clk_16, //output 16hz clock clk_32, //output 32hz clock clk_32k); //output 32khz clock
input clk_33m,rst; output clk_1,clk_8,clk_16,clk_32,clk_32k;
wire clk_33m,rst; reg [24:0] count; wire clk_32k,clk_1,clk_8,clk_16,clk_32;
//************* clock generator****************************
always @(posedge clk_33m or negedge rst) if (!rst) count<=25'd0; else count<=count+1'b1;
assign clk_1=count[24]; assign clk_32k=count[9]; assign clk_8=count[21]; assign clk_16=count[20]; assign clk_32=count[19];
endmodule
圖2-1 分頻器時序仿真
2.1.3分頻器RTL 電路圖
圖2-2 分頻器RTL電路圖 2.2計數(shù)器的設計 2.2.1分頻器設計原理 計數(shù)是一種最簡單基本的運算,計數(shù)器就是實現(xiàn)這種運算的邏輯電路,計數(shù)器在數(shù)字系統(tǒng)中主要是對脈沖的個數(shù)進行計數(shù),以實現(xiàn)測量、計數(shù)和控制的功能,同時兼有分頻功能,計數(shù)器是由基本的計數(shù)單元和一些控制門所組成,計數(shù)單元則由一系列具有存儲信息功能的各類觸發(fā)器構成,這些觸發(fā)器有RS觸發(fā)器、T觸發(fā)器、D觸發(fā)器及JK觸發(fā)器等。計數(shù)器在數(shù)字系統(tǒng)中應用廣泛,如在電子計算機的控制器中對指令地址進行計數(shù),以便順序取出下一條指令,在運算器中作乘法、除法運算時記下加法、減法次數(shù),又如在數(shù)字儀器中對脈沖的計數(shù)等等。計數(shù)器可以用來顯示產(chǎn)品的工作狀態(tài),一般來說主要是用來表示產(chǎn)品已經(jīng)完成了多少份的折頁配頁工作。它主要的指標在于計數(shù)器的位數(shù),常見的有3位和4位的。很顯然,3位數(shù)的計數(shù)器最大可以顯示到999,4位數(shù)的最大可以顯示到9999。在數(shù)字電子技術中應用的最多的時序邏輯電路。計數(shù)器不僅能用于對時鐘脈沖計數(shù),還可以用于分頻、定時、產(chǎn)生節(jié)拍脈沖和脈沖序列以及進行數(shù)字運算等。但是并無法顯示計算結(jié)果,一般都是要通過外接LCD或LED屏才能顯示。 2.2.2六十進制計數(shù)器 odule COUNT_60 (clk, //count input clock; rst, //system reset; rco, //carry output q); //BCD code output
input clk,rst; output reg rco; output [6:0] q;
wire clk,rst; reg [6:0] q; reg en;
//*********************************************************
always @(posedge clk or negedge rst)
if (!rst) q[3:0]<=4'd0; else if(q[3:0]==4'd8) begin q[3:0]<=q[3:0]+1'b1; en<=1'b1; end else if (q[3:0]==4'd9) begin q[3:0]<=4'd0; en<=1'b0; end else begin q[3:0]<=q[3:0]+1'b1; en<=1'b0; end
always @(posedge clk or negedge rst)
if (!rst) q[6:4]<=3'd0; else if (en) begin if (q[6:4]==3'd5) begin q[6:4]<=3'd0; rco<=1'b1; end else begin q[6:4]<=q[6:4]+1'b1; rco<=1'b0; end end else ;
Endmodule 2.2.3RTL電路圖 
圖2-3六十進制計數(shù)器RTL電路圖 2.3鎖存器的設計2.3.1鎖存器設計原理所謂鎖存器,就是輸出端的狀態(tài)不會隨輸入端的狀態(tài)變化而變化,僅在有鎖存信號時輸入的狀態(tài)被保存到輸出,直到下一個鎖存信號到來時才改變。典型的鎖存器邏輯電路是D 觸發(fā)器電路。在LED和數(shù)碼管顯示方面,要維持一個數(shù)據(jù)的顯示,往往要持續(xù)的快速的刷新。尤其是在四段八位數(shù)碼管等這些要選通的顯示設備上。在人類能夠接受的刷新頻率之內(nèi),大概每三十毫秒就要刷新一次。這就大大占用了處理器的處理時間,消耗了處理器的處理能力,還浪費了處理器的功耗。鎖存器的使用可以大大的緩解處理器在這方面的壓力。當處理器把數(shù)據(jù)傳輸?shù)芥i存器并將其鎖存后,鎖存器的輸出引腳便會一直保持數(shù)據(jù)狀態(tài)直到下一次鎖存新的數(shù)據(jù)為止。這樣在數(shù)碼管的顯示內(nèi)容不變之前,處理器的處理時間和IO引腳便可以釋放。可以看出,處理器處理的時間僅限于顯示內(nèi)容發(fā)生變化的時候,這在整個顯示時間上只是非常少的一個部分。而處理器在處理完后可以有更多的時間來執(zhí)行其他的任務。這就是鎖存器在LED和數(shù)碼管顯示方面的作用:節(jié)省了寶貴的MCU時間。
2.3.2鎖存器源程序及波形仿真 module sem_drive (oSEG0, oSEG1, oSEG2, oSEG3, oSEG4, oSEG5, oSEG6, oSEG7, //output to 8 SEG iDIG ); //input 8-BCD code (4*8=32bit) input [31:0] iDIG; output [6:0] oSEG0,oSEG1,oSEG2,oSEG3,oSEG4,oSEG5,oSEG6,oSEG7;
wire [31:0] iDIG; wire [6:0] oSEG0,oSEG1,oSEG2,oSEG3,oSEG4,oSEG5,oSEG6,oSEG7;
SEG7_LUT U0 (.oSEG(oSEG0),.iDIG(iDIG[3:0])); SEG7_LUT U1 (.oSEG(oSEG1),.iDIG(iDIG[7:4])); SEG7_LUT U2 (.oSEG(oSEG2),.iDIG(iDIG[11:8])); SEG7_LUT U3 (.oSEG(oSEG3),.iDIG(iDIG[15:12])); SEG7_LUT U4 (.oSEG(oSEG4),.iDIG(iDIG[19:16])); SEG7_LUT U5 (.oSEG(oSEG5),.iDIG(iDIG[23:20])); SEG7_LUT U6 (.oSEG(oSEG6),.iDIG(iDIG[27:24])); SEG7_LUT U7 (.oSEG(oSEG7),.iDIG(iDIG[31:28]));
Endmodule 圖2-4 鎖存器時序仿真圖 2.2.3鎖存器RTL 電路圖 圖2-5 鎖存器RTL電路圖 2.4顯示部分的設計 2.4.1七段數(shù)碼管顯示原理 對于人機交互式單片機系統(tǒng)來說,不僅需要響應用戶輸入,同時也需要將一些測控信息輸出顯示。這些顯示信息可以提供實時的數(shù)據(jù)或圖形結(jié)果,以便于掌握系統(tǒng)的狀態(tài)并進行分析處理。目前,最常用的是LED數(shù)碼管顯示。其成本低廉、使用簡便,可以顯示數(shù)字或幾個特定的字符。數(shù)碼管數(shù)碼管的一種是半導體發(fā)光器件,數(shù)碼管可分為七段數(shù)碼管和八段數(shù)碼管,區(qū)別在于八段數(shù)碼管比七段數(shù)碼管多一個發(fā)光二極管單元,其基本單元是發(fā)光二極管。數(shù)碼管通過對其不同的管腳輸入相對的電流,使其發(fā)亮,從而顯示出數(shù)字能夠顯示時間、日期、溫度等所有可用數(shù)字表示的參數(shù)的器件。在電器特別是家電領域應用極為廣泛,如顯示屏、空調(diào)、熱水器、冰箱等等。絕大多數(shù)熱水器用的都是數(shù)碼管,其他家電也用液晶屏與熒光屏。 2.4.2七段數(shù)碼管顯示源程序及波形仿真module SEG7_LUT (oSEG, //output SEG7 code iDIG); //input BCD code input [3:0] iDIG; output [6:0] oSEG; reg [6:0] oSEG;
// --a-- // | | // f b // | | // --g-- // | | // e c // | | // --d-- O DP
always @(iDIG) case(iDIG) //gfedcba 4'h0: oSEG = 7'b1000000; //display 0; 4'h1: oSEG = 7'b1111001; //display 1; 4'h2: oSEG = 7'b0100100; //display 2; 4'h3: oSEG = 7'b0110000; //display 3; 4'h4: oSEG = 7'b0011001; //display 4; 4'h5: oSEG = 7'b0010010; //display 5; 4'h6: oSEG = 7'b0000010; //display 6; 4'h7: oSEG = 7'b1111000; //display 7; 4'h8: oSEG = 7'b0000000; //display 8; 4'h9: oSEG = 7'b0010000; //display 9; // 4'ha: oSEG = 7'b0001000; //display A; 4'ha: oSEG = 7'b0111111; //display - for clock; 4'hb: oSEG = 7'b0000011; //display B; 4'hc: oSEG = 7'b1000110; //display C; 4'hd: oSEG = 7'b0100001; //display D; 4'he: oSEG = 7'b0000110; //display E; 4'hf: oSEG = 7'b0001110; //display F; endcase
Endmodule 3系統(tǒng)頂層設計 3.1自頂向下的設計方法 所謂自頂向下設計方法,就是采用可完全獨立于芯片廠商及其產(chǎn)品結(jié)構的描述語,在功能級對設計產(chǎn)品進行定義,并結(jié)合功能仿真技術,以確保設計的正確性,能定義完成后,利用邏輯綜合技術,把功能描述轉(zhuǎn)換成某一具體結(jié)構芯片的網(wǎng)表文件,輸出給廠商的布局布線器進行布局布線。布局布線結(jié)果還可反標回同一仿真器,進行包括功能和時序的后驗證,以保證布局布線所帶來的門延時和線延時不會影響設計的性能。 自頂向下設計方法的優(yōu)越性是顯而易見的。首先,由于功能描述可完全獨立于芯片結(jié)構,在設計的最初階段,設計師可不受芯片結(jié)構的約束,集中精力進行產(chǎn)品設計,避免了傳統(tǒng)設計方法所帶來的重新再設計風險,大大縮短了設計周期。其次,設計的再利用得到保證。目前的電子產(chǎn)品正向模塊化發(fā)展所謂模塊化就是對以往設計成果進行修改,組合和再利用,產(chǎn)生全新的或派生設計,而自頂向下設計方法的功能描述可與芯片結(jié)構無關。因此可以以一種IP的方式進行存檔,以便將來的重新利用。 第三,設計規(guī)模大大提高。簡單的語言描述即可完成復雜的功能,而不需要手工繪圖。第四,芯片選擇更加靈活。設計師可在較短的時間內(nèi)采用各種結(jié)構芯片來完成同一功能描述,從而在設計規(guī)模、速度、芯片價格及系統(tǒng)性能要求等方面進行平衡,選擇最佳結(jié)果。 3.2頂層設計源程序及其仿真波形 module sem_drive (oSEG0, oSEG1, oSEG2, oSEG3, oSEG4, oSEG5, oSEG6, oSEG7, //output to 8 SEG iDIG ); //input 8-BCD code (4*8=32bit) input [31:0] iDIG; output [6:0] oSEG0,oSEG1,oSEG2,oSEG3,oSEG4,oSEG5,oSEG6,oSEG7;
wire [31:0] iDIG; wire [6:0] oSEG0,oSEG1,oSEG2,oSEG3,oSEG4,oSEG5,oSEG6,oSEG7;
SEG7_LUT U0 (.oSEG(oSEG0),.iDIG(iDIG[3:0])); SEG7_LUT U1 (.oSEG(oSEG1),.iDIG(iDIG[7:4])); SEG7_LUT U2 (.oSEG(oSEG2),.iDIG(iDIG[11:8])); SEG7_LUT U3 (.oSEG(oSEG3),.iDIG(iDIG[15:12])); SEG7_LUT U4 (.oSEG(oSEG4),.iDIG(iDIG[19:16])); SEG7_LUT U5 (.oSEG(oSEG5),.iDIG(iDIG[23:20])); SEG7_LUT U6 (.oSEG(oSEG6),.iDIG(iDIG[27:24])); SEG7_LUT U7 (.oSEG(oSEG7),.iDIG(iDIG[31:28]));
endmodule 3.2.1系統(tǒng)頂層RTL 電路圖

圖3-1系統(tǒng)頂層RTL 電路圖 4總結(jié) 在這次設計中遇到了很多實際性的問題,在實際設計中才發(fā)現(xiàn),書本上理論性的東西與在實際運用中的還是有一定的出入的,所以有些問題不但要深入地理解,而且要不斷地更正以前的錯誤思維。一切問題必須要靠自己一點一滴的解決,而在解決的過程當中你會發(fā)現(xiàn)自己在飛速的提升。對于教材管理系統(tǒng),其程序是比較簡單的,主要是解決程序設計中的問題,而程序設計是一個很靈活的東西,它反映了你解決問題的邏輯思維和創(chuàng)新能力,它才是一個設計的靈魂所在。因此在整個設計過程中大部分時間是用在程序上面的。很多子程序是可以借鑒書本上的,但怎樣銜接各個子程序才是關鍵的問題所在,這需要對系統(tǒng)的結(jié)構很熟悉。通過這次設計我也發(fā)現(xiàn)了自身存在的不足之處,雖然感覺理論上已經(jīng)掌握,但在運用到實踐的過程中仍有意想不到的困惑,經(jīng)過一番努力才得以解決。
完整的Word格式文檔51黑下載地址:
肖力全20125024033.doc
(422 KB, 下載次數(shù): 17)
2018-11-21 17:03 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|