第一篇:用FPGA設計MP3個人數字播放機
引 言
MPEG(活動影像專業人員組織)是為數字音頻確定單一編碼和解碼(壓縮/解壓縮)方法于1988年建立的。1992年,國際標準組織(ISO)和國際電工委員會(IEC)為音頻和視頻編碼建立了MPEG1(ISO/IEC11172)標準。這使得業內在處理新數字世紀出現的各種類型音頻/視頻媒體
時統一在單一格式上。
隨著以數字形式存儲和播放音樂的MPEG Audio Layer3(MP3)格式的發展,個人數字播放機市場開始出現巨大的發展機會。非壓縮的音頻磁軌的MP3數字文件只有原來磁軌大小的1/10。能保持74分鐘數字音頻錄音時間的650Mbytes讀寫CD可以保持740分鐘MP3壓縮音頻數據。數字播放機的一般解決方案是采用軟件形式(如基于Windows或其他OS基礎上的“Internet Audio Player”)或硬件形式(如“Portable MP3 Player”)。如Diamond Multimedia公司的Rio PMP300和Rio PMP500 MP3數字播放機分別采用Actel公司的A40MX04和A40MX09 FPGA實現其特殊應用功能。FPGA能滿足整個系統的價格、功耗和性能要求。A40MX04提供547個邏輯模塊,它們可配置做為組合邏輯或273個觸發器和實現接口邏輯的69個I/O。A40MX04和A40MX09很容易滿足48MHz速度要求。它們靈活的結構使系統設計人員能在每種MP3播放機
中最佳地實現各種功能。
MP3數字播放機系統要求
MP3播放機有兩個基本工作模式:下載模式和播放模式。在下載模式中,在PC上運行的軟件允許用戶下載MP3文件到播入機中的閃存卡。一旦把所有文件下載完,播放機與PC斷開,并通過耳機收聽下載的音樂。MP3播放機有不同的播放選擇控制,如播放、快進、快倒、停止/暫停、音量控制、隨機播放和重復播放功能。
MP3播放機包含可輸入到PC的軟件。軟件提供用戶接口以便通過PC并行端口選擇、定序和下載不同音樂的MP3文件到播放機。圖1示出系統級框圖。
通過并行端口下載音樂到播放機,其速率大約為每1MB編碼音樂10秒。MP3播放機的小尺寸對所有元件的物理尺寸有嚴格限制。另外,MP3播放機是便攜、電池供電裝置,需要工作在大約180mW低功率下。這兩個因素對功能設計的元件選擇有很大的影響。
用FPGA實現MP3系統
圖2示出Rio PMP500系統框圖,其中A42MX09 FPGA做為接口FPGA,它包含CPU接口、帶ECC(Error Correcting Code)支持的閃存和靈巧存儲器接口、時鐘產生邏輯、功能控制邏輯和
鍵功能檢測邏輯單元。
A42MX09中的CPU I/F單元提供與系統CPU(NECD78P064GC微控制器,帶集成LCD控制器)的通信通路。CPU運行在2.5MHz,控制整個系統的工作。對于任何所需要的操作,CPU喚醒系統并設置整個系統。CPU存取系統存儲器和管理整個閃存的配置、編程和存取。CPU有一個到MP3處理器的接口。MP3從閃存讀的數據由CPU寫到MP3處理器。MP3處理器譯碼MP3數據并把數據送到DAC,以便模擬輸出到耳機。
A42MX09中的靈巧存儲器接口單元是連接靈巧存儲器卡的接口。靈巧存儲器卡是一個外部閃存,用來增加整個系統存儲器以便在播放機中存儲更多的歌曲。到靈巧存儲器卡的信號接口非
常類似于閃存接口。
閃存接口單元用于控制閃存,閃存保存通過并行端口下載的MP3文件。另外,ECC用Hamming碼函數實現。Hamming碼是一種FEC(Forward Error Correction)工具,當所用數據通過噪聲媒體時FEC能校正錯誤。原始數據具有額外的校驗位附加在每個字組以生成一個碼字。這些額外位用“Block Parity”機理計算。采用模2運算用數據位來生成矩陣G得到Hamming碼字。這需要乘法功能,而用A42MX09中的邏輯模塊的組合功能很容易實現乘法功能。
A42MX09中的時鐘產生器從48MHz輸入時鐘產生驅動器件內部不同邏輯單元所需的不同時鐘。時鐘產生邏輯單元由觸發器和組合邏輯構成分頻器。A42MX09中的鍵盤檢測單元用于改變播放機的設置。鍵盤接口單元一般由檢測鍵盤陣列中連接點(根據按鍵)的邏輯單元構成并把按鍵轉變為與該鍵相關的功能。根據按鍵檢測執行適當的功能。陣列由寄存器、鎖存器和組合邏輯
實現。
Rio MP3播放機的功率由MAX1M1705器件控制,而1705由FPGA功耗控制單元控制。MP3播放機一般由單節1.5V電池供電。電池最少應能維持12小時聽所有下載的音樂。功率控制是Rio MP3播放機的一個顯著的特點。功率控制器件有兩種功率工作模式:PFM(脈沖頻率調制)和
PWM(脈寬調制)模式。
PFM模式是低靜態電流待機模式,此模式提供120mA總輸出電流并降低靜態功耗到500uW。PWM模式是高功耗模式,能提供高達450mA輸出電流。當MP3播放機處于停機狀態時,CPU編程寫FPGA的一個寄存器,從而產生MODE信號置MAX1M器件進入PFM低功率模式。在PFM模式Rio MP3播放機功耗只有2mW~3mW。當MP3播放機工作時,MODE信號改變MAX1M器件到PWM模式。Rio MP3播放機工作狀態時的總功率大約在180mW左右。
下一代MP3系統 下一代MP3系統將改變現在的系統,能提供更快的下載、更多的用于播放的音樂文件和更多的用戶從接口/鍵面板選擇。更快的下載可通過采用高速并行端口模式(見IEEE1284)或USB端口實現。采用高密度閃存連同本地SDRAM基歌曲高速緩沖存儲器可提供更多音樂文件播放并可提供另外的選擇,如快速播放、快進、慢播放、編程播放等。其他選擇可包括紅外收發器,可使用戶從播放機到播放機來回發射數據或執行某些遠程控制操作。整個系統可用一個FPGA實現,不需要CPU。在FPGA中的音頻DAC控制器邏輯單元可提供I2C接口來控制音頻DAC,音頻DAC通過I2C接口取串行音頻數據并變換為模擬音頻提供給耳機。
其他新的壓縮方法正在涌現,其中ATRAC3(Adaptive Transform Acoustic Coding—自適應變換聲頻編碼)標準可壓縮CD音樂數據10:1而又能保持CD音質。ATRAC3特點是:
1、通過頻帶分裂濾波器和MDCT(Modified Discrete Cosine Transforms—改進式離散余弦變換)
對信號分析獲得的。
2、位率壓縮。利用ATRAC3技術,能實現音樂信號的高效率壓縮。
結語
利用FPGA實現MP3數字播放機的主要接口FPGA功能,可有效地滿足系統的性能、功率、價
格和尺寸要求。
第二篇:基于FPGA的CDMA數字基帶系統設計
摘 要
隨著現代通信技術的發展,特別是移動通信技術的高速發展,CDMA技術越來越被人們所關注。而基于FPGA的CDMA數字基帶系統正是一種新興的具有很大可行性的技術。本文給出了CDMA數字基帶收發系統的設計方案,并以Xilinx ISE 8.1為硬件開發平臺,利用FPGA實現了4路信息信號的擴頻、編碼調制和解擴、解調、驗證了初始方案的可行性。運用VHDL語言,實現對CDMA通訊系統的上行鏈路數字部分進行設計,對有關模塊的編譯,編譯通過后的結果,以及使用Xilinx系列芯片通過仿真得到波形,證明了整個系統原理和設計提出的正確性。關鍵詞:CDMA;數字基帶;FPGA;Xilinx
目錄
1.課程設計目的...............................................................................................................1 2.軟、硬件環境介紹.....................................................................................................1 4.CDMA基帶傳輸系統簡介..........................................................................................2 5.CDMA基帶系統設計....................................................................................................2
5.1 系統設計平臺...............................................................................................................2 5.2 CDMA系統設計原理......................................................................................................2
6.系統總體設計...........................................3
6.1 CDMA的整體設計框圖..................................................................................................3 6.2 利用VHDL語言編程實現的分頻電路模塊.................................................................4
7.本系統完成的功能.......................................4
7.1 Walsh碼發生器............................................................................................................4 7.1.1 生成Walsh碼調制(地址編碼)的模塊圖...........................................................5 7.2 PN碼、信息碼發生器..................................................................................................5 7.2.1 生成PN擴頻的模塊圖.............................................................................................5 7.3 調制與解調...................................................................................................................6
8.程序代碼..............................................7
8.1 分頻器模塊...................................................................................................................7 8.2 PSK模塊........................................................................................................................7 8.3串并轉換模塊................................................................................................................8
9.仿真調試與結果.........................................9 10.設計心得體會.........................................11 11.參考文獻.............................................12
1.課程設計目的
《應用電子技術綜合實訓》是電子信息工程專業技術教育的重要實踐教學環 節,對學生掌握基本理論、運用基本知識、訓練基本技能和達到技術教育培養目標的要求有著十分重要的意義和作用。通過對具體應用電子電路的設計和開發過程的練習,加深學生對基礎理論的理解,掌握設計電路、開發電路和實現電路的能力,能熟練應用開發軟件。培養學生獨立思考、解決實際工程問題的能力,為專業理論知識的學習和專業技能訓練打好堅實的基礎。
2.軟、硬件環境介紹
1.軟件環境:Windows XP操作系統、Xilinx ISE8.1 EDA集成開發環境; 2.硬件環境:個人計算機一臺
3.Xilinx ISE8.1 EDA集成開發環境介紹:
ISE的全稱為Integrated Software Environment,即“集成軟件環境”,是Xilinx公司的硬件設計工具。相對容易使用的、首屈一指的PLD設計環境。ISE將先進的技術與靈活性、易使用性的圖形界面結合在一起,能在最短的時間,以最少的努力,達到最佳的硬件設計。
Xilinx公司的ISE開發設計軟件的工程設計流程,具體分為五個步驟:即輸入(Design Entry)、綜合(Synthesis)、實現(Implementation)、驗證(Verification)、下載(Download)。4.Xilinx公司介紹:
Xilinx(賽靈思)是全球領先的可編程邏輯完整解決方案的供應商。Xilinx研發、制造并銷售范圍廣泛的高級集成電路、軟件設計工具以及作為預定義系統級功能的IP(Intellectual Property)核。客戶使用Xilinx及其合作伙伴的自動化軟件工具和IP核對器件進行編程,從而完成特定的邏輯操作。Xilinx公司成立于 1984年,Xilinx首創了現場可編程邏輯陣列(FPGA)這一創新性的技術,并于1985年首次推出商業化產品。眼下Xilinx滿足了全世界對 FPGA產品一半以上的需求。Xilinx產品線還包括復雜可編程邏輯器件(CPLD)。在某些控制應用方面CPLD通常比FPGA速度快,但其提供的邏輯資源較少。Xilinx可編程邏輯解決方案縮短了電子設備制造商開發產品的時間并加快了產品面市的速度,從而減小 了制造商的風險。與采用傳統方法如固定邏輯門陣列相比,利用Xilinx可編程器件,客戶可以更快地設計和驗證他們的電路。而且,由于Xilinx器件是只需要進行編程的標準部件,客戶不需要象采用固定邏輯芯片時那樣等待樣品或者付出巨額成本。Xilinx產品已經被廣泛應用于從無線電話基站到DVD播放機的數字電子應用技術中。
4.CDMA基帶傳輸系統簡介
CDMA(Code Division Multiple Access)是在數字通信技術的分支擴頻通信的基礎上發展起來的一項技術。它主要用于利用相互正交(或者盡可能正交)的不同編碼分配給不同用戶調制信號,實現多用戶同時使用同一頻率接入系統和網絡的通信。本文針對 CDMA 碼分多址技術設計1個4路用戶傳輸系統 , 省去了載波調制部分 , 把 CDMA擴頻系統中傳輸的信號簡化為數字基帶信號 , 并做出一個與之相應的擴頻編碼調制收發系統,系統采用Walsh 函數正交碼作為地址碼調制原數據信號 , 選用m序列作為擴頻的偽隨機碼。
5.CDMA基帶系統設計
5.1 系統設計平臺
開發工具軟件采用Xilinx公 司 的 EDA 工 具Xilinx ISE。利用 ISE中提供的編程語言設計方法和圖形設計方法實現系統各部分的功能。
5.2 CDMA系統設計原理
CDMA技術基于擴頻通信的基本原理,將要傳送的具有一定信號帶寬的信息數據,用一個帶寬遠大于信號帶寬的高速偽隨機編碼信號去調制它,使原信息數據信號的帶寬被大大擴頻,再經載波調制后發射出去。接收端則使用完全相同的偽隨機碼,與接收的帶寬信號做相關處
理,把寬帶信號變換成信息數據的窄帶信號(解擴)實現數據通信。這種擴頻通信的明顯特點是采用編碼調制、頻譜擴頻和相關處理技術。使用擴頻編碼調 制易于保密也可供多用戶使用。另外,對信息數據的頻譜擴展,使功率譜密度明顯降低,既不容易被別人發現又不容易干擾別人。CDMA通信多址干擾的大小決定于擴頻編碼間的互相關值,如果該值非常小乃至可以忽略,那么接收調解輸出結果就只有原數據信號和噪聲。所以CDMA可在同一載波頻率上同時傳送多個用戶的信息、數據、實現多址通信。編碼之間的互相關值越小,多址通信用戶就越多。
6.系統總體設計
6.1 CDMA的整體設計框圖
整體框圖如圖 1 所示。
說明:圖 1 中“→”表示信號是1路, “→”表示信號是 4路。觸發時鐘 : 該收發系統受同步時鐘控制,在全局時鐘的基礎上進行分頻,詳見表1。
表 1 觸發時鐘分頻
圖1 CDMA基帶收發系統概念框圖 6.2 利用VHDL語言編程實現的分頻電路模塊
圖2.實現的多分頻模塊圖
7.本系統完成的功能
本收發系統主要由調制器和解調器兩部分組成。它們完成的功能如下:(a)調制器:內嵌于編碼器中的信息信號發生器產生的 4 路輸入信號,經 Walsh 調制、PN 擴頻、基帶求和與并串變換成為 1 路信號,完成調制。
(b)解調器:接收端將收到的 1 路信號首先進行串并變換,在取得同步的基礎上進行 PN 解擴和 Walsh 解調,恢復出 4 路輸入信息。
7.1 Walsh碼發生器
Walsh函數是一種非正弦的完備正交函數集。由于它采用的是數字系統,比較適合于用來表達和處理數字信號。考慮到是數字基帶系統 , 本系統采用的 Walsh 碼組應為:
W1={1,1,1,1};W2={1,0,1,0};W3={1,1,0,0};W4={1,0,0,1}。
該發生器利用 ISE 編程實現較簡單,在 Walsh碼時鐘(全局時鐘的 24 分頻)的控制下,每出現一次時鐘跳變事件,輸出端以4為周期依次輸出1111,1010,1100和1001的碼序列。
沃爾什(Walsh)碼是正交碼,經常被用作碼分多址系統的地址碼,Walsh碼產生模塊作為擴頻傳輸的地址碼,并且具有檢測使用中的兩路Walsh碼是否正交 的功能。本設計中使用Walsh,存儲在發射端數據寄存器中,擴頻過程中根據 Walsh碼的地址控制信號。抽取兩路 Walsh 碼分別對兩路消息碼進行擴頻。接收端截獲串行的數字信息流后,從接收端的數據寄存器中取出 Walsh 碼對接收信號進行解擴。Walsh 碼電路的設計思路運用了譯碼的原理來實現。
7.1.1 生成Walsh碼調制(地址編碼)的模塊圖
Walsh 碼調制所生成的模塊圖為圖3所示。
圖3 Walsh碼調制模塊圖
Walsh 碼調制的仿真圖為圖 4所示。
圖4 Walsh碼調制仿真結果圖
7.2 PN碼、信息碼發生器
利用7個D觸發器相互級聯實現周期為 127 的 PN 序列。具體構成依據 m 序列特征多項式 , 由 ISE提供圖形設計方法實現。PN 碼時鐘為全局時鐘的 3 分頻。信息碼的產生則只需在信息碼時鐘的控制下 , 從同樣的級聯中引出 4 路信號作為信息碼 , 信息碼時鐘為全局時鐘的 96 分頻。
7.2.1 生成PN擴頻的模塊圖
由 PN 擴頻所生成的模塊圖為圖5所示。
圖5 PN 擴頻所生成的模塊圖
7.3 調制與解調
在數字基帶系統中,Walsh 碼調制可以簡單地用同或門來實現,而PN擴頻則可通過簡單的異或門實現。在實現 Walsh 碼解調與解擴時 ,PN 解擴只需在接收端加 1 異或門。下面著重介紹一下 Wlash 碼解調的方法———相關檢測。
相關檢測原理舉例解釋(見表 2)。
表2相關原理檢測舉例解釋
Walsh調制碼即原信息碼與Walsh 碼同或 , 所得 4 路碼統計所得 1 的個數并轉化成相應 3 比特并行碼 , 例如表中 Walsh編碼的第 1 列轉化為010,第2列為100。在接收端則根據傳遞來的接收信息逐路進行相關檢測。相關檢測 規則列于表 3 中。
表3 相關檢測規則 8.程序代碼
8.1 分頻器模塊
module clk_div(clk_in,rst_n,clk_out);parameter cnt_top=10;clk_in/clk_out=cnt_top; parameter width=4;parameter duty=50;input clk_in;input rst_n;output clk_out;reg clk_out;reg [width-1:0]cnt;always@(posedge clk_in or negedge rst_n)begin if(!rst_n)cnt<=0;else if(cnt==(cnt_top-1))cnt<=0;else cnt<=cnt+1'b1;end always@(posedge clk_in or negedge rst_n)begin if(!rst_n)clk_out<=0;else if(cnt<(cnt_top*duty)/100)clk_out<=1;else clk_out<=0;end endmodule 8.2 PSK模塊
module pskmod(clk,rst,seq,in,out);input clk,rst,seq;input [7:0] in;output [7:0] out;reg [7:0] out;always @(posedge clk or negedge rst)begin if(!rst)out=0;else begin if(seq)out=in;else out=~in;end end endmodule 8.3串并轉換模塊
module ser2par2(clk,rst,in,out,flag);//serial to parallel input clk,rst;input in;output flag;output [3:0]out;reg [3:0]out;reg [1:0]cnt;reg flag;always @(posedge clk or negedge rst)begin if(!rst)begin out=0;end else begin case(cnt)2'b00:out[0]=in;2'b01:out[1]=in;2'b10:out[2]=in;2'b11:out[3]=in;default:out[0]=in;endcase end end always @(posedge clk or negedge rst)begin if(!rst)flag=0;else begin cnt=cnt+1;if(cnt==2'b11)flag=1;else flag=0;end end endmodule 9.仿真調試與結果
點擊processes框下的modelsim simulator中Simulation Behavioral Model,調用Modelsim對模塊進行仿真。(注,同一時刻僅能有一個modelsim打開)。雙擊后調用modelsim,在彈出的modelsim界面中,已有部分仿真結果,如圖6所示。
圖6 軟件仿真界面
在transcript框中輸入“restart”,在彈出的對話框中選ok。各端口信號 清空,如圖7所示。
圖7 清空端口信號 在transcript框中輸入命令,run 10us。仿真運行10us。查看仿真功能。驗證程序設計正確性。由于數字信號不易查看輸出信號的變化,因而可在輸出波形窗口對應信號上單擊右鍵,選擇format->analog(automatic), 得到模擬信號波形進行觀察,如圖8所示。
圖8 波形仿真結果
10.設計心得體會
通過這次課程設計,我深刻的體會到企業局域網建設是一項涉及面廣、技術復雜、周期比較長的系統工程。它既是建設一個集計算機網絡與各類信息的搜集、傳遞、處理、加工為一體的信息樞紐中心,又是一項為企業的生產、經營、產品開發及領導決策服務的綜合工程。設計一個好的局域網需要有清晰的思維和整體布局的能力,總體說來還是一個比較難的工作。
在這次課程設計過程中,通過查找相關書籍和相關資料,也使得自己增長了不少知識。從這次課設我充分認識到自己相關網絡知識的缺乏,雖然也用了很長時間但設計方案還是缺乏一定的可行性。在這次課程設計過程中我也認真閱讀了相關書籍,對局域網有了一定的了解,所以說這次課設我還是收獲不小。11.參考文獻
[1]李棟.多進制擴頻系統的關鍵技術的研究[D].西安:西安電子科技大學出版社,2001.[2]胡兵.自適應陣在碼分多址(CDMA)中的應用[D].西安 :西北工業大學,2001.[3] 李暢怡.基于擴展頻譜和CDMA的數字視頻移動通信研究[D].長沙 :湖南大學,2001.[4] 常娥.突發性擴頻信號的同步技術研究[D].大連 :大連理工大學,2003.[6] R.C.Dixon, Spread Spectrum Systems[M].New York: John Wiley & Sons, 1976.[5] 鄔民鶯.IS-95 CDMA 前向鏈路的研究與仿真[D].大連 :大連海事大學出版社 , 2003.
第三篇:FPGA可調數字時鐘實驗報告
浙江大學城市學院
實驗報告紙
一、實驗要求
1、用vhdl編程,實現10進制計數器
2、用vhdl編程,實現60進制計數器
3、用vhdl編程,實現數字時鐘,時、分、秒、毫秒分別顯示在數碼管上。
4、實現可調數字時鐘的程序設計,用按鍵實現時、分、秒、毫秒的調整。
二、實驗原理
用VHDL,行為級描述語言實現實驗要求。思路如下:
1、分頻部分:由50MHZ分頻實現1ms的技術,需要對50MHZ采取500000分頻。
2、計數部分:采用低級影響高級的想法,類似進位加1的思路。對8個寄存器進行計數,同步數碼管輸出。
3、數碼管輸出部分:用一個撥碼開關控制顯示,當sw0=0時,四位數碼管顯示秒、毫秒的計數。當sw0=1時,四位數碼管顯示時、分得計數。
4、調整部分:分別用四個按鍵控制時、分、秒、毫秒的數值。先由一個開關控制計數暫停,然后,當按鍵按下一次,對應的數碼管相對之前的數值加1,,通過按鍵實現時間控制,最后開關控制恢復計數,完成時間調整。
5、整個實現過程由一個文件實現。
三、實驗過程
各個引腳說明: Clk:50MHZ SW:數碼管切換,SW=’0’時,數碼管顯示為秒,毫秒。SW=’1’時,數碼管顯示為時,分。
SW1:暫停與啟動。SW1=’0’時,時鐘啟動,SW=’1’時,時鐘暫停。
SW2:時鐘調整接通按鈕,當SW2=’0’時,不進行調整,當SW=’1’時,通過按鍵調整時間。
KEY0: 毫秒調整,按一次實現+1功能 KEY1:秒調整,按一次實現+1功能
浙江大學城市學院 實 驗 報 告 紙
KEY2:分調整,按一次實現+1功能 KEY3:時調整,按一次實現+1功能 Q0;第一個數碼管 Q1;第二個數碼管 Q2: 第三個數碼管 Q3: 第四個數碼管
1、源代碼如下:
library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity paobiao is port(clk,sw,key0,key1,key2,key3,sw1,sw2:in std_logic;
q0:out std_logic_vector(6 downto 0);
q1:out std_logic_vector(6 downto 0);
q2:out std_logic_vector(6 downto 0);
q3:out std_logic_vector(6 downto 0));end paobiao;architecture behave of paobiao is signal cntt1 :integer range 0 to 10;signal cntt2 :integer range 0 to 10;signal cntt3 :integer range 0 to 10;signal cntt4 :integer range 0 to 6;signal cntt5 :integer range 0 to 10;signal cntt6 :integer range 0 to 10;signal cntt7 :integer range 0 to 10;signal cntt8 :integer range 0 to 6;浙江大學城市學院 實 驗 報 告 紙
signal cntttt1 :integer range 0 to 10;signal cntttt2 :integer range 0 to 10;signal cntttt3 :integer range 0 to 10;signal cntttt4 :integer range 0 to 6;signal cntttt5 :integer range 0 to 10;signal cntttt6 :integer range 0 to 10;signal cntttt7 :integer range 0 to 10;signal cntttt8 :integer range 0 to 6;
begin
process(clk)--,key0,key1,key2,key3)
variable cnt :integer range 0 to 500000;
--variable cnt9 :integer range 0 to 3000000000;
variable cnt1 :integer range 0 to 10;
variable cnt2 :integer range 0 to 10;
variable cnt3 :integer range 0 to 10;
variable cnt4 :integer range 0 to 6;
variable cnt5 :integer range 0 to 10;
variable cnt6 :integer range 0 to 10;
variable cnt7 :integer range 0 to 10;
variable cnt8:integer range 0 to 6;
begin if(clk'event and clk='1')then
if(sw1='0')then if(cnt>=2)then
cnt:=0;
cnt1:=cnt1+1;浙江大學城市學院 實 驗 報 告 紙
if(cnt1=10)then
cnt1:=0;
cnt2:=cnt2+1;
if(cnt2=10)then
cnt1:=0;
cnt2:=0;
cnt3:=cnt3+1;
if(cnt3=10)then
cnt1:=0;
cnt2:=0;
cnt3:=0;
cnt4:=cnt4+1;
if(cnt4=6)then
cnt1:=0;
cnt2:=0;
cnt3:=0;
cnt4:=0;
cnt5:=cnt5+1;
if(cnt5=10)then
cnt5:=0;
cnt6:=cnt6+1;
if(cnt6=6)then
cnt5:=0;
cnt6:=0;
cnt7:=cnt7+1;
if(cnt7=4)then
cnt5:=0;
cnt6:=0;
cnt7:=0;浙江大學城市學院 實 驗 報 告 紙
cnt8:=cnt8+1;
if(cnt8=3)then
cnt5:=0;
cnt6:=0;
cnt7:=0;
cnt8:=0;
end if;
end if;
end if;
end if;
end if;
end if;
end if;
end if;
else cnt:=cnt+1;
end if;
if(sw2='0')then
cntt1<=cnt1;
cntt2<=cnt2;
cntt3<=cnt3;
cntt4<=cnt4;
cntt5<=cnt5;
cntt6<=cnt6;
cntt7<=cnt7;
cntt8<=cnt8;
else
cnt1:=cntttt1;
cnt2:=cntttt2;
cnt3:=cntttt3;浙江大學城市學院 實 驗 報 告 紙
cnt4:=cntttt4;
cnt5:=cntttt5;
cnt6:=cntttt6;
cnt7:=cntttt7;
cnt8:=cntttt8;
cntt1<=cnt1;
cntt2<=cnt2;
cntt3<=cnt3;
cntt4<=cnt4;
cntt5<=cnt5;
cntt6<=cnt6;
cntt7<=cnt7;
cntt8<=cnt8;
end if;
end if;end if;end process;
process(key0)variable cnttt1 :integer range 0 to 10;variable cnttt2 :integer range 0 to 10;begin if(key0'event and key0='0')then
cnttt1:=cnttt1+1;
if(cnttt1=10)then
cnttt1:=0;
cnttt2:=cnttt2+1;
if(cnttt2=10)then 浙江大學城市學院 實 驗 報 告 紙
cnttt2:=0;
end if;
end if;
cntttt1<=cnttt1;
cntttt2<=cnttt2;end if;
end process;process(key1)variable cnttt3 :integer range 0 to 10;variable cnttt4 :integer range 0 to 10;begin if(key1'event and key1='0')then
cnttt3:=cnttt3+1;
if(cnttt3=10)then
cnttt3:=0;
cnttt4:=cnttt4+1;
if(cnttt4=6)then
cnttt4:=0;
end if;
end if;cntttt3<=cnttt3;
cntttt4<=cnttt4;end if;end process;process(key2)variable cnttt5 :integer range 0 to 10;variable cnttt6 :integer range 0 to 10;begin
if(key2'event and key2='0')then 浙江大學城市學院 實 驗 報 告 紙
cnttt5:=cnttt5+1;
if(cnttt5=10)then
cnttt5:=0;
cnttt6:=cnttt6+1;
if(cnttt6=6)then
cnttt6:=0;
end if;
end if;cntttt5<=cnttt5;
cntttt6<=cnttt6;
end if;end process;process(key3)variable cnttt7 :integer range 0 to 10;variable cnttt8 :integer range 0 to 10;begin
if(key3'event and key3='0')then
cnttt7:=cnttt7+1;
if(cnttt7=4)then
cnttt7:=0;
cnttt8:=cnttt8+1;
if(cnttt8=3)then
cnttt8:=0;
end if;
end if;
cntttt7<=cnttt7;
cntttt8<=cnttt8;
end if;浙江大學城市學院 實 驗 報 告 紙
end process;
--end if;--end process;
process(cntt1,cntt5)
begin
if(sw='0')then
case cntt1 is
when 0=>q0<=“1000000”;
when 1=>q0<=“1111001”;
when 2=>q0<=“0100100”;
when 3=>q0<=“0110000”;
when 4=>q0<=“0011001”;
when 5=>q0<=“0010010”;
when 6=>q0<=“0000010”;
when 7=>q0<=“1011000”;
when 8=>q0<=“0000000”;
when 9=>q0<=“0010000”;
when others=>q0<=NULL;end case;else
case cntt5 is
when 0=>q0<=“1000000”;
when 1=>q0<=“1111001”;
when 2=>q0<=“0100100”;
when 3=>q0<=“0110000”;
when 4=>q0<=“0011001”;
when 5=>q0<=“0010010”;
when 6=>q0<=“0000010”;
浙江大學城市學院 實 驗 報 告 紙
when 7=>q0<=“1011000”;
when 8=>q0<=“0000000”;
when 9=>q0<=“0010000”;
when others=>q0<=NULL;end case;
end if;
end process;
process(cntt2,cntt6)
begin if(sw='0')then
case cntt2 is
when 0=>q1<=“1000000”;
when 1=>q1<=“1111001”;
when 2=>q1<=“0100100”;
when 3=>q1<=“0110000”;
when 4=>q1<=“0011001”;
when 5=>q1<=“0010010”;
when 6=>q1<=“0000010”;
when 7=>q1<=“1011000”;
when 8=>q1<=“0000000”;
when 9=>q1<=“0010000”;
when others=>q1<=NULL;end case;else
case cntt6 is
when 0=>q1<=“1000000”;
when 1=>q1<=“1111001”;
when 2=>q1<=“0100100”;浙江大學城市學院 實 驗 報 告 紙
when 3=>q1<=“0110000”;
when 4=>q1<=“0011001”;
when 5=>q1<=“0010010”;
when 6=>q1<=“0000010”;
when 7=>q1<=“1011000”;
when 8=>q1<=“0000000”;
when 9=>q1<=“0010000”;
when others=>q1<=NULL;end case;end if;
end process;process(cntt3,cntt7)
begin
if(sw='0')then
case cntt3 is
when 0=>q2<=“1000000”;
when 1=>q2<=“1111001”;
when 2=>q2<=“0100100”;
when 3=>q2<=“0110000”;
when 4=>q2<=“0011001”;
when 5=>q2<=“0010010”;
when 6=>q2<=“0000010”;
when 7=>q2<=“1011000”;
when 8=>q2<=“0000000”;
when 9=>q2<=“0010000”;
when others=>q2<=NULL;end case;else
case cntt7 is 浙江大學城市學院 實 驗 報 告 紙
when 0=>q2<=“1000000”;
when 1=>q2<=“1111001”;
when 2=>q2<=“0100100”;
when 3=>q2<=“0110000”;
when 4=>q2<=“0011001”;
when 5=>q2<=“0010010”;
when 6=>q2<=“0000010”;
when 7=>q2<=“1011000”;
when 8=>q2<=“0000000”;
when 9=>q2<=“0010000”;
when others=>q2<=NULL;end case;end if;
end process;
process(cntt4,cntt8)
begin if(sw='0')then
case cntt4 is
when 0=>q3<=“1000000”;
when 1=>q3<=“1111001”;
when 2=>q3<=“0100100”;
when 3=>q3<=“0110000”;
when 4=>q3<=“0011001”;
when 5=>q3<=“0010010”;
when others=>q3<=NULL;end case;else
case cntt8 is
when 0=>q3<=“1000000”;浙江大學城市學院 實 驗 報 告 紙
when 1=>q3<=“1111001”;
when 2=>q3<=“0100100”;
when 3=>q3<=“0110000”;
when 4=>q3<=“0011001”;
when 5=>q3<=“0010010”;
when 6=>q3<=“0000010”;
--when 7=>q3<=“1011000”;--when 8=>q3<=“0000000”;--when 9=>q3<=“0010000”;
when others=>q3<=NULL;end case;end if;
end process;end behave;
2、原理圖如下:
浙江大學城市學院 實 驗 報 告 紙
3、功能仿真如下
1、秒、毫秒計數仿真
2、分、時計數仿真
注釋:由于仿真時間限制,小時不能顯示。注意SW由0變成1;
浙江大學城市學院 實 驗 報 告 紙
3、暫停的仿真,數碼管顯示用秒,毫秒。
4、按鍵調整的仿真,主要仿真毫秒的仿真
四、實驗結果
實驗結果均完成所有要求,但有一個bug,在實現調整功能的時候,不能實時調整數碼管暫停下來的數字,只能從之前調整過的數值起開始調整,不過能實現調整之后,開啟時鐘,時鐘即在設定的時間開始跑。當然找到解決的方法,當由于思路和已經 寫好的程序沖突性較大,所以此處不再修改。
五、心得體會
本次實驗在分頻的基礎上進行拓展,同時應用數碼管顯示,開關和按鍵的控制,比較系統的做了一個實驗,對自身的提高還是很有幫助的。
說到心得,此次實驗告訴我一下經驗:
1、在開始寫程序之前最好先評估好自己的思路,簡易畫出想象中的原理圖,再進行編程,對之后的修改有很大的幫助。
2、程序寫長了,發現錯得時候,修改比較麻煩,所有注意編程習慣很重要,適當的加一些注釋,提高程序的可讀性。
3、程序最好分模塊寫,比較清晰。
浙江大學城市學院 實 驗 報 告 紙
第四篇:基于FPGA的數字電子時鐘設計與實現(范文模版)
《數字電子技術》課程設計
設計題目:基于FPGA的數字電子時鐘設計與實現
系 部: 電子與信息工程系 專業班級: 電子信息工程08秋(1)班 小組成員: 胡修遠 學 號: 08031145 指導教師 : 陶亞雄 周麗婕
完成日期: 2012年 1 月
目錄
一、所用設備與器材................................................1 1.1儀器設備...................................................1 二.系統方案......................................................1 2.1 設計思想..................................................1 2.1.1課題背景........................................1 2.1.2 Quartus II軟件.................................3 2.2工作原理及系統框圖.........................................8 三.軟件方案......................................................9 3.1 程序流程圖................................................9 3.1.1 24進制........................................9 3.1.2 10進制流程圖.................................10 3.1.3 6進制........................................11 3.1.4 60進制.......................................11 3.1.5 from0to9......................................12 3.1.6 分頻模塊.......................................12 3.1.7 總流程圖.......................................13 3.2 程序清單.................................................14 3.2.1頭文件complete_clock程序......................14 3.2.2 counter24程序.................................15 3.2.3 counter60程序.................................15 3.2.4 from0to9程序..................................16 3.2.5 counter6程序..................................17 3.2.6 counter10程序.................................17 3.2.7 分頻程序.......................................17 3.2.8 校時模塊程序...................................18 四.調試及結果...................................................18
4.1 模塊仿真.................................................18 4.1.1 counter10模塊仿真.............................18 4.1.2 counter24模塊仿真.............................19 4.1.3 counter60模塊仿真.............................19 4.1.4 分頻模塊仿真...................................19 4.1.5 top_clock計時模塊仿真.........................19 4.2 程序下載.................................................20 4.3分析運行結果..............................................21 4.3.1 設計總結.......................................21 4.3.2 心得體會.......................................21 4.3.3 致謝...........................................22
2012.1
上海師范大學天華學院電信系數字集成器件與應用專業課程設計
一、所用設備與器材
1.1儀器設備
使用儀器設備有FPGA DE2-70開發板、PC機、信號發生器。
圖1 FPGA DE2-70開發板圖
二.系統方案
2.1 設計思想
利用數字電子技術、EDA設計方法、FPGA等技術,設計、仿真并實現一個基于FPGA的數字電子時鐘基本功能,其基本組成框圖如圖1所示,振蕩器采用ALTERA的DE2-70實驗板的50MHz輸出,分頻器將50MHz的方波進行分頻進而得到1Hz的標準秒脈沖,時、分、秒計時模塊分別由二十四進制時計數器、六十進制分計數器和六十進制秒計數器完成,校時模塊完成時和分的校正。擴展功能設計為倒計時功能,從59分55秒至59分59秒,每秒亮一盞燈報時。
2.1.1課題背景
20世紀末,電子技術獲得了飛速的發展,在其推動下,現代電子產品幾乎滲透了社會的各個領域,有力的推動了社會生產力的發展和社會信息化程度的提高,同時也使現代電子產品性能更進一步,產品更新換代的節奏也越來越快。
20世紀80年代末,出現了FPGA(Field Progrommable Gate Array),CAE和CAD技術的應用更為廣泛,它們在PCB設計的原理圖輸入,自動布局布線及PCB分析,以及邏輯設計,邏輯仿真布爾綜合和化簡等方面擔任了重要的角色,2012.1
上海師范大學天華學院電信系數字集成器件與應用專業課程設計
為電子設計自動化必須解決的電路建模,標準文檔及仿真測試奠定了基礎。硬件描述語言是EDA技術的重要組成部分,VHDL是作為電子設計主流硬件的描述語言。本論文就是應用VHDL語言來實現秒表的電路設計。VHDL語言是標準硬件描述語言,它的特點就是能形式化抽樣表示電路結構及行為,支持邏輯設計中層次領域的描述,借用了高級語言的精巧結構簡化電路描述,具有電路模擬與驗證及保證設計的正確性,支持電路由高層向底層的綜合變換,便于文檔管理,易于理解和設計重用。
EDA技術是在電子CAD技術基礎上發展起來的計算機軟件系統,是指以計算機為工作平臺,融合了應用電子技術、計算機技術、信息處理及智能化技術的最新成果,進行電子產品的自動設計。
利用EDA工具,電子設計師可以從概念、算法、協議等開始設計電子系統,大量工作可以通過計算機完成,并可以將電子產品從電路設計、性能分析到設計出IC版圖或PCB版圖的整個過程在計算機上自動處理完成。
現在對EDA的概念或范疇用得很寬。包括在機械、電子、通信、航空航天、化工、礦產、生物、醫學、軍事等各個領域,都有EDA的應用。目前EDA 技術已在各大公司、企事業單位和科研教學部門廣泛使用。例如在飛機制造過程中,從設計、性能測試及特性分析直到飛行模擬,都可能涉及到EDA技術。本文所指的EDA技術,主要針對電子電路設計、PCB設計和IC設計。EDA 設計可分為系統級、電路級和物理實現級。
用VHDL語言開發的流程:(1)文本編輯:用任何文本編輯器都可以進行,也可以用專用的HDL編輯環境。通常VHDL文件保存為.vhd文件。
(2)功能仿真:將文件調入HDL仿真軟件進行功能仿真,檢查邏輯功能是否正確(也叫前仿真,對簡單的設計可以跳過這一步,只在布線完成以后,進行時序仿真)。
(3)邏輯綜合:將源文件調入邏輯綜合軟件進行綜合,即把語言綜合成最簡的布爾表達式和信號的連接關系。邏輯綜合軟件會生成.edf(edif)的EDA工業標準文件。
(4)布局布線:將.edf文件調入PLD廠家提供的軟件中進行布線,即把設計好的邏輯安放到PLD/FPGA內。2012.1
上海師范大學天華學院電信系數字集成器件與應用專業課程設計
3(5)編程下載:確認仿真無誤后,將文件下載到芯片中。
本設計為一個多功能的數字鐘,具有時、分、秒計數顯示功能,以24小時的循環計數:具有校對功能。本設計采用EDA技術,以硬件描述語言VHDL為系統邏輯描述手段設計文件,在Quartus ?工具軟件下,采用自頂向下的設計方式,由各個基本模塊共同構建了一個基本FPGA的數字鐘。
系統主芯片采用EP2C70F896C6,有時鐘模塊、控制模塊、計時模塊、數據譯碼模塊、顯示以及報時模塊組成。經編譯和仿真所設計的程序,在可編程邏輯器件上下載驗證,本系統能夠完成時、分、秒的分別顯示,由按鍵輸入進行數字鐘的校時、清零、啟停功能。
隨著電子技術的發展,數字電路朝著速度快、容量大、體積小、重量輕的方向發展。人們對時間計量的精度要求越來越高,鐘表的數字化給人們生產生活帶來了極大的方便。數字鐘是一種用數字電路技術實現時、分、秒計時的裝置,與機械式時鐘相比具有更高的準確性和直觀性,且無機械裝置,具有更更長的使用壽命,因此得到了廣泛的使用。
本次設計以數字電子為主,實現對時、分、秒數字顯示的計時裝置,周期為24小時,顯示滿刻度為23時59分59秒,并具有校時功能和報時功能的數字電子鐘。課程設計所采用的開發平臺:Quartus II是可編程片上系統的綜合性設計環境,它支持CPLD和FPGA器件的開發。FPGA(Field Programmable Gate Array)現場可編程門陣列,內部主要由許多可編程邏輯模塊組成,靠縱橫交錯的分布式可編程互連線連接起來,可構成極其復雜的邏輯電路。本次課程設計所采用的FPGA芯片 Cyclone II系列的EP2C70F896C6。
2.1.2 Quartus II軟件
Quartus II 是Altera公司的綜合性PLD開發軟件,支持原理圖、VHDL、VerilogHDL以及AHDL(Altera Hardware Description Language)等多種設計輸入形式,內嵌自有的綜合器以及仿真器,可以完成從設計輸入到硬件配置的完整PLD設計程。Quartus II可以在XP、Linux以及Unix上使用,除了可以使用Tcl腳本完成設計流程外,提供了完善的用戶圖形界面設計方式。具有運行速度快,界面統一,功能集中,易學易用等特點。
Quartus II支持Altera的IP核,包含了LPM/MegaFunction宏功能模塊庫,使用戶可以充分利用成熟的模塊,簡化了設計的復雜性、加快了 2012.1
上海師范大學天華學院電信系數字集成器件與應用專業課程設計
設計速度。對第三方EDA工具的良好支持也使用戶可以在設計流程的各個階段使用熟悉的第三方EDA工具。
Quartus II使用基本流程如下: 1.打開Quartus II軟件,創建工程
a.點擊工具欄File,利用創建工程向導(New Project Wizard)創建新工程。
圖2 新建工程圖
b.工程目錄為c:altera71sp1quartus(路徑中不能包含中文,不能建立在桌面上),工程名稱以及頂層設計實體為counter10(以英文字母開頭)。
圖3 創建路徑圖
c.選擇與開發板上芯片型號對應的器件。硬件選cycloneⅡ EP2C70F896C6。
圖4 芯片選擇圖
d.進入第三方EDA工具選擇窗口,在此可以選擇使用第三方的EDA工具,如一些布局布線、綜合、仿真軟件。
e.確認無誤后,單擊Finsh完成工程創建。2012.1
上海師范大學天華學院電信系數字集成器件與應用專業課程設計
f.工程創建成功后,在【Project Navigator】(資源管理窗口)顯示當前工程的層次、文件和設計單元。
g.執行File—New—Design Files—verilog HDL File,建立原理圖文件。
圖5 原理圖文件建立圖
h.完成后點擊File----save as,保存到c:altera71sp1quartus目錄下。i.使用文本編輯器輸入源碼,完成原理圖編譯。
j.編譯工程,執行Processing—start—start Analysis&Elaboration進行編譯,分析檢查輸入文件是否有錯誤。2.創建仿真波形文件
a.點擊New—Vector Waveform File—save as
圖6 新建仿真波形文件圖
b.在Name框圖中右擊鼠標,Insert—Insert Node or Bus—Node Finder—在Filter中選擇Pinns:all,點擊list,點擊“》”將左側列表中的內容移動到右側列表中。2012.1
上海師范大學天華學院電信系數字集成器件與應用專業課程設計
圖7 插入管腳圖
c.在CP上右擊選擇value,選擇時鐘脈沖信號clock(周期可自行設置)。EN和nCR都選擇高電平(Forcing High)。
圖8 輸入信號賦值
d.選擇Assignments—Settings設置—simulater settings—模式mode選擇功能型Functional e.選擇Processing—generate functional simulation netlist生成功能網表
圖9 生成功能網表圖
f.點擊波形仿真的快捷鍵,進行波形的仿真。
g.分別給EN和nCR不同的電平信號,觀察分析波形的變化。2012.1
上海師范大學天華學院電信系數字集成器件與應用專業課程設計
圖10 EN=1 nCR=1
圖11 EN=0 nCR=1
圖12 EN=1 nCR=0 2012.1
上海師范大學天華學院電信系數字集成器件與應用專業課程設計
圖13 EN=0 nCR=0
圖14 EN脈沖 nCR=1
2.2工作原理及系統框圖
利用數字電子技術、EDA設計方法、FPGA等技術,設計、仿真并實現一個基于FPGA的數字電子時鐘基本功能,其基本組成框圖如圖1所示,振蕩器采用ALTERA的DE2-70實驗板的50MHz輸出,分頻器將50MHz的方波進行分頻進而得到1Hz的標準秒脈沖,時、分、秒計時模塊分別由二十四進制時計數器、六十進制分計數器和六十進制秒計數器完成,校時模塊完成時和分的校正。電子時鐘擴展功能為倒計時流水燈。數字電子鐘的電路組成框圖片如下圖: 2012.1
上海師范大學天華學院電信系數字集成器件與應用專業課程設計
多功能數字鐘頂層模塊振蕩器校時電路倒計時模塊分頻器CP 1Hz時計數器(24進制)分計數器(60進制)秒計數器(60進制)時譯碼顯示6計數器10計數器分譯碼顯示6計數器10計數器分譯碼顯示 圖15 系統框圖
1.數字鐘電路系統由主體電路和擴展電路兩大部分所組成。
2.數字電子時鐘電路具有時、分、秒計時,秒計數器計滿60后向分計數器進位,分計數器計滿60后向小時計數器進位,小時計數器按照“24進制”規律計數。
3.準確計時,以數字形式顯示時、分、秒的時間,計數器的輸出經譯碼器送顯示器。
4.具有分、時校正功能,校正輸入脈沖頻率為1Hz 5.復位功能,時、分、秒計時清零。
6.擴展功能為:具有仿廣播電臺整點報時的功能,即每逢59分51秒、52秒、53秒、54秒、55秒及57秒,LED綠燈依此點亮,59分59秒時,LED紅燈亮,形成倒計時流水燈報時。
三.軟件方案
3.1 程序流程圖
3.1.1 24進制
小時采用24進制計時,當CP↑,EN和nCR為高電平時計數,計數范圍為[0,23],使能信號EN等于0時,計時器保持。當高位大于2或高位等于2且低位大于3時,計時器清零,否則繼續計時。流程圖見下圖。2012.1
上海師范大學天華學院電信系數字集成器件與應用專業課程設計
開始CP↑or nCR↓YnCR=0 ?YNNEN=0 ?YNNQH>2 or Q>23Y清零保持清零Q=Q+1 圖16 24進制程序流程圖
3.1.2 10進制流程圖
當CP↑,EN和nCR為高電平時計數,計數范圍為[0,9],使能信號EN等于0時,計時器保持。當計時到9的時候,計時器清零,否則繼續計時。流程圖見下圖。
開始CP↑or nCR↓YnCR=0 ?YNNNEN=0 ?YQ=9 ?Y清零保持清零NQ=Q+1
圖17 10進制流程圖 2012.1
上海師范大學天華學院電信系數字集成器件與應用專業課程設計
3.1.3 6進制
當CP↑,EN和nCR為高電平時計數,計數范圍為[0,5],使能信號EN等于0時,計時器保持。當計時到5的時候,計時器清零,否則繼續計時。流程圖見下圖。
開始CP↑or nCR↓YnCR=0 ?YNNNNEN=0 ?YQ=5 ?Y清零保持清零Q=Q+1 圖18 6進制流程圖
3.1.4 60進制
分、秒采用60進制計時,當CP↑,EN和nCR為高電平時計數,計數范圍為[0,59],使能信號EN等于0時,計時器保持。當個位等于9時向十位進位;當個位等于9十位等于5,計時器清零,否則繼續計時。流程圖見下圖。
開始CP↑or nCR↓NnCR=0?NEN=0?Y個位Q1=9?NYQ2=Q2+1Q2=5?YQ1=9?NNN清零保持Q1=Q1+1Y清零Q1=Q1+1 圖19 60進制流程圖 2012.1
上海師范大學天華學院電信系數字集成器件與應用專業課程設計
3.1.5 from0to9
數碼管有7段組成,分共陽極和共陰極,本次設計采用共陽極數碼管。當輸入為低電平時,數碼管顯示;當輸入為高電平時,數碼管不顯示。用這樣的方法輸入不同的高低信號控制數碼管的顯示。
HEX=7'b0000001HEX=1001111HEX=b0010010HEX=7'b0000110HEX=7'b1001100開始Case DNHEX=7'b0100000HEX=7'b1111111HEX=7'b0001111HEX=7'b0000000HEX=7'b0000100顯示7顯示8顯示9顯示6YHEX=7'b0100100顯示5顯示0顯示1顯示2顯示3顯示4 圖20 from0to9流程圖
3.1.6 分頻模塊
開始50MHz方波10^2分頻500KHz方波10^2分頻5KHz方波10^2分頻50Hz方波10^2分頻0.5Hz方波
圖21 分頻模塊流程圖 2012.1
上海師范大學天華學院電信系數字集成器件與應用專業課程設計
3.1.7 總流程圖
開始開始NCPCP↑↑or nCRor nCR↓↓Y分頻模塊YYNYAdjHrkey=1?AdjHrkey=1?NNN時低位時低位=9?=9?NYYAdjMinKey=1?AdjMinKey=1?YY低位清零高位進位低位清零高位進位N高位高位>2or>2or時時>23>23YNN分低位分低位=9=9??NN清零清零YY秒低位秒低位=9=9??NNNY低位清零高位進位低位清零高位進位YY低位計數低位計數低位計數低位計數YNY秒高位秒高位=5=5??低位清零高位進位低位清零高位進位低位計數低位計數NYY高位高位=5=5??NN秒高位清零,分低位進位秒高位清零,分低位進位高位計數高位計數清零清零Y高位計數高位計數N低位計數低位計數Y低位清零高位進位低位清零高位進位N分低位分低位=9=9??NN分高位分高位=5=5??YY高位計數高位計數Y分清零,時低位位進位分清零,時低位位進位低位清零高位進位低位清零高位進位Y時低位時低位=9=9??NNNNYY高位高位>2or>2or時時>23>23清零清零低位計數低位計數
圖22 總流程圖 2012.1
上海師范大學天華學院電信系數字集成器件與應用專業課程設計
3.2 程序清單
3.2.1頭文件complete_clock程序
module complete_clock(HEX0,HEX1,HEX2,HEX3,HEX4,HEX5,_50MHzIn,_1Hz,_50Hz, _5KHz,_500KHz,AdjMinkey,AdjHrkey,nCR,Alarm,LED0,LED10,LED3,LED4,LED5,LED6,LED7,LED8,LED9);
output [7:0] HEX0,HEX1,HEX2,HEX3,HEX4,HEX5;output Alarm,_1Hz,_50Hz,_5KHz,_500KHz;output LED0;output LED10;output LED3;output LED4;output LED5;output LED6;output LED7;output LED8;output LED9;wire [7:0] HEX0,HEX1,HEX2,HEX3,HEX4,HEX5;input nCR,_50MHzIn;wire _1Hz,_50Hz,_5KHz,_500KHz;wire LED0;wire LED10;wire LED3;wire LED4;wire LED5;wire LED6;wire LED7;wire LED8;wire LED9;input AdjMinkey,AdjHrkey;wire [7:0] Second,Minute,Hour;Divided_Frequency C1(_5KHz,_500KHz,nCR,_50MHzIn);//調用分頻模塊,輸入50MHz的頻率,經兩次分頻后變為5KHz Divided_Frequency U0(_1Hz,_50Hz,nCR,_5KHz);//調用分頻模塊,輸入5KHz的頻率,經
兩次分頻后變為1Hz top_clock U1(Hour,Minute,Second,_1Hz,nCR,AdjMinkey,AdjHrkey);//調用校時模塊,對時、分模塊進行校時 baoshi U2(Alarm_Ring,Minute,Second,_50Hz,_5KHz);assign Alarm=Alarm_Ring;assign LED0=({Minute,Second}==16'h5951);//定義LED0為59分51秒時燈亮 assign LED10=({Minute,Second}==16'h5952);//定義LED10為59分52秒時燈亮 assign LED3=({Minute,Second}==16'h5953);//定義LED3為59分53秒時燈亮 assign LED4=({Minute,Second}==16'h5954);//定義LED4為59分54秒時燈亮 assign LED5=({Minute,Second}==16'h5955);//定義LED5為59分55秒時燈亮 assign LED6=({Minute,Second}==16'h5956);//定義LED6為59分56秒時燈亮 2012.1
上海師范大學天華學院電信系數字集成器件與應用專業課程設計
assign LED7=({Minute,Second}==16'h5957);//定義LED7為59分57秒時燈亮 assign LED8=({Minute,Second}==16'h5958);//定義LED8為59分58秒時燈亮 assign LED9=({Minute,Second}==16'h5959);//定義LED9為59分59秒時燈亮 from0to9 U10(HEX0,Second[3:0]);//個位秒調用譯碼 from0to9 U9(HEX1,Second[7:4]);//十位秒調用譯碼 from0to9 U3(HEX2,Minute[3:0]);//個位分調用譯碼 from0to9 U4(HEX3,Minute[7:4]);//個位分調用譯碼 from0to9 U5(HEX4,Hour[3:0]);//個位時調用譯碼 from0to9 U6(HEX5,Hour[7:4]);//十位時調用譯碼 endmodule 3.2.2 counter24程序
module counter24(CntH,CntL,nCR,EN,CP);input CP,nCR,EN;output [3:0] CntH,CntL;reg [3:0] CntH,CntL;always @(posedge CP or negedge nCR)begin if(~nCR){CntH,CntL}<=8'h00;//當nCR=0時,計時器清零
else if(~EN){CntH,CntL}<={CntH,CntL};//當EN=0時,停止計時,保持 else if((CntH>2)||(CntH>9)||((CntH==2)&&(CntL>=3))){CntH,CntL}<=8'h00;else if((CntH==2)&&(CntL<3))begin CntH<=CntH;CntL<=CntL+1'b1;end else if(CntL==9)begin CntH<=CntH+1'b1;CntL<=4'b0000;end else begin CntH<=CntH;CntL<=CntL+1'b1;end end Endmodule 3.2.3 counter60程序
module counter60(Q1,Q2,Q3,Q4,Q5,Q6,Cnt,Cnt1,Cnt24,nCR,EN,CP,LED,LED1,LED2);input CP,nCR,EN;output [7:0] Cnt;output [7:0] Cnt1;output [7:0] Cnt24;output [6:0] Q1;output [6:0] Q2;output [6:0] Q3;output [6:0] Q4;output [6:0] Q5;output [6:0] Q6;output LED;output LED1;output LED2;wire [7:0] Cnt;2012.1
上海師范大學天華學院電信系數字集成器件與應用專業課程設計
wire [7:0] Cnt1;wire [7:0] Cnt24;wire [6:0] Q1;wire [6:0] Q2;wire [6:0] Q3;wire [6:0] Q4;wire [6:0] Q5;wire [6:0] Q6;wire LED;wire LED1;wire LED2;wire ENP;wire ENP1;wire ENP2;wire ENP3;counter10 UC0(Cnt[3:0],nCR,EN,CP);counter6 UC1(Cnt[7:4],nCR,ENP,CP);counter10 UC2(Cnt1[3:0],nCR,ENP1,CP);counter6 UC3(Cnt1[7:4],nCR,ENP2,CP);counter24 UC4(Cnt24[7:4],Cnt24[3:0],nCR,ENP3,CP);assign ENP=(Cnt[3:0]==4'h9);assign ENP1=(Cnt==8'h59);assign ENP2=((Cnt1[3:0]==4'h9)&&(Cnt==8'h59));assign ENP3=((Cnt1==8'h59)&&(Cnt==8'h59));assign LED=~CP;assign LED1=~CP;assign LED2=~CP;from0to9 UC5(Q1,Cnt[3:0]);from0to9 UC6(Q2,Cnt[7:4]);from0to9 UC7(Q3,Cnt1[3:0]);from0to9 UC8(Q4,Cnt1[7:4]);from0to9 UC9(Q5,Cnt24[3:0]);from0to9 UC10(Q6,Cnt24[7:4]);Endmodule 3.2.4 from0to9程序
module from0to9(HEX,D);output [6:0] HEX;input [3:0] D;reg [6:0] HEX;always @(D)begin case(D)4'd0:{HEX[0],HEX[1],HEX[2],HEX[3],HEX[4],HEX[5],HEX[6]}=7'b0000001;4'd1:{HEX[0],HEX[1],HEX[2],HEX[3],HEX[4],HEX[5],HEX[6]}=7'b1001111;4'd2:{HEX[0],HEX[1],HEX[2],HEX[3],HEX[4],HEX[5],HEX[6]}=7'b0010010;2012.1
上海師范大學天華學院電信系數字集成器件與應用專業課程設計
4'd3:{HEX[0],HEX[1],HEX[2],HEX[3],HEX[4],HEX[5],HEX[6]}=7'b0000110;4'd4:{HEX[0],HEX[1],HEX[2],HEX[3],HEX[4],HEX[5],HEX[6]}=7'b1001100;4'd5:{HEX[0],HEX[1],HEX[2],HEX[3],HEX[4],HEX[5],HEX[6]}=7'b0100100;4'd6:{HEX[0],HEX[1],HEX[2],HEX[3],HEX[4],HEX[5],HEX[6]}=7'b0100000;4'd7:{HEX[0],HEX[1],HEX[2],HEX[3],HEX[4],HEX[5],HEX[6]}=7'b0001111;4'd8:{HEX[0],HEX[1],HEX[2],HEX[3],HEX[4],HEX[5],HEX[6]}=7'b0000000;4'd9:{HEX[0],HEX[1],HEX[2],HEX[3],HEX[4],HEX[5],HEX[6]}=7'b0000100;default:{HEX[0],HEX[1],HEX[2],HEX[3],HEX[4],HEX[5],HEX[6]}=7'b1111111;endcase end endmodule 3.2.5 counter6程序
module counter6(Q,nCR,EN,CP);input CP,nCR,EN;output [3:0] Q;reg [3:0] Q;always @(posedge CP or negedge nCR)begin if(~nCR)Q<=4'b0000;//當nCR=0時,計時器清零 else if(~EN)Q<=Q;//當EN=0時,停止計時,保持 else if(Q==4'b0101)Q<=4'b0000;else Q<=Q+1'b1;//計時器正常計時 end Endmodule 3.2.6 counter10程序
module counter10(Q,nCR,EN,CP);input CP,nCR,EN;output [3:0] Q;reg [3:0] Q;always @(posedge CP or negedge nCR)begin if(~nCR)Q<=4'b0000;//當nCR=0時,計時器清零 else if(~EN)Q<=Q;//當EN=0時,停止計時,保持 else if(Q==4'b1001)Q<=4'b0000;else Q<=Q+1'b1;//計時器正常計時 end Endmodule 3.2.7 分頻程序
module Divided_Frequency(_1HzOut,nCR,_5kHzIN);input _5kHzIN,nCR;output _1HzOut;supply1 Vdd;//定義 Vdd 是高電平
wire [15:0] Q;//計時器的輸出信號(中間變量)wire EN1,EN2,EN3;// 計時器的使能信號(中間變量)counter10 DU0(Q[3:0],nCR,Vdd,_5kHzIN);//調用十進制 2012.1
上海師范大學天華學院電信系數字集成器件與應用專業課程設計
counter10 DU1(Q[7:4],nCR,EN1,_5kHzIN);counter10 DU2(Q[11:8],nCR,EN2,_5kHzIN);counter10 DU3(Q[15:12],nCR,EN3,_5kHzIN);assign EN1=(Q[3:0]==4'h9);assign EN2=(Q[7:4]==4'h9)&(Q[3:0]==4'h9);assign EN3=(Q[11:8]==4'h9)&(Q[7:4]==4'h9)&(Q[3:0]==4'h9);assign _1HzOut=Q[15];//assign _500HzOut=Q[0];endmodule 3.2.8 校時模塊程序
module top_clock(Second,Minute,Hour,_1Hz,nCR,AdjMinKey,AdjHrkey);input _1Hz,nCR,AdjMinKey,AdjHrkey;output [7:0] Second,Minute,Hour;wire [7:0] Hour,Minute,Second;supply1 Vdd;wire MinCP,HrCP;counter60 UT1(Second,nCR,Vdd,_1Hz);//調用counter60,對秒計時 counter60 UT2(Minute,nCR,Vdd,~MinCP);// 調用counter60,對分校時
counter24 UT3(Hour[7:4],Hour[3:0],nCR,Vdd,~HrCP);//調用counter24,對時校時 assign MinCP=AdjMinKey ? _1Hz:(Second==8'h59);//當MinCP=AdjMinKey時,執行校時,當MinCP≠AdjMinKey時,秒計時至59 時向分進位 assign HrCP=AdjHrkey?_1Hz:({Minute,Second}==16'h5959);//當HrCP=AdjHrkey時,執
行校時,當HrCP≠AdjHrkey時,分
秒計時至59分59秒時向時進位 Endmodule 四.調試及結果
4.1 模塊仿真
4.1.1 counter10模塊仿真
CP為時鐘脈沖;當CP↑,EN和nCR為高電平時Q計數;Q的計數范圍為[0,9]
圖counter10仿真波形圖 2012.1
上海師范大學天華學院電信系數字集成器件與應用專業課程設計
4.1.2 counter24模塊仿真
CP為時鐘脈沖;當CP↑,EN和nCR為高電平時Q計數;Q的計數范圍為[0,23]
圖24 counter24仿真波形圖
4.1.3 counter60模塊仿真
CP為時鐘脈沖;當CP↑,EN和nCR為高電平時Q計數;Q的計數范圍為[0,59]
圖25 counter60仿真波形圖
4.1.4 分頻模塊仿真
分頻器是將輸入的基本時鐘信號分頻為其他模塊需要的5kHZ 和1HZ 的信號.其中CLK 輸入為5kHZ , CLK2 輸出1HZ 信號,分頻實際也是用了計數器的原理。
圖26 分頻模塊仿真波形圖
4.1.5 top_clock計時模塊仿真 2012.1
上海師范大學天華學院電信系數字集成器件與應用專業課程設計
當秒計時到59時,向分進一位,當秒計時到59且分計時到59時向時進一位。當時分秒計時到23’59’59時,計時器清零。
圖27 top_clock計時模塊仿真波形圖
4.2 程序下載
圖28 時測試校時,時至23 圖29 時測試校時,時進位至00
圖30 分測試校時分至59
圖31 分測試校時,分進位至00 圖32 59分52秒,LEDG1亮 圖33 59分55秒,LEDG4亮 2012.1
上海師范大學天華學院電信系數字集成器件與應用專業課程設計
圖34 59分57秒,LEDG6亮
圖35 59分59秒,LEDR0亮
4.3分析運行結果
4.3.1 設計總結
本次大型作業我們所研究的課題是基于FPGA的數字電子時鐘的設計與實現。時鐘設計的方法是通過計時模塊、分頻模塊、校時模塊、譯碼顯示模塊和倒計時報時模塊來構成該電子時鐘。計時模塊為時分秒計時,采用24進制計時。因此該模塊中調用了24進制和60進制兩個程序,其中60進制采用的是調用6進制和10進制的方法來實現。
分頻模塊輸入一頻率為50MHz的信號,經過四次10^2分頻,將信號逐次分為500KHz、5KHz、50Hz直至0.5Hz。計時模塊就由分頻器分頻出來的標準秒脈沖進行計時,時、分、秒計時模塊分別由二十四進制時計數器、六十進制分計數器和六十進制秒計數器完成,校時模塊完成時和分的校正。我們還進行了擴展功能設計——倒計時流水燈功能,從59分55秒至59分59秒,每秒亮一盞燈報時,55秒至58秒,依此亮綠燈,59秒亮紅燈。
通過這兩周的課程設計,我們熟悉了基于FPGA的數字電子時鐘的設計與實現的整個流程,文本編輯,功能仿真,邏輯綜合,布局布線,編程下載,每一步剛開始或多或少有些問題,但在我們不斷努力學習補充修改后,最終圓滿完成數字電子時鐘的時、分、秒的計時和校時功能,復位功能,還設計實現了倒計時流水燈擴展功能。
4.3.2 心得體會
為期兩周的大型作業,我們組順利完成了基于FPGA的數字電子時鐘設計與實現的課程設計。從剛開始對Verilog語言非常陌生,到最后接近熟練地掌握Verilog語言的程度,期間花費不少時間和精力,同時也收獲了很多,學會了 2012.1
上海師范大學天華學院電信系數字集成器件與應用專業課程設計
使用Verilog語言編程仿真電路實驗,掌握了可編程邏輯器件的應用開發技術,熟悉了一種EDA軟件使用,掌握了Verilog設計方法,即分模塊分層次的設計方法。
在設計的過程中,因為剛剛接觸這種編程語言,我們也遇到了很多問題。但是我們沒有放棄過,不斷檢查糾正錯誤。Verilog源程序的編寫很容易出現錯誤,這就需要耐心的調試。因為很多情況下,一長串的錯誤往往是由一個不經意的小錯誤引起的。有時程序一直出錯找不到原因的時候,我們也會去虛心向別的組的同學請教,或者和他們一起討論問題,從中得到一些啟發。
由于設備和時間的限制,我們還有一部分擴展內容沒能夠完成,即數字鐘的整點蜂鳴報時功能。但本次設計實驗已使我們對Verilog語言產生了濃厚的興趣,在以后的學習生活中會主動去了解更多有關這方面的知識及其在實踐中的應用。
這次大型作業,不僅讓我們又掌握了一些新的知識,也提高了我們的動手能力和科學嚴謹的精神。其次也培養了我們自學的能力,遇到不明白的地方可以通過思考、查資料、與同學交流多種方式解決問題。這些對于我們以后的學習和工作都有極大的幫助。
4.3.3 致謝
最后,我們要感謝系里提供這一次的機會讓我們學到更多知識,并且提供了這么好的學習條件,設備、學習環境、師資等方面都非常好。同時也要感謝周麗婕老師和陶亞雄老師兩周以來耐心的指導,在我們遇到問題的時候,是她們悉心的指導幫助和不厭其煩的講解下我們才得以順利的完成這次的設計,我們再次表示由衷的感謝!
第五篇:個人FPGA學習心得
回想起自己學FPGA,已經有一段時間了,從開始的茫然,到
后來的瘋狂看書,設計開發板,調電路,練習各種FPGA實例,到最后能獨立完成項目,一路走來,感受頗多,拿出來和大家分享,順便介紹下自己的一點經驗所得,希望對初學者有所幫助。
廢話不說了,下面進入正題,學習FPGA我主要經歷了這么幾個階段:
①、Verilog語言的學習,熟悉Verilog語言的各種語法。
②、FPGA的學習,熟悉QuartusII軟件的各種功能,各種邏輯算法設計,接口模塊(RS232,LCD,VGA,SPI,I2c等)的設計,時序分析,硬件優化等,自己開始設計簡單的FPGA板子。
③、NiosII的學習,熟悉NiosII的開發流程,熟悉開發軟件(SOPC,NiosII IDE),了解NiosII的基本結構,設計NiosII開發板,編寫NiosII C語言程序,調試板子各模塊功能。
先來說說第一個階段,現在主要的硬件描述語言有VHDL,Verilog兩種,在本科時老師一般教VHDL,不過現在
Verilog用的人越來越多,其更容易上手(與C語言語法比較類似),也更靈活,現在的IC設計基本都用Verilog。像systemC,systemVerilog之類的應該還在萌芽階段,以后可能會有較大發展。鑒于以上原因我選擇了Verilog作為我學習的硬件描述語言。
其實有C語言的基礎,學起Verilog的語言很簡單,關鍵要有并行的概念,所有的module,assign,always都是并行的,這一點與軟件語言有明顯不同。這里推薦幾本評價比較好的學習Verilog的書籍:
①、《verilog 數字系統設計教程》,這本書對于入門是一本很好的書,通俗易懂,讓人很快上手,它里面的例子也不錯。但本書對于資源優化方面的編程沒有多少涉及到。
②、《設計與驗證Verilog HDL》,這本書雖然比較薄,但是相當精辟,講解的也很深入,很多概念看了這本書有種豁然開朗的感覺,呵呵。
學習Verilog其實不用看很多書,基本的語法部分大家都一樣,關鍵是要自己會靈活應用,多做練習。
Verilog語言學了一段時間,感覺自己可以編點東西,希望自己編的程序在板子上運行看看結果,下面就介紹我學習的第二個階段。
剛開始我拿了實驗室一塊CPLD的開發板做練習,熟悉QuartusII的各種功能,比如IP的調用,各種約束設置,時序分析,Logiclock設計方法等,不過做到后面發現CPLD的資源不太夠(沒有內嵌的RAM、不能用SignalTapII,LE太少等),而實驗室沒有FPGA開發板,所以就萌生了自己做FPGA開發板的意圖,剛好Cadence我也學的差不多了,就花了幾天時間主要研究了FPGA配置電路的設計,在板子上做了Jtag和AS下載口,在做了幾個用戶按鍵和LED,其他的口全部引出作為IO口,電路比較簡單,板子焊好后一調就通了(心里那個爽啊...)。我選的FPGA是cycloneII系列的EP2C5,資源比以前的FPGA多了好幾倍,還有PLL,內嵌的RAM,可以試試SignalTapII,用內嵌的邏輯分析儀測試引腳波形,對于FPGA的調試,邏輯分析儀是至關重要的。利用這塊板子我完成了項目中的幾個主要功能:RS232通信,指令譯碼,配置DDS,AD數據高速緩存,電子開關狀態設置等,在實踐中學習起來真的比平時快很多,用到什么學什么動力更大。這個時候我主要看的數據有這幾本感覺比較好:
①、《Altera FPGA/CPLD 設計(基礎篇)》:講解一些基本的FPGA設計技術,以及QuartusII中各個工具的用法(IP,RTL,SignalProbe,SignalTapII,Timing Closure Floorplan,chip Editor等),對于入門非常好。
②、《Altera FPGA/CPLD 設計(高級篇)》:講解了一些高級工具的應用,LogicLock,時序約束很分析,設計優化,也講述了一些硬件編程的思想,作為提高用。
③、《FPGA設計指南--器件,工具和流程》:這本書看了他的目錄忍不住就買了,這本書講述了FPGA設計的各個方面,雖然每個方面都是點到為止,但能讓你有個整體的概念,了解FPGA的所有設計功能,了解FPGA開發的整個流程。
④、在這里也推薦幾個學習FPGA比較好的論壇
http://www.tmdps.cn,不過很多人一看到英語就不想看,其實上面的英文很簡單,很多時候不敢看是因為對自己沒信心或心靜不下來看。不過官方網站上資料很多,剛開始可能會覺得資料安排的有點亂,不方便查找,以后有時間我列個資料的鏈接目錄,整理一下,方便大家查找。
到這里,自己最FPGA的學習有一段時間了,練習了很多實例,自己也編寫了不少程序,也有了一些項目經驗,算是對FPGA有些了解了。在不斷的學習中發現FPGA不僅可以做邏輯設計,算法設計等,還能做嵌入式開發,altera先后開發了Nios,NiosII兩款FPGA的嵌入式軟核,并有配套的軟件,剛開始看到這些我真是心中突然豁然開朗,學習真的是無止境,又一個全新的領域擺在我面前,我決定學習NiosII,要學就要學最好。
剛開始入門是很痛苦的,嵌入式設計需要從硬件到驅動到軟件全部熟悉,硬件系統問題還不是很大(以前做過單片機,DSP等MCU),處理器的架構心里還有點數,對于驅動和軟件工程,剛開始學習真的很頭痛。NiosII應該還算比較新的內容(應該是2004年出的),國內的書籍不算很多,網上這方面的資料也比較零碎,所以我就開始將Altera網站上這方面的資料系統的看一邊,這里推薦幾本網站上的handbook:
①、Embedded Design Handbook
②、Nios II Processor Reference Handbook
③、Nios II Software Developer's Handbook
④、Quartus II Handbook, Volume 4: SOPC Builder
⑤、Quartus II Handbook, Volume 5: Embedded Peripherals
看完這些handbook,總算基本明白整個架構,軟硬件設計方法,驅動的編寫等,感覺自己可以編一些嵌入式的程序了,不過雖然前面做的那塊ep2c5的板子支持NiosII系統,不過對于嵌入式設計來說還是顯得單薄了一點,沒有SDRAM,Flash這兩個比較基本的模塊,Ep2C5內嵌的RAM太小,程序寫不大,而且每次總要絞盡腦汁優化程序代碼大小,很多時候優化了后函數功能會受到限制,不利于初學者,也不利于調試。所以到這里我有產生了自己做一塊Nios開發板的想法(直接買比較貴,自己做便宜,而且還能鍛煉自己,一舉兩得),通過借鑒其他開發板,選擇自己開發板上需要包含什么模塊,確定各個模塊使用什么芯片,閱讀各個芯片的datasheet,畫出原理圖并做出PCB圖,這塊板子我選的是Ep2c8Q208,比上一塊資源又將近多了一倍,板子上還有以下模塊:SDRAM,Flash,EPCS4,RS232,USB,VGA,PS2,AD,DA,LCD等,滿足了一般開發板的配置要求。板子回來以后調試了四五天,(flash工作了,LCD顯示了,RS232通了,USB通了,AD,DA工作了,SDRAM正常了...),真是每天都有驚喜,每個模塊都編寫了NiosII軟件測試程序,調試硬件的時候對軟件的運行也更熟悉了。在這次調試的過程中真的學到了很多,為此專門寫了好幾頁調試筆記,下次拿出來和大家一起分享。現在硬件平臺有了,NiosII也了解的差不多了,終于可以自己編寫一些規模大一點的程序了。
學FPGA的一點心得
從去年開始學FPGA,以前一直做DSP,但因為項目的需要,在一個應用中只有FPGA才能解決問題,所以硬著頭皮上FPGA,又因為結項目的時間比較緊,所以主要以解決問題為目的,說真的,項目做下來寫了四千多行的代碼,達到了設計目標,但對FPGA學習還不夠系統,也正進一步的學習中.因為我是單干,沒有團隊,遇到問題只能在網上找資料,其難度可想而知,幸好以前用過CPLD,有一點基礎,用的編程語言是VHDL,感覺AHDL寫一點小程序還可以,但做復雜程序就有點費力了(應該是我的AHDL沒學好),所以在做FPGA程序時我選擇了比較簡單的verilog語言。
由于沒人指導,所以買了一個簡單的FPGA開發板,是Cyclone的,開發板就是好,送了較多學習資料,用了一個星期的時間,學習了NIOSII的基本應用,當然,我的需要就是知道如何在NIOS里控制一個信號的高低電平變化就夠了,其它全是C語言的東西,主要是熟悉了Quartus的開發平臺,并用NIOS程序把要實現的主要代碼用C寫了一遍,通過了,但速度上不去。有這些知識做鋪墊后,就開始了項目的設計。
項目要求將外部高速數據(40MB/s)進行存盤,并可以將存盤的數據在適當的時候原路返回(速度不變)。所以在硬件的設計上FPGA選擇了EP2C35F484C8N,外部有128M的SDRAM做為數據的緩沖。所以FPGA的主要程序集中在ATAHOST控制器(實現UDMA讀寫)、SDRAM控制器(大容量循環緩沖)上,當然還包括一些其它的控制,如實時時鐘,USB2.0芯片控制,RS232的通信及相應的通信協
議。
硬件完成后,大部分的時間都在寫程序,感覺verilog跟C差不多,就將原來寫成的C代碼翻譯了一下,每寫一段代碼就測試一下。起初并不知道在Quartus里還有邏輯分析儀的功能,所以程序出了問題只能使勁的分析代碼,猜想問題可能出在哪里,萬不得已時才做一下仿真(后來看很多有做程序都先做仿真,仿真通過后再下載到目標板里運行測試,但到現在我的仿真關還沒過),所以做得很累。我感到這樣做下去到時間結點肯定結了不了項目,就找FPGA的QQ群向高手們請教經驗,知道了可以Quartus的邏輯分析儀來觀察信號,哈哈,爽了(感謝感謝)。后面的程序找問題就容易多了,按照ATA協議、SDRAM手冊、及各外圍芯片手冊一步步寫下去,當然其中也遇到了各種各樣的問題,但很快得到解決。一直到項目結束,都是用邏輯分析儀來找問題,沒做過仿真(所以現在仿真關還沒過)。
今年又用FPGA做了一些項目。簡單說一下體會吧,歸結起來就三個字:做、想、問。書讀千遍,不如做一遍;看別人做百次,不如自己做一次;就是要實踐。實踐的動力一方面來自興趣,別一方面來自己壓力,我個人覺得后者更重要。有需求會容易形成壓力,也就是說最好能在實際的項目開發中鍛煉,而不是為了學習而學習。在做的過程中要多想,多想想問題出現的原因,問題解決后要多問幾個為什么,這也是經驗積累的過程,最好要寫項目日志,把問題及原因、解決的辦法都寫進去。還要多問,遇到問題經歷了痛苦的思索后還得不到解決就要問了,問搜索引擎,問網友,問同學同行,一篇文章、朋友們的點撥都可能幫助自己快
速解決問題。
FPGA入門心得及系列資料
不知道為什么自己每次接受一個新事物,總要花上那么長的一段時間。每個東西,總要經過從一點都不了解,到有點了知道,到最后才想知道要來學學,但每次學習時也總是走馬觀花。可能真的受中國的教育思想束縛的太嚴重了吧。以前的人讀書,好像也沒有什么目標,只是知道上課要認真聽,考試要考好。這樣就可以了。也從來沒想過,我學這個到底有什么用呢。
但是上了大學后,一切都改變了。我們的學習也不再是為了考試而考試了。尤其是像我們學電子,假如僅僅是為考試的話,那你的大學完全可以過得很輕松,整天睡覺,游戲,照樣可以考高分。那樣畢業了,你說你的大學學習是不是等于0。到頭來還是什么也不是。所以當你進入大學,當你選擇了電子,就決定了你從此要為之付出。不管將來怎樣,只要你朝著自己的方向走,一定會成功的。
現在說說FPGA的學習吧,或許,很多人剛接觸FPGA時,可能還在為到底什么是CPLD,什么時FPGA,我到底要學習哪門語言而苦惱,不知大家是不是這樣,但是我曾經就是這樣,也到網上去找過,最后也終于找到了答案。因為那時身邊的人都還沒學過。其實CPLD,FPGA最大的區別也就是FPGA的程序必須由配置芯片經過上電后,將程序寫入芯片中,也就是FPGA的內部存儲器是相當于內存一樣,一掉電就沒了。而CPLD是像單片機一樣,程序是存儲存在內部中的,一上電就可以跑了。二者的功能差不多,但是FPGA的資源比CPLD更加豐富。在CPLD上可以實現的功能,在FPGA上基本都可以實現的。所以也不必去想太多什么是FPGA,CPLD了,只要弄懂了二者的內部結構就可以了。至于學什么語言嗎,首先要看你們在校老師上課是用什么語言,就先那個語言吧,我們學校老師是用VHDL語言的,所以一開始我也是先學VHDL語言,而且學習資料比較多,但是在網上看到,好像公司里面用的比較多的是Verilog HDL語言,為了能看懂一些資料,現在也在學Verilog HDL語言,學習中發現,要是學過C語言的人,會發現Verilog HDL好像更加好理解。
一旦你開始了學習FPGA,那就要堅持下去,因為語言這東西,要是不一下子把它強記住,過不了兩天就又忘了,書本的東西,一定要越快消化越好,這樣你看別人的程序時就不會有什么語言障礙了。之后就是編寫程序,模仿別人的模塊,仿真實驗,這步很重要,要不你就不會發現FPGA功能的強大,你也不知道到底仿真的結果和實際是不是有差別。當你成功時,你一定會感到成功的喜悅。
當你基本的程序都看得懂時,有完整地編個程序,而且在硬件上實驗過時,那么祝賀你入門了,之后的道路就是不斷的實踐,跟學習單片機一樣,只有不斷的學習,不斷的做東西,你的編程能力才會提高。
以上僅僅為作者本人的一點觀點,本人現在還是一個電子白菜,只是苦于自己學習電子找不到捷徑,不想還有更多的人跟我一樣,在電子的道路中不斷摸索,不斷徘徊。
看過一個高手對FPGA的認識,自己對FPGA未來的發展更是看好,鑒定了學好的決心,FPGA在電子開發工作中已經上升到數字系統核心處理器,盡快掌握FPGA開發技術顯得非常迫切。總結了一下: 傳統的開發方式:一半固定,硬件CPU是不可編程的,另一半靈活是可編程的軟件
FPGA新開發形式:兩個部分都是可編程了,FPGA,它代表的就是硬件的編程。這兩部分都可編程的一個結合點就是FPGA上的軟核。另外可以根據需要通過外部單片機把合適的應用bit流寫入到FPGA內,從而完成根據功能需要變更硬件。硬件可重構!
使計算機的能力越來越強,方法一:通過提高工藝來提高工作頻率;方法二:通過優化系統體系,并行!
新學習思想: FPGA設計有點象圍棋:易學難精 帶著問題學習是最有效率的
時序性能的調整提高是FPGA開發能力的標志
多看書,但要注意,書當做字典,不是所有地方都去看。
目前,在FPGA上有三種類型開發方法和應用方向:a、邏輯類應用 b、軟核類應用 c、DSP類應用。邏輯類應用我們接觸的最早,也是FPGA最初的應用領域,大的應用上,一些數字IC設計可以在FPGA做前期的功能驗證,在通信領域,FPGA做信號的編解碼等等,小的應用上我們做的最多的實際是CPLD,完成信號的變換控制等等。軟核應用是前幾年才興起,現在熱門的開發應用方法,在原本需要FPGA結合CPU的地方有成本和靈活性優勢。
FPGA的DSP應用是非常有潛力的,性能優勢非常明顯。開發方法是用Matlab的simulink中嵌入廠商的開發工具包,算法驗證在Matlab simulink工具下完成,在開發工具包的支持下生成HDL模塊或者直接生成FPGA下載配置文件,這個方向是FPGA應用最有挑戰能力領域。Mathworks公司不久前也推出了獨立于FPGA廠商的Simulink HDL Coder工具,使的Matlab在數字系統設計領域邁出了堅實的一步,把Simulink 模型和Stateflow框圖生成位真(Bit-Ture)、周期精確(Cycle-Accurate)、可綜合的Verilog和VHDL代碼,為Matlab simulink用戶提供了通往FPGA設計實現的直接通道。
看過很多FPGA相關的書,其中內容重復的不少,要看就看經典的。這些是從眾多書中挑出來自己認為不錯的書,望初學者能節省時間,重點閱讀:
《verilog 數字系統設計教程》::針對初學者學習Verilog HDL硬件描述語言,語言是基礎,首先要能建立一個語言與硬件對應起來的觀念,不能按照C語言的套路。打好基礎很重要。
《Altera FPGA/CPLD 設計(基礎篇)》:介紹FPGA的基本概念,和QuartusII中軟件的基本使用,包括一些內部自帶工具軟件使用。還有仿真軟件ModelSim。
《Altera FPGA/CPLD 設計(高級篇)》:講解一些高級應用,涉及到FPGA開發,高級調試要用到的,比如時序約束,LogicLock等。
《Nios II軟件架構解析》:對Nios軟核的低層的東西,比如中斷、復位,HAL(硬件抽象層)、外設驅動進行橫向解析,對Nios II IDE中的使用設置,軟件開發技巧等進行縱向解析。
《FPGA應用開發實戰技巧精粹》:都是技巧,難得!
《NiosII嵌入式軟核SOPC設計原理及應用》:(就是全面)Nios II體系,Avalon總線,Nios II外設,SOPC硬件系統開發,軟件開發等進行講解。
剛才開始接觸邏輯設計很多人會覺得很簡單:因為verilog的語法不多,半天就可以把書看完了。但是很快許多人就發現這個想法是錯誤的,他們經常埋怨綜合器怎么和自己的想法差別這么大:它竟然連用for循環寫的一個計數器都不認識!
相信上一段的經歷大部分人都曾有,原因是做邏輯設計的思維和做軟件的很不相同,我們需要從電路的角度去考慮問題。
在這個過程中首先要明白的是軟件設計和邏輯設計的不同,并理解什么是硬件意識。
軟件代碼的執行是一個順序的過程,編繹以后的機器碼放在存儲器里,等著CPU一條一條的取指并執行;因此軟件設計中經常會帶有順序處理的思維。而邏輯設計則不同,我們設計的是數字電路,它是由很多很多的與非門及D觸發器構成的,上電之后所有與非門和D觸發器都同時工作,不會因為A觸發器的代碼描述在B觸發器之前A觸發器就是先工作,事實上,RTL級代碼的代碼先后順序在綜合成網表文件后這種順序就消失了,取代的是基本邏輯電路之間的互聯關系描述;因此邏輯設計需要的是一種并發的思維,我們也需要用并發的思維去考慮電路的設計。
當然,我們設計的電路功能一般都有先后順序的關系,如果這種順序不能通過代碼的先后順序來實現,那么要怎么完成這一功能呢?在邏輯設計中,我們所說的先后順序都是基于時間軸來實現:它的承載體就是時序邏輯,也就是那些觸發器。
硬件意識的東西網上談論的已經很多,這里就不再多說了。
其次就是要熟悉基本電路的設計。
基本的電路不是很多,也就是D觸發器、計數器、移位寄存器、狀態機、多路選擇器、譯碼器等幾種,所有復雜的電路都可由這些基本的電路構成。高手水平高的體現并不是他能寫出一些很奇特的電路,相反,水平高是體現在他們總能將復雜的電路用這些很樸素的基本電路去描述。甚至,你會發現他們的代碼基本上是由if...else、case這些語句構成的,樸素的讓你覺得奇怪。
我認為,初學者在入門的時候,對于基本電路的設計應該固定化、標準化,每種電路該用什么樣的代碼描述,應該要固定、統一,盡量少一些花哨的東西。說來這里我舉個例子。
以前有幾個朋友因為仿真有問題請我幫忙找問題。他們的代碼寫的很亂,出現了很多種稀奇古怪的電路,一看頭都大了,只好建議他們按照標準的電路重新寫下代碼。結果過了半天,他們就和我說問題不見了。
所以,高手們喜歡用簡單的代碼是有道理的,電路的標準化和規范化可以減少許多稀奇古怪的問題,問題少了他們也就能在別人加班的時候回家多睡回覺,呵呵。總之,簡單的、樸素的就是最好的。
最后是代碼的規范化。代碼規范主要是代碼書寫、命名等規范。比如不能用TAB鍵空格、低電平有效信號命名時加_n(如rst_n等)、每行只能寫一行代碼等。這些東西網上也很多,這里只是強烈建議大家要嚴格遵守,像華為等公司如果代碼不規范的話肯定是要打回去重寫的。入門
結合一兩個小項目把上面所說的事情都做好后,差不多就可以進入入門的階段了(要求稍微嚴格了一點點,呵呵)。
入門階段要學的有:設計時序;理解約束的原理及如何加約束。
先談談設計時序。
設計時序是進行邏輯設計的基本要求:時序是設計出來的,不是仿出來的,更不是湊出來的。
很多人在做邏輯設計時喜歡一上來就狂寫代碼,寫到一半后發現信號間的時序出問題了,只好推倒重來;好不容易反復了幾次之后,通過仿真軟件看了下,差不多要對了,于是再湊一下時序,竟然對了!但這個做法除了設計周期長外,代碼的質量也難以保證,往往存在很多冗余的邏輯,甚至有一些隱藏著較深的bug。
為什么會出現上面的問題呢?因為我們設計的是數字邏輯,而信號之間的邏輯關系往往是比較復雜的,在內部信號很多的情況下,僅憑拍下腦袋就寫代碼肯定是不能理清楚它們之前的復雜的關系,所以出錯在所難免。
正確的做法是我們要先對整個設計有一些規劃--時時刻刻都要有設計時序的思想。設計時序最重要的是做好方案,這里說的方案絕不是只是擺幾個框圖在那里。我們在做設計的時候需要做總體設計方案、邏輯詳細設計方案。這兩種方案包括了很多東西,邏輯總體方案主要是一級模塊的劃分及接口時序的定義,而邏輯詳細方案就是代碼的文字及圖形描述!
對于入門者來說,接觸的比較多的是邏輯詳細設計方案。在這一級別的方案中,我們是要求的是至少要做到模塊內部所有關鍵信號的時序都要先設計好,這里講的設計時序主要就是畫波形圖,在一個操作周期內每個信號在每一個時鐘周期該是什么樣子就畫成什么樣子。