数字电路与逻辑设计实验(上)
学院:信息与通信工程学院
班级:
学号:
姓名:
班内序号:
日期:2015年05月31日
一、实验要求
(1)实验目的
1.熟悉用QuartusII原理图输入法进行电路设计和仿真;
2.掌握QuartusII图形模块单元的生成与调用;
3.熟悉用VHDL语言设计组合逻辑电路和时序电路的方法;
4.熟悉用QuartusII文本输入法和图形输入法进行电路设计;
5.熟悉不同的编码及其之间的转换;
6.熟悉计数器、分频器的设计方法
7.掌握VHDL语言的语法规范,掌握时序电路描述方法;
8.掌握多个数码管动态扫描显示的原理及设计方法。
9.熟悉实验板的使用。
(2)实验所用仪器及元器件
1.计算机
2.直流稳压电源
3.数字系统与逻辑设计实验开发板(EPM1270T144C5)
(3)实验内容
1.QuartusII 原理图输入法设计与实现
2.用 VHDL 设计与实现组合逻辑电路
3.用 VHDL 设计与实现时序逻辑电路
4.用 VHDL 设计与实现相关电路
二、四次实验的具体内容
实验一:
实验内容:QuartusII 原理图输入法设计与实现
1.用逻辑门设计实现一个半加器,仿真验证其功能,并生成新的半加器图形模块单元。
2.用实验内容1中生成的半加器模块和逻辑门设计实现一个全加器,仿真验证其功能,
并下载到实验板测试,要求用拨码开关设定输入信号,发光二极管显示输出信号。
3.用3线-8线译码器(74LS138)和逻辑门设计实现函数F,仿真验证其功能,并下载
到实验板测试。要求用拨码开关设定输入信号,发光二极管显示输出信号。
实验题目:
第七章实验 1(1)、(2)、(3)必做,选做 VHDL 实现全加器实验设计的原理图、VHDL代码、仿真波形图:
1.半加器:
原理图:
仿真波形图:
仿真波形图分析:根据仿真波形对比半加器真值表,可以确定电路实现了半加器的功能。满足了实验要求。
2. 全加器:
原理图:
仿真波形图:
仿真波形图分析:根据仿真波形对比全加器真值表,可以确定电路实现了全加器的功能,满足了实验要求。
3. 3线-8线译码器
原理图:
仿真波形图:
仿真波形图分析:观察波形,可实现函数F,满足实验要求。
实验二:
实验内容:用 VHDL 设计与实现组合逻辑电路
1.数码管译码器:用VHDL语言设计实现一个3线—8线译码器,仿真验证其功能,并
下载到实验板测试。要求用拨码开关设定输入信号,发光二极管显示输出信号。
2.8421 码转余 3 码:用VHDL语言设计实现一个8421码转换为余3码的代码转换器,
仿真验证其功能,并下载到实验板测试。要求用拨码开关设定输入信号,发光二极
管显示输出信号。
3.奇校验器:用VHDL语言设计实现一个4位二进制奇校验器,输入奇数个‘1’时,
输出为‘1’,否则输出‘0’,仿真验证其功能,并下载到实验板测试。要求用拨码
开关设定输入信号,发光二极管显示输出信号。
实验题目:(1)数码管译码器(第七章实验 2(2))(2)8421 码转余 3 码(第七章实验 3(2))(3)奇校验器(第七章实验 4(2));
实验设计的原理图、VHDL代码、仿真波形图:
1.数码管译码器:
VHDL代码:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY yimaqi 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 yimaqi;
ARCHITECTURE yimaqi_arch OF yimaqi IS
BEGIN
c<="011111";
PROCESS(a)
BEGIN
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<="0000000";
END CASE;
END PROCESS;
END yimaqi_arch;
仿真波形图:
仿真波形图分析:当a分别取得0~9时,输出b分别使得对应的数码管亮起对应的数字。满足实验要求。
2.8421转余3码
VHDL代码:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY zhuanyu3 IS
PORT(A:IN STD_LOGIC_VECTOR(3 downto 0);
B:OUT STD_LOGIC_VECTOR(3 downto 0));
END zhuanyu3;
ARCHITECTURE trans_ex3 OF zhuanyu3 IS
BEGIN
PROCESS(A)
BEGIN
CASE A IS
WHEN"0000" => B<="0011";
WHEN"0001" => B<="0100";
WHEN"0010" => B<="0101";
WHEN"0011" => B<="0110";
WHEN"0100" => B<="0111";
WHEN"0101" => B<="1000";
WHEN"0110" => B<="1001";
WHEN"0111" => B<="1010";
WHEN"1000" => B<="1011";
WHEN"1001" => B<="1100";
WHEN OTHERS=> B<="0000";
END CASE;
END PROCESS;
END trans_ex3;
仿真波形图:
仿真波形图分析:当A分别取得0~9对应的8421码时,输出B输出对应的余3码。满足实验要求。
3.奇校验器
VHDL代码:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY odd_parity IS
PORT(A3,A2,A1,A0:IN STD_LOGIC;
Y:OUT STD_LOGIC);
END odd_parity;
ARCHITECTURE behave OF odd_parity IS
SIGNAL comb: STD_LOGIC_VECTOR(3 DOWNTO 0);
BEGIN
comb<=A3&A2&A1&A0;
PROCESS(comb)
BEGIN
CASE comb IS
WHEN"0001" => Y<='1';
WHEN"0010" => Y<='1';
WHEN"0100" => Y<='1';
WHEN"1000" => Y<='1';
WHEN"1011" => Y<='1';
WHEN"1101" => Y<='1';
WHEN"1110" => Y<='1';
WHEN"0111" => Y<='1';
WHEN OTHERS => Y<='0';
END CASE;
END PROCESS;
END behave;
仿真波形图:
仿真波形图分析:当输入A3.A2.A1.A0中有奇数个‘1’时,输出Y=1。满足实验要求。实验三:
实验内容:用 VHDL 设计与实现时序逻辑电路
1.8421 十进制计数器:用VHDL语言设计实现一个带异步复位的8421码十进制计数
器,仿真验证其功能,并下载到实验版测试。要求用按键设定输入信号,发光二极管显示输出信号。
2.分频器:用VHDL语言设计实现一个分频系数为12,分频输出信号占空比为50%的
分频器。要求在QuartusII平台上设计程序并仿真验证设计。
3.将1、2所设计的电路(分频器的系数需要修改)和数码管译码器 3 个电路进行链
接,并下载到实验板显示计数结果
实验题目:(1)8421 十进制计数器(第七章实验 8(2))(2)分频器(第七章实验 11(1))(3)将(1)、(2)和数码管译码器 3 个电路进行链接,并下载到实验板显示计数结果
实验设计的原理图、VHDL代码、仿真波形图:
1.8421 十进制计数器:
VHDL代码:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY count IS
PORT(
clk,clear:IN STD_LOGIC;
q:OUT STD_LOGIC_VECTOR(3 DOWNTO 0)
);
END count;
ARCHITECTURE a OF count IS
SIGNAL q_temp:STD_LOGIC_VECTOR(3 DOWNTO 0);
BEGIN
PROCESS(clk)
BEGIN
IF(clk'event and clk='1')THEN
IF clear='1' THEN
q_temp<="0000";
ELSIF q_temp="1001" THEN
q_temp<="0000";
ELSE
q_temp<=q_temp+1;
END IF;
END IF;
END PROCESS;
q<=q_temp;
END a;
仿真波形图:
仿真波形图分析:由图易看出其计数周期为10,从0~9。分频器:
VHDL代码:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY div12 IS
PORT(
clk:IN STD_LOGIC;
clear:IN STD_LOGIC;
clk_out:OUT STD_LOGIC);
END div12;
ARCHITECTURE a OF div12 IS
SIGNAL tmp:INTEGER RANGE 0 TO 11;
BEGIN
p1:PROCESS(clear,clk)
BEGIN
IF clear='1' THEN
tmp<=0;
ELSIF clk'event AND clk='1' THEN
IF tmp=11 THEN
tmp<=0;
ELSE
tmp<=tmp+1;
END IF;
END IF;
END PROCESS;
p2:PROCESS(tmp)
BEGIN
IF clk'event AND clk='1' THEN
IF tmp<6 THEN
clk_out<='0';
else
clk_out<='1';
END IF;
END IF;
END PROCESS p2;
END a;
仿真波形图:
仿真波形图分析:由图易看出该分频器的输出的时钟周期是输入时钟周期的12倍。
2.三个电路综合:(用VHDL语言实现连接)
VHDL代码:
(此时分频器的分频比为12M)
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY lianjie4 IS
PORT(CLK:IN STD_LOGIC;
CLEAR:IN STD_LOGIC;
OP:OUT STD_LOGIC_VECTOR(6 DOWNTO 0);
CAT: OUT STD_LOGIC_VECTOR(5 DOWNTO 0));
END lianjie4;
ARCHITECTURE behav OF lianjie4 IS
COMPONENT div50m
PORT(clk:IN STD_LOGIC;
clear:IN STD_LOGIC;
clk_out:OUT STD_LOGIC);
END COMPONENT;
COMPONENT count
PORT(clk,clear:IN STD_LOGIC;
q:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));
END COMPONENT;
COMPONENT seg7_1
PORT(A: IN STD_LOGIC_VECTOR(3 DOWNTO 0);
LED7S: OUT STD_LOGIC_VECTOR(6 DOWNTO 0);
CAT: OUT STD_LOGIC_VECTOR(5 DOWNTO 0));
END COMPONENT;
SIGNAL clktmp:STD_LOGIC;
SIGNAL tmp:STD_LOGIC_VECTOR(3 DOWNTO 0);
BEGIN
u1:div50m PORT MAP(clk=>CLK,clear=>CLEAR,clk_out=>clktmp);
u2:count PORT MAP(clk=>clktmp,clear=>CLEAR,q=>tmp);
u3:seg7_1 PORT MAP(A=>tmp,LED7S=>OP,CAT=>CAT);
END behav;
实验四:
实验内容:用 VHDL 设计与实现相关电路
1.数码管动态扫描控制器:用VHDL语言设计并实现六个数码管串行扫描电路,要求
同时显示“班级—班内序号”(120-11)这六个不同的数字图形到六个数码管上,仿真验证其功能,并下载到实验板测试。
实验题目:数码管动态扫描控制器、点阵行扫描控制器(二选一)
实验设计的原理图、VHDL代码、仿真波形图:
1.数码管动态扫描控制器:
原理图:
VHDL代码:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity led is
port(clk: in std_logic;
partout:out std_logic_vector(6 downto 0);
catout: out std_logic_vector(5 downto 0));
end led;
architecture a of led is
signal part: std_logic_vector(6 downto 0);
signal cat: std_logic_vector(5 downto 0);
signal temp: std_logic;
signal count: integer range 0 to 50000;
begin
p1:process(clk)
begin
if(clk'event and clk='1')then
if count=50000 then
count<=0;
temp<= not temp;
else
count<=count+1;
end if;
end if;
end process p1;
p2:process(temp)
begin
if(temp'event and temp='1')then
case cat is
when"111110"=> cat<="011111";part<="0110000"; --1
when"011111"=> cat <="101111";part<="1101101"; --2
when"101111"=> cat <="110111";part<="1111110"; --0
when"110111"=> cat<="111011";part<="0000001"; ---
when"111011"=> cat<="111101";part<="0110000"; --1
when"111101"=> cat<="111110";part<="0110000"; --1
when others => cat<="011111";part<="0110000"; --1 end case;
end if;
end process p2;
catout<=cat;
partout<=part;
end a;
仿真波形图:
仿真波形图分析:由仿真波形图可以看出输出值符合实验要求。选做题目:
VHDL代码:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY GKY07P14 IS
PORT( clk,clear:IN STD_LOGIC;
q:OUT STD_LOGIC_VECTOR(6 DOWNTO 0);
countout:OUT STD_LOGIC_VECTOR(5 DOWNTO 0));
END GKY07P14;
ARCHITECTURE behave OF GKY07P14 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 11;
SIGNAL tmp:INTEGER RANGE 0 TO 15999;
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=15999 THEN
tmp<=0;
ELSE
tmp<=tmp+1;
end if;
end process p0;
p1:PROCESS(tmp)
begin
IF clk'EVENT AND clk='1' THEN
IF tmp<1000 THEN
clk1<='0';
else
clk1<='1';
END IF;
END IF;
END PROCESS p1;
p2:PROCESS(clk)
BEGIN
IF(clk'EVENT AND clk='1')THEN
IF(cnt=11)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=11)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
CASE cnt+cnt1 IS
WHEN 6=>q_temp<="0110000";
WHEN 7=>q_temp<="1101101";
WHEN 8=>q_temp<="0000001";
WHEN 9=>q_temp<="0110000";
WHEN 10=>q_temp<="0110000";
WHEN 11=>q_temp<="0110000";
WHEN OTHERS =>q_temp<="0000000";
END CASE;
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";
WHEN OTHERS =>count<="111111";
end case;
end if;
end process p5;
countout<=count;
end behave;
(下载到电路板上测试,可以实现动态扫描)
三、故障及问题分析
由于本学期数电实验是初次接触,题目都比较单一,主要是熟悉掌握VHDL语言,刚开始做的时候觉得不知所措,后来慢慢熟悉了操作之后就变的得心应手。中间也遇到过一些问题,例如刚开始结束时间设置的不合理,导致仿真波形有毛刺现象出现,还有在第三次实验中,做异步加法器时候做成了同步加法器,导致下载到实验板上时候只有到时钟来临时候才显示计数,后来改正之后就符合了实验要求。还有对于多输出的函数,通过仿真图可以看出是存在功能冒险的,虽然并不影响实验结果,但随着实验的规模越来越大,应该重视它,尽力消除冒险。
四、总结和结论
这是我们第一次接触数电实验,在实验中,我们学会了全新的一门编程语言:VHDL以及一款编程软件QuartusII。通过这几次实验,我熟悉了用QuartusII原理图输入法进行电路设计和仿真,掌握VHDL语言的语法规范,时序电路描述方法,熟悉了用VHDL语言设计组合逻辑电路和时序电路的方法。相比与模电实验,数电实验需要更多的是细致地预习,编写程序,其他的步奏只要熟练了就很轻松,所以我们应该在课下努力提高使用VHDL语言编程的能力。我准备暑假时候提高这方面的能力,希望下学期的时候能学到更多数字电路逻辑实验的知识。