數字邏輯電路課程設計報告
一、實驗內容
1. 12進位計數器設計。
2. 數字頻率計的設計。
二.12進位計數器設計
1.設計要求
用74LS192設計12進位加法計數器,計數值從01~12迴圈,用7段LED數位管顯示計數值。用DEII實驗板驗證。
2.原理圖設計
1利用兩個74LS192充當計數器的高位和低位,中左邊的74LS192作為低位,右邊的74LS192為高位.兩片的輸入端A,B,C,D均置數0,0,0,0,左邊的74LS192輸入頻率為1kHZ的訊號.
2利用74LS47解碼器,將傳入的十進位訊號直接翻譯成7段顯示碼,輸出介面接上7段顯示管。
3利用一個與非門實現十進位。當產生001011時設定清零連接埠有效
12進位加法計數器原理圖1所示。
圖1 12進位加法計數器原理圖
3.操作步驟
1.開啟QuartusII軟體,建立wizard,選取器件為CycloneIIEP2C35F672C8。建立 block Diagram/Schematic File,建立cnt12.bdf檔案
2. 將元器件74LS192,74LS47,與非門,輸入輸出引腳從library匯入,連好圖,修改輸入輸出引腳的名字。
3進行全程編譯,無誤後啟動“Assigment-Pin”菜單,配置引腳的location
分別為PIN-V13,PIN-V14,PIN-AE11,PIN-AD11,PIN-AC12,PIN-AB12,PIN-AF12.
4在QuartusII軟體選擇“Tools”菜單下的“Programmer”命令。在下載之前,要進行硬體設定,在“Hardware Setting”中選擇“USB-Blaster”,將編程模式選擇為“JTAG”,並在“Program/Configure”複選框內打勾,便可點擊“start”按鈕,開始下載。
5在FPGA上檢驗是否為12進位。
三.4位元字頻率計設計
1.設計要求
設計4位元字頻率計,測頻範圍0000~9999Hz。用DEII實驗板驗證。
2.數字頻率計的工作原理
當閘門訊號(寬度為1s的正脈衝)到來時,閘門開通,被測訊號通過閘門送到計數器,計數器開始計數,當閘門訊號結束時,計數器停止計數。由於閘門開通時間為1s,計數器的數值就是被測訊號頻率。為了使測得的頻率值準確,在閘門開通之前,計數器必須清零。為了使顯示電路穩定的顯示頻率值,計數器和顯示電路之間加了鎖存器,當計數器計數截止,將計數值通過鎖存訊號送到鎖存器。
控制電路在時基電路的控制下產生三個訊號:閘門訊號,鎖存訊號和清零訊號。
圖2 數字頻率計原理框圖
圖3 數字頻率計原理框圖工作時序
3.數字頻率計頂層原理圖設計
圖中總共有四個不同的功能模組:CNT10,LATCH4,DECODER和CONTROL模組。
1四個十進位計數器CNT10組成10000進位計數器,是頻率計的測量範圍達到0-9999Hz;
2LATCH4模組用於鎖存計數器計數結果;
3DECODER模組將計數器輸出的8421BCD碼轉換為7段顯示碼。
4CONTROL模組為頻率計的控制器,產生滿足時序要求的控制訊號。
圖4 數字頻率計頂層原理圖
4.數字頻率計底層模組模擬
(1)計數器模組模擬
Clk:時基訊號
Clr:清零訊號
Cs:片選訊號,cs=1時才會計數。
圖5 計數器模組模擬結果
(2)鎖存器模組模擬
當le=1時將dd訊號鎖存到qq中。
圖6 鎖存器模組模擬結果
(3)顯示解碼模組模擬結果
將din傳入的8421BCD碼轉換成7段顯示碼
圖7 顯示解碼模組模擬結果
(4)控制模組模擬結果
控制電路在時基電路的控制下產生三個訊號:閘門訊號,鎖存訊號和清零訊號。
圖8 控制模組模擬結果
5.數字頻率操作過程
1.開啟QuartusII軟體,建立wizard,選取器件為CycloneIIEP2C35F672C8。建立VHDL File,建立cnt10,latch4,decoder,control四個模組.
2. 編寫VHDL代碼.
CNT10:
library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity cnt10 is port(clk:in std_logic; clr:in std_logic; cs :in std_logic; qq :buffer std_logic_vector(3 downto 0); co :out std_logic); end cnt10; architecture one of cnt10 is begin process(clk,clr,cs) begin if (clr='1') then qq<="0000"; elsif (clk'event and clk='1') then if (cs='1') then if (qq=9) then qq<="0000"; else qq<=qq+1; end if; end if; end if; end process; process(qq) begin if (qq=9) then co<= '0'; else co<='1'; end if; end process; end; |
Latch4:
LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY LATCH4 IS PORT(le: IN STD_LOGIC; dd: IN STD_LOGIC_VECTOR(3 DOWNTO 0); qq: OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); END LATCH4; ARCHITECTURE one OF LATCH4 IS BEGIN PROCESS(le,dd) BEGIN IF (le='1') THEN qq<=dd; END IF; END PROCESS; END one; |
Decoder:
library ieee; use ieee.std_logic_1164.all; entity decoder is port(din:in std_logic_vector(3 downto 0); led7s:out std_logic_vector(6 downto 0) ); End; architecture one of decoder is begin process(din) begin case din is when "0000"=>led7s<="1000000"; when "0001"=>led7s<="1111001"; when "0010"=>led7s<="0100100"; when"0011"=>led7s<="0110000"; when"0100"=>led7s<="0011001"; when"0101"=>led7s<="0010010"; when"0110"=>led7s<="0000010"; when"0111"=>led7s<="1111000"; when"1000"=>led7s<="0000000"; when"1001"=>led7s<="0010000"; when"1010"=>led7s<="0001000"; when"1011"=>led7s<="0000011"; when"1100"=>led7s<="1000110"; when"1101"=>led7s<="0100001"; when"1110"=>led7s<="0000110"; when"1111"=>led7s<="0001110"; when others=>led7s<=null; end case; end process; end; |
Control:
library ieee; use ieee.std_logic_1164.all; entity control is port(clk: in std_logic; cs,clr,le: out std_logic); end control; architecture behav of control is signal current_state,next_state:std_logic_vector(3 downto 0); constant st0:std_logic_vector :="0011" ; constant st1:std_logic_vector :="0010"; constant st2:std_logic_vector :="0110"; constant st3:std_logic_vector :="0111"; constant st4:std_logic_vector :="0101"; constant st5:std_logic_vector :="0100"; constant st6:std_logic_vector :="1100"; constant st7:std_logic_vector :="1101"; constant st8:std_logic_vector :="1111"; constant st9:std_logic_vector :="1110"; begin com1:process(current_state) begin case current_state is when st0=>next_state<=st1; clr<='1'; cs<='0'; le<='0'; when st1=>next_state<=st2; clr<='0'; cs<='1'; le<='0'; when st2=>next_state<=st3; clr<='0'; cs<='1'; le<='0'; when st3=>next_state<=st4; clr<='0'; cs<='1'; le<='0'; when st4=>next_state<=st5; clr<='0'; cs<='1'; le<='0'; when st5=>next_state<=st6; clr<='0'; cs<='1'; le<='0'; when st6=>next_state<=st7; clr<='0' ; cs<='1'; le<='0'; when st7=>next_state<=st8; clr<='0'; cs<='1'; le<='0'; when st8=>next_state<=st9; clr<='0'; cs<='1'; le<='0'; when st9=>next_state<=st0; clr<='0'; cs<='0'; le<='1'; when others=>next_state<=st0; clr<='0'; cs<='0'; le<='0'; end case; end process com1; reg: process(clk) begin if (clk'event and clk='1') then current_state<=next_state; end if; end process reg; end behav; |
3.對各個子模組進行編譯,若出現錯誤,則首先排查VHDL是否正確。
4.上一步成功編譯後,再進行模擬。建立Vector Waveform File,確定模擬時間(End Time)和網格寬度(Grid Size),在列表處加入輸入輸出節點(Insert Node Or Bus),並配置輸入波形,最後開始模擬(Start Simulation)。
5.模擬結果正確後,產生相應的模組符號,以便在頂層圖中使用。
6.各個子模組完成後,建立fmeter.bdf.將各個子模組匯入到檔案中,並按照頂層原理圖所示,正確布局和連接線路。設定fmeter.bdf為頂層並編譯。
7.上一步正確後,開始分配引腳,開啟Pin選項,為每一個Node設定Location,設定規則參考書本附錄。
8.開啟Programmer,將fmeter的配置下載到CycloneII晶片內,在FPGA面板上運行。檢查是否出現錯誤,若沒有,則實驗順利完成。
四.實驗體會
1. 碰到的問題
1編寫完VHDL代碼後,對其編譯,始終顯示錯誤,檢查代碼無誤,並重新建立wizard後,仍然無法通過編譯。
解決:應當建立一個獨立的檔案夾,將檔案儲存體在裡面,否則,同級目錄下出現其他不相關的檔案,會影響編譯。
2將內容下載到FPGA後,無法正常運行。
解決:檢查配置時發現,晶片型號配置錯誤,應該為CycloneIIEP2C35F672C8。
3編寫fmeter.bdf後,編譯,但無法通過。
解決:檢查錯誤時發現,存在多餘的線頭,部分連線沒有真正連上。
2. 實驗收穫
3. 建議