基于FPGA的數(shù)字系統(tǒng)設(shè)計(jì)與實(shí)踐-課件_第1頁(yè)
基于FPGA的數(shù)字系統(tǒng)設(shè)計(jì)與實(shí)踐-課件_第2頁(yè)
基于FPGA的數(shù)字系統(tǒng)設(shè)計(jì)與實(shí)踐-課件_第3頁(yè)
基于FPGA的數(shù)字系統(tǒng)設(shè)計(jì)與實(shí)踐-課件_第4頁(yè)
基于FPGA的數(shù)字系統(tǒng)設(shè)計(jì)與實(shí)踐-課件_第5頁(yè)
已閱讀5頁(yè),還剩194頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、第六章 綜合數(shù)字系統(tǒng)實(shí)例6.1 矩陣鍵盤(pán)掃描接口設(shè)計(jì)6.2 交通燈控制的設(shè)計(jì)6.3 6層電梯控制器的設(shè)計(jì)6.4 快速傅里葉變換FFT處理器的設(shè)計(jì)第六章 綜合數(shù)字系統(tǒng)實(shí)例6.1 矩陣鍵盤(pán)掃描接口設(shè) 本章分別以矩陣鍵盤(pán)掃描接口、交通燈控制、6層電梯、快速傅里葉變換FFT處理器四個(gè)實(shí)例的詳細(xì)設(shè)計(jì),幫助讀者深入學(xué)習(xí)理解FPGA的設(shè)計(jì)思想、方法。 本章分別以矩陣鍵盤(pán)掃描接口、交通燈控制、6層電梯、快速6.1 矩陣鍵盤(pán)掃描接口設(shè)計(jì) 本節(jié)介紹矩陣式鍵盤(pán)掃描接口設(shè)計(jì),該實(shí)例的目的在于學(xué)習(xí)復(fù)雜數(shù)字系統(tǒng)的設(shè)計(jì)思想,掌握矩陣式鍵盤(pán)輸入陣列的設(shè)計(jì)方法。6.1 矩陣鍵盤(pán)掃描接口設(shè)計(jì) 本節(jié)介紹矩6.1.1 實(shí)例內(nèi)容說(shuō)明

2、在電子、控制、信息處理等各種系統(tǒng)中,操作人員經(jīng)常需要向系統(tǒng)輸入數(shù)據(jù)和命令來(lái)實(shí)現(xiàn)人機(jī)通信。實(shí)現(xiàn)人機(jī)通信最常用的輸入設(shè)備是鍵盤(pán)。在EDA技術(shù)的綜合應(yīng)用設(shè)計(jì)中,常用的鍵盤(pán)輸入電路有獨(dú)立式鍵盤(pán)輸入電路、矩陣式鍵盤(pán)輸入電路和“虛擬式”鍵盤(pán)輸入電路。6.1.1 實(shí)例內(nèi)容說(shuō)明 在電子、控制、信息處理 所謂矩陣式鍵盤(pán)輸入電路,就是將水平鍵盤(pán)掃描線和垂直輸出譯碼線的交叉處通過(guò)一個(gè)按鍵來(lái)連通,再通過(guò)一個(gè)鍵盤(pán)輸入譯碼電路,將各種鍵盤(pán)掃描線和垂直輸出譯碼線信號(hào)的不同組合編碼轉(zhuǎn)換成一個(gè)特定的輸入信號(hào)值或輸入信號(hào)編碼。利用這種行列矩陣結(jié)構(gòu)的鍵盤(pán),只需N個(gè)行線和M個(gè)列線即可組成NM按鍵。矩陣式鍵盤(pán)輸入電路的優(yōu)點(diǎn)是當(dāng)需要鍵數(shù)

3、較多時(shí),可以節(jié)省I/O口線;缺點(diǎn)是編程相對(duì)困難。 所謂矩陣式鍵盤(pán)輸入電路,就是將水平鍵盤(pán)掃描線和垂直輸 本實(shí)驗(yàn)使用實(shí)驗(yàn)設(shè)備上的鍵盤(pán)單元設(shè)計(jì)一個(gè)44矩陣鍵盤(pán)的掃描譯碼電路。此設(shè)計(jì)包括鍵盤(pán)掃描模塊和掃描碼鎖存模塊,實(shí)現(xiàn)每按下鍵盤(pán)陣列的一個(gè)按鍵立即在七段數(shù)碼管上顯示相應(yīng)的數(shù)值。 本實(shí)例設(shè)計(jì)中,主要涉及到VHDL語(yǔ)言的case語(yǔ)句的應(yīng)用,以及Quartus II開(kāi)發(fā)工具的邏輯分析儀(SignalTap II Logic Analyzer)的使用。 本實(shí)驗(yàn)使用實(shí)驗(yàn)設(shè)備上的鍵盤(pán)單元設(shè)計(jì)一個(gè)44矩陣鍵盤(pán)6.1.2 設(shè)計(jì)思路與原理 鍵盤(pán)輸入接口一般有兩種方式:一個(gè)按鍵對(duì)應(yīng)一個(gè)輸入引腳方式和矩陣掃描方式。前者原

4、理比較簡(jiǎn)單,如圖6.1所示,按鍵一端(這里稱作左端)接地;另一端(這里稱作右端)通過(guò)一個(gè)電阻R上拉到VCC,并且接FPGA的輸入引腳。如果按鍵沒(méi)有被按下即按鍵兩端是斷開(kāi)的,由于右端通過(guò)一個(gè)電阻R上拉到VCC,此時(shí)FPGA的輸入引腳的輸入值為高;如果按鍵被按下即按鍵的左端和右端連通到地,此時(shí)FPGA的輸入引腳的輸入值為低。6.1.2 設(shè)計(jì)思路與原理 鍵盤(pán)輸入接口一般有兩圖6.1 一個(gè)按鍵對(duì)應(yīng)一個(gè)輸入引腳的按鍵原理圖圖6.1 一個(gè)按鍵對(duì)應(yīng)一個(gè)輸入引腳的按鍵原理圖 一個(gè)按鍵對(duì)應(yīng)一個(gè)輸入引腳的按鍵方式的優(yōu)點(diǎn)是原理簡(jiǎn)單、實(shí)現(xiàn)方便;缺點(diǎn)是每個(gè)按鍵都需要占用一個(gè)FPGA的I/O引腳,按鍵數(shù)量多,而FPGA的

