版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 課程設(shè)計(jì)任務(wù)書</b></p><p> 學(xué)生姓名: 專業(yè)班級:電子科學(xué)與技術(shù)0903班</p><p> 指導(dǎo)教師: 工作單位: 信息工程學(xué)院 </p><p> 題 目: 8×9先進(jìn)先出(FIFO)緩沖器設(shè)計(jì) </
2、p><p><b> 初始條件: </b></p><p> QuartusⅡ軟件、微機(jī)、FPGA實(shí)驗(yàn)箱</p><p><b> 設(shè)計(jì)任務(wù): </b></p><p> 深入研究和掌握FIFO的理論知識。利用QuartusⅡ軟件強(qiáng)大的編譯和仿真功能,實(shí)現(xiàn)FIFO緩沖器的設(shè)計(jì)、仿真以及硬件功能實(shí)
3、現(xiàn)。設(shè)計(jì)一個8×9先進(jìn)先出(FIFO)緩沖器,要求達(dá)到一下功能:</p><p> 1、8位字深,9位字寬;</p><p> 2、當(dāng)讀信號ready有效時,F(xiàn)IFO的輸出data_out使能,當(dāng)ready無效時,F(xiàn)IFO的輸出處于高阻態(tài);</p><p> 3、當(dāng)寫信號write有效時,9位款的寄存器進(jìn)行寫操作;</p><p&
4、gt; 4、信號rdinc和wrinc被用來作為寄存器讀和寫指針遞增,以指示該位寄存器的讀和寫;</p><p> 5、信號rdptclr和wrptclr復(fù)位讀寫指針指向FIFO的第一個寄存器;</p><p> 6、data_in是將被載入到一個寄存器的數(shù)據(jù);</p><p> 7、ef、ff分別作為緩沖器空和滿的標(biāo)志(附加)。</p>&l
5、t;p><b> 時間安排:</b></p><p> 指導(dǎo)教師簽名: 年 月 日</p><p> 系主任(或責(zé)任教師)簽名: 年 月 日</p><p><b> 摘 要1<
6、/b></p><p> Abstract2</p><p><b> 1 緒論1</b></p><p> 2 QUARTUS II的使用1</p><p> 2.1 新建工程1</p><p> 2.2 程序編寫1</p><p><b
7、> 2.3 仿真1</b></p><p> 2.4 硬件調(diào)試2</p><p> 3 FIFO緩沖器原理3</p><p> 3.1 FIFO緩沖器的結(jié)構(gòu)3</p><p> 3.2 FIFO的一些重要參數(shù)3</p><p> 3.3 FIFO的分類4</p>
8、<p> 3.4 FIFO緩沖器的應(yīng)用5</p><p> 3.5 FIFO緩沖器空/滿狀態(tài)的算法5</p><p> 4 FIFO緩沖器設(shè)計(jì)方案6</p><p> 4.1方案一——FIFO定制6</p><p> 4.1.1 設(shè)計(jì)步驟6</p><p> 4.1.2 功能驗(yàn)證7
9、</p><p> 4.2方案二——8個字長為9的變量構(gòu)成寄存器9</p><p> 4.2.1 設(shè)計(jì)思想9</p><p> 4.2.2功能模塊9</p><p> 4.2.3 硬件調(diào)試10</p><p><b> 4 結(jié)束語11</b></p><p&
10、gt;<b> 參考文獻(xiàn)12</b></p><p><b> 附錄113</b></p><p><b> 附錄215</b></p><p><b> 摘 要</b></p><p> 先進(jìn)先出(FIFO)緩沖器是雙端口數(shù)據(jù)存儲器,
11、其存儲結(jié)構(gòu)與RAM相同,僅存儲方式存在差異。本文詳細(xì)介紹了基于FPGA開發(fā)環(huán)境Quartus II、用VHDL語言編程實(shí)現(xiàn)FIFO緩沖器的方法和過程。利用FPGA的可編程性,擁有簡潔而又多變的設(shè)計(jì)方法。本設(shè)計(jì)實(shí)現(xiàn)了先進(jìn)先出緩存器的一些基本功能,也把一些新的思路加入到設(shè)計(jì)中,通過仿真和實(shí)驗(yàn)箱實(shí)現(xiàn)了FIFO緩沖器的數(shù)據(jù)讀寫功能、讀寫指針移動和復(fù)位功能、緩沖器空、滿指示標(biāo)志功能。本次課程設(shè)計(jì)中擬定了兩種設(shè)計(jì)方案,使FIFO緩沖器性能得以優(yōu)化,
12、并且都進(jìn)行了仿真和FPGA實(shí)現(xiàn)。</p><p> 關(guān)鍵詞:FIFO緩沖器,F(xiàn)PGA,Quartus II,VHDL </p><p><b> Abstract</b></p><p> First In First Out (FIFO) buffer is a dual-port data memory. It has the sam
13、e storage structure with RAM, but differences in the storage pattern. This article describes the methods and processes of designing a FIFO buffer, which based on Quartus II -- the FPGA development environment. The design
14、 is programmed by VHDL language. Via the simulation and experiment, such FIFO buffer functions is achived, as data reading and writing, moving and resetting the read and write pointer, signage feature of e</p><
15、;p> Key words:FIFO buffer,F(xiàn)PGA,Quartus II,VHDL</p><p><b> 1 緒論</b></p><p> 隨著電子工程和計(jì)算機(jī)科學(xué)(EECS)的迅猛發(fā)展,數(shù)字電路系統(tǒng)的發(fā)展也十分迅速。電子器件在最近幾十年經(jīng)歷了從小規(guī)模集成電路到中、大規(guī)模集成電路的發(fā)展歷程。從簡單的可編程器件到高密度可編程器件。設(shè)計(jì)方法也
16、在從根本上轉(zhuǎn)變。由原來的手工設(shè)計(jì)發(fā)展到現(xiàn)在的電子設(shè)計(jì)自動化EDA(Electronic Design Automation)技術(shù)。EDA技術(shù)就是依賴功能強(qiáng)大的計(jì)算機(jī)。在EDA工具軟件平臺上.以硬件描述語言VHDL(Very High Speed Inte-grated Circuit Hardware Description Language)為系統(tǒng)邏輯捕述手段。VHDL是一種全方位的硬件描述語言,包括系統(tǒng)行為級、寄存器傳輸級和邏輯門級
17、多個設(shè)計(jì)層次,支持結(jié)構(gòu)、數(shù)據(jù)流和行為3種描述形式的混合描述,因此VHDL幾乎覆蓋了以往各種硬件描述語言的功能,整個自頂向下或自底向上的電路設(shè)計(jì)過程都可以用VHDL來完成。</p><p> 可編程邏輯器件自20世紀(jì)70年代以來,經(jīng)歷了PAL、GAL、CPLD、FPGA幾個發(fā)展階段,其中CPLD、FPGA屬高密度可編程邏輯器件,目前集成度以高達(dá)200萬門/片,它將掩膜ASIC集成度高的優(yōu)點(diǎn)和可編程邏輯器件設(shè)計(jì)生產(chǎn)
18、方便的特點(diǎn)結(jié)合在一起,特別適合于樣品研制和小批量產(chǎn)品開發(fā),使產(chǎn)品能以最快的速度上市,而當(dāng)市場擴(kuò)大時,它可以和容易地轉(zhuǎn)由ASIC實(shí)現(xiàn),因此開發(fā)風(fēng)險(xiǎn)也大為降低。CPLD/FPGA器件已成為現(xiàn)代高層次電子設(shè)計(jì)方法的實(shí)現(xiàn)載體。</p><p> Quartus II 是Altera公司的綜合性PLD開發(fā)軟件,支持原理圖、VHDL、VerilogHDL以及AHDL(Altera Hardware Description
19、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)。</p><p> Altera的Quartus II可編程邏輯軟件屬于第四代PLD開發(fā)平臺。該平臺支持一個工作
20、組環(huán)境下的設(shè)計(jì)要求,其中包括支持基于Internet的協(xié)作設(shè)計(jì)。Quartus平臺與Cadence、Exe-mplarLogic、MentorGraphics、Synopsys和Synplicity等EDA供應(yīng)商的開發(fā)工具相兼容。改進(jìn)了軟件的LogicLock模塊設(shè)計(jì)功能,增添 了FastFit編譯選項(xiàng),推進(jìn)了網(wǎng)絡(luò)編輯性能,而且提升了調(diào)試能力。Altera在Quartus II中包含了許多諸如SignalTap II、Chip Edit
21、or和RTL V-iewer的設(shè)計(jì)輔助工具,集成了SOPC和HardCopy設(shè)計(jì)流程,并且繼承了Maxplus II 友好的圖形界面及簡便的使用方法。</p><p> 2 QUARTUS II的使用</p><p><b> 2.1 新建工程</b></p><p> 雙擊桌面QUARTUS II圖標(biāo)進(jìn)入主界面,單擊軟件主界面中File
22、 → New Project Wizard...開始新建一個工工程,根據(jù)提示選擇存儲路徑,輸入工程名,軟件會默認(rèn)頂層實(shí)體名與工程名相同并顯示。往下選擇芯片,在此時選擇Cyclone下的EP1C3T144C8,最后會顯示所有選擇結(jié)果,以供最后確認(rèn)。</p><p><b> 2.2 程序編寫</b></p><p> 單擊File→New...,在彈出的窗口中選擇新
23、建VHDL File,然后在其中編寫程序。一般用三段式VHDL語言編寫程序代碼。⑴ 庫或程序包調(diào)用的說明部分;⑵ 實(shí)體說明部分;⑶ 結(jié)構(gòu)體描述模塊功能;</p><p> 編寫完成程序代碼后,將其以實(shí)體名保存,編譯程序,若編譯成功則繼續(xù)向下進(jìn)行。將多個程序連起來成為創(chuàng)建頂層文件,可以由程序編寫或者用畫圖來實(shí)現(xiàn)。</p><p> 本課題最終用原理圖畫頂層文件,故還需要由VHDL Fil
24、e生成元件,以供畫圖使用。在主窗口左側(cè)Project Navigator下選擇Files,在Software Files下找到需要生成元件的VHDL文件,右鍵單擊選擇Create Symbol Files For Current File來生成元件。元件生成之后就可以進(jìn)行原理圖繪制。方法是:單擊File→New...,在彈出的窗口中選擇新建Block Diagram/Schematic File。左鍵雙擊原理圖,在彈出的Symbol窗口
25、中選擇元件,可以再軟件自帶的元件庫中找常用元件,如果之前有通過VHDL File生成元件,還可以在窗口中的Project下找自己生成的元件。選定元件,OK后將其放置在原理圖上適當(dāng)?shù)奈恢?,選好所有元件后,按照設(shè)計(jì)對元件進(jìn)行連線,最后再加上輸入輸出端口并更改端口名,保存原理圖進(jìn)行編譯,若成功則進(jìn)入下一步,否則根據(jù)提示修改原理圖直到編譯成功。</p><p><b> 2.3 仿真</b><
26、;/p><p> 單擊File→New...,在彈出的窗口中選擇新建Vector Waveform File。左鍵雙擊圖左邊的空白處,在彈出的Insert Node or Bus窗口下單擊Node Finder,在彈出的窗口中單擊List,并將Nodes Found全部導(dǎo)到Selected Nodes,單擊OK,仿真圖上會顯示所有的輸入輸出端口。選定某一輸入端口,在左邊的工具條中選擇適當(dāng)?shù)膱D標(biāo)設(shè)置輸入波形。將所有的
27、輸入端口設(shè)置完畢后保存,單擊Processing→Simulator Tool,Simulation Tool設(shè)置為Functional,單擊Generate Functional Simulation Netlist。待其完成后選擇Simulator Tool窗口下方的的Start,完成后,單擊Open,仿真結(jié)果會覆蓋在仿真圖上。根據(jù)波形檢查是否實(shí)現(xiàn)要達(dá)到的功能。</p><p><b> 2.4
28、硬件調(diào)試</b></p><p> 單擊主界面Assignments→Device...在彈出的Setting窗口下單擊Device&Pin Option,在彈出的窗口中設(shè)置不是用的管腳為高阻態(tài)。單擊Assignments→Pins,對應(yīng)實(shí)驗(yàn)箱上的管腳名進(jìn)行設(shè)置,設(shè)置完畢后進(jìn)行編譯,軟件會檢測管腳設(shè)置有無錯誤。設(shè)置無誤單擊Programmer,在實(shí)驗(yàn)箱與微機(jī)主機(jī)連接好并通電打開電源的前提下,
29、即可以向?qū)嶒?yàn)箱中導(dǎo)入程序,進(jìn)行硬件調(diào)試。</p><p> 3 FIFO緩沖器原理</p><p> FIFO是英文First In First Out的縮寫,是一種先進(jìn)先出的數(shù)據(jù)緩存器,他與普通存儲器的區(qū)別是沒有外部讀寫地址線,這樣使用起來非常簡單,但缺點(diǎn)就是只能順序?qū)懭霐?shù)據(jù),順序的讀出數(shù)據(jù),其數(shù)據(jù)地址由內(nèi)部讀寫指針自動加1完成,不能像普通存儲器那樣可以由地址線決定讀取或?qū)懭肽硞€指
30、定的地址。</p><p> 3.1 FIFO緩沖器的結(jié)構(gòu)</p><p> FIFO緩沖器一般由三部分構(gòu)成,分別為寫地址產(chǎn)生器、讀地址產(chǎn)生器、雙端寄存器。各部分都有各自的時鐘信號,有數(shù)據(jù)輸入輸出端口、讀寫操作控制信號、有緩沖空滿標(biāo)志位。FIFO緩沖器一般結(jié)構(gòu)簡圖如圖2-1所示。</p><p> 3.2 FIFO的一些重要參數(shù)</p><
31、p> FIFO的寬度:也就是英文資料里??吹降腡HE WIDTH,它指的是FIFO一次讀寫操作的數(shù)據(jù)位,就像MCU有8位和16位,ARM 32位等等,F(xiàn)IFO的寬度在單片成品IC中是固定的,也有可選擇的,如果用FPGA自己實(shí)現(xiàn)一個FIFO,其數(shù)據(jù)位,也就是寬度是可以自己定義的。</p><p> FIFO的深度:THE DEEPTH,它指的是FIFO可以存儲多少個N位的數(shù)據(jù)(如果寬度為N)。如一個8位的
32、FIFO,若深度為8,它可以存儲8個8位的數(shù)據(jù),深度為12 ,就可以存儲12個8位的數(shù)據(jù),F(xiàn)IFO的深度可大可小,個人認(rèn)為FIFO深度的計(jì)算并無一個固定的公式。在FIFO實(shí)際工作中,其數(shù)據(jù)的滿/空標(biāo)志可以控制數(shù)據(jù)的繼續(xù)寫入或讀出。在一個具體的應(yīng)用中也不可能由一些參數(shù)算數(shù)精確的所需FIFO深度為多少,這在寫速度大于讀速度的理想狀態(tài)下是可行的,但在實(shí)際中用到的FIFO深度往往要大于計(jì)算值。一般來說根據(jù)電路的具體情況,在兼顧系統(tǒng)性能和FIFO
33、成本的情況下估算一個大概的寬度和深度就可以了。而對于寫速度慢于讀速度的應(yīng)用,F(xiàn)IFO的深度要根據(jù)讀出的數(shù)據(jù)結(jié)構(gòu)和讀出數(shù)據(jù)的由那些具體的要求來確定。</p><p> 滿標(biāo)志:FIFO已滿或?qū)⒁獫M時由FIFO的狀態(tài)電路送出的一個信號,以阻止FIFO的寫操作繼續(xù)向FIFO中寫數(shù)據(jù)而造成溢出(overflow)。</p><p> 空標(biāo)志:FIFO已空或?qū)⒁諘r由FIFO的狀態(tài)電路送出的一個
34、信號,以阻止FIFO的讀操作繼續(xù)從FIFO中讀出數(shù)據(jù)而造成無效數(shù)據(jù)的讀出(underflow)。</p><p> 讀時鐘:讀操作所遵循的時鐘,在每個時鐘沿來臨時讀數(shù)據(jù)。</p><p> 寫時鐘:寫操作所遵循的時鐘,在每個時鐘沿來臨時寫數(shù)據(jù)。</p><p> 讀指針:指向下一個讀出地址。讀完后自動加1。</p><p> 寫指針:
35、指向下一個要寫入的地址的,寫完自動加1。</p><p> 讀寫指針其實(shí)就是讀寫的地址,只不過這個地址不能任意選擇,而是連續(xù)的。</p><p> 3.3 FIFO的分類</p><p> 根據(jù)FIFO工作的時鐘域,可以將FIFO分為同步FIFO和異步FIFO。同步FIFO是指讀時鐘和寫時鐘為同一個時鐘。在時鐘沿來臨時同時發(fā)生讀寫操作。異步FIFO是指讀寫時鐘
36、不一致,讀寫時鐘是互相獨(dú)立的。異步FIFO緩沖器結(jié)構(gòu)原理圖如圖2-2所示。</p><p> 3.4 FIFO緩沖器的應(yīng)用</p><p> FIFO一般用于不同時鐘域之間的數(shù)據(jù)傳輸,比如FIFO的一端時AD數(shù)據(jù)采集,另一端時計(jì)算機(jī)的PCI總線,假設(shè)其AD采集的速率為16位 100K SPS,那么每秒的數(shù)據(jù)量為100K×16bit=1.6Mbps,而PCI總線的速度為33MH
37、z,總線寬度32bit,其最大傳輸速率為1056Mbps,在兩個不同的時鐘域間就可以采用FIFO來作為數(shù)據(jù)緩沖。另外對于不同寬度的數(shù)據(jù)接口也可以用FIFO,例如單片機(jī)位8位數(shù)據(jù)輸出,而DSP可能是16位數(shù)據(jù)輸入,在單片機(jī)與DSP連接時就可以使用FIFO來達(dá)到數(shù)據(jù)匹配的目的。</p><p> 3.5 FIFO緩沖器空/滿狀態(tài)的算法</p><p> FIFO設(shè)計(jì)的難點(diǎn)在于怎樣判斷FIF
38、O的空/滿狀態(tài)。為了保證數(shù)據(jù)正確的寫入或讀出,而不發(fā)生益處或讀空的狀態(tài)出現(xiàn),必須保證FIFO在滿的情況下,不能進(jìn)行寫操作。在空的狀態(tài)下不能進(jìn)行讀操作。怎樣判斷FIFO的滿/空就成了FIFO設(shè)計(jì)的核心問題。由于同步FIFO幾乎很少用到,這里只描述異步FIFO的空/滿標(biāo)志產(chǎn)生問題。</p><p> 構(gòu)造一個指針寬度為N+1,深度為2^N字節(jié)的FIFO(為方便比較將格雷碼指針轉(zhuǎn)換為二進(jìn)制指針)。當(dāng)指針的二進(jìn)制碼中最
39、高位不一致而其它N位都相等時,F(xiàn)IFO為滿(在Clifford E. Cummings的文章中以格雷碼表示是前兩位均不相同,而后兩位LSB相同為滿,這與換成二進(jìn)制表示的MSB不同其他相同為滿是一樣的)。當(dāng)指針完全相等時,F(xiàn)IFO為空。這也許不容易看出,舉個例子說明一下:一個深度為8字節(jié)的FIFO怎樣工作(使用已轉(zhuǎn)換為二進(jìn)制的指針)。FIFO_WIDTH=8,F(xiàn)IFO_DEPTH= 2^N = 8,N = 3,指針寬度為N+1=4。起初r
40、d_ptr_bin和wr_ptr_bin均為“0000”。此時FIFO中寫入8個字節(jié)的數(shù)據(jù)。wr_ptr_bin =“1000”,rd_ptr_bin=“0000”。當(dāng)然,這就是滿條件?,F(xiàn)在,假設(shè)執(zhí)行了8次的讀操作,使得rd_ptr_bin =“1000”,這就是空條件。另外的8次寫操作將使wr_ptr_bin 等于“0000”,但rd_ptr_bin 仍然等于“1000”,因此FIFO為滿條件。</p><p>
41、; 顯然起始指針無需為“0000”。假設(shè)它為“0100”,并且FIFO為空,那么8個字節(jié)會使wr_ptr_bin =“1100”,, rd_ptr_bin 仍然為“0100”。這又說明FIFO為滿。</p><p> 4 FIFO緩沖器設(shè)計(jì)方案</p><p> 方案一充分利用Quartus II 軟件的強(qiáng)大集成環(huán)境,直接定制FIFO模塊,系統(tǒng)提供現(xiàn)成的電路結(jié)構(gòu)圖、程序代碼、仿真波
42、形等文件。只需用戶簡單的調(diào)用和設(shè)置就可以完成,非常方便快捷,而且準(zhǔn)確。</p><p> 方案二使用VHDL語言編寫程序?qū)崿F(xiàn)FIFO功能。從提高代碼有效率的角度出發(fā),用8個向量為9的變量存儲數(shù)據(jù),并將讀寫操作同內(nèi)部寄存器融合在一起編寫。整合模塊,提高利用率。</p><p> 4.1方案一——FIFO定制</p><p> 4.1.1 設(shè)計(jì)步驟</p&g
43、t;<p> 直接Quartus II自帶的FIFO利用設(shè)計(jì)步驟如下:</p><p> (1) 打開MegaWizard Plug-In Manager初始對話框。在Tools菜單中選擇MegaWizard </p><p> Plug-In Manager,選擇Create a new custom…項(xiàng)(如果要修改一個已編輯好的LPM模塊,則選擇Edit an ex
44、isting custom…項(xiàng)),即定制一個新的模塊。單擊Next按鈕后在左欄選擇Storage項(xiàng)下的FIFO,再選擇Cyclone器件和VHDL語言方式;最后輸入FIFO文件存放的路徑和文件名:d:\sin_gnt\data_rom.vhd(定制的 ROM 元件文件名),單擊Next按鈕。</p><p> 輸出信號控制線。選擇full、empty、usedw。</p><p> 單
45、擊Next按鈕后繼續(xù)執(zhí)行以下設(shè)置。后面的設(shè)置基本都默認(rèn),直接單擊NEXT,直至如下圖所示(中間過程為默認(rèn)設(shè)置)選中所有的文件,即可生成.vhd、.inc、.cmp、.bsf、.jpg等文件。至此,F(xiàn)IFO宏定制設(shè)計(jì)完成。下面檢測驗(yàn)證其功能。</p><p> 4.1.2 功能驗(yàn)證</p><p> 打開工程中.jpg文件得到仿真波形圖。當(dāng)寫使能write=1,read=0時的時候,遇到
46、第一個脈沖上升沿就將輸入端口的001送到內(nèi)部雙端寄存器里面,第二個脈沖時把002送進(jìn)去;之后讀使能read=1,將第一個數(shù)001送到輸出端口;read=0,寫入第三個數(shù)003;再次讀使能read=1,讀出第二個數(shù)001。當(dāng)aclr=1時,地址清零。在寫入第一個數(shù)后,讀指針加1等于寫指針,故判為空。其功能模塊如下:</p><p><b> 仿真波形圖:</b></p><
47、;p> 4.2方案二——8個字長為9的變量構(gòu)成寄存器</p><p> 4.2.1 設(shè)計(jì)思想</p><p> 在緩沖器內(nèi)部定義一個89的存儲空間用于暫存數(shù)據(jù)。初始狀態(tài)讀寫指針都指向0號數(shù)寄存器(共8個)。當(dāng)輸入通道打開時,每來一個脈沖(由外部按鍵提供),向緩沖期內(nèi)輸入一個9位的數(shù),與此同時內(nèi)部寄存器讀指針加1,準(zhǔn)備接受下一個需要暫存的數(shù),下一個脈沖到來,再存一個數(shù),讀指針再加
48、1……當(dāng)輸出通道打開時,每來一個脈沖輸出一個9位數(shù),寫指針加1,準(zhǔn)備輸出下一個9位數(shù),同理進(jìn)行下一個數(shù)的輸出……由于輸入/輸出數(shù)據(jù)是按需進(jìn)行的,故設(shè)計(jì)脈沖由按鍵提供,為更好的進(jìn)行控制,加一個消抖電路使其每按一次內(nèi)部計(jì)數(shù)確定加1。</p><p><b> 4.2.2功能模塊</b></p><p> 本設(shè)計(jì)共由兩個部分組成:先入先出緩存器、分頻器。</p&g
49、t;<p> 其中先入先出緩存器模塊包括寫操作、讀操作:</p><p> 寫操作:當(dāng)wrptclr為0時,首先將寫地址wrinc清零。當(dāng)wrptclr為1且寫使能write=1、讀使能無效ready=0時,將data_in寫入寄存器。程度段如下:</p><p> write_prog:process(wrptclr,clk)is</p><p&g
50、t;<b> begin</b></p><p> if(wrptclr='0')then</p><p> wrinc<=(others=>'0'); wradd<=wrinc;</p><p> elsif (clk'event and clk='1') th
51、en</p><p> if (write='1') then</p><p> case wrinc is</p><p> when"000" => q0<=data_in;</p><p><b> …… …… ……</b></p><p
52、> 讀操作:與寫操作算法相同,只是讀指針為rdinc,讀指針清零控制變量rdptclr。</p><p> if (rdptclr='0') then rdinc<=(others=>'0'); </p><p> elsif (clk'event and clk='1') then</p>&
53、lt;p> if (ready='1') then --加入當(dāng)ready無效時,輸出處于高阻態(tài)</p><p> case rdinc is</p><p> when "000" => data_out <= q0; …… ……</p><p> else data_out<=
54、"ZZZZZZZZZ";</p><p><b> 分頻器原理如下:</b></p><p> 為了配合消抖電路,取延時為5ms,即使得采樣頻率為5ms,由此根據(jù)f=1/T,算得脈沖頻率為200Hz,而實(shí)驗(yàn)箱上提供的是20M的時鐘頻率,故要對時鐘進(jìn)行分頻。程序中用內(nèi)部計(jì)數(shù)器計(jì)算到來的脈沖數(shù),脈沖數(shù)小于50000時輸出為0,否則輸出為1,同時計(jì)到
55、100000時計(jì)數(shù)器清零。</p><p><b> 整體原理圖如下:</b></p><p> 4.2.3 硬件調(diào)試</p><p> 選擇下進(jìn)行芯片設(shè)置,選擇芯片選用設(shè)置好后進(jìn)行引腳設(shè)置,一切選擇好后將程序下載入實(shí)驗(yàn)箱上,接通電源,用按鍵來控制它的脈沖輸入,用撥碼開關(guān)來控制它的輸入序列,用發(fā)光二極管(即試驗(yàn)箱上的燈)作為它的輸出,以觀
56、察燈的的變化來觀察FIFO的輸出。先將輸入序列設(shè)置好將wrpclr rdpclr置1,將write 置1,此時燈的狀態(tài)與輸入序列相同,再將ready置1,改變輸入序列,再將ready 置0,write置1,此時燈的狀態(tài)與改后輸入序列相同,從而達(dá)到緩沖的狀態(tài)</p><p><b> 4 結(jié)束語</b></p><p> 兩周時間轉(zhuǎn)眼就過,電子線路EDA課程設(shè)計(jì)也接
57、近的尾聲。在此次課程設(shè)計(jì),我認(rèn)為最重要的就是認(rèn)真的研究老師給的題目,先搞懂要做什么達(dá)到什么樣的效果,再進(jìn)行原理分析寫出各個模塊程序這樣會事半功倍。</p><p> 在這兩周來,也總結(jié)出了自己很多問題,第一、不夠細(xì)心比如由于粗心大意敲錯代碼,由于對課本理論的不熟悉導(dǎo)致編程出現(xiàn)錯誤。第二,思路不夠嚴(yán)謹(jǐn),我的第一大心得體會就是作為一名工程技術(shù)人員,要求具備的首要素質(zhì)絕對應(yīng)該是嚴(yán)謹(jǐn)。第三,在做人上,我認(rèn)識到,無論做什
58、么事情,只要你足夠堅(jiān)強(qiáng),有足夠的毅力與決心,有足夠的挑戰(zhàn)困難的勇氣,就沒有什么辦不到的。在這次難得的課程設(shè)計(jì)過程中我鍛煉了自己的思考能力和動手能力。同時自己查閱資料獲取對自己有用的信息的能力有所提高</p><p> 感謝學(xué)校給我們這次機(jī)會,鍛煉了我們的動手能力。通過這次課設(shè)讓我明白了理論和實(shí)際操作之間差距,而且也讓我很明確得意識到自己在EDA有很多的不足,以后應(yīng)該多鉆研一下。同時也感謝指導(dǎo)老師在設(shè)計(jì)過程中的輔
59、導(dǎo)以及同學(xué)的幫助。</p><p> 再次感謝老師的輔導(dǎo)以及同學(xué)的幫助,是他們讓我有了一個更好的認(rèn)識,無論是學(xué)習(xí)還是生活,生活是實(shí)在的,要踏實(shí)走路。課程設(shè)計(jì)時間雖然很短,但我學(xué)習(xí)了很多的東西,使我眼界打開,感受頗深。</p><p><b> 參考文獻(xiàn)</b></p><p> [1] 潘松.黃繼業(yè),EDA技術(shù)與VHDL(第二版).北京
60、:清華大學(xué)出版社,2007.01</p><p> [2] 黃仁欣,EDA技術(shù)實(shí)用教程. 北京 :清華大學(xué)出版社,2006.09</p><p> [3] 汪國強(qiáng),EDA技術(shù)與應(yīng)用. 北京 :電子工業(yè)出版社,2007.04</p><p> [4] 宋嘉玉,孫麗霞.EDA實(shí)用技術(shù).北京:人民郵電出版社,2006. </p><p>
61、[5] 齊洪喜,陸穎.VHDL電路設(shè)計(jì)實(shí)用技術(shù).北京:清華大學(xué)出版社,2004.</p><p><b> 附錄1</b></p><p> LIBRARY ieee;</p><p> USE ieee.std_logic_1164.all;</p><p> LIBRARY altera_mf;</p&
62、gt;<p> USE altera_mf.all;</p><p> ENTITY FIFO IS</p><p><b> PORT</b></p><p><b> (</b></p><p> aclr: IN STD_LOGIC ;</p><
63、;p> clock: IN STD_LOGIC ;</p><p> data: IN STD_LOGIC_VECTOR (8 DOWNTO 0);</p><p> rdreq: IN STD_LOGIC ;</p><p> wrreq: IN STD_LOGIC ;</p><p> empty: O
64、UT STD_LOGIC ;</p><p> full: OUT STD_LOGIC ;</p><p> q: OUT STD_LOGIC_VECTOR (8 DOWNTO 0);</p><p> usedw: OUT STD_LOGIC_VECTOR (2 DOWNTO 0)</p><p><b> )
65、;</b></p><p><b> END FIFO;</b></p><p> ARCHITECTURE SYN OF fifo IS</p><p> SIGNAL sub_wire0: STD_LOGIC_VECTOR (2 DOWNTO 0);</p><p> SIGNAL sub_wi
66、re1: STD_LOGIC ;</p><p> SIGNAL sub_wire2: STD_LOGIC_VECTOR (8 DOWNTO 0);</p><p> SIGNAL sub_wire3: STD_LOGIC ;</p><p> COMPONENT scfifo</p><p><b> GENERIC
67、 (</b></p><p> add_ram_output_register: STRING;</p><p> intended_device_family: STRING;</p><p> lpm_numwords: NATURAL;</p><p> lpm_showahead: STRING;&
68、lt;/p><p> lpm_type: STRING;</p><p> lpm_width: NATURAL;</p><p> lpm_widthu: NATURAL;</p><p> overflow_checking: STRING;</p><p> underflow_checki
69、ng: STRING;</p><p> use_eab: STRING</p><p><b> );</b></p><p><b> PORT (</b></p><p> usedw: OUT STD_LOGIC_VECTOR (2 DOWNTO 0);</p>
70、<p> rdreq: IN STD_LOGIC ;</p><p> empty: OUT STD_LOGIC ;</p><p> aclr: IN STD_LOGIC ;</p><p> clock: IN STD_LOGIC ;</p><p> q: OUT STD_LOGIC_VECTOR (8
71、 DOWNTO 0);</p><p> wrreq: IN STD_LOGIC ;</p><p> data: IN STD_LOGIC_VECTOR (8 DOWNTO 0);</p><p> full: OUT STD_LOGIC </p><p><b> );</b></p>&
72、lt;p> END COMPONENT;</p><p><b> BEGIN</b></p><p> usedw <= sub_wire0(2 DOWNTO 0);</p><p> empty <= sub_wire1;</p><p> q <= sub_wir
73、e2(8 DOWNTO 0);</p><p> full <= sub_wire3;</p><p> scfifo_component : scfifo</p><p> GENERIC MAP (</p><p> add_ram_output_register => "ON",</p
74、><p> intended_device_family => "Cyclone",</p><p> lpm_numwords => 8,</p><p> lpm_showahead => "OFF",</p><p> lpm_type => "scfifo&
75、quot;,</p><p> lpm_width => 9,</p><p> lpm_widthu => 3,</p><p> overflow_checking => "ON",</p><p> underflow_checking => "ON",</p
76、><p> use_eab => "ON"</p><p><b> )</b></p><p> PORT MAP (</p><p> rdreq => rdreq,</p><p> aclr => aclr,</p><p&g
77、t; clock => clock,</p><p> wrreq => wrreq,</p><p> data => data,</p><p> usedw => sub_wire0,</p><p> empty => sub_wire1,</p><p> q =&g
78、t; sub_wire2,</p><p> full => sub_wire3</p><p><b> );</b></p><p><b> END SYN;</b></p><p><b> 附錄2</b></p><p><
79、b> FIFIO的程序</b></p><p> library ieee;</p><p> use ieee.std_logic_1164.all;</p><p> use ieee.std_logic_unsigned.all;</p><p> use ieee.std_logic_arith.all;&
80、lt;/p><p> entity FIFO is</p><p> port(ready,write : in std_logic;</p><p> data_in : in std_logic_vector(8 downto 0);</p><p> clk : in std_logic;</p><p>
81、 rdptclr,wrptclr : in std_logic;</p><p> data_out : out std_logic_vector(8 downto 0));</p><p><b> end FIFO;</b></p><p> architecture bhv of FIFO is</p><p&g
82、t; signal rdinc,wrinc : integer range 0 to 7;</p><p> signal rom0,rom1,rom2,rom3,rom4,rom5,rom6,rom7 : std_logic_vector(8 downto 0);</p><p> signal r_w : std_logic_vector(1 downto 0);</p&g
83、t;<p><b> begin</b></p><p> process(clk,data_in,ready,write,rdptclr,wrptclr)</p><p><b> begin</b></p><p> r_w<=ready&write;</p><
84、p> if(rising_edge(clk))</p><p> then case r_w is</p><p> when "00"|"11" => data_out<="ZZZZZZZZZ";</p><p> when "01" => if(wrp
85、tclr='1') then wrinc<=0;</p><p> else case wrinc is</p><p> when 0 => rom0<=data_in;</p><p> when 1 => rom1<=data_in;</p><p> when 2 => ro
86、m2<=data_in;</p><p> when 3 => rom3<=data_in;</p><p> when 4 => rom4<=data_in;</p><p> when 5 => rom5<=data_in;</p><p> when 6 => rom6<=d
87、ata_in;</p><p> when 7 => rom7<=data_in;</p><p> when others => null;</p><p><b> end case;</b></p><p> wrinc<=wrinc+1;</p><p>&
88、lt;b> end if;</b></p><p> when "10" => if(rdptclr='1')</p><p> then rdinc<=0;</p><p> else case rdinc is</p><p> when 0 => data
89、_out<=rom0;</p><p> when 1 => data_out<=rom1;</p><p> when 2 => data_out<=rom2;</p><p> when 3 => data_out<=rom3;</p><p> when 4 => data_out
90、<=rom4;</p><p> when 5 => data_out<=rom5;</p><p> when 6 => data_out<=rom6;</p><p> when 7 => data_out<=rom7;</p><p> when others => null;&l
91、t;/p><p><b> end case;</b></p><p> rdinc<=rdinc+1;</p><p><b> end if;</b></p><p><b> end case;</b></p><p><b>
92、 end if;</b></p><p> end process;</p><p><b> end bhv;</b></p><p><b> 分頻器的程序</b></p><p> library ieee;</p><p> use ieee.
93、std_logic_1164.all;</p><p> use ieee.std_logic_arith.all;</p><p> use ieee.std_logic_unsigned.all;</p><p> entity fenpin is</p><p> port(clkf:in std_logic;
94、 </p><p> q1:out std_logic);</p><p> end fenpin;</p><p> architecture behave of fenpin is</p><p> signal q:std_logic_vector(25 downto 0
95、);</p><p><b> begin</b></p><p> process(clkf)</p><p><b> begin</b></p><p> if rising_edge(clkf)then</p><p> if(q=100000)then&l
96、t;/p><p> q<=(others=>'0');</p><p> else q<=q+1;</p><p> if q<50000 then </p><p><b> q1<='0';</b></p><p> else
97、 q1<='1';</p><p><b> end if;</b></p><p><b> end if;</b></p><p><b> end if;</b></p><p> end process;</p><p&
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 8×8點(diǎn)陣led數(shù)碼圖形顯示的課程設(shè)計(jì)
- 8×8×8光立方畢業(yè)方案說明書
- 課程設(shè)計(jì)--8×8led點(diǎn)陣屏仿電梯數(shù)字滾動顯示
- 倉庫管理_先進(jìn)先出制度
- 倉庫先進(jìn)先出管理規(guī)范
- 物料先進(jìn)先出管理規(guī)范
- 倉庫儲存、先進(jìn)先出管理規(guī)范
- LC1303先進(jìn)先出存儲器的設(shè)計(jì)與實(shí)現(xiàn).pdf
- 課程設(shè)計(jì)--8位計(jì)數(shù)器eda課程設(shè)計(jì)報(bào)告
- 單片機(jī)課程設(shè)計(jì)--4個8×8點(diǎn)陣led電子顯示屏的設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)---4個8×8點(diǎn)陣led電子顯示屏的設(shè)計(jì)
- 16×16點(diǎn)陣eda課程設(shè)計(jì)報(bào)告
- 先進(jìn)先出法倉庫管理系統(tǒng)
- 畢業(yè)設(shè)計(jì)-----車鉤、緩沖器緩沖裝置設(shè)計(jì)
- eda課程設(shè)計(jì)-搶答器
- eda課程設(shè)計(jì)--eda課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告
- eda課程設(shè)計(jì)--計(jì)費(fèi)器
- eda課程設(shè)計(jì)報(bào)告--eda數(shù)字搶答器
- eda課程設(shè)計(jì)-- eda與數(shù)字系統(tǒng)課程設(shè)計(jì)
- eda自動值更器課程設(shè)計(jì)
評論
0/150
提交評論