数字电路与逻辑设计实验报告
一、实验名称和实验任务要求
1、用 VHDL 语言设计实现一个 4 选 1 数据选择器,根据地址端的不同取值选择不同的数
据端到输出端,仿真验证其功能。
2、用 VHDL 语言设计实现一个共阴极 7 段数码管译码器,仿真验证其功能。
3、用 VHDL 语言设计实现一个分频系数为 10,分频输出信号占空比为 50%的分频器,仿
真验证其功能。
4、用 VHDL 语言设计实现一个带异步复位的 8421 码十进制计数器,仿真验证其功能。
将分频器、计数器和数码管译码器 3 个电路进行连接,实现一个加 1 的计数器,并在数码
管上显示计数结果,仿真验证其功能。顶层设计用图形法或 vhdl 例化,均可。
二、电路设计及 VHDL 代码及注释
1. 4 选 1 数据选择器
代码:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
entity BAT is
port(a,b:in std_logic;
s1,s2,s3,s4:in std_logic;
en:in std_logic;
y: out std_logic);
end entity BAT;
architecture one of BAT is
signal ab:std_logic_vector(1 downto 0);
begin
ab <= a&b;
process(ab,s1,s2,s3,s4)
begin
case ab is
when "00" => y<=s1;
when "01" => y<=s2;
when "10" => y<=s3;
when "11" => y<=s4;
when others => null;
end case;
end process;
end architecture one;
仿真波形图:
波形图分析:
en 为 1 时,当输入 ab 为 00 时,输出为 s1; 当输入 ab 为 01 时,输出为 s2; 当输入 ab 为 10
时,输出为 s3; 当输入 ab 为 11 时,输出为 s4;
2. 共阴极 7 段数码管译码器
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY shiyan IS
PORT(A:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
B:OUT STD_LOGIC_VECTOR(6 DOWNTO 0);
C:OUT STD_LOGIC_VECTOR(5 DOWNTO 0));
END shiyan;
ARCHITECTURE encoder_arch OF shiyan IS
BEGIN
PROCESS(A)
BEGIN
C<="011111";
CASE A IS
WHEN"0000"=> B<="1111110";--0
WHEN"0001"=> B<="0110000";--1
WHEN"0010"=> B<="1101101";--2
WHEN"0011"=> B<="1111001";--3
WHEN"0100"=> B<="0110011";--4
WHEN"0101"=> B<="1011011";--5
WHEN"0110"=> B<="1011111";--6
WHEN"0111"=> B<="1110000";--7
WHEN"1000"=> B<="1111111";--8
WHEN"1001"=> B<="1111011";--9
WHEN OTHERS=> B<="ZZZZZZZ";
END CASE;
END PROCESS;
END encoder_arch;
波形图:
波形图分析:A 为输入,A0-A3 为由低位到高位变化,B 是数码管的各个部分,随着 A 输
入的变化,B 数码管对应译码出相应的数字显示出来。
3. 分频系数为 10,分频输出信号占空比为 50%的分频器
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
Use ieee.std_logic_arith.all;
Entity shiyan6 is
generic(N:integer:=10);
port(
clkin,CLR1:IN std_logic;
clkout:OUT std_logic);
End shiyan6;
Architecture a of shiyan6 is
signal cnt:integer range 0 to n/2-1;
signal temp:std_logic;
Begin
process(clkin,CLR1)
begin
if CLR1 = '1' then cnt<=0;
elsif(clkin'event and clkin='1')then
if(cnt=n/2-1)then
cnt<=0;
temp<=NOT temp;
else
cnt<=cnt+1;
end if;
end if;
end process;
clkout<=temp;
End
a;
波形图:
仿真波形图分析:
实现了分频系数为 10,分频输出信号占空比为 50%
4. 带异步复位的 8421 码十进制计数器
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY shiyan4 IS
PORT(
clk,reset:IN STD_LOGIC;
q:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));
END shiyan4;
ARCHITECTURE a OF shiyan4 IS
SIGNAL q_temp:STD_LOGIC_VECTOR(3 DOWNTO 0);
BEGIN
PROCESS(clk,reset)
BEGIN
IF reset='0' THEN
q_temp <="0000";
ELSIF clk'EVENT AND clk='1' THEN
IF q_temp="1001" THEN
q_temp <="0000";
ELSE q_temp <=q_temp+1;
END IF;
END IF;
END PROCESS;
q<= q_temp;
END a;
波形图:
运行前:
运行后:
波形分析:8421 十进制计数器随着时钟的信号进行计数,restart 是复位,当复位为零的时候计数器重新计
数。
5.组合电路
波形图:
波形图分析:实现了加 1 的计数器
三、问题分析
VHDL 文件名与实体名如果不一致,会导致编译的错误,如果更改文件名还是不行的话
可以重新建立工程文件。
实验 5 电路连接后编译失败
后完善分频器的设计并将电路输入端输出端名称修改。
四、总结及结论
通过本次实验,一方面巩固了前期所学的数电知识,最重要的是学习了 VHDL 语言并进
一步熟悉了 quartus 软件的使用,学习了更多 quartus 的功能,并可以通过仿真来验证电路
是否正确。仿真的时候注意总时间的选取和输入变量的周期,要会看出来自己的仿真波形是
否是正确的。