5、可用引腳又不夠豐富的情況下,這個(gè)缺點(diǎn)是不能忽視的,甚至是不能容忍的。而鍵盤(pán)的矩陣掃描方式正好能很好解決這個(gè)問(wèn)題。相對(duì)一個(gè)按鍵對(duì)應(yīng)一個(gè)輸入引腳的按鍵方式,矩陣掃描方式的優(yōu)點(diǎn)就是在按鍵數(shù)量一定的情況下,占用FPGA的I/O引腳數(shù)量你那個(gè)有效減少。假設(shè)按鍵的數(shù)量為M*N個(gè),則所需的FPGA的I/O引腳數(shù)量為M+N個(gè)。但是矩陣掃描方式的原理也相對(duì)一個(gè)按鍵對(duì)應(yīng)一個(gè)輸入引腳的按鍵方式更為復(fù)雜,矩陣鍵盤(pán)的原理圖如圖6.2所示。 一個(gè)按鍵對(duì)應(yīng)一個(gè)輸入引腳的按鍵方式的優(yōu)點(diǎn)是原理簡(jiǎn)單、圖6.2 矩陣鍵盤(pán)的原理圖圖6.2 矩陣鍵盤(pán)的原理圖 首先對(duì)矩陣鍵盤(pán)的每個(gè)按鍵進(jìn)行編碼,編碼如圖6.2所示(0000、0001、1

6、110、1111)。由于COL通過(guò)電阻上拉到VCC,因此當(dāng)沒(méi)有鍵被按下時(shí),COL的值為“1111”;當(dāng)有按鍵被按下(假設(shè)被按下的鍵是編碼為“0000”的鍵)時(shí),F(xiàn)PGA輸出的行掃描信號(hào)ROW連續(xù)為“1110”“1101”“1011”“0111”,當(dāng)ROW等于“1110”即ROW0為低時(shí),COL0也為低,則表示FPGA判斷出編碼為“0000”的按鍵被按下,F(xiàn)PGA輸出有按鍵被按下的指示信號(hào)和該按鍵的編碼。FPGA的輸入/輸出接口如圖6.3所示。 首先對(duì)矩陣鍵盤(pán)的每個(gè)按鍵進(jìn)行編碼,編碼如圖6.2所圖6.3 鍵盤(pán)掃描輸入電路頂層設(shè)計(jì)電路圖圖6.3 鍵盤(pán)掃描輸入電路頂層設(shè)計(jì)電路圖6.1.3 程序設(shè)計(jì)與

7、驗(yàn)證 有了設(shè)計(jì)思路與原理,接下來(lái)要做的就是具體的實(shí)現(xiàn)過(guò)程與驗(yàn)證。6.1.3 程序設(shè)計(jì)與驗(yàn)證 有了設(shè)計(jì)思路6.1.3.1 創(chuàng)建Quartus II 工程(1)運(yùn)行Quartus II 軟件,選擇菜單FileNew Project Wizard,工程名稱及頂層文件名稱為“matrikeyscan”,在選擇器件設(shè)置對(duì)話框中選擇目標(biāo)器件,建立新工程。選擇FileNew菜單,創(chuàng)建VHDL描述語(yǔ)言設(shè)計(jì)文件,在文本編輯器界面中編寫(xiě)鍵盤(pán)掃描模塊matrikeyscan的VHDL源程序、鍵盤(pán)消抖模塊JPCD的VHDL源程序以及D觸發(fā)器電路DCFQ的VHDL源程序 ,分別保存設(shè)計(jì)文件并設(shè)“matrikeyscan

8、.vhd”為頂層文件。如圖4-4所示。6.1.3.1 創(chuàng)建Quartus II 工程圖6.4 Quartus II新工程創(chuàng)建對(duì)話框圖6.4 Quartus II新工程創(chuàng)建對(duì)話框(2)接連單擊“Next”按鈕到“Family & Device Setting”對(duì)話框,進(jìn)行相應(yīng)FPGA芯片的設(shè)置,本實(shí)例所用DE2實(shí)驗(yàn)板的Cyclone II系列EP2C35F672C6芯片,如圖4-5所示。讀者可根據(jù)實(shí)際情況進(jìn)行相應(yīng)調(diào)整,點(diǎn)擊“Finish”按鈕,完成工程創(chuàng)建。(2)接連單擊“Next”按鈕到“Family & Devi圖6.5 FPGA芯片設(shè)置圖6.5 FPGA芯片設(shè)置6.1.3.2 VHDL代碼

9、設(shè)計(jì)在Quartus II開(kāi)發(fā)環(huán)境下,選擇“File”-“New”命令或是點(diǎn)擊工具欄中的 圖標(biāo),在彈出的“New”對(duì)話框中,選擇“VHDL File”單擊“OK”按鈕,如圖6.6所示。6.1.3.2 VHDL代碼設(shè)計(jì)圖6.6 “New”對(duì)話框圖6.6 “New”對(duì)話框在代碼編輯窗口輸入設(shè)計(jì)代碼分別如下:-鍵盤(pán)輸入消抖電路的VHDL源程序。 JPXD.VHD-由于本設(shè)計(jì)中使用的矩陣式鍵盤(pán)是機(jī)械開(kāi)關(guān)結(jié)構(gòu),因此在開(kāi)關(guān)切換的瞬間會(huì)在-接觸點(diǎn)出現(xiàn)信號(hào)來(lái)回彈跳的現(xiàn)象,從而會(huì)造成誤動(dòng)作影響鍵盤(pán)操作的正確性。-出現(xiàn)彈跳的原因是:雖然只是按下按鍵一次然后放掉,然而實(shí)際產(chǎn)生的按鍵信號(hào)-卻不止跳動(dòng)一次,經(jīng)過(guò)取樣信號(hào)

