当前位置:文档之家› 《数字电路与逻辑设计实验(上) 》

《数字电路与逻辑设计实验(上) 》

数字电路与逻辑设计实验(上)

学院:信息与通信工程学院

班级:

学号:

姓名:

班内序号:

日期: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语言编程的能力。我准备暑假时候提高这方面的能力,希望下学期的时候能学到更多数字电路逻辑实验的知识。

相关主题
文本预览
相关文档 最新文档