數字邏輯電路課程設計報告


 

 

 

數字邏輯電路課程設計報告

 

 

 

 

 

 

姓名 姜楠

學號 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(dinin std_logic_vector(3 downto 0);

led7sout 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. 碰到的問題

    編寫完VHDL代碼后,對其編譯,始終顯示錯誤,檢查代碼無誤,並重新創建wizard后,仍然無法通過編譯。

    解決:應當建立一個獨立的文件夾,將文件存儲在里面,否則,同級目錄下出現其他不相關的文件,會影響編譯。

    將內容下載到FPGA后,無法正常運行。

    解決:檢查配置時發現,芯片型號配置錯誤,應該為CycloneIIEP2C35F672C8。

    編寫fmeter.bdf后,編譯,但無法通過。

    解決:檢查錯誤時發現,存在多余的線頭,部分連線沒有真正連上。

  2. 實驗收獲

    老師要求很嚴格,相比於其他專業,學生們只要從別人那里拷貝一下就可以順利通過實驗,我們的實驗課不僅是在面包板上連線,而且還要學習如何使用Quartus軟件,學習VHDL語言,利用FPGA來實現相應的功能。短短幾次課學習到了很多知識。

    首先,原先只學習軟件知識,這幾次實驗使我對硬件描述語言有了初步認識,

    拓展了對硬件的理解。

    其次,提高了自身的學習能力和查錯能力。很多時候,不知道接下來的步驟要如何完成,不知道自己完成的電路到底哪里出錯,一心想着是不是我的儀器是壞的。最后在同學的幫助下,都順利解決了。但過程卻異常艱辛。看着同學的實驗都驗收了,自己的實驗就是調試不對,心里急也沒用,只能一步步檢查。

  3. 建議

    建議適時更新一下實驗室配置,機器老了,應當及早維修。

    而且應該為我們計算機學院單獨配一個硬件實驗室,而不是用其他學院的實驗室。

    電腦里有前人做實驗留下的代碼,有些人就這樣用別人的成果水水地驗收了。

    建議及時清理硬盤。

     


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM