數字邏輯電路課程設計報告
姓名 姜楠
學號 201126100207
指導教師 賈立新
專業班級 計算機+自動化1101
學 院 計算機學院
提交日期 2013年 6月 6日
一、實驗內容
1. 12進制計數器設計。
2. 數字頻率計的設計。
二.12進制計數器設計
1.設計要求
用74LS192設計12進制加法計數器,計數值從01~12循環,用7段LED數碼管顯示計數值。用DEII實驗板驗證。
2.原理圖設計
利用兩個74LS192充當計數器的高位和低位,下圖中左邊的74LS192作為低位,右邊的74LS192為高位.兩片的輸入端A,B,C,D均置數0,0,0,0,左邊的74LS192輸入頻率為1kHZ的信號.
利用74LS47譯碼器,將傳入的十進制信號直接翻譯成7段顯示碼,輸出接口接上7段顯示管。
利用一個與非門實現十進制。當產生001011時設置清零端口有效
12進制加法計數器原理圖如圖1所示。
圖1 12進制加法計數器原理圖
3.操作步驟
.打開QuartusII軟件,創建wizard,選擇器件為CycloneIIEP2C35F672C8。新建 block Diagram/Schematic File,創建cnt12.bdf文件
. 將元器件74LS192,74LS47,與非門,輸入輸出引腳從library導入,連好圖,修改輸入輸出引腳的名字。
進行全程編譯,無誤后啟動"Assigment-Pin"菜單,配置引腳的location
分別為PIN-V13,PIN-V14,PIN-AE11,PIN-AD11,PIN-AC12,PIN-AB12,PIN-AF12.
在QuartusII軟件選擇"Tools"菜單下的"Programmer"命令。在下載之前,要進行硬件配置,在"Hardware Setting"中選擇"USB-Blaster",將編程模式選擇為"JTAG",並在"Program/Configure"復選框內打勾,便可點擊"start"按鈕,開始下載。
在FPGA上檢驗是否為12進制。
三.4位數字頻率計設計
1.設計要求
設計4位數字頻率計,測頻范圍0000~9999Hz。用DEII實驗板驗證。
2.數字頻率計的工作原理
當閘門信號(寬度為1s的正脈沖)到來時,閘門開通,被測信號通過閘門送到計數器,計數器開始計數,當閘門信號結束時,計數器停止計數。由於閘門開通時間為1s,計數器的數值就是被測信號頻率。為了使測得的頻率值准確,在閘門開通之前,計數器必須清零。為了使顯示電路穩定的顯示頻率值,計數器和顯示電路之間加了鎖存器,當計數器計數截止,將計數值通過鎖存信號送到鎖存器。
控制電路在時基電路的控制下產生三個信號:閘門信號,鎖存信號和清零信號。
圖2 數字頻率計原理框圖
圖3 數字頻率計原理框圖工作時序
3.數字頻率計頂層原理圖設計
圖中總共有四個不同的功能模塊:CNT10,LATCH4,DECODER和CONTROL模塊。
四個十進制計數器CNT10組成10000進制計數器,是頻率計的測量范圍達到0-9999Hz;
LATCH4模塊用於鎖存計數器計數結果;
DECODER模塊將計數器輸出的8421BCD碼轉換為7段顯示碼。
CONTROL模塊為頻率計的控制器,產生滿足時序要求的控制信號。
圖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面板上運行。檢查是否出現錯誤,若沒有,則實驗順利完成。
四.實驗體會
-
碰到的問題
編寫完VHDL代碼后,對其編譯,始終顯示錯誤,檢查代碼無誤,並重新創建wizard后,仍然無法通過編譯。
解決:應當建立一個獨立的文件夾,將文件存儲在里面,否則,同級目錄下出現其他不相關的文件,會影響編譯。
將內容下載到FPGA后,無法正常運行。
解決:檢查配置時發現,芯片型號配置錯誤,應該為CycloneIIEP2C35F672C8。
編寫fmeter.bdf后,編譯,但無法通過。
解決:檢查錯誤時發現,存在多余的線頭,部分連線沒有真正連上。
-
實驗收獲
老師要求很嚴格,相比於其他專業,學生們只要從別人那里拷貝一下就可以順利通過實驗,我們的實驗課不僅是在面包板上連線,而且還要學習如何使用Quartus軟件,學習VHDL語言,利用FPGA來實現相應的功能。短短幾次課學習到了很多知識。
首先,原先只學習軟件知識,這幾次實驗使我對硬件描述語言有了初步認識,
拓展了對硬件的理解。
其次,提高了自身的學習能力和查錯能力。很多時候,不知道接下來的步驟要如何完成,不知道自己完成的電路到底哪里出錯,一心想着是不是我的儀器是壞的。最后在同學的幫助下,都順利解決了。但過程卻異常艱辛。看着同學的實驗都驗收了,自己的實驗就是調試不對,心里急也沒用,只能一步步檢查。
-
建議
建議適時更新一下實驗室配置,機器老了,應當及早維修。
而且應該為我們計算機學院單獨配一個硬件實驗室,而不是用其他學院的實驗室。
電腦里有前人做實驗留下的代碼,有些人就這樣用別人的成果水水地驗收了。
建議及時清理硬盤。