西工大_数电实验_第二次实验_实验报告

  • 格式:doc
  • 大小:2.36 MB
  • 文档页数:14

数电实验2 一.实验目的 1.学习并掌握硬件描述语言(VHDL 或 Verilog HDL);熟悉门电路的逻辑功能,并用硬件描述语言实现门电路的设计。 2.熟悉中规模器件译码器的逻辑功能,用硬件描述语言实现其设计。 3.熟悉时序电路计数器的逻辑功能,用硬件描述语言实现其设计。 4.熟悉分频电路的逻辑功能,并用硬件描述语言实现其设计。

二.实验设备 开发环境 开发板

三.实验内容 要求1:编写一个异或门逻辑电路,编译程序如下。 1)用 QuartusII 波形仿真验证; 2)下载到DE0 开发板验证。

要求2:编写一个将二进制码转换成 0-F 的七段码译码器。 1)用 QuartusII 波形仿真验证; 2)下载到 DE0 开发板,利用开发板上的数码管验证。

要求3: 编写一个计数器。 1)用QuartusII 波形仿真验证; 2)下载到 DE0 开发板验证。

要求4:编写一个能实现占空比 50%的 5M 和50M 分频器即两个输出,输出信号频率分别为 10Hz 和 1Hz。 1) 下载到 DE0 开发板验证。(提示:利用 DE0 板上已有的 50M 晶振作为输入信号,通过开发板上两个的 LED 灯观察输出信号)。 2) 电路框图如下:

扩展内容:利用已经实现的 VHDL 模块文件,采用原理图方法,实现 0-F 计数自动循环显示,频率 10Hz。(提示:如何将 VHDL 模块文件在逻辑原理图中应用,参考参考内容 5)

四.实验原理 1.实验1实现异或门逻辑电路,VHDL源代码如下: LIBRARY IEEE; USE EXORGATE IS PORT(A,B:IN STD_LOGIC; C:OUT STD_LOGIC); END EXORGATE; ARCHITECTURE fwm OF EXORGATE IS BEGIN C<=A XOR B; END;

2.实验2实现一个将二进制码转换成0-F的七段译码器,VHDL源代码如下: LIBRARY IEEE; USE sevendecoder IS PORT (data_in:IN STD_LOGIC_VECTOR(3 DOWNTO 0); dis_out:OUT STD_LOGIC_VECTOR(6 DOWNTO 0)); END sevendecoder; ARCHITECTURE fwm OF sevendecoder IS BEGIN PROCESS(data_in) BEGIN CASE data_in IS WHEN"0000"=>dis_out<="1000000";--显示 0 WHEN"0001"=>dis_out<="1111001";--显示 1 WHEN"0010"=>dis_out<="0100100";--显示 2 WHEN"0011"=>dis_out<="0110000";--显示 3 WHEN"0100"=>dis_out<="0011001";--显示 4 WHEN"0101"=>dis_out<="0010010";--显示 5 WHEN"0110"=>dis_out<="0000010";--显示 6 WHEN"0111"=>dis_out<="1111000";--显示 7 WHEN"1000"=>dis_out<="0000000";--显示 8 WHEN"1001"=>dis_out<="0010000";--显示 9 WHEN"1010"=>dis_out<="0001000";--显示 A WHEN"1011"=>dis_out<="0000011";--显示 b WHEN"1100"=>dis_out<="1000110";--显示 C WHEN"1101"=>dis_out<="0100001";--显示 d WHEN"1110"=>dis_out<="0000110";--显示 E WHEN"1111"=>dis_out<="0001110";--显示 F WHEN OTHERS=> dis_out<="1111111";--灭灯,不显示 END CASE; END PROCESS; END fwm;

3.实验3完成一个计数器,VHDL源代码如下: LIBRARY IEEE; USE counter IS PORT ( clk,RST : IN STD_LOGIC; DOUT : OUT STD_LOGIC_VECTOR (3 DOWNTO 0); --四位计数 COUT : OUT STD_LOGIC); --进位位 END counter; ARCHITECTURE fwm OF counter IS SIGNAL Q1 : STD_LOGIC_VECTOR (3 DOWNTO 0); BEGIN PROCESS(clk,RST) BEGIN IF RST = '0' THEN Q1<=(OTHERS => '0'); COUT<= '0'; ELSIF clk'EVENT AND clk='1' THEN Q1<=Q1+1; COUT<= '0'; IF Q1 >= "1001" THEN Q1<=(OTHERS => '0'); COUT<= '1'; END IF; END IF; END PROCESS; DOUT<=Q1 ; END fwm;