10、的檢查后,將會(huì)造成誤判斷,以為鍵盤(pán)按了兩次。-如果調(diào)整抽樣頻率可以改善彈跳現(xiàn)象,因此必須加上彈跳清除電路,避免誤操作信號(hào)在代碼編輯窗口輸入設(shè)計(jì)代碼分別如下:-的發(fā)生。彈跳消除電路所使用的脈沖信號(hào)的頻率必須比其他電路使用的脈沖信號(hào)的頻率-更高;通常將掃描電路的工作頻率定在24Hz左右,而將彈跳消除電路的工作頻率定在128Hz-左右,其工作頻率通常是前者的4倍或者更高library ieee;use ieee.std_logic_1164.all;entity jpxd is port(d_in : in std_logic;-的發(fā)生。彈跳消除電路所使用的脈沖信號(hào)的頻率必須比其他電路clk : i

11、n std_logic;dd1,dd0,qq1,qq0: out std_logic;d_out:out std_logic);d_out1:out std_logic);end entity jpxd ;architecture behv of jpxd is component dcfq is port(clk: in std_logic; -時(shí)鐘信號(hào) clrn: in std_logic; -清零信號(hào) prn: in std_logic; -預(yù)置信號(hào) d: in std_logic; clk : in std_logic; q: out std_logic); end component

12、 dcfq; signal vcc,inv_d:std_logic; signal q0,q1:std_logic; signal d1,d0:std_logic; begin vcc=1; inv_dclk,clrn=inv_d,prn=vcc,d=vcc,q=q0); umn2:dcfq port map(clk=clk,clrn=q0,prn=vcc,d=vcc,q=q1); q: out std_logic);process(clk) begin if clkevent and clk=1 then d0=not q1; d1=d0; end if;end process; -dd0=

