EDA 實驗指導書 實驗一Quartus軟件的使用 [實驗目的] 掌握Quartus軟件的使用。 [實驗內容] 學習Quartus軟件的設計操作步驟。 [實驗原理]Quartus軟件功能介紹。 Quartus軟件功能簡介: 1) 原理圖輸入(Graphic Editor) Quartus軟件具有圖形輸入能力,用戶可以方便的使用圖形編輯器輸入電路圖,圖中的元器件可以調用元件庫中元器件,除調用庫中的元件以外,還可以調用該軟件中的符號功能形成的功能塊。 2) 硬件描述語言輸入(Text Editor) Quartus軟件中有一個集成的文本編輯器,該編輯器支持VHDL,AHDL和Verilog硬件描述語言的輸入,同時還有一個語言模板使輸入程序語言更加方便,該軟件可以對這些程序語言進行編譯并形成可以下載配置數據。 3) 波形編輯器(waveform Editor) Quartus9.1版本軟件,在進行邏輯電路的行為仿真時,需要在所設計電路的輸入端加入一定的波形,波形編輯器可以生成和編輯仿真用的波形,使用該編輯器的工具條可以容易方便的生成波形和編輯波形。 4) 編譯與仿真 Quartus9.1版本軟件,當設計文件被編譯好,并在波形編輯器中將輸入波形編輯完畢后,就可以進行行為仿真了,通過仿真可以檢驗設計的邏輯關系是否準確。Quartus11.0版本軟件沒有仿真功能,需要其它仿真軟件的支持,例如:Modelsim 軟件。 5) 管腳配置 這里需要參考實驗板提供的管腳配置TCL腳本文件。開發板實驗指導手冊中也有介紹。 6) 器件編程下載 當設計全部完成后,就可以將形成的目標文件下載到實驗板的FPGA芯片中,實際驗證設計的準確性。 [實驗步驟] 可以按照電子版的開發板實驗指導手冊進行學習,熟練掌握Quartus11.0版本軟件的開發流程。注意采用的芯片要改為EP2C8Q208C8。 注意事項:請牢記工程未使用到的 IO引腳請設置為三態輸入(As input tri-stated), 一定不能將未使用的引腳設置為輸出(As outputs driving ground), 否則可能會造成核心板主芯片及存儲芯片沖突損壞!或是造成其它意想不到的損壞! 如何設置未使用的引腳為三態? 答:Quartus--菜單 Assignments--Device---Device and Pin Options---Unused Pins---Reserve all unused pins==改為 As input tri-stated 每個例程下載前都養成習慣,先查下設置對不對,不對的話,改好,要重新編譯一下(別 忘記這步!)如果程序下載進去,數碼管、LED 燈都亂亮了,那肯定是沒設置好,請嚴格遵照上面的修改好,重新編譯! 注意:用繪圖法設計半加器和全加器來學習軟件的操作過程. 半加器電路圖如下所示。 然后生成圖形符號再設計全加器。全加器電路圖如下所示。 [實驗報告] 不做要求。注意實驗板的電路原理圖要事先看看。 實驗二簡單組合邏輯電路設計 [實驗目的] 1 掌握組合邏輯電路的設計方法。 2 熟悉實驗板上FPGA芯片的管腳配置分配表。 [實驗內容] [實驗原理] 根據以上組合電路的真值表,利用行為級的編程風格來設計。 [實驗步驟] 啟動Quartus11.0軟件,將編寫的設計文件編譯后再根據實驗板的管腳配置表分配好管腳,最后下載相應的.sof文件測試。注意在選管腳時可以將輸入用撥碼開關代替,輸出可以采用發光二極管代替。 [實驗報告] 要求用VHDL語言編程完成以上8-3線優先編碼器,3-8譯碼器的設計,并且比較圖形輸入法與語言輸入法的優劣。 參考程序如下: (1)3-8譯碼器 LIBRARY IEEE ; USE IEEE.STD_LOGIC_1164.ALL ; ENTITY YMQ38 IS PORT (A : IN STD_LOGIC_VECTOR( 2 DOWNTO 0) ; EN : IN STD_LOGIC ; Y : OUT STD_LOGIC_VECTOR( 7 DOWNTO 0)) ; END YMQ38 ; ARCHITECTURE DEC_BEHAVE OF YMQ38 IS SIGNAL SEL : STD_LOGIC_VECTOR( 3 DOWNTO 0) ; BEGIN SEL(0) <= EN ; SEL(1) <= A(0) ; SEL(2) <= A(1) ; SEL(3) <= A(2) ; WITH SEL SELECT Y<= "00000001" WHEN "0001", "00000010" WHEN "0011", "00000100" WHEN "0101", "00001000" WHEN "0111", "00010000" WHEN "1001", "00100000" WHEN "1011", "01000000" WHEN "1101", "10000000" WHEN "1111", "11111111" WHEN OTHERS ; END DEC_BEHAVE; (2)4-2線優先編碼器 library ieee; use ieee.std_logic_1164.all; entity encode42 is port( d: in std_logic_vector(3 downto 0); a0n,a1n: out std_logic); end encode42; architecture behav of encode42 is signal q : std_logic_vector(1 downto 0); begin a0n<=q(0);a1n<=q(1); process(d) begin if d(3)='0' then q<="00"; elsif d(2)='0' then q<="01"; elsif d(1)='0' then q<="10"; elsif d(0)='0' then q<="11"; else q<="00"; end if; end process; end behav; 實驗三簡單時序電路設計 [實驗目的] 1、 掌握D觸發器的邏輯功能。 2、 掌握簡單時序電路的設計方法。 [實驗內容] [實驗原理] 1、D觸發器: 正沿觸發的D觸發器的電路符號如下圖所示。它是一個正邊沿觸發的D觸發器,有一個數據輸入端d,一個時鐘輸入端clk和一個數據輸出端q。D觸發器的真值表如下表所示。從表中可以看到,D鎖存器的輸出端只有在正沿脈沖過后,輸入端d的數據才可以傳遞到輸出端q。 表1 D鎖存器真值表 2.同步四位加法計數器,要求有使能端控制,enable=1時,開始計數。 [實驗步驟] 啟動Quartus11.0軟件,將編寫的設計文件編譯后再根據實驗板的管腳配置表分配好管腳,最后下載相應的.sof文件測試。注意在選管腳時可以將輸入用撥碼開關代替,輸出可以采用發光二極管代替。 [實驗報告] 要求用VHDL語言編程完成D觸發器和四位加法計數器的設計。 思考題:能否利用移位寄存器實現八位流水燈的設計電路。 參考程序如下: (1)D觸發器 LIBRARY ieee; use ieee.std_logic_1164.all; entity dff1 is port(clk,d: in std_logic; q: out std_logic); end dff1; architecture dff1_behave of dff1 is begin process(clk) begin if (clk'event and clk='1') then q<=d; end if; end process; end dff1_behave; (2)同步四位加法計數器 LIBRARY ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity count4 is port(clk,en: in std_logic; qa,qb,qc,qd: out std_logic); end count4; architecture behave of count4 is signal count_6: std_logic_vector(3 downto 0); signal clk2:std_logic; begin process(clk) --分頻模塊 variable count11:integer range 0 to 2500000; begin if clk'event and clk='1' then if count11=2500000 then count11:=0; clk2<=not clk2; else count11:=count11+1; end if; end if; end process; process(clk2) begin if (clk2'event and clk2='1') then if(en='1') then count_6<=count_6+'1'; end if; end if; end process; qa<=count_6(0); qb<=count_6(1); qc<=count_6(2); qd<=count_6(3); end behave; (3) 設計參考程序:流水燈的控制電路。 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; --這3個程序包足發應付大部分的VHDL程序設計 USE IEEE.STD_LOGIC_Arith.ALL; USE IEEE.STD_LOGIC_Unsigned.ALL; USE IEEE.NUMERIC_STD.ALL; ENTITY ledwater IS PORT(clk: IN STD_LOGIC; led: OUT STD_LOGIC_VECTOR(8 DOWNTO 1)); END; ARCHITECTURE one OF ledwater IS signal led_r: std_logic_vector(9 downto 1); signal clk2:std_logic; BEGIN led<=led_r(8 DOWNTO 1); process(clk) --分頻模塊 variable count11:integer range 0 to 2500000; begin if clk'event and clk='1' then if count11=2500000 then count11:=0; clk2<=not clk2; else count11:=count11+1; end if; end if; end process; PROCESS(clk2) BEGIN IF RISING_EDGE(clk2) THEN led_r<=led_r(8 DOWNTO 1) & '0'; IF led_r="000000000" THEN--循環完畢嗎? led_r<="111111111";--是,則重新賦初值 END IF; END IF; END PROCESS; END; 實驗四LED顯示譯碼電路的設計 [實驗目的] - 掌握LED顯示譯碼電路的設計。
- 熟悉用數碼管實現十六進制計數的動態顯示原理。
[實驗內容] - 編寫能夠同時在八個數碼管上輪換顯示0~F十六進制數的電路。
- 編寫能夠用動態掃描方式顯示數字:12345678的電路。
[實驗原理] 用數碼管除了可以顯示0~9的阿拉伯數字外,還可以顯示一些英語字母。在實驗電路板的原理圖上要分析出數碼管是共陰極接法還是共陽極接法。 [實驗步驟] 啟動Quartus11.0軟件,將編寫的設計文件編譯后再根據實驗板的管腳配置表分配好管腳,最后下載相應的.sof文件測試。 [實驗報告] 要求用VHDL語言編程完成以上LED顯示譯碼器與動態掃描電路的設計。 思考題:如何實現一個N(偶數)分頻器的設計。 (1)0~F計數顯示電路。 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; ENTITY sled IS PORT(clk:IN STD_LOGIC; dig: OUT STD_LOGIC_VECTOR(7 DOWNTO 0); seg: OUT STD_LOGIC_VECTOR(7 DOWNTO 0)); --七段譯碼輸出 END; ARCHITECTURE ONE OF sled IS signal seg_r:STD_LOGIC_VECTOR(7 DOWNTO 0); --定義數碼管輸出寄存器 signal count_4: std_logic_vector(3 downto 0); signal clk2:STD_LOGIC; BEGIN seg<=seg_r; --輸出數碼管譯碼結果 dig<="00000000"; process(clk) --分頻器 variable count11:integer range 0 to 25000000; begin if clk'event and clk='1' then if count11=25000000 then count11:=0; clk2<=not clk2; else count11:=count11+1; end if; end if; end process; process(clk2) begin if (clk2'event and clk2='1') then count_4<=count_4+'1'; end if; end process; PROCESS(count_4) --七段譯碼 BEGIN CASE count_4 IS WHEN X"0"=> seg_r<=X"c0";--顯示0 WHEN X"1"=> seg_r<=X"f9";--顯示1 WHEN X"2"=> seg_r<=X"a4";--顯示2 WHEN X"3"=> seg_r<=X"b0";--顯示3 WHEN X"4"=> seg_r<=X"99";--顯示4 WHEN X"5"=> seg_r<=X"92";--顯示5 WHEN X"6"=> seg_r<=X"82";--顯示6 WHEN X"7"=> seg_r<=X"f8";--顯示7 WHEN X"8"=> seg_r<=X"80";--顯示8 WHEN X"9"=> seg_r<=X"90";--顯示9 WHEN X"a"=> seg_r<=X"88";--顯示a WHEN X"b"=> seg_r<=X"83";--顯示b WHEN X"c"=> seg_r<=X"c6";--顯示c WHEN X"d"=> seg_r<=X"a1";--顯示d WHEN X"e"=> seg_r<=X"86";--顯示e WHEN X"f"=> seg_r<=X"8e";--顯示f WHEN OTHERS=> seg_r<=X"FF"; END CASE; END PROCESS; END; (2)動態掃描顯示數字:12345678電路設計。 library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; entity dled is port( clk:in std_logic; dig:out std_logic_vector(7 downto 0); --數碼管選擇輸出引腳 seg:out std_logic_vector(7 downto 0) ); --數碼管段輸出引腳 end entity; architecture one of dled is constant d: std_logic_vector(31 downto 0):= x"12345678"; signal seg_r: std_logic_vector(7 downto 0); --定義數碼管輸出寄存器 signal dig_r: std_logic_vector(7 downto 0); --定義數碼管選擇輸出寄存器 signal disp_dat: std_logic_vector(3 downto 0); --定義顯示數據寄存器 signal count: std_logic_vector(2 downto 0); --定義計數寄存器 signal clk_1k: std_logic; begin dig<=dig_r; seg<=seg_r; process(clk) variable count11:integer range 0 to 25000; begin if clk'event and clk='1' then if count11=25000 then count11:=0; clk_1k<=not clk_1k; else count11:=count11+1; end if; end if; end process; process(clk_1k) begin if rising_edge(clk_1k) then count<=count+1; end if; end process; PROCESS(clk_1k) BEGIN IF rising_edge(clk_1k) THEN CASE count IS WHEN "000"=> disp_dat<=d(31 DOWNTO 28); --第一個數碼管 WHEN "001"=> disp_dat<=d(27 DOWNTO 24); --第二個數碼管 WHEN "010"=> disp_dat<=d(23 DOWNTO 20); --第三個數碼管 WHEN "011"=> disp_dat<=d(19 DOWNTO 16); --第四個數碼管 WHEN "100"=> disp_dat<=d(15 DOWNTO 12); --第五個數碼管 WHEN "101"=> disp_dat<=d(11 DOWNTO 8); --第六個數碼管 WHEN "110"=> disp_dat<=d(7 DOWNTO 4); --第七個數碼管 WHEN "111"=> disp_dat<=d(3 DOWNTO 0); --第八個數碼管 END CASE; CASE count IS --選擇數碼管顯示位 WHEN "000"=> dig_r<="01111111"; --選擇第一個數碼管顯示 WHEN "001"=> dig_r<="10111111"; --選擇第二個數碼管顯示 WHEN "010"=> dig_r<="11011111"; --選擇第三個數碼管顯示 WHEN "011"=> dig_r<="11101111"; --選擇第四個數碼管顯示 WHEN "100"=> dig_r<="11110111"; --選擇第五個數碼管顯示 WHEN "101"=> dig_r<="11111011"; --選擇第六個數碼管顯示 WHEN "110"=> dig_r<="11111101"; --選擇第七個數碼管顯示 WHEN "111"=> dig_r<="11111110"; --選擇第八個數碼管顯示 END CASE; END IF; END PROCESS; PROCESS(disp_dat) BEGIN CASE disp_dat IS WHEN X"0"=> seg_r<=X"c0";--顯示0 WHEN X"1"=> seg_r<=X"f9";--顯示1 WHEN X"2"=> seg_r<=X"a4";--顯示2 WHEN X"3"=> seg_r<=X"b0";--顯示3 WHEN X"4"=> seg_r<=X"99";--顯示4 WHEN X"5"=> seg_r<=X"92";--顯示5 WHEN X"6"=> seg_r<=X"82";--顯示6 WHEN X"7"=> seg_r<=X"f8";--顯示7 WHEN X"8"=> seg_r<=X"80";--顯示8 WHEN X"9"=> seg_r<=X"90";--顯示9 WHEN X"a"=> seg_r<=X"88";--顯示a WHEN X"b"=> seg_r<=X"83";--顯示b WHEN X"c"=> seg_r<=X"c6";--顯示c WHEN X"d"=> seg_r<=X"a1";--顯示d WHEN X"e"=> seg_r<=X"86";--顯示e WHEN X"f"=> seg_r<=X"8e";--顯示f END CASE; END PROCESS; END; 實驗五數字鐘設計 [實驗目的] 1. 掌握多位計數器相連的設計方法。 2. 掌握十進制、六十進制、二十四進制計數器的設計方法。 3. 掌握喇叭的驅動方法。。 4. 掌握層次化設計方法。 [實驗內容] 1. 具有時、分、秒計數顯示功能,以24小時循環計時。 2. 具有清零,調節小時、分鐘的功能。 3. 具有整點報時功能,整點報時的同時LED燈花樣顯示。 [實驗原理] 在同一塊FPGA芯片集成了如下電路模塊: 1. 時鐘計數:秒——60進制BCD碼計數;分——60進制BCD碼計數;時——24進制BCD碼計數;同時整個計數器有清零,調分,調時功能。在整點時間能提供報時信號。 2. 有驅動8位七段共陰極掃描數碼管的片選驅動信號輸出和七段字行譯碼輸出。 3. 喇叭在整點時有報時驅動信號產生。 4. LED燈根據設計在整點時有花樣顯示信號產生。 [實驗步驟] 1、啟動Quartus11.0軟件,將編寫的設計文件編譯后再根據實驗板的管腳配置表分配好管腳,最后下載相應的.sof文件測試 實驗現象:當程序下載完畢后數碼管從00時00分00秒開始計時,通過按鍵K1可以調節時鐘的分鐘顯示,通過按鍵K2可以調節時鐘的小時顯示。當時鐘走到整點時,喇叭開始鳴叫1分鐘,發光二極管LED1~LED3循環閃爍。 [實驗報告] 1. 畫出整個數字鐘電路的結構框圖。 2. 用VHDL語言完成頂層圖形文件中各個子模塊的設計。如果設計中的某些模塊在以前 的實驗中使用過,該模塊可以不要再寫,例如LED顯示譯碼器。 實驗六頻率計設計 [實驗目的] 1、掌握多位計數器相連的設計方法。 2、掌握頻率計的工作原理。 3、掌握EDA技術的層次化設計方法。 [實驗內容] 設計一個頻率計,其測頻范圍為1HZ<f<50MHz.。 [實驗原理] 本實驗所設計的頻率計由三個模塊組成:測頻控制信號發生器TESTCTL、8個有時鐘使能的十進制計數器CNT10和一個32位鎖存器REG32B。以下分別敘述頻率計各個邏輯模塊的功能與設計方法。 測頻控制信號發生器的設計要求:頻率測量的基本原理是計算每秒鐘內待測信號的脈沖個數。這就要求TESTCTL的計數使能信號TSTEN能產生一個1秒脈寬的周期信號,并對頻率計的每一計數器CNT10的ENA使能端進行同步控制。當TSTEN為高電平時,允許計數;為低電平時停止計數,并保持其所計的脈沖個數。在停止計數期間,首先需要一個鎖存信號LOAD的上跳沿將計數器在前1秒鐘的計數值鎖存進32位鎖存器REG32B中,并由外部的7段譯碼器譯出,并穩定顯示。設置鎖存器的好處是,顯示的數據穩定,不會由于周期性的清零信號而不斷閃爍。鎖存信號之后,必須有一個清零信號CLR_CNT對計數器進行清零,為下1秒鐘的計數操作作準備。測頻控制信號發生器的工作時序如下圖所示。為了產生這個時序圖,需首先建立一個由D觸發器構成的二分頻器,在每次時鐘CLK上升沿到來時其值翻轉。
0.jpg (9.17 KB, 下載次數: 63)
下載附件
2017-12-6 21:05 上傳
其中控制信號時鐘CLK的頻率取1HZ,那么信號TSTEN的脈寬恰好為1S,可以用作計數閘門信號。然后根據測頻的時序要求,可得出信號LOAD和CLR_CNT的邏輯描述。由上圖可見,在計數完成后,即計數使能信號TSTEN在1S的高電平后,利用其反相值的上跳沿產生一個鎖存信號LOAD,0.5S后,CLR_CNT產生一個清零信號上跳沿。高質量的測頻控制信號發生器的設計十分重要,設計中要對其進行仔細的實時防真,防止可能產生的毛刺。 寄存器REG32B設計要求:若已有32位BCD碼存在于此模塊的輸入口,在信號LOAD的上升沿后即被鎖存到寄存器REG32B的內部,并由REG32B的輸出端輸出,然后由實驗板上的7段譯碼器譯成能在數碼管上顯示輸出的相應數值。 計數器CNT10設計要求:此十進制計數器的特殊之處是,有一時鐘使能輸入端ENA,用于鎖定計數值。當高電平時計數允許,低電平時禁止計數。 [實驗步驟] 1. 啟動Quartus11.0軟件,將編寫的設計文件編譯后再根據實驗板的管腳配置表分配好管腳,最后下載相應的.sof文件測試。 2. 注意要測量的信號源可以采用多個分頻器實現。做實驗時可以選擇分頻器的一個輸出信號進行測試。 [實驗報告] 1、畫出設計的頂層文件原理圖。 2、對照頻率計波形圖分析電路工作原理。 3、寫出各功能模塊的VHDL語言源程序,并且給出相應的注釋。如果設計中的某些模塊 在以前的實驗中使用過,該模塊可以不要再寫,例如LED顯示譯碼器,LED位選掃描產生電路。 實驗七 樂曲演奏電路設計 [實驗目的] 1. 了解樂曲演奏電路的原理。 2. 掌握利用可編程邏輯器件實現樂曲演奏的設計方法。 [實驗內容] 用VHDL語言設計一個“梁祝”樂曲演奏電路。 [實驗原理] 與利用微處理器(CPU或MCU)來實現樂曲演奏相比,以純硬件完成樂曲演奏電路的邏輯要復雜得多,如果不借助于功能強大的EDA工具和硬件描述語言,僅憑傳統的數字邏輯技術,即使最簡單的演奏電路也難以實現。 本實驗設計項目作為“梁祝”樂曲演奏電路的實現,其工作原理是這樣的:我們知道,組成樂曲的每個音符的發音頻率值及其持續的時間是樂曲能連續演奏所需的兩個基本要素,問題是如何來獲取這兩個要素所對應的數值以及通過純硬件的手段來利用這些數值實現所希望樂曲的演奏效果。 本實驗設計由四個模塊組成,其每一個模塊的功能如下所述。模塊一為一個數控分頻器SPEAKERA,其CLK端輸入一具有較高頻率(本實驗為1MHz)的信號,通過SPEAKERA分頻后由SPKOUT輸出。由于直接從數控分頻器中出來的輸出信號是脈寬極窄的脈沖式信號,為了有利于驅動喇叭,需另加一個D觸發器以均衡其占空比,但這時的頻率將是原來的1/2。SPEAKERA對CLK輸入信號的分頻比由11位預置數TONE[10..0]決定。SPKOUT的輸出頻率將決定每一音符的音調,這樣分頻計數器的預置值TONE[10..0]與SPKOUT的輸出頻率就有了對應關系。例如在TONETABA模塊中若取TONE[10..0]=1036,將發音符為“3”音的信號頻率。 模塊二TONETABA是確定樂曲的速度以及每個音符的節拍數。TONETABA的功能首先是為SPEAKERA提供決定所發音符的分頻預置數,而此數在SPEAKERA輸入口停留的時間即為此音符的節拍值。模塊TONETABA是樂曲簡譜碼對應的分頻預置數查表電路,其中設置了“梁祝”樂曲全部音符所對應的分頻預置數,共13個,每一音符的停留時間由音樂節拍和音調發生器模塊NOTETABS的CLK的輸入頻率決定,在此為4Hz。這13個值的輸出由對應于TONETABA的4位輸入值Index[3..0]確定,而Index[3..0]最多有16種可選值。輸向TONETABA中的值ToneIndex[3..0]的輸出值與持續的時間由模塊NOTETABS決定。 模塊三NOTETABS為音調發生器,在NOTETABS中設置了一個8位二進制計數器(計數最大值為138),這個計數器的計數頻率選為4Hz,即每一計數值的停留時間為0.25S,恰為當全音符設為1S時,四四拍的4分音符的持續時間。例如,NOTETABS在以下的VHDL邏輯描述中,“梁祝”樂曲的第一個音符為“3”,此音在邏輯中停留了4個時鐘節拍,即為1S時間,相應地所對應的“3”音符分頻預置值為1036在SPEAKERA的輸入端停留了1S。隨著NOTETABS中的計數器按4Hz的時鐘頻率作加法計數時,“梁祝”樂曲就開始連續自然地演奏起來了。 模塊四fengping是個分頻器,實現將50MHZ的時鐘生成1MHZ和4HZ的時鐘。 下表為簡譜中音名與頻率的關系: [實驗步驟] 啟動Quartus11.0軟件,將編寫的設計文件編譯后再根據實驗板的管腳配置表分配好管腳,最后下載相應的.sof文件測試,下載完畢后就開始連續演奏“梁祝”樂曲, [實驗報告] 1、畫出設計的頂層設計原理圖。 2、寫出原理圖中各功能模塊的VHDL語言源程序并加上注釋。模塊三NOTETABS音調發生 器的“梁祝”樂曲音符可以壓縮寫三行即可。 思考題:如何設計一個簡易電子琴控制器。 實驗八搶答器設計 [實驗目的] 1. 熟悉四路搶答器的工作原理。 2. 了解原理圖、VHDL語言層次化設計方法。 [實驗內容] 設計一個四人搶答器電路。 [實驗原理] (1) 設計制作一個可容納四組參賽者的數字智力搶答器,每組設置一個搶答按鈕供搶答者使用。 (2) 電路具有第一搶答信號的鑒別和鎖存功能。 (3) 設置計分電路。 (4) 設置犯規電路。 一般說來,多路智力競賽搶答器的的組成框圖為: 圖1 多路智力競賽搶答器的的組成框圖 其工作過程是:接通電源下載完畢后,節目主持人將開關置于清除位置,搶答器處于禁止工作狀態,編號顯示器數碼管熄滅,當節目主持人宣布搶答開始并將開關置于開始位置,搶答器處于工作狀態,當選手按鍵搶答時,優先編碼器立即分辨出搶答器的編號,并由鎖存器鎖存,然后由編碼顯示電路顯示編號,同時,控制電路對輸入編碼進行封鎖,避免其他選手再次進行搶答。當選手將問題回答完畢,主持人操作控制開關,對選手進行加分,再使系統恢復到禁止工作狀態,以便進行下一輪的搶答。 [實驗步驟] 啟動Quartus11.0軟件,將編寫的設計文件編譯后再根據實驗板的管腳配置表分配好管腳,最后下載相應的.sof文件測試。 [實驗報告] 畫出本實驗電路的原理圖和并給出相應模塊的VHDL語言源程序。如果設計中的某些模塊 在以前的實驗中使用過,該模塊可以不要再寫,例如LED顯示譯碼器,LED位選掃描產生電路等。 實驗九交通燈控制器設計(課程設計:題目可自選) [設計目的] 掌握VHDL語言的層次化設計方法,自己設計簡單的交通燈控制器電路。 [設計內容] 1、能顯示十字路口東西、南北兩個方向的紅、黃、綠燈的指示狀態。 2、用兩組紅、黃、綠三色燈作為兩個方向的紅、黃、綠燈。能實現正常的倒計時功能以及用兩組數碼管作為東西和南北方向的倒計時顯示。 3、用VHDL語言設計符合上述功能要求的交通燈控制器,并用層次化設計方法設計該電路。 [實驗原理] 以下給出了本設計的一個演示實例:首先必須了解交通路燈的燃滅規律。本實例需要用到實驗箱上交通燈模塊中的發光二極管,即紅、黃、綠各三個。依人們的交通常規,“紅燈停,綠燈行,黃燈提醒”。其交通燈的燃滅規律為:初始態是兩個路口的紅燈全亮,之后,東西路口的綠燈亮,南北路口的紅燈亮,東西方向通車,延時一段時間后,東西路口綠燈開始閃爍,一段時間后綠燈滅,黃燈開始閃爍。閃爍若干次后,東西路口紅燈亮,同時南北路口的綠燈亮,南北方向開始通車,延時一段時間后,南北路口的綠燈開始閃爍,一段時間后綠燈滅,黃燈開始閃爍。閃爍若干次后,再切換到東西路口方向,重復上述過程。該控制器可以采用有限狀態機來實現。 [實例演示步驟] 1. 啟動Quartus11.0軟件,將編寫的設計文件編譯后再根據實驗板的管腳配置表分配好管腳,最后下載相應的.sof文件測試。 實驗現象:程序下載完畢后,首先東西方向通行,當數碼管倒計時計到還剩5秒時綠燈開始閃爍,當計到1秒時黃燈開始閃爍,0秒過后轉向南北方向通行。其現象與東西向一致, 15秒后又轉向東西向通行。以后都重復上述過程。 [設計報告] 1、課程設計題目可以自由選取,按照課程設計的規范要求進行設計報告的撰寫。 2、書寫設計報告時應結構合理,層次分明,在分析時注意語言的流暢。 3、要給出完整的設計過程和設計源碼,并且要在實驗箱上進行實物驗證。 |