资源描述
吉林大学CPLD实践
实习报告
学 院:仪器科学与电气工程
专 业:测控技术与仪器
年 级:
姓 名:
学 号:
时 间:2010-09-17——2010-09-18
实验台号:No.1
第一部分:基本实验
实验一:七段译码器显示
一、实验目的:
1、 学习基于VHDL 语言设计组合逻辑。
2、 学习VHDL 语言的编程规范,初步养成良好的编程习惯。
二、实验要求:
基于VHDL 语言设计实现设计一个 7 段数码管显示译码器,并用4 位拨码开关和数码管验证其功能。
二、实验仪器设备:
微机一台(Windows XP 系统、安装QuartusⅡ等相关软件)、CPLD 学习板一块、5V 电源线一个、下载线一条。
四、设计内容:
1、硬件连接图
为了共用外围器件,可以采用4 位拨码开关和1 个4 位共阳数码管
来验证设计,硬件连线图如下。
2、实验过程:
(1) 程序设计:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity exam1 is
port(ip:in std_logic_vector(3 downto 0);
op:out std_logic_vector(7 downto 0));
end exam1;
architecture a of exam1 is
begin
process(ip)
begin
case ip is
when"0000"=>op<="11111100";
when"0001"=>op<="01100000";
when"0010"=>op<="11011010";
when"0011"=>op<="11110010";
when"0100"=>op<="01100110";
when"0101"=>op<="10110110";
when"0110"=>op<="10111110";
when"0111"=>op<="11100000";
when"1000"=>op<="11111110";
when"1001"=>op<="11110110";
when"1010"=>op<="11101110";
when"1011"=>op<="00111110";
when"1100"=>op<="10011100";
when"1101"=>op<="01111010";
when"1110"=>op<="10011110";
when"1111"=>op<="10001110";
when others=>op<="00000000";
end case;
end process;
end a;
(2) 编译
对文件seg7.vhd 进行编译综合及管脚分配后,执行一次全编译。
(3) 仿真
使用QuartusⅡ对其进行仿真。
(4)下载调试
利用 QuartusⅡ的Programmer将编译好的pof文件下载到EPM240当中。下载完成后,改变4位拨码开关的输入状态,观察数码管显示情况是否符合设计要求。如不符合,重复以上步骤。
五、实验结果阐述:
本实验要求达到结果是让8421BCD码能够转化为相应的十进制码输出,经过实验,最后的调试结果如下:
输入BCD码
数码管显示
0
0
0
0
0
0
0
0
0
1
0
0
1
0
2
0
0
1
1
3
0
1
0
0
4
0
1
0
1
5
0
1
1
0
6
0
1
1
1
7
1
0
0
0
8
1
0
0
1
9
通过上述的情况观察,达到本次实验的要求,实验成功。
六、课后是考题:
若数码管为共阴极,设计代码应如何改动?
答:若数码管改为了共阴极,应该把赋值代码的0、1调换或者在前面整体取反。
实验二:8421BCD 码加法器
一、实验目的:
1、 学习基于VHDL 语言设计组合逻辑。
2、 学习VHDL 语言的编程规范,初步养成良好的编程习惯。
二、设计要求:
8421BCD 码加法器与一般二进制加法器的运算规则一样,不同的是,需要对
相加以后的结果进行变换,保证相加之后的结果仍然为8421BCD 码。实现可以分两步完成:首先将两个BCD 码按照二进制相加,然后将得到的二进制数转换为8421BCD 码。利用用VHDL语言设计实现一个8421BCD 码加法器,并设计硬件电路进行验证结果的正确性,要求结果用数码管显示出来
三、实验仪器:
微机一台(Windows XP 系统、安装QuartusⅡ等相关软件)、CPLD 学习板一块、5V 电源线一个、下载线一条。
四、实验内容:
1、硬件连接图
可以分别用两个4 位的拨码开关表示输入的8421BCD 码,相加之后的结果者数码管指示。
2、实验过程:
(1) 程序设计:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity exam2 is
port(a,b:in std_logic_vector(3 downto 0);
c:out std_logic_vector(4 downto 0)
);
end exam2;
architecture quanjia of exam2 is
signal aa,bb,cc:std_logic_vector(4 downto 0);
begin
aa<='0'&a;
bb<='0'&b;
cc<=aa+bb;
process(a,b)
begin
if(a<=9 and b<=9)then
if(cc>=0 and cc<10) then
c<=cc;
elsif (cc>=10 and cc<20) then
c<=cc+6;
else c<="00000";
end if;
else c<="11111";
end if;
end process;
end quanjia;
(2)编译
综合编译无误及引脚分配后,进行全编译。
(3)仿真
使用 QuartusⅡ对其进行仿真。
4. 下载调试
利用 QuartusⅡ的Programmer将编译好的pof 文件下载到 EPM240当中。下载完成后,改变8位拨码开关的状态,观察发光管的亮灭情况是否符合设计要求。如不符合,重复以上步骤。
五、实验结果:
硬件测试结果如下:
输入BCD码
数码管显示
A3
A2
A1
A0
B3
B2
B1
B0
0
0
0
0
0
0
0
0
00
0
0
0
0
0
0
0
1
01
0
1
0
1
0
0
0
1
06
0
0
1
0
1
0
0
1
11
1
0
0
1
1
0
0
1
18
0
0
1
0
0
1
0
0
06
1
1
0
0
1
0
1
0
00
1
1
1
1
1
1
1
1
00
根据上表的观察,当输入为正常的8421BCD码值是,为两者相加的结果,当其中一个BCD码值大于9则输出为00,表示违反设计原则。实验预期结果也是如此。
六、课后思考题:
用同样的设计方法设计一个8路数据选择器。
答:本题目有误,不能采用这次实验的方法实现八路数据选择器;八选一数据选择器设计程序如下:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity xiti2 is
port(m:in std_logic;
a:in std_logic_vector(2 downto 0);
b:in std_logic_vector(7 downto 0);
q:out std_logic );
end xiti2;
architecture xuanzeqi of xiti2 is
signal q1:std_logic;
begin
process(a)
if(m=’1’)then
q<=’0’;
else
case a is
when”000”=>q1<=d(0);
when”001”=>q1<=d(1);
when”010”=>q1<=d(2);
when”011”=>q1<=d(3);
when”100”=>q1<=d(4);
when”101”=>q1<=d(5);
when”110”=>q1<=d(6);
when”111”=>q1<=d(7);
whwn others=>null;
end case;
end if;
end process;
q<=q1;
end xuanzeqi;
实验三:加减计数器设计
一、实验目的
1、学习基于VHDL 设计时序逻辑;
2、学习 VHDL 语言的规范化编程,掌握计数器的描述方法。
二、设计要求
设计一个可逆10进制计数器,用1位拨码开关进行加减控制:输入为0时进行加计数,当输入为1时进行减计数;用1位拨码开关进行同步清零控制:输入为0时清零,输入为1时正常计数。计数结果用数码管显示。计数器是一类比较典型的时序逻辑模块,基于VHDL语言设计灵活方便,利用进程语句和条件语句,可以描述任意进制的计数器。
三、实验仪器
微机一台(Windows XP 系统、安装QuartusⅡ等相关软件)、CPLD 学习板一块、5V 电源线一个、下载线一条。
四、设计提示
1、硬件连接图
如图5.1 所示,可以利用拨码开关进行加减计数和清零控制,利用发光管或者数码管显示计数结果。
2、实验过程:
(1) 程序设计
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity exam3 is
port (CLK0:in std_logic;
m,n:in std_logic;
a:buffer std_logic_vector(3 downto 0));
end exam3;
architecture jishu of exam3 is
begin
process(CLK0,m,n)
begin
if(n='0')then
if(CLK0'event and CLK0='1')then
if(a>=0 and a<9) then
if(m='0')then
a<=a+1;
elsif(m='1' and m/='0')then
a<=a-1;
elsif(m='0')
end if;
else a<="0000";
end if;
else a<=a;
end if;
elsif(n='1')then
a<="0000";
end if;
end process;
end jishu;
(2)编译
综合编译无误及引脚分配后,进行全编译。
(3)仿真
使用 QuartusⅡ对其进行仿真。
(4)下载调试
利用 QuartusⅡ的Programmer将编译好的pof文件下载到EPM240当中。下载完成后,改变2位拨码开关的状态,观察发光管的亮灭情况是否符合设计要求。如不符合,重复以上步骤。
五、实验结果:
按键(0)的显示
按键(1)的显示
0
9
1
8
2
7
3
6
4
5
5
4
6
3
7
2
8
1
9
0
0
9
每一秒反复循环显示
当按键为低电平是为0-9的正循环计数,当按键为高电平是为9-0的倒循环计数。达到了本次实验的要求。
六、课后思考题:
设计一个100 分频器,输出为方波。
答:设计程序如下:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity xiti3 is
generic(n : integer:=1);
port (clkin:in std_logic;
clkou:out std_logic;
end xiti3;
architecture fenpinqi of diviseur is
begin
PROCESSprocess
varible count:integer:= 0;
begin
if( clkin'event and clkin='1') then
if( count >n)then
count := 0;
clkout <= '1';
else
count := count + 1;
clkout <= '0';
end if;
end if;
end process;
end fenpinqi;
实验四:按键去抖动
一、实验目的
1、学习基于VHDL 描述状态机的方法;
2、学习 VHDL 语言的规范化编程,学习按键去抖动的原理方法。
二、设计要求
机械式轻触按键是常用的一种外围器件,由于机械原因导致的抖动会使得按键输入出现毛刺。设计一个按键去抖动电路,并用按键作为时钟,结合计数器观察去抖动前后的效果有什么不同。按键去抖动通常采用延时判断的方法,去除按键过程中出现的毛刺。其实现过程是:当查询到按键按下时,延时一段时间再去判断按键是否仍然被按下,若是则此次按键有效,否则看作是干扰。这可以利用状态机来实现。
三、实验仪器
微机一台(Windows XP 系统、安装QuartusⅡ等相关软件)、CPLD 学习板一块、5V 电源线一个、下载线一条。
四、实验内容:
1、硬件连接图
如下图连接硬件,内部可将按键输入作为一个计数器的时钟,输出连接到发光数码管上,去抖后的结果用一个单独的LED管显示出来,对比一下去抖前后的效果有何不同。
2、实验过程:
(1) 程序设计
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity exam4 is
port ( keyin:in std_logic;
clk:in std_logic;
reset:in std_logic;
Y:buffer std_logic_vector(3 downto 0);
Q:buffer std_logic_vector(3 downto 0);
keyout: out std_logic);
end exam4;
architecture a of exam4 is
type state is (s0,s1,s2,s3);
signal s:state;
begin
process(clk,keyin)
begin
if(clk'event and clk='1')then
if reset='1' then Q<="0000";Y<="0000";
else if (keyin'event and keyin='1')then Y<=Y+1;end if;
case s is
when s0=>if keyin='1' then s<=s1;keyout<='0';
else s<=s0;keyout<='0';end if;
when s1=>if keyin='1' then s<=s2;keyout<='0';
else s<=s0;keyout<='0';end if;
when s2=>if keyin='1' then s<=s3;keyout<='0';
else s<=s0;keyout<='0';end if;
when s3=>if keyin='1' then s<=s3;keyout<='1';
else s<=s0;Q<=Q+1;keyout<='0';end if;
end case;
end if;
end if;
end process;
end a;
(2)编译
综合编译无误及引脚分配后,进行全编译。
(3)仿真
使用 QuartusⅡ对其进行仿真。
4. 下载调试
利用 QuartusⅡ的Programmer将编译好的pof文件下载到 EPM240当中。下载完成后,按动按键,观察发光管的变化情况;将去抖电路去掉后,按动按键,观察发光管变化有什么不
同。
五、实验结果:
使clk端连接10Hz频率,当按键达到0.5秒时,数码管(去抖前)显示会马上加1,数码管(去抖后)显示会在五秒后加1,同时二极管D亮;当按键不足0.5秒时,数码管(去抖前)显示会马上加1,数码管(去抖后)显示不变,二极管不亮。达到本次实验的设计要求,实验成功。
六、课后思考题:
按键去抖电路中,延时时间对去抖效果有无影响?
答:有影响。延时过短的话去抖的效果不是很明显。
实验五:抢答器
一、实验目的
1、学习基于VHDL 设计时序逻辑;
2、学习 VHDL 语言的规范化编程,学习抢答器的设计方法。
二、设计要求
设计一个 四路抢答器,当按下抢答键开始抢答,设置四个按键作为四路抢答开关,四个LED作为抢答显示,一旦抢答成功,蜂鸣器发声,与抢答开关对应的LED亮。抢答器具有存储功能,属于时序电路范畴。该设计可以利用触发器来完成设计。用触发器的清零端作为抢答控制,触发器输出做反馈来禁止抢答。
三、实验平台
微机一台(Windows XP 系统、安装QuartusⅡ等相关软件)、CPLD 学习板一块、5V 电源线一个、下载线一条。
四、实验内容:
1、硬件连接图
2、实验过程:
(1) 程序设计;
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity exam5 is
port(clr:in std_logic;
clk,clk2:in std_logic;
a:in std_logic_vector(3 downto 0);
b:buffer std_logic_vector(3 downto 0);
c:out std_logic;
e:buffer std_logic_vector(3 downto 0));
end exam5;
architecture qiangda4 of exam5 is
signal d:std_logic:='0';
begin
process(clr,clk2)
begin
if (clr='0') then
if (d='0')then
if(clk2'event and clk2='1')then
case a is
when "0001"=> b<="0001" ;
d<='1';
e<="0001";
when "0010"=> b<="0010" ;
d<='1';
e<="0010";
when "0100"=> b<="0100" ;
d<='1';
e<="0011";
when "1000"=> b<="1000" ;
d<='1';
e<="0100";
when others => b<=b;
d<=d;
e<=e;
end case;
end if;
end if;
else b<="0000";
d<='0';
e<="0000";
end if;
end process;
c<= d and clk;
end qiangda4;
(2)编译
综合编译无误及引脚分配后,进行全编译。
(3)仿真
使用 QuartusⅡ对其进行仿真。
4. 下载调试
利用 QuartusⅡ的Programmer将编译好的pof文件下载到EPM240当中。下载完成后,按动按键,观察发光管的变化情况是否符合设计要求。
五、实验结果
实验操作
结果观察
1号抢答,然后清零
抢答时,数码管显示1,蜂鸣器响,对应的LED亮;清零时,数码管显示0,蜂鸣器停止响,LED灭
2号抢答,然后清零
抢答时,数码管显示2,蜂鸣器响,对应的LED亮;清零时,数码管显示0,蜂鸣器停止响,LED灭
3号抢答,然后清零
抢答时,数码管显示3,蜂鸣器响,对应的LED亮;清零时,数码管显示0,蜂鸣器停止响,LED灭
4号抢答,然后清零
抢答时,数码管显示4,蜂鸣器响,对应的LED亮,清零时,数码管显示0,蜂鸣器停止响,LED灭
4号抢答,然后依次按下1号、2号、3号抢答
数码管显示4,蜂鸣器响,对应的LED亮,其他路的抢答不产生效果
根据实验的结果观察,已经达到了四路抢答的功能,当一个人抢答成功时,其他抢答无效。达到实验预期的结果,实验成功。
六、课后思考题:
改动设计,将抢答结果用数码管显示出来。
答:我在实验设计的时候已经达到了此功能。
第二部分:综合实验(必做部分)
实验六:LED点阵汉字显示
一、实验目的
熟悉LED 点阵显示的原理,掌握编程实现点阵显示汉字的方法。
二、设计要求
在16×16 LED 点阵上显示汉字。根据点阵显示的原理,显示码按从左至右、从上至下 16 位数据的格式进行编码,依次点亮每行LED(对应行线置1),并将对应的显示码从列线输出;循环进行即可显示字符。可以设计一个16 进制计数器,在每个计数周期内点亮对应行线,并从列线送出相应的显示码,循环进行;另外,也可以采用状态机的设计方法进行设计。
三、实验平台
微机一台(Windows XP 系统、安装QuartusⅡ、汉字取模等相关软件)、CPLD 学习板一块、5V 电源线一个、下载线一条。
四、实验内容
1、硬件连接图:
2、实验过程:
(1)程序设计;
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity exam7 is
port (clk,clk2:in std_logic;
hl:out std_logic_vector(31 downto 0));
end exam7;
architecture dian of exam7 is
signal a:std_logic_vector(3 downto 0);
signal b:std_logic;
begin
pl:process(clk)
begin
if(clk'event and clk='1')then
a<=a+1;
end if;
end process pl;
bh:process(clk2)
begin
if(clk2'event and clk2='1')then
b<=not b ;
end if;
end process bh;
ds:process(a)
begin
if(b='0')then
if(a=0)then
hl<=not"11111111111111101111111111111111";
elsif(a=1)then
hl<=not"11111111111111011111110111111101";
elsif(a=2)then
hl<=not"11111111111110111111110111111101";
elsif(a=3)then
hl<=not"11111111111101111111110111111011";
elsif(a=4)then
hl<=not"11111111111011111111110111110111";
elsif(a=5)then
hl<=not"11111111110111111101110111101111";
elsif(a=6)then
hl<=not"11111111101111111110110111011111";
elsif(a=7)then
hl<=not"11111111011111111111010110111111";
elsif(a=8)then
hl<=not"11111110111111111111100101111111";
elsif(a=9)then
hl<=not"11111101111111111111100111111111";
elsif(a=10)then
hl<=not"11111011111111111111100111111111";
elsif(a=11)then
hl<=not"11110111111111111000000000000001";
elsif(a=12)then
hl<=not"11101111111111111111110111111111";
elsif(a=13)then
hl<=not"11011111111111111111110111111111";
elsif(a=14)then
hl<=not"10111111111111111111110111111111";
elsif(a=15)then
hl<=not"01111111111111111111111111111111";
end if;
else if(a=0)then
hl<=not "11111111111111101111111111111111";
elsif a=1 then
hl<=not "11111111111111011111111111111111";
elsif a=2 then
hl<=not "11111111111110111111111111101111";
elsif a=3 then
hl<=not "11111111111101111111110111011111";
elsif a=4 then
hl<=not "11111111111011111101110110111111";
elsif a=5 then
hl<=not "11111111110111111101010100000011";
elsif a=6 then
hl<=not "11111111101111111101010010111011";
elsif a=7 then
hl<=not "11111111011111111101010010101011";
elsif a=8 then
hl<=not "11111110111111111000000110101011";
elsif a=9 then
hl<=not "11111101111111111101010010101011";
elsif a=10 then
hl<=not "11111011111111111101010010101011";
elsif a=11 then
hl<=not "11110111111111111101010100000011";
elsif a=12 then
hl<=not "11101111111111111101110110111111";
elsif a=13 then
hl<=not "11011111111111111111110111011111";
elsif a=14 then
hl<=not "10111111111111111111111111111111";
elsif a=15 then
hl<=not "01111111111111111111111111111111";
end if;
end if;
end process ds;
end dian;
(2)编译
综合编译无误及引脚分配后,进行全编译。
(3)仿真
使用 QuartusⅡ对其进行仿真。
4. 下载调试
利用 QuartusⅡ的Programmer将编译好的pof文件下载到EPM240当中。下载完成后,观察LED点阵显示是否满足设计要求。
五、实验结果:
硬件测试结果:当加载程序结束过后,选择CLK的频率为1KHz,16*16点阵LED显示屏上交替显示“长”、“春”两个字,并发出蜂鸣,实验成功。
六、课后思考题:
改动设计,在点阵上循环显示“仪电学院”四个汉字。
答:改动方法如下:
将程序中的内部状态信号b:改为signal b:std_logic(1 downto 0); b<=b+1;
由原来的两个状态变味了现在的四个状态,就有四个状态交替显示,分别对“仪电学院”四个字进行16*16点阵编码即可。
实验七:交通灯控制器
一、实验目的
1、学习层次化设计方法。
2、初步学会分析设计较为复杂的数字逻辑。
二、设计要求
交通灯控制器可分为两部分,一部分为状态机,其状态数可观察十字路口
的交通灯变化情况获得,转移条件受时间控制;另一部分为定时器,为状态机提供时间信息。设计一个十字路口的交通灯控制器,东西方向的红灯,绿灯,黄灯亮的时间分别为50 秒,28秒,2秒;南北方向的红灯,绿灯,黄灯亮的时间分别为30 秒,48秒,2秒。
三、实验平台
微机一台(Windows XP 系统、安装QuartusⅡ等相关软件)、CPLD学习板一块、5V电源线一个、下载线一条。
四、实验内容
1、硬件连接
用红、黄、绿四组发光管模拟十字路口的交通灯,一路时钟作为定时信号。同时在外接一数码管,显示提示时间;
2、实验过程:
(1) 程序设计:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity exam8 is
port(clk:in std_logic;
kled:buffer std_logic_vector(5 downto 0):="100001";
dis:out std_logic_vector(7 downto 0)
);
end exam8;
architecture jiao of exam8 is
signal a,b:std_logic_vector(5 downto 0):="110000";
begin
process(clk)
begin
if (clk 'event and clk='1')then
a<=a-1;
if (kled="010100" and a="000001")then
kled<= "100001";
a<= "110000";
elsif (kled="100001" and a="000001")then
kled<="100010";
a<="000010";
elsif(kled="100010" and a="000001")then
kled<="001100";
a<="011100";
elsif(kled="001100" and a="000001")then
kled<="010100";
a<="000010";
elsif(kled="000000")then
kled<="100001";
a<="110000";
end if;
end if;
end process ;
dis(7 downto 4)<="0000"when (a>=0 and a<10)else
"0001" when (a>=10 and a<20)else
"0010" when (a>=20 and a<30)else
"0011" when (a>=30 and a<40)else
"0100" when (a>=40 and a<50);
b<=a when (a>=0 and a<10)else
a-"001010" when (a>=10 and a<20)else
a-"010100" when (a>=20 and a<30)else
a-"011110" when (a>=30 and a<40)else
a-"101000" ;--when (a>=40 and a<50);
dis
展开阅读全文