13、d0;dd1=d1;qq1=q1;qq0=q0; d_out = not(d1 and not d0); - d_out1=not q1;end architecture behv;process(clk)-鍵盤(pán)掃描電路的vhdl源程序:jpscan.vhd library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; entity jpscan is port(sclk : in std_logic; -系統(tǒng)時(shí)鐘:1khZ yline : in

14、 std_logic_vector(4 downto 1); -y列按鍵輸入 rclk : out std_logic; -x行鍵盤(pán)掃描時(shí)鐘 -鍵盤(pán)掃描電路的vhdl源程序:jpscan.vhdyxd : out std_logic_vector(3 downto 0); -y列消抖輸出 data : out std_logic_vector(7 downto 0); -數(shù)字輸出 xrow : out std_logic_vector(4 downto 1);-x行鍵盤(pán)掃描end entity jpscan; architecture behv of jpscan is component j

15、pxd is port(d_in : in std_logic; clk : in std_logic; d_out:out std_logic); end component jpxd;yxd : out std_logic_vector( signal clk:std_logic; -控制電路工作時(shí)鐘:512hZ signal key_scan : std_logic_vector(1 downto 0);-鍵盤(pán)掃描時(shí)鐘信號(hào)00-01-10-11 signal clk_jpxd : std_logic; -去抖電路工作時(shí)鐘: signal y_xd : std_logic_vector(3

16、 downto 0); -鍵盤(pán)列輸入去抖后的寄存器 signal x_scan : std_logic_vector(3 downto 0); -鍵盤(pán)行掃描輸出寄存器 -1110-1101-1011-0111 signal value : std_logic_vector(7 downto 0); - signal clk:std_logic; 按鍵譯碼數(shù)值寄存器 begin data=value; -信號(hào)掃描發(fā)生器 counter: block is signal q : std_logic_vector(6 downto 0); -計(jì)數(shù)器實(shí)現(xiàn)分頻 begin process(sclk) i

17、s begin if sclkevent and sclk=1 then q=q+1; end if;按鍵譯碼數(shù)值寄存器 clk=q(0); -控制電路工作時(shí)鐘:512hZ系統(tǒng)時(shí)鐘的二分頻clk_jpxd=q(2); -去抖時(shí)鐘信號(hào),大約128hZkey_scan=q(6 downto 5); -產(chǎn)生鍵盤(pán)掃描信號(hào)00-01-10-11,大約16hZ end process;x_scan=“1110” when key_scan=“00” else1101 when key_scan=01 Else1011 when key_scan=10 Else0111 when key_scan=11 e

18、lse clk=q(0); -控制電路工作時(shí)鐘:512hZ系統(tǒng) “1111”;xrow(4 downto 1)yline(1),d_out=y_xd(0),clk=clk_jpxd);u2 : jpxd port map(d_in=yline(2),d_out=y_xd(1),clk=clk_jpxd);u3 : jpxd port map(d_in=yline(3),d_out=y_xd(2),clk=clk_jpxd); “1111”;u4 : jpxd port map(d_in=yline(4),d_out=y_xd(3),clk=clk_jpxd);yxd(3 downto 0)=y

19、_xd(3 downto 0);rclk=sclk; -鍵盤(pán)掃描時(shí)鐘等于控制電路工作時(shí)鐘:512hZ end block jpxdmk;key_decoder : block is -鍵盤(pán)譯碼模塊signal z:std_logic_vector(5 downto 0);begin process(clk) begin zylineif clkevent and clk=1 thencase z iswhen “001110” = value value value value value value value value value value value value value valu

20、e value value value value=“01111-輸出鎖存器vhdl源程序:reg.vhdllibrary ieee;use ieee.std_logic_1164.all;entity reg is port( rclk : in std_logic; -掃描時(shí)鐘yxd : in std_logic_vector(3 downto 0); -y列消抖輸入data : in std_logic_vector(7 downto 0); -輸入數(shù)據(jù)led : out std_logic_vector(7 downto 0);-鎖存數(shù)據(jù)輸出end entity reg;-輸出鎖存器v

21、hdl源程序:reg.vhdlarchitecture behv of reg is signal rst : std_logic; -鎖存器復(fù)位清零 signal olddata : std_logic_vector(7 downto 0);-鎖存器舊數(shù)據(jù) signal newdata : std_logic_vector(7 downto 0);-鎖存器新數(shù)據(jù) begin process(rclk) begin if rclkevent and rclk=1 then rst=yxd(3) and yxd(2) and yxd(1) and yxd(0); -判斷是否有按鍵按下 archi

22、tecture behv of reg isend if;end process;process(rst) is begin if(rst=1) then -rst=1沒(méi)有按鍵按下 newdata=olddata; else olddata=data; -rst=0有按鍵按下打入新數(shù)據(jù) end if; led“Start Compilation”命令或是單擊工具欄中的 圖標(biāo)對(duì)代碼進(jìn)行編譯。編譯正確完成后,選擇“Assignment”“Pin Planer”命令或是單擊工具欄 圖標(biāo),進(jìn)行FPGA引腳分配,具體分配如圖6.7所示。完成代碼編寫(xiě)后,選擇“Processing”“Start圖6.7 F

23、PGA引腳分配圖6.7 FPGA引腳分配引腳分配完成后,選擇“Processing”“Start” “Start I/O Assignments Analysis”命令進(jìn)行FPGA引腳分配的合法性驗(yàn)證。通過(guò)FPGA引腳分配的合法性驗(yàn)證后,選擇“Processing”“Start Compilation”命令或是單擊工具欄中的 圖標(biāo)對(duì)代碼進(jìn)行編譯。編譯無(wú)誤,即完成了矩陣鍵盤(pán)掃描的設(shè)計(jì)階段。引腳分配完成后,選擇“Processing”“Start6.1.3.3 矩陣鍵盤(pán)掃描的驗(yàn)證 完成矩陣鍵盤(pán)掃描的代碼設(shè)計(jì)之后,需要對(duì)該設(shè)計(jì)進(jìn)行驗(yàn)證。驗(yàn)證有兩種方式:一種為軟件仿真,另一種為硬件測(cè)試。在進(jìn)行測(cè)試之前

24、準(zhǔn)備好開(kāi)發(fā)板、Altera下載纜、電源。 為了能讓讀者簡(jiǎn)單明了清楚實(shí)驗(yàn)過(guò)程,筆者在工程中加入SignalTap II Logic Analyzer文件,該功能是Quartus II開(kāi)發(fā)工具自帶的邏輯分析儀,它的工作原理是通過(guò)JTAG纜,把所需要觀察的FPGA的引腳、信號(hào)的值傳到電腦上,在“SignalTap II Logic Analyzer”窗口中顯示,實(shí)現(xiàn)FPGA的在線調(diào)試。6.1.3.3 矩陣鍵盤(pán)掃描的驗(yàn)證選擇“File”“New”命令或是單擊工具欄中的 圖標(biāo),在彈出的“New”對(duì)話框中,選擇“Other File”選項(xiàng)卡,選擇“SignalTap II Logic Analyzer F

25、ile”選項(xiàng),單擊“OK”按鈕,如圖6.9所示。選擇“File”“New”命令或是單擊工具欄中的 圖6.8 新建SignalTap II Logic Analyzer File圖6.8 新建SignalTap II Logic An在“SignalTap II Logic Analyzer File”窗口中,單擊“Signal Configuration”下面的 按鈕進(jìn)行采樣時(shí)鐘設(shè)置,在彈出的對(duì)話框中選擇“clkreg”,單擊 移到右邊編輯框,單擊“OK”按鈕退出,如圖6.9所示。在“SignalTap II Logic Analyzer 圖6.8 新建SignalTap II Logic A

26、nalyzer File圖6.8 新建SignalTap II Logic An在“SignalTap II Logic Analyzer File”窗口中,單擊“Signal Configuration”下面的 按鈕進(jìn)行采樣時(shí)鐘設(shè)置,在彈出的對(duì)話框中選擇“clkreg”,單擊 移到右邊編輯框,單擊“OK”按鈕退出,如圖6.9所示。在“SignalTap II Logic Analyzer 圖6.9 采樣時(shí)鐘時(shí)鐘圖6.9 采樣時(shí)鐘時(shí)鐘接著進(jìn)行所要觀察信號(hào)的設(shè)置,單擊“Signal Configuration” 下面的 按鈕,在彈出的對(duì)話框中進(jìn)行所要觀察信號(hào)的相應(yīng)設(shè)置,設(shè)置方法如同采樣時(shí)鐘的設(shè)置

27、,如同6.10所示,單擊“OK”按鈕退出。接著進(jìn)行所要觀察信號(hào)的設(shè)置,單擊“Signal Config圖6.10 所需觀察信號(hào)的設(shè)置圖6.10 所需觀察信號(hào)的設(shè)置 所需觀察信號(hào)設(shè)置之后,在“Sample depth:”下拉列表框中選擇“128”。這個(gè)數(shù)字選得越大,表示存儲(chǔ)所觀察信號(hào)時(shí)間窗口越長(zhǎng),當(dāng)然所需的片內(nèi)RAM越多。讀者可以根據(jù)實(shí)際情況進(jìn)行相應(yīng)調(diào)整。最后對(duì)信號(hào)的顯示格式進(jìn)行設(shè)置,總線(大于1位的信號(hào))顯示格式有二進(jìn)制、八進(jìn)制、十進(jìn)制、十六進(jìn)制等。在COL信號(hào)上單擊鼠標(biāo)右鍵,在彈出的快捷菜單中選擇“Bus Display Format”“Binary”命令,如圖4-11所示。另外,keyou

28、t、ROW也需要進(jìn)行相應(yīng)設(shè)置。 所需觀察信號(hào)設(shè)置之后,在“Sample depth:圖6.11 信號(hào)顯示格式設(shè)置圖6.11 信號(hào)顯示格式設(shè)置保存SignalTap II Logic Analyzer File為matrikeyscan.stp。在彈出的對(duì)話框(如圖6.12所示),系統(tǒng)提示是否為當(dāng)前工程使能matrikeyscan.stp文件,單擊“是”按鈕完成SignalTap II Logic Analyzer File文件的創(chuàng)建。選擇“Processing”“Start Compilation”命令或是單擊工具欄中的 圖標(biāo)對(duì)整個(gè)工程進(jìn)行編譯。保存SignalTap II Logic Ana

29、lyzer 圖6.12 系統(tǒng)提示圖6.12 系統(tǒng)提示把準(zhǔn)備好的開(kāi)發(fā)板接上JTAG纜,通上電。對(duì)JTAG進(jìn)行相應(yīng)設(shè)置,如圖6.13所示。圖6.13 JTAG設(shè)置把準(zhǔn)備好的開(kāi)發(fā)板接上JTAG纜,通上電。對(duì)JTAG進(jìn)行相應(yīng)設(shè)單擊 對(duì)FPGA進(jìn)行配置,配置完成之后,按下編碼為“0000”的按鍵,單擊工具欄中的 圖標(biāo),進(jìn)行信號(hào)獲取,如圖6.14所示。圖6.14說(shuō)明:由于編碼為“0000”的按鍵被按下,當(dāng)行掃描信號(hào)ROW輸出為“1110”時(shí),列掃描信號(hào)輸入為“1110”及表示編碼為“0000”的按鍵被按下,按鍵指示信號(hào)為高。圖6.14 按下編碼為“0000”的按鍵單擊 對(duì)FPGA進(jìn)行配置,配置完成之后,按

30、下編碼為“000按下編碼為“0101”的按鍵,單擊工具欄中的 圖標(biāo),進(jìn)行信號(hào)獲取,如圖6.15所示。圖6.15說(shuō)明:由于編碼為“0101”的按鍵被按下,當(dāng)行掃描信號(hào)ROW輸出為“1011”時(shí),列掃描信號(hào)輸入為“1101”即表示編碼為“0101”的按鍵被按下,按鍵指示信號(hào)為高。圖6.15 按下編碼為“0000”的按鍵按下編碼為“0101”的按鍵,單擊工具欄中的 圖標(biāo),進(jìn)行信號(hào)當(dāng)沒(méi)有任何按鍵被按下時(shí),單擊工具欄中的 圖標(biāo),進(jìn)行信號(hào)獲取,如圖6.16所示。圖6.16說(shuō)明:由于沒(méi)有任何的按鍵被按下,當(dāng)行掃描信號(hào)ROW輸出為“1110”、“1101”、“1011”、“0111”時(shí),列掃描信號(hào)輸入始終為“

31、1111”,按鍵指示信號(hào)一直為低。至此,整個(gè)工程的硬件測(cè)試得到通過(guò),矩陣鍵盤(pán)掃描的設(shè)計(jì)完成。圖6.16 按下編碼為“0000”的按鍵當(dāng)沒(méi)有任何按鍵被按下時(shí),單擊工具欄中的 圖標(biāo),進(jìn)行信號(hào)獲取,6.1.4 實(shí)例總結(jié)本節(jié)首先對(duì)矩陣鍵盤(pán)掃描的原理進(jìn)行分析,然后設(shè)計(jì)出矩陣鍵盤(pán)掃描的VHDL設(shè)計(jì)文件。為了能直觀了解設(shè)計(jì)的正確性,在工程加入了SignalTap II Logic Analyzer File,對(duì)設(shè)計(jì)進(jìn)行硬件測(cè)試。讀者通過(guò)學(xué)習(xí),可以了解Quartus II開(kāi)發(fā)工具的一般過(guò)程,以及SignalTap II Logic Analyzer的使用方法。6.1.4 實(shí)例總結(jié)本節(jié)首先對(duì)矩陣鍵盤(pán)掃描的原理進(jìn)

32、行分6.2 交通燈控制的設(shè)計(jì)交通燈的應(yīng)用十分廣泛,本節(jié)介紹如何利用FPGA完成對(duì)交通燈的控制設(shè)計(jì),讓讀者學(xué)習(xí)綜合數(shù)字系統(tǒng)的設(shè)計(jì)方法,掌握FPGA設(shè)計(jì)交通燈控制的原理及方法。6.2 交通燈控制的設(shè)計(jì)交通燈的應(yīng)用十分廣泛,本節(jié)介紹6.2.1 實(shí)例內(nèi)容說(shuō)明 依人們的交通常規(guī),“紅燈停,綠燈行,黃燈提醒”,其交通燈的燃滅規(guī)律為:初始態(tài)是兩個(gè)路口的紅燈全亮。之后,東西路口的綠燈亮,南北路口的紅燈亮,東西方向開(kāi)始通行,同時(shí)從15秒開(kāi)始倒計(jì)時(shí)。倒計(jì)時(shí)到5秒時(shí),東西路口綠燈開(kāi)始閃爍,倒計(jì)時(shí)到1秒時(shí)東西綠燈滅,黃燈開(kāi)始亮。倒計(jì)時(shí)到0秒后,東西路口紅燈亮,同時(shí)南北路口的綠燈亮,南北方向開(kāi)始通行,同樣從15秒開(kāi)始倒

33、計(jì)時(shí),再切換到東西路口方向,以后周而復(fù)始的重復(fù)上述過(guò)程。如圖6.17所示為十字路口交通燈示意圖。6.2.1 實(shí)例內(nèi)容說(shuō)明 依人們的交通常規(guī),“紅圖6.17 十字路口交通燈示意圖圖6.17 十字路口交通燈示意圖6.2.2 設(shè)計(jì)思路與原理 本程序設(shè)計(jì)的電路主要為時(shí)序電路,其實(shí)時(shí)性容易得到保證,難點(diǎn)在于控制邏輯,在于如何保證主干道信號(hào)燈與支路信號(hào)燈的同步。 本例涉及時(shí)序電路的設(shè)計(jì)、邏輯控制方法運(yùn)用,以及Quartus II的仿真設(shè)計(jì)。6.2.2 設(shè)計(jì)思路與原理 本程序設(shè)計(jì)的電路主要圖6.18 交通燈控制頂層設(shè)計(jì)電路圖交通燈控制器由單片CPLD/FPGA來(lái)實(shí)現(xiàn),整個(gè)系統(tǒng)由七個(gè)單元電路組成,頂層原理圖如

34、圖6.18所示圖6.18 交通燈控制頂層設(shè)計(jì)電路圖交通燈控制器由單片C 圖6.18中的七個(gè)單元電路分別為: 交通燈控制器單元JTDKZH:根據(jù)主干道、支干道輸入信號(hào)SM、SB及時(shí)鐘信號(hào)CLK,發(fā)出主、支干道指示燈的控制信號(hào),同時(shí)向各個(gè)定時(shí)單元CNT45S、CNT25S、CNT5S,顯示控制單元XSKZH發(fā)出使能控制信號(hào)EN45、EN25、EN05M、EN05B。 定時(shí)單元CNT45S、CNT25S、CNT5S分別實(shí)現(xiàn)45秒、25秒、5秒鐘的定時(shí),根據(jù)SM、SB、CLK及JTDKZH單元發(fā)出的相關(guān)使能控制信號(hào)EN45、EN25、EN05M、EN05B按要求進(jìn)行定時(shí),并將其輸出傳送到顯示控制單元X

35、SKZH。 圖6.18中的七個(gè)單元電路分別為: 顯示控制單元XSKZH:根據(jù)交通燈控制器單元JTDKZH發(fā)出的有關(guān)使能控制信號(hào)EN45、EN25、EN05M、EN05B選擇定時(shí)單元CNT45S、CNT25S、CNT5S的輸出傳送到顯示單元DISPLAY。 顯示單元DISPLAY:根據(jù)顯示控制單元XSKZH發(fā)出的數(shù)據(jù),把需要顯示的數(shù)據(jù)傳送給相應(yīng)七段數(shù)碼管的段選和位選信號(hào)。段選信號(hào)動(dòng)態(tài)掃描相應(yīng)的數(shù)碼管,位選信號(hào)輸出到譯碼單元BCD_LED。 顯示控制單元XSKZH:根據(jù)交通燈控制器單元JTDK 譯碼單元BCD_LED:將顯示單元DISPLAY發(fā)出的位選信號(hào)進(jìn)行七段譯碼,用于在數(shù)碼管上顯示正確的數(shù)據(jù)

36、。 本實(shí)驗(yàn)要求設(shè)計(jì)一個(gè)由一條主干道和一條支干道的匯合點(diǎn)形成的十字路口的交通燈控制器,具體要求如下:(1)主、支干道各設(shè)有一個(gè)綠、黃、紅指示燈,兩個(gè)顯示數(shù)碼管。(2)主干道處于長(zhǎng)允許通行狀態(tài),而支干道有車(chē)來(lái)時(shí)才允許通行。當(dāng)主干道允許通行亮綠燈時(shí),支干道亮紅燈。而支干道允許通行亮綠燈時(shí),主干道亮紅燈。 譯碼單元BCD_LED:將顯示單元DISPLAY發(fā)出(3)當(dāng)主干道、支干道均有車(chē)時(shí),兩者交替允許通行,主干道每次通行45秒,支干道每次通行25秒,在每次由綠燈向紅燈轉(zhuǎn)換的過(guò)程中,要亮5秒的黃燈作為過(guò)渡,并進(jìn)行減計(jì)時(shí)顯示。(3)當(dāng)主干道、支干道均有車(chē)時(shí),兩者交替允許通行,主干道每次6.2.3 程序設(shè)計(jì)

37、與注釋(1)運(yùn)行QuartusII 軟件,分別建立新工程,選擇FileNew菜單,創(chuàng)建VHDL描述語(yǔ)言設(shè)計(jì)文件,分別編寫(xiě)JTDKZH.VHD、CNT45S.VHD、CNT25S.VHD、CNT5S.VHD、XSKZH.VHD、DISPLAY.VHD及BCD_LED.VHD源程序。根據(jù)前述實(shí)驗(yàn)內(nèi)容自行設(shè)計(jì)CNT45S、CNT25S、CNT5S、DISPLAY 、BCD_LED單元,完成其功能,然后按照Quartus II設(shè)計(jì)流程進(jìn)行編譯仿真,驗(yàn)證時(shí)序要求。6.2.3 程序設(shè)計(jì)與注釋(1)運(yùn)行QuartusII-JTDKZH.VHD -library ieee;use ieee.std_logic

38、_1164.all;entity jtdkzh is port(clk,sm,sb : in std_logic; -sm、sb為主干道、支干道指示燈控制信號(hào) mr,my,mg,br,by,bg : out std_logic); -mr:主干道紅燈; -my:主干道黃燈; -mg:主干道綠燈;-JTDKZH.VHD - -br:從干道紅燈; -by:從干道黃燈; -bg:從干道綠燈;end entity jtdkzh;architecture behv of jtdkzh is type state_type is(a,b,c,d); signal state:state_type; beg

39、in cnt: process(clk) is -br:從干道紅燈;variable s: integer range 0 to 45; variable clr,en:bit; begin if(clkevent and clk=1) thenif clr=0 then -clr=0時(shí)s=0s:=0;elsif en=0 thens:=s; -clr=1、en=0時(shí)s=selse -clr=1、en=1時(shí)s自加1s:=s+1;end if;variable s: integer range 0 tocase state iswhen a=mr=0;my=0;mg=1;br=1;by=0;bg

40、=0;-a狀態(tài):主干道綠燈亮、從干道紅燈亮if(sb and sm)=1 then -sb=1,sm=1說(shuō)明if s=45 then -判斷s是否等于45? state=b;clr:=0;en:=0; -s45則跳轉(zhuǎn)到b狀態(tài)else state=a;clr:=1;en:=1; -s/=45保持a狀態(tài)case state is -clr=1、en=1時(shí)s自加1end if; elsif(sb and(not sm)=1 then -sb=1,sm=0說(shuō)明state=b;clr:=0;en:=0;elsestatemr=0;my=1;mg=0;br=1;by=0;bg=0;-b狀態(tài):主干道黃燈亮、

41、從干道紅燈亮 if s=5 then state=c;clr:=0;en:=0; -s5則跳轉(zhuǎn)到c狀態(tài)Elsestatemr=1;my=0;mg=0;br=0;by=0;bg=1;-c狀態(tài):主干道紅燈亮、從干道綠燈亮 if(sm and sb)=1 thenif s=5 then if s=25 then -s25則跳轉(zhuǎn)到d狀態(tài)state=d;clr:=0;en:=0;Elsestate=c;clr:=1;en:=1; -s/=25保持c狀態(tài)-clr=1、en=1時(shí)s自加1end if;elsif sb =0 thenstate=d;clr:=0;en:=0;Elsestatemr=1;my=

42、0;mg=0;br=0;by=1;bg=0;-d狀態(tài):主干道紅燈亮、從干道黃燈亮if s=5 thenstate=a;clr:=0;en:=0;Elsestatemr=1;my=0;mg=0- CNT45S.VHD -library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity cnt45s is port(sb,clk,en45 : in std_logic; dout45m,dout45b : out std_logic_vector(7 downto 0);end entity cnt45s

43、;architecture behv of cnt45s is signal cnt6b:std_logic_vector(5 downto 0); begin- CNT45S.VHD - process(sb,clk,en45) is begin if sb=0 then cnt6b=cnt6b-cnt6b-1; elsif(clkevent and clk=1) then if en45=1 then cnt6b=cnt6b+1; elsif en45=0 then cnt6bdout45m=“01000101”;dout45bdout45m=“01000100”;dout45bdout4

44、5m=“01000011”;dout45bdout45m=01000010;dout45bdout45m=“01000001”;dout45bdout45m=“01000000”;dout45bdout45m=“00111001”;dout45bdout45m=“00111000”;dout45bdout45m=00110111;dout45bdout45mdout45m=00110110;dout45bdout45m=“00110101”;dout45bdout45m=“00110100”;dout45bdout45m=“00110011”;dout45bdout45m=00110010;d

45、out45bdout45mdout45m=“00110001”;dout45bdout45m=“00110000”;dout45bdout45m=“00101001”;dout45bdout45m=“00101000”;dout45bdout45m=00100111;dout45bdout45mdout45m=“00100110”;dout45bdout45m=“00100101”;dout45bdout45m=“00100100”;dout45bdout45m=“00100011”;dout45bdout45m=00100010;dout45bdout45mdout45m=“00100001

46、”;dout45bdout45m=“00100000”;dout45bdout45m=“00011001”;dout45bdout45m=“00011000”;dout45bdout45m=00010111;dout45bdout45mdout45m=“00010110”;dout45bdout45m=“00010101”;dout45bdout45m=“00010100”;dout45bdout45m=“00010011”;dout45bdout45m=00010010;dout45bdout45mdout45m=“00010001”;dout45bdout45m=“00010000”;do

47、ut45bdout45m=“00001001”;dout45bdout45m=00001000;dout45bdout45mdout45m=“00000111”;dout45bdout45m=“00000110”;dout45bdout45m=“00000101”;dout45bdout45m=“00000100”;dout45bdout45m=00000011;dout45bdout45mdout45m=“00000010”;dout45bdout45m=“00000001”;dout45bdout45m=00000000;dout45bdout45m=“00000-CNT25S.VHDli

48、brary ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity cnt25s is port(sb,sm,clk,en25 : in std_logic; dout25m,dout25b: out std_logic_vector(7 downto 0);end entity cnt25s;architecture behv of cnt25s is-CNT25S.VHDsignal cnt5b:std_logic_vector(4 downto 0); begin process(sb,sm,clk,

49、en25) is begin if sb=0 or sm=0 then cnt5b=cnt5b-cnt5b-1; elsif(clkevent and clk=1) then if en25=1 then cnt5b=cnt5b+1;signal cnt5b:std_logic_vector(elsif en25=0 then cnt5bdout25b=00100101;dout25mdout25b=00100100;dout25mdout25b=00100011;dout25mdout25b=00100010;dout25mdout25b=00100001;dout25mdout25b=00

50、100000;dout25mdout25bdout25b=00011001;dout25mdout25b=00011000;dout25mdout25b=00010111;dout25mdout25b=00010110;dout25mdout25b=00010101;dout25mdout25b=00010100;dout25mdout25b=00010011;dout25mdout25b=00010010;dout25mdout25b=00010001;dout25mdout25bdout25b=00010000;dout25mdout25b=00001001;dout25mdout25b=

51、00001000;dout25mdout25b=00000111;dout25mdout25b=00000110;dout25mdout25bdout25b=00000101;dout25mdout25b=00000100;dout25mdout25b=00000011;dout25mdout25b=00000010;dout25mdout25b=00000001;dout25mdout25bdout25b=00000000;dout25m=00000000; end case; end process;end architecture behv;基于FPGA的數(shù)字系統(tǒng)設(shè)計(jì)與實(shí)踐-課件-CNT

52、5S.VHDlibrary ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity cnt5s is port(clk,en05m,en05b:in std_logic; dout5: out std_logic_vector(7 downto 0);end entity cnt5s;-CNT5S.VHDarchitecture behv of cnt5s is signal cnt3b:std_logic_vector(2 downto 0); begin process(clk,en05m,en05b)

53、 is begin if(clkevent and clk=1) then if en05m=1 or en05b=1 then -en05m和en05b任意一個(gè)為1時(shí),cnt3b自加1 cnt3b=cnt3b+1; else cnt3bdout5dout5dout5dout5dout5dout5=00000000; end case; end process;end architecture behv;process(cnt3b) is-XSKZH.VHDlibrary ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.

54、all;entity xskzh is port(en45,en25,en05m,en05b : in std_logic; ain45m,ain45b : in std_logic_vector(7 downto 0); ain25m,ain25b,ain05 : in std_logic_vector(7 downto 0); doutm,doutb : out std_logic_vector(7 downto 0);end entity xskzh;-XSKZH.VHDarchitecture behv of xskzh is begin process(en45,en25,en05m

55、,en05b) isbegin if en45=1 then doutm=ain45m(7 downto 0);doutb=ain45b(7 downto 0); elsif en05m=1 then doutm=ain05(7 downto 0);doutb=ain05(7 downto 0); elsif en25=1 then doutm=ain25m(7 downto 0);doutb=ain25b(7 downto 0);architecture behv of xskzh is elsif en05b=1 then doutm=ain05(7 downto 0);doutb=ain

56、05(7 downto 0); end if; end process;end architecture behv; elsif en05b=1 then-DISPLAY.VHD-library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity display is port(doutm,doutb : in std_logic_vector(7 downto 0); clk1 : in std_logic; bcd : out std_logic_vector(3 downto 0); seg :

57、out std_logic_vector(3 downto 0);end entity display;architecture behv of display is-DISPLAY.VHD-type states is(st0,st1,st2,st3); signal current_state,next_state:states; begin ss1: process(clk1) begin if(clk1=1 and clk1event) then current_statebcd=doutb(7 downto 4); seg=0111; next_statebcd=doutb(3 do

58、wnto 0); seg=1011; next_statebcd=doutm(7 downto 4); seg=1101; next_statebcd=doutm(3 downto 0); seg=1110; next_statebcd=1111; seg=1111; next_state led led led led led led led led led led led led=10000000(2)仿真結(jié)果,如圖6.19所示。圖6.19 交通燈控制仿真結(jié)果(2)仿真結(jié)果,如圖6.19所示。圖6.19 交通燈控制6.2.4 實(shí)例總結(jié)本實(shí)例實(shí)現(xiàn)了一個(gè)簡(jiǎn)單交通燈信號(hào)的控制和轉(zhuǎn)換,讀者通過(guò)本節(jié)

59、學(xué)習(xí),可以加深認(rèn)識(shí)對(duì)時(shí)序電路的控制邏輯的設(shè)計(jì)思路。實(shí)際的交通燈要求更多、設(shè)計(jì)也更為復(fù)雜,但萬(wàn)變不離其中,只要掌握了設(shè)計(jì)要領(lǐng)就能做到舉一反三。6.2.4 實(shí)例總結(jié)本實(shí)例實(shí)現(xiàn)了一個(gè)簡(jiǎn)單交通燈信號(hào)的6.3 6層電梯控制器的設(shè)計(jì) 電梯控制器是日常生活中常用的器件,本節(jié)介紹使用FPGA設(shè)計(jì)實(shí)現(xiàn)6層電梯的控制器。6.3 6層電梯控制器的設(shè)計(jì) 電梯控制器是日常生6.3.1 實(shí)例說(shuō)明 本例主要實(shí)現(xiàn)的功能為:以FPGA設(shè)計(jì)控制芯片,控制6層電梯的升降運(yùn)行狀態(tài)。設(shè)計(jì)主要涉及到VHDL語(yǔ)言的case語(yǔ)句的使用,以及模塊設(shè)計(jì)方法的運(yùn)用。6.3.1 實(shí)例說(shuō)明 本例主要實(shí)現(xiàn)的功能為:以F6.3.2 設(shè)計(jì)思路與原理(1)電

60、梯的輸入信號(hào)分析 電梯的輸入信號(hào)分析主要包括外部輸入信號(hào)和內(nèi)部輸入信息分析。對(duì)于電梯外部輸入信號(hào):每一層電梯門(mén)外需要有上升請(qǐng)求按鈕和下降請(qǐng)求按鈕,其中一樓電梯門(mén)外只有上升請(qǐng)求按鈕,6樓電梯門(mén)外只有下降請(qǐng)求按鈕。 電梯內(nèi)部輸入信號(hào)包括6個(gè)前往樓層按鈕、提前關(guān)門(mén)按鈕、延時(shí)關(guān)門(mén)按鈕、電梯異常求救按鈕(該信號(hào)本章當(dāng)做告警信號(hào)),另外還有超重等告警信號(hào)輸入。6.3.2 設(shè)計(jì)思路與原理(1)電梯的輸入信號(hào)分析(2)電梯的輸出信號(hào)分析電梯的輸出信號(hào)分析也主要包括外部輸出信號(hào)和內(nèi)部輸出信息的分析。對(duì)于電梯外部輸出信號(hào)包括上升請(qǐng)求按鈕和下降請(qǐng)求按鈕是否被按下指示信號(hào)燈、電梯當(dāng)前所在樓層指示信號(hào)、電梯運(yùn)行方向指示

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論