4.实验4编写一个能实现占空比 50%的 5M 和50M 分频器即两个输出,输出信号频率分别为 10Hz 和 1Hz,VHDL源代码如下: LIBRARY IEEE; USE fpq IS PORT(clk:IN STD_LOGIC; clk_out,clk_out1:OUT STD_LOGIC); END fpq; ARCHITECTURE fwm OF fpq IS CONSTANT m : INTEGER:= ; --50M 分频到 1Hz 时=。 CONSTANT m1 : INTEGER:= 2500000; --5M 分频到 10Hz 时=2500000。 SIGNAL tmp :STD_LOGIC; SIGNAL tmp1 :STD_LOGIC; BEGIN PROCESS(clk, tmp) VARIABLE cout : INTEGER:=0; BEGIN IF clk'EVENT AND clk='1' THEN cout:=cout+1; --计数器+1 IF cout<=m THEN tmp<='0'; --计数小于等于 ,输出 0 ELSIF coutELSE cout:=0; --计数器清零 END IF; END IF; END PROCESS; clk_out<=tmp; --50M分频器输出 PROCESS(clk, tmp1) VARIABLE cout1 : INTEGER:=0; BEGIN IF clk'EVENT AND clk='1' THEN cout1:=cout1+1; --计数器+1 IF cout1<=m1 THEN tmp1<='0'; --计数小于等于 2500000,输出 0 ELSIF cout1ELSE cout1:=0; --计数器清零 END IF; END IF; END PROCESS;

clk_out1<=tmp1; --5M分频器输出 END fwm;

五:拓展内容 首先需要一个分频器分频得到10Hz的时钟信号 LIBRARY IEEE; USE tuozhan IS PORT(clk:IN STD_LOGIC; clk_out1:OUT STD_LOGIC); END tuozhan; ARCHITECTURE fwm OF tuozhan IS --CONSTANT m : INTEGER:= ; --50M 分频到 1Hz 时=。 CONSTANT m1 : INTEGER:= 2500000; --5M 分频到 10Hz 时=2500000。 SIGNAL tmp :STD_LOGIC; SIGNAL tmp1 :STD_LOGIC; BEGIN

PROCESS(clk, tmp1) VARIABLE cout1 : INTEGER:=0; BEGIN IF clk'EVENT AND clk='1' THEN cout1:=cout1+1; --计数器+1 IF cout1<=m1 THEN tmp1<='0'; --计数小于等于 2500000,输出 0 ELSIF cout1ELSE cout1:=0; --计数器清零 END IF; END IF; END PROCESS;

clk_out1<=tmp1; --5M分频器输出 END fwm; 然后需要一个计数器 LIBRARY IEEE; USE decoder IS PORT (clk:IN STD_LOGIC;--接收10HZ的时钟信号 dis_out:OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); END decoder; ARCHITECTURE fwm OF decoder IS BEGIN PROCESS(clk) VARIABLE count : INTEGER:=0; BEGIN CASE count IS WHEN 0 =>dis_out<="0000"; WHEN 1 =>dis_out<="0001"; WHEN 2 =>dis_out<="0010"; WHEN 3 =>dis_out<="0011"; WHEN 4 =>dis_out<="0100"; WHEN 5 =>dis_out<="0101"; WHEN 6 =>dis_out<="0110"; WHEN 7 =>dis_out<="0111"; WHEN 8 =>dis_out<="1000"; WHEN 9 =>dis_out<="1001"; WHEN 10 =>dis_out<="1010"; WHEN 11 =>dis_out<="1011"; WHEN 12 =>dis_out<="1100"; WHEN 13 =>dis_out<="1101"; WHEN 14 =>dis_out<="1110"; WHEN 15 =>dis_out<="1111"; WHEN OTHERS=>count:=0;

END CASE; IF clk'EVENT AND clk='1' THEN count:=count+1; END IF; END PROCESS; END fwm;

最后使用七段译码器译码为七段码 LIBRARY IEEE; USE sevendecoder IS PORT (data_in:IN STD_LOGIC_VECTOR(3 DOWNTO 0); dis_out:OUT STD_LOGIC_VECTOR(6 DOWNTO 0)); END sevendecoder;