2009级数字电路实验
实验名称: EDA基础实验
学生姓名:
班 级:
班内序号:
学 号:
日 期:
1.实验
【实验目的】
1.熟悉用QuartusII原理图输入法进行电路设计和仿真;
2.掌握QuartusII图形模块单元的生成与调用;
3.熟悉用VHDL语言设计组合逻辑电路和时序电路的方法;
4.熟悉用QuartusII文本输入法和图形输入法进行电路设计;
5.熟悉不同的编码及其之间的转换;
6.掌握触发器的逻辑功能及使用方法;
7.熟悉计数器、寄存器、锁存器、分频器、移位寄存器的设计方法
8.掌握VHDL语言的语法规范,掌握时序电路描述方法;
9.掌握多个数码管动态扫描显示的原理及设计方法。
【实验所用仪器及元器件】
1.计算机
2.直流稳压电源
3.数字系统与逻辑设计实验开发板
【实验内容】
1.用逻辑门设计实现一个半加器,仿真验证其功能,并生成新的半加器图形模块单元。
2.用实验内容1中生成的半加器模块和逻辑门设计实现一个全加器,仿真验证其功
能,并下载到实验板测试,要求用拨码开关设定输入信号,发光二极管显示输出信
号。
3.用3线-8线译码器(74LS138)和逻辑门设计实现函数F,仿真验证其功能,并下
载到实验板测试。要求用拨码开关设定输入信号,发光二极管显示输出信号。
4.用VHDL语言设计实现一个3位二进制数值比较器,仿真验证其功能,并下载到实
验板测试。要求用拨码开关设定输入信号,发光二极管显示输出信号。
5.用VHDL语言设计实现一个4选1的数据选择器;一个8421码转换为格雷码的代码
转换器;一个举重比赛裁判器;一个带同步置位和同步复位功能的D触发器;一个
带异步复位的4位二进制减计数器;一个带异步复位的8421码十进制计数器;一
个带异步复位的4位自启动环形计数器;一个带控制端的8位二进制寄存器,当控
制端为‘1’时,电路正常工作,否则输出为高阻态;一个分频系数为12,分频输
出信号占空比为50%的分频器。仿真验证其功能,并下载到实验板测试。要求用拨
码开关和按键开关设定输入信号,发光二极管显示输出信号。(注:有几个不需要
下载到实验板测试)
2.程序分析
全加器:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY h_adder IS
PORT(a,b:IN STD_LOGIC;
co,so:OUT STD_LOGIC);
END ENTITY h_adder;
ARCHITECTURE a OF h_adder IS
BEGIN
so<= a XOR b;
co<= a AND b;
END;
library ieee;
use ieee.std_logic_1164.all;
entity GKY07P3 is
port(ain,bin,cin:in std_logic;
cout,sum:out std_logic);
end entity GKY07P3;
architecture a of GKY07P3 is
component h_adder
port(a,b:in std_logic;
co,so:out std_logic);
end component;
signal d,e,f:std_logic;
begin
u1:h_adder port map(a=>ain,b=>bin,co=>d,so=>e);
u2:h_adder port map(a=>e,b=>cin,co=>f,so=>sum);
cout<=d or f;
end;
整体思路是按照实验的要求,先做出一个半加器,然后在这个半加器的基础上实现全加器的功能。
函数F:
3位二进制数值比较器:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY GKY07P4 IS
PORT(A:IN STD_LOGIC_VECTOR(2 DOWNTO 0);
B:IN STD_LOGIC_VECTOR(2 DOWNTO 0);
YA,YB,YC:OUT STD_LOGIC);
END GKY07P4;
ARCHITECTURE behave OF GKY07P4 IS
BEGIN
PROCESS(A,B)
BEGIN
IF(A>B)THEN
YA<='1';YB<='0';YC<='0';
ELSIF(A
Y<=D0;YB<= NOT D0;
WHEN"01"=>Y<=D1;YB<= NOT D1;
WHEN"10"=>Y<=D2;YB<= NOT D2;
WHEN"11"=>Y<=D3;YB<= NOT D3;
WHEN OTHERS=>Y<='0';YB<='1';
END CASE;
ELSE
Y<='0';YB<='1';
END IF;
END PROCESS;
END behave;
主要是WHEN语句的运用,用两位二进制数示四种数据输出状态,再用WHEN语句具体实现。
8421码转换为格雷码:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY GKY07P6 IS
PORT(A:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
B:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));
END GKY07P6;
ARCHITECTURE behave OF GKY07P6 IS
BEGIN
PROCESS(A)
BEGIN
B(3)<=A(3);
B(2)<=A(3) XOR A(2);
B(1)<=A(2) XOR A(1);
B(0)<=A(1) XOR A(0);
END PROCESS;
END behave;
本来是考察WHEN语句的运用,将所有的情况用WHEN语句列出来,但是因为8421码转换为格雷码的时候有一个相关的计算式子,采用这个式子可以使程序简化不少。
举重比赛裁判器:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY GKY07P7 IS
PORT(a:IN STD_LOGIC_VECTOR(2 DOWNTO 0);
b:OUT STD_LOGIC_VECTOR(2 DOWNTO 0));
END GKY07P7;
ARCHITECTURE behave OF GKY07P7 IS
BEGIN
PROCESS(a)
BEGIN
CASE a IS
WHEN"000" => b <= "000";
WHEN"001" => b <= "000";
WHEN"010" => b <= "000";
WHEN"011" => b <= "100";
WHEN"100" => b <= "100";
WHEN"101" => b <= "111";
WHEN"110" => b <= "111";
WHEN"111" => b <= "111";
END CASE;
END PROCESS;
END;
与前几题不同,这个更偏向应用。列出实际情况的状态表,发现三个裁判的不同判断各对应红黄绿灯的亮灭情况,故还是WHEN语句的应用。
D触发器:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY GKY07P8 IS
PORT(d,clk,set,reset:IN STD_LOGIC;
q,qb:OUT STD_LOGIC);
END GKY07P8;
ARCHITECTURE struc OF GKY07P8 IS
BEGIN
PROCESS(clk,set,reset)