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