引言 FPGA 是現場可編程門陣列(Field Programmable Gate Array)的簡稱。FPGA器件及其開發系統是開發大規模數字集成電路的新技術。它利用計算機輔助設計,繪制出實現用戶邏輯的原理圖、編輯布爾方程或用硬件描述語言等方式作為設計輸入;然后經一系列轉換程序、自動布局布線、模擬仿真的過程;最后生成配置FPGA器件的數據文件,對FPGA器件初始化。這樣就實現了滿足用戶要求的專用集成電路,真正達到了用戶自行設計、自行研制和自行生產集成電路的目的。 FPGA是一種半定制的集成電路,其特點是直接面向用戶,具有極大的靈活性和通用性,開發效率高,硬件測試和實現快捷,工作可靠性好而且技術維護簡單。 隨著電子技術的發展,集成電路的規模越來越大,復雜程度也越來越高。對于如此大規模的和復雜程度的電路設計問題,傳統的門級描述方法顯得過于瑣碎和難以管理。而VHDL語言具有強大的功能,覆蓋面廣,描述能力強,可用于從門級、電路級直至系統級的描述、仿真和綜合。下面簡要介紹了VHDL語言。 VHDL的英文全名是Very-High-Speed Intergrated Circuit Hardware Description Language誕生于1982年。1987年底,VHDL被IEEE和美國國防部確認為標準硬件描述語言。自IEEE公布了VHDL的標準版本,IEEE-1076(簡稱87版)之后,各EDA公司相繼推出了自己的VHDL設計環境,或宣布自己的設計工具可以和VHDL接口。此后VHDL在電子設計領域得到了廣泛的接受,并逐步取代了原有的非標準的硬件描述語言。1993年,IEEE對VHDL進行了修訂,從更高的抽象層次和系統描述能力上擴展VHDL的內容,公布了新版本的VHDL,即IEEE標準的1076-1993版本(簡稱93版)。現在,VHDL和Verilog作為IEEE的工業標準硬件描述語言,又得到眾多EDA公司的支持。在電子工程領域,已成為事實上的通用硬件描述語言。有專家認為:在新的世紀中,VHDL與Verilog語言將承擔起大部分的數字系統設計任務。VHDL主要用于描述數字系統的結構、行為、功能和接口。除了含有許多具有硬件特征的語句外,VHDL的語言形式和描述風格與句法是十分類似于一般的計算機高級語言。VHDL的程序結構特點是將一項工程設計——或稱設計實體(可以是一個元件,一個電路模塊或一個系統)分成外部(或稱可視部分,及端口)和內部(或稱不可視部分),即設計實體的內部功能和算法完成部分。在對一個設計實體定義了外部界面后,一旦其內部開發完成后,其它的設計就可以直接調用這個實體。這種將設計實體分成內外部分的概念是VHDL系統設計的基本點。 Quartus II是Altera公司推出的CPLD/FPGA集成化開發軟件,可以完成設計輸入、邏輯綜合、布局與布線、仿真、時序分析、硬件配置完整的PLD設計流程。QuartusⅡ提供了多種設計輸入方式、快速的編譯和直接易懂的器件編程。具有友好的用戶界面, 快速的綜合速度和更優化的綜合和適配功能。Quartus II自帶宏功能模塊庫,大大減輕了用戶的工作量,加快設計速度。Quartus II 內置仿真器可以在工程中仿真任何設計。可進行功能仿真、時序仿真來檢驗設計的邏輯功能和計算設計的內部定時是否符合設計。仿真器可以仿真整個設計,或仿真設計的任何部分。支持可編程系統(SOPC)和大規模FPGA設計開發,集系統級設計、嵌入式軟件開發、可編程邏輯設計于一體,是一種綜合性的開發平臺。 該軟件支持Altera公司的Stratix Ⅱ、Stratix GX、Stratix、MAX3000A、MAX 7000B、MAX 7000AE、MAX Ⅱ、FLEX6000、FLEX10K系列、Cyclone、CycloneⅡ、APEX Ⅱ、APEX20K和ACEX1K系列。 1 整體設計方案 設計基于FPGA的計數器,要求顯示1個0-9999的四位計數器,可以由4個模塊為10的十進制計數器級聯而成,所以可以顯示的頻率范圍是1-9999HZ。因此頻率計的功能分割成四個模塊:分頻計、計數器、輸出鎖存器和譯碼顯示電路。各個模塊均用VHDL語言描述并用QuartusⅡ進行仿真。本設計采用數控分頻計可以對信號實現不同分頻比輸出信號作為計數器輸入。鎖存器由一個外部脈沖控制可以控制顯示部分顯示周期。當系統正常工作時,輸入信號標提供頻率,經過分頻器分頻,產生計數信號送入計數器模塊,計數模塊對輸入的脈沖個數進行計數數結束后將計數結果送入鎖存器中,保證系統可以穩定顯示數據,計數結果能夠顯示在七段數碼顯示管上。 
圖1-1整體設計方案 2各功能模塊設計及仿真 2.1分頻器的設計 2.1.1分頻器設計原理 嵌入式設備品種繁多而且性能差異也十分巨大。有些嵌入式設備如VoIP電話,簡單的車載系統,簡單的機頂盒等,由于它們的任務單一,功能簡單,因此計算能力和存儲空間都很有限。采用這些設備進行移植顯然是不現實的。因此,在嵌入式設備的選擇上,本項目將移植的目標設備定位在具有一定計算能力和存儲空間的中高端嵌入式設備上。比較有代表性的嵌入式設備包括:中高端PDA,中高端智能電話,中高端機頂盒等。此外,為了加快移植的速度,減短開發周期,因此,將嵌入式設備的硬件平臺選擇為X86體系結構的硬件平臺。在數字邏輯電路設計中,分頻器是一種基本電路,通過分頻可以得到需要的時鐘頻率。常見的分頻器有二進制分頻器、偶數次分頻器、奇數次分頻器、占空比可調的分頻器和小數分頻器。分頻的方法很多最常見的就是利用加法器對時鐘信號進行分頻,當然也可以利用一些專用的電路結構來實現。 數控分頻器的功能是在輸入端給定不同數據時,將對輸入的時鐘信號有不同的分頻比,對于一個N分頻器,分頻出的時鐘周期是原時鐘周期的N倍,頻率變為原來的1/N。對于一個8位計數器,如果輸入數D,然后啟動計數器工作,則經過D倍的時鐘周期計數器溢出時,輸出full變為高電平,再以full為敏感信號,對fout進行取反操作,如此N=2D。計數一次后,再重新計數,反復進行直至輸入被賦予新值。對于數控分頻數器,裝載不同的計數初始值時,會有不同頻率的溢出信號,從而得到不同的輸出。數控分頻器是利用計數值可并行預置的加法計數器設計完成的。 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計數器的設計 2.2.1分頻器設計原理 計數是一種最簡單基本的運算,計數器就是實現這種運算的邏輯電路,計數器在數字系統中主要是對脈沖的個數進行計數,以實現測量、計數和控制的功能,同時兼有分頻功能,計數器是由基本的計數單元和一些控制門所組成,計數單元則由一系列具有存儲信息功能的各類觸發器構成,這些觸發器有RS觸發器、T觸發器、D觸發器及JK觸發器等。計數器在數字系統中應用廣泛,如在電子計算機的控制器中對指令地址進行計數,以便順序取出下一條指令,在運算器中作乘法、除法運算時記下加法、減法次數,又如在數字儀器中對脈沖的計數等等。計數器可以用來顯示產品的工作狀態,一般來說主要是用來表示產品已經完成了多少份的折頁配頁工作。它主要的指標在于計數器的位數,常見的有3位和4位的。很顯然,3位數的計數器最大可以顯示到999,4位數的最大可以顯示到9999。在數字電子技術中應用的最多的時序邏輯電路。計數器不僅能用于對時鐘脈沖計數,還可以用于分頻、定時、產生節拍脈沖和脈沖序列以及進行數字運算等。但是并無法顯示計算結果,一般都是要通過外接LCD或LED屏才能顯示。 2.2.2六十進制計數器 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六十進制計數器RTL電路圖 2.3鎖存器的設計2.3.1鎖存器設計原理所謂鎖存器,就是輸出端的狀態不會隨輸入端的狀態變化而變化,僅在有鎖存信號時輸入的狀態被保存到輸出,直到下一個鎖存信號到來時才改變。典型的鎖存器邏輯電路是D 觸發器電路。在LED和數碼管顯示方面,要維持一個數據的顯示,往往要持續的快速的刷新。尤其是在四段八位數碼管等這些要選通的顯示設備上。在人類能夠接受的刷新頻率之內,大概每三十毫秒就要刷新一次。這就大大占用了處理器的處理時間,消耗了處理器的處理能力,還浪費了處理器的功耗。鎖存器的使用可以大大的緩解處理器在這方面的壓力。當處理器把數據傳輸到鎖存器并將其鎖存后,鎖存器的輸出引腳便會一直保持數據狀態直到下一次鎖存新的數據為止。這樣在數碼管的顯示內容不變之前,處理器的處理時間和IO引腳便可以釋放。可以看出,處理器處理的時間僅限于顯示內容發生變化的時候,這在整個顯示時間上只是非常少的一個部分。而處理器在處理完后可以有更多的時間來執行其他的任務。這就是鎖存器在LED和數碼管顯示方面的作用:節省了寶貴的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七段數碼管顯示原理 對于人機交互式單片機系統來說,不僅需要響應用戶輸入,同時也需要將一些測控信息輸出顯示。這些顯示信息可以提供實時的數據或圖形結果,以便于掌握系統的狀態并進行分析處理。目前,最常用的是LED數碼管顯示。其成本低廉、使用簡便,可以顯示數字或幾個特定的字符。數碼管數碼管的一種是半導體發光器件,數碼管可分為七段數碼管和八段數碼管,區別在于八段數碼管比七段數碼管多一個發光二極管單元,其基本單元是發光二極管。數碼管通過對其不同的管腳輸入相對的電流,使其發亮,從而顯示出數字能夠顯示時間、日期、溫度等所有可用數字表示的參數的器件。在電器特別是家電領域應用極為廣泛,如顯示屏、空調、熱水器、冰箱等等。絕大多數熱水器用的都是數碼管,其他家電也用液晶屏與熒光屏。 2.4.2七段數碼管顯示源程序及波形仿真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系統頂層設計 3.1自頂向下的設計方法 所謂自頂向下設計方法,就是采用可完全獨立于芯片廠商及其產品結構的描述語,在功能級對設計產品進行定義,并結合功能仿真技術,以確保設計的正確性,能定義完成后,利用邏輯綜合技術,把功能描述轉換成某一具體結構芯片的網表文件,輸出給廠商的布局布線器進行布局布線。布局布線結果還可反標回同一仿真器,進行包括功能和時序的后驗證,以保證布局布線所帶來的門延時和線延時不會影響設計的性能。 自頂向下設計方法的優越性是顯而易見的。首先,由于功能描述可完全獨立于芯片結構,在設計的最初階段,設計師可不受芯片結構的約束,集中精力進行產品設計,避免了傳統設計方法所帶來的重新再設計風險,大大縮短了設計周期。其次,設計的再利用得到保證。目前的電子產品正向模塊化發展所謂模塊化就是對以往設計成果進行修改,組合和再利用,產生全新的或派生設計,而自頂向下設計方法的功能描述可與芯片結構無關。因此可以以一種IP的方式進行存檔,以便將來的重新利用。 第三,設計規模大大提高。簡單的語言描述即可完成復雜的功能,而不需要手工繪圖。第四,芯片選擇更加靈活。設計師可在較短的時間內采用各種結構芯片來完成同一功能描述,從而在設計規模、速度、芯片價格及系統性能要求等方面進行平衡,選擇最佳結果。 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系統頂層RTL 電路圖

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