北邮数电
实验报告
化学实验报告单总流体力学实验报告观察种子结构实验报告观察种子结构实验报告单观察种子的结构实验报告单
.doc
数字电路与逻辑设计实验实验
报告
软件系统测试报告下载sgs报告如何下载关于路面塌陷情况报告535n,sgs报告怎么下载竣工报告下载
学科类别:通信工程
姓 名 张健为
学 院 信息与通信工程学院
专 业 通信工程
班 级 2013211122
学 号 2013210402
班内序号 13
指导教师 高英
2015年 6 月
北京邮电大学数字电路与逻辑设计实验
实验一 Quartus II原理图输入法设计 一、实验目的:
(1)熟悉Quartus II原理图输入法进行电路设计和仿真;
(2)掌握Quartus II 图形模块单元的生成与调用;
(3)熟悉实验板的使用。
二、实验所用器材:
(1)计算机;
(2)数字系统与逻辑设计实验开发板。
三、实验任务要求
(1)用逻辑门设计实现一个半加器,仿真验证其功能,并生成新的半加器图形模块单元。 (2)用(1)中生成的半加器模块和逻辑门设计实现一个全加器,仿真验证其功能,并下载到实
验板测试,要求用拨码开关设定输入信号,发光二极管显示输出信号。 四、设计思路和过程
(1)半加器的设计
半加器电路是指对两个输入数据位进行加法,输出一个结果位和进位,不产生进位输入的加法器电路。是实现两个一位二进制数的加法运算电路。数据输入AI被加数、BI加数,数据输出SO和数(半加和)、进位C0。在数字电路设计中,最基本的方法是不管半加器是一个什么样的电路,按组合数字电路的分析方法和步骤进行。
1(列出真值表
半加器的真值表如表4-1所示。
表中两个输入是加数A0和B0,输出有一个是和S0,另一个是进位C0。
表4-1 半加器真值表
输入 输出
AI BI SO CO
0 0 0 0
0 1 1 0
1 0 1 0
1 1 0 1
2(根据真值表写出输出逻辑表达式
该电路有两个输出端,属于多输出组合数字电路,电路的逻辑表达式为:
SO=AI?BI
CO=AB
所以,可以用一个两输入异或门和一个两输入与门实现。 (2)全加器的实现
全加器与半加器的区别在于全加器有一个低进位CI,从外部特性来看,它是一个三输入
两输出的器件。
1、列出真值表
一位全加器的真值表如表4-2所示,其中AI为被加数,BI为加数,相邻低位来的进位
,输出本位和为SO。向相邻高位进位数为CO。 数为CI
表4-2 全加器真值表
输入 输出
AI BI CI SO CO
0 0 0 0 0
0 0 1 1 0
0 1 0 1 0
0 1 1 0 1
1 0 0 1 0
1 0 1 0 1
1 1 0 0 1
1 1 1 1 1 2、根据真值表写出逻辑表达式
根据真值表写出逻辑表达式如下:
SO=AI?BI?CI
CO=AB+(AI?BI)CI
所以根据上式在对比半加器的逻辑表达式,可以知道只要再加入一个异或门和一个两输
入与门和两输入或门即可在半加器的基础上实现全加器。 五、实验原理图
1、半加器实验原理图
图5-1 半加器实验原理图
2、全加器实验原理图
图5-1 全加器实验原理图
六、仿真波形图及仿真波形分析
1、半加器仿真波形图
半加器仿真波形如图6-1所示,经检验与表4-1所列相符。
图6-1 半加器仿真波形图
2、全加器仿真波形图
全加器仿真波形如图6-2所示。经检验与表4-2所列相符,满足全加器特性。
图6-2 半加器仿真波形图
实验三 用VHDL设计与实现时序逻辑电路 一、实验目的:
(1)熟悉用VHDL语言设计时序逻辑电路的方法;
(2)熟悉计数器的设计与应用;
(3)熟悉分频器的设计方法;
(4)熟悉用Quartus II文本输入法进行电路设计。
二、实验所用器材:
(1)计算机;
(2)数字系统与逻辑设计实验开发板。
三、实验任务要求
(1)用VHDL语言设计一个带异步复位的8421码十进制计数器,仿真验证其功能。 (2)用VHDL语言设计一个分频系数为10,分频输出信号占空比为50%的分频器。要求在
Quartus II平台上设计程序并仿真验证程序。
(3)将(1)、(2)和数码管译码器进行链接,并下载到实验板显示计数结果。 四、实验VHDL代码
(1)8421计数器
library IEEE;
use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity count_1 is
port (
clk,rst : in STD_logic;
q : out STD_LOGIC_VECTOR(3 DOWNTO 0));
end count1;
architecture a of count_1 is signal count : STD_LOGIC_VECTOR(3 DOWNTO 0);
begin
process(clk,rst)
begin
if rst = '1' then
count<="0000";
elsif (clk'event and clk = '1') then
if (count = "1001") then
count<="0000";
else
count<=count+1;
end if;
end if;
end process;
q<=count;
end;
(2)分频器
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY div_12 IS
PORT(
clk : IN STD_LOGIC;
clk_out : OUT STD_LOGIC);
END div_12;
ARCHITECTURE a OF div_12 IS
SIGNAL tmp : INTEGER RANGE 0 TO 4;
SIGNAL clktmp : STD_LOGIC;
BEGIN
PROCESS(clk)
BEGIN
IF clk'event AND clk = '1' THEN
IF tmp = 4 THEN
tmp <=0;clktmp<= NOT clktmp;
ELSE tmp <=tmp+1;
END IF;
END IF;
END PROCESS;
clk_out<=clktmp;
END;
(3)数码管译码器
library ieee;
use ieee.std_logic_1164.all;
entity Vhdl1 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 Vhdl1;
architecture Vhdl1_arch of Vhdl1 is begin
c<="110111";
process(a)
begin
case a is
when"0000"=>b<="1111110";
when"0001"=>b<="0110000";
when"0010"=>b<="1101101";
when"0011"=>b<="1111001";
when"0100"=>b<="0110011";
when"0101"=>b<="1011011";
when"0110"=>b<="1011111";
when"0111"=>b<="1110000";
when"1000"=>b<="1111111";
when"1001"=>b<="1111011";
when others =>b<="0000000";
end case;
end process;
end;
五、实验原理图
图6-1 实验原理图
实验原理图如图6-1所示。Div_12为分频器,count_1为8421计数器,clear为异步复位端。Vhdl1为数码管译码器。Clock为时钟输入端,clk_out为分频后时钟输出端,q[3..0]为8421计数器信号输出端,a[3..0]为数码管译码器信号输入端,b[6..0]、c[5..0]为数码
管译码器信号输出端。
六、仿真波形图及仿真波形分析
图6-1 仿真波形图,1,
图6-2 仿真波形图,2,
如图6-1可知电路异步复位功能正常,当clear出现高电平时,数码管立即显示0,并在clear高电平消失后立即从0开始计数。在计数到9之后又重新由0开始计数。图6-1及图6-2显示了完整的计数周期。C表示了计数所利用的数码管的编号。由仿真图可以看出,电路功能正常。
实验四 用VHDL设计与实现相关电路 一、实验目的:
(1)掌握VHDL语言的语法规范,掌握时序电路描述方法;
(2)掌握多个数码管动态扫描显示的原理及设计方法;
二、实验所用器材:
(1)计算机;
(2)数字系统与逻辑设计实验开发板。
三、实验任务要求
用VHDL语言设计并实现六个数码管串行扫描电路,要求同时显示0、1、2、3、4、5这6个不同的数字图形到6个数码管上,仿真验证其功能,并下载到实验板测试。 四、实验VHDL代码
ENTITY shumaguan IS
PORT(
clk:IN STD_LOGIC;
b:OUT STD_LOGIC_VECTOR(6 DOWNTO 0);
c:OUT STD_LOGIC_VECTOR(5 DOWNTO 0)); END ENTITY;
ARCHITECTURE jingtaixianshi OF shumaguan IS
SIGNAL jishu:INTEGER RANGE 0 TO 5:=0;
BEGIN
p1:PROCESS(clk)
BEGIN
IF(clk'event AND clk='1') THEN
IF(jishu=5) THEN
time<=0;
ELSE
jishu<=jishu+1;
END IF;
END IF;
END PROCESS p1;
p2:PROCESS(jishu)
BEGIN
CASE jishu IS
WHEN 0=> b<="1111110";c<="011111";
WHEN 1=> b<="0110000";c<="101111";
WHEN 2=> b<="1101101";c<="110111";
WHEN 3=> b<="1111001";c<="111011";
WHEN 4=> b<="0110011";c<="111101";
WHEN 5=> b<="1011011";c<="111110";
END CASE;
END PROCESS p2;
END jingtaixianshi;
选做(数码管滚动显示):
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all; entity smg1 is
port(
clk,clear: in std_logic;
kongzhi: in std_logic;
q:out std_logic_vector(6 downto 0);
countout:out std_logic_vector(5 downto 0)
);
end smg1;
architecture behave of smg1 is
signal q_temp:std_logic_vector(6 downto 0); signal count:std_logic_vector(5 downto 0);
signal cnt,cnt1: integer range 0 to 5;
signal tmp:integer range 0 to 19999; signal clk1:std_logic;
begin
p0:process (clk,clear)
begin
if clear='0' then tmp<=0;
elsif clk'event and clk='1' then
if tmp=19999 then
tmp<=0;
else
tmp<=tmp+1;
end if;
end if;
end process p0;
p1:process(tmp)
begin
if clk'event and clk='1' then
if tmp<10000 then
clk1<='0';
else
clk1<='1';
end if;
end if;
end process p1;
p2:process(tmp)
begin
if clk'event and clk='1'then
if cnt=5 then
cnt<=0;
else
cnt<=cnt+1;
end if;
end if;
end process p2;
p3:process(clk1)
begin
if clk1'event and clk1='1' then
if cnt1=5 then cnt1<=0;
else
cnt1<=cnt1+1;
end if;
end if;
end process p3;
p4:process(cnt,cnt1)
begin
if clear='0' then q_temp<="0000000";
else
if kongzhi='0' then
case cnt+cnt1 is
when 0 => q_temp<="1111110";
when 1 => q_temp<="0110000";
when 2 => q_temp<="1101101";
when 3 => q_temp<="1111001";
when 4 => q_temp<="0110011";
when 5 => q_temp<="1011011";
when 6 => q_temp<="1111110";
when 7 => q_temp<="0110000";
when 8 => q_temp<="1101101";
when 9 => q_temp<="1111001";
when 10 => q_temp<="0110011";
when 11 => q_temp<="1011011";
when others => q_temp<="0000000";
end case;
else
case cnt+cnt1 is
when 0 => q_temp<="1111110";
when 1 => q_temp<="1011011";
when 2 => q_temp<="0110011";
when 3 => q_temp<="1111001";
when 4 => q_temp<="1101101";
when 5 => q_temp<="0110000";
when 6 => q_temp<="1111110";
when 7 => q_temp<="1011011";
when 8 => q_temp<="0110011";
when 9 => q_temp<="1111001";
when 10 => q_temp<="1101101";
when 11=> q_temp<="0110000";
when others => q_temp<="0000000";
end case;
end if;
end if;
end process p4;
q<=q_temp;
p5:process(cnt)
begin
if clear='0' then count<="111111";
else
case cnt is
when 0 => count<="011111";
when 1 => count<="101111";
when 2 => count<="110111";
when 3 => count<="111011";
when 4 => count<="111101";
when 5 => count<="111110";
end case;
end if;
end process p5;
countout<=count;
end behave;
五、仿真波形图及仿真波形分析
图5-1 仿真波形图
如图5-1,电路实现了对6段数码管的译码输出,并通过所设计的串行扫描控制,对6个7段数码管扫描输出,要求6个数码管分别显示0、1、2、3、4、5,当控制信号为高电平时,对应数码管点亮,否则熄灭。当时钟频率满足时视觉暂留特性的要求时,可以看到6
、1、2、3、4、5.仿真波形经检验正确。 个数码管同时分别显示0
选做(数码管滚动显示):
问题及故障分析
实验一过程中,前期遇到了对软件不熟悉的问题,元件调用时原理图没有在同一文件夹下,仿真波形图没有与工程名相同,造成了设计及仿真的错误。下载时还出现了建立工程时芯片选择与实验板不一致,无法匹配的问题。除人为失误之外实验一相对较简单,没有遇到难以解决的故障。
实验三过程中,顶层设计时原理图连接本应选择总线却选择了普通连接线,导致仿真得不到预期波形。
实验四过程中,最初代码中没有添加信号shuju,导致下载后动态扫描时六个数码管同时显示相同数字,与实验要求相违背。出线问题的原因在于没有进行对数码管进行控制,添加信号shuju之后可通过shuju取值不同使不同数码管显示不同的数字。
总结和结论
通过一个学期的数电实验课学习,我熟悉了Quartus II软件。学习了原理图和VHDL文本两种电路设计方案。并且在实验三中,将两种方案相结合,使用顶层原理图加底层VHDL语言的方案开发。四次实验课的过程中,通过练习还学习了利用纯VHDL语言进行顶层加底层的设计。在编程过程中,也由最开始的以实现功能为主,逐渐转为在实现功能的基础上更好的节约内部资源,提高芯片内部逻辑门的利用率。此外,通过实践,我对分频器、译码器、计数器这些之前理论课上抽象的知识点有了更加深刻和形象的认识。