CPLD/FPGA 应用开发
技术实验报告
学生姓名: 张齐昌 学 号: 201410204065 学 院: 信息工程学院 班 级: 通信14-2 指导教师: 荀延龙
2017年 4 月 16
日
实验一组合逻辑电路的设计
一、实验目的:
1、掌握用VHDL语言和EPLD进行组合逻辑电路的设计方法。
2、加深对EPLD设计全过程的理解。
3、掌握组合逻辑电路的静态测试方法。
二、实验设备:
1、PC机
2、EDA实验箱(主芯片是ALTERA公司EP1K100QC208-3 或EP1K30TC30144-3)。
三、实验内容(任意选做3个):
1、用VHDL语言输入法设计一个四舍五入判别电路,其输入为8421BCD码,要求当输入
大于或等于5时,判别电路输出为1;反之为0。
2、用VHDL语言输入法设计3个开关控制一盏灯的逻辑电路,要求当开关都断开时,灯灭;
任一开关闭合或断开,灯的状态变换一次。
3、用VHDL语言输入法设计一个4选1数据选择器,信号A、B、D3、D2、D1、D0、Y、
S。要求S=“0”时,根据A、B的状态m i选择输出端Y=D i。
4、用VHDL语言输入法设计一个3线-8线译码器,信号A、B、C、Y7、Y6、Y
5、Y4、Y3、
Y2、Y1、Y0、S。要求S=“0”时,根据A、B、C的状态m i选择输出端Y i=“0”。
四、实验步骤:
1、采用文本编辑器输入VHDL语言源程序,建立工程。
2、编译。
3、仿真。
4、对芯片进行编程。
5、根据管脚分配情况连线。
(1)四舍五入判别电路的四个输入管脚分别与四个拨码开关相连,输出数据与LED灯相连。
(2)开关控制电路的3个输入管脚分别与3个按键开关相连,输出管脚与LED 灯相连。
(3)4选1数据选择器的7个信号A、B、D3、D2、D1、D0、S分别连7个拨码开关,输出信号Y与LED灯相连。
(4)3线-8线译码器4个信号A、B、C、S分别连4个拨码开关,输出信号Y i 与8个LED灯相连。
6、控制输入信号(按键或拨码开关),观察电路输出(LED灯的亮与灭)。
五、实验程序及部分仿真电路图:
1、用VHDL语言输入法设计一个四舍五入判别电路,其输入为8421BCD码,要求当输入
大于或等于5时,判别电路输出为1;反之为0。
library ieee;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY t1_1 is
port(
d0,d1,d2,d3:in std_logic;
out1:out std_logic);
end t1_1;
architecture zqc of t1_1 is
begin
out1<=((d0 and d1)or(d1 and d2)or d3);
end zqc;
2、用VHDL语言输入法设计3个开关控制一盏灯的逻辑电路,要求当开关都断开时,灯灭;
任一开关闭合或断开,灯的状态变换一次。
library ieee
use ieee.std_logic_1164.all;
entity t1_2 is
port(
k:in std_logic_vector(2 downto 0)
y:out std_logic);
end t1_2
architecture zqc of t1_2 is
begin
with (k) select
y<='0'when "000",
'1'when "001",
'0'when "011",
'1'when "010",
'0'when "110",
'1'when "100",
'0'when "101",
'1'when "111";
end zqc
3、用VHDL语言输入法设计一个4选1数据选择器,信号A、B、D3、D2、D1、D0、Y、
S。要求S=“0”时,根据A、B的状态m i选择输出端Y=D i。
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity t3_1 is
port(a0,a1,a2,a3:in std_logic;
s:in std_logic_vector(1 downto 0);
y:out std_logic);
end t3_1 ;
architecture archmux of t3_1 is
begin
y<=a0 when s="00" else
a1 when s="01" else
a2 when s="10" else
a3;
end
archmux;
六、实验遇到问题以及感悟
第一次真实操作quartus Ⅱ9.0适应,实验中刚开始出现很多问题,程序错误,由于我的电脑安装是quartus Ⅱ15.0,高版本会自动加标点符号,所以我的程序几乎没有太多的符号,结果导致错误连篇,认真改正后,由于对编译就操作一次,导致问题太多,没有遵守荀老师的一个项目一个文件夹要求,导致引脚都是相同的,甚至都是低电平情况,但是荀老师希望我们能够自己寻找答案,自己去找出问题解决问题。
最后,我一个个解决问题,倍感欣慰。
实验二计数器及时序电路
一、实验目的:
1、了解时序电路的VHDL语言设计方法。
2、了解同步计数器的使用方法。
3、理解时序电路和同步计数器加译码电路的联系,设计任意编码计数器。
二、实验设备:
1、PC机
2、EDA实验箱(主芯片是ALTERA公司EP1K100QC208-3 或EPM7128SLC84-15)。
三、实验内容:
1、用VHDL语言输入法设计一个上升沿触发、异步清零的四位二进制加法计数器。
2、用VHDL语言输入法设计一个下降沿触发、同步清零的十二进制计数器。
3、用原理图输入法使用74161宏,要求M=1时实现六进制,M=0时实现十二进制计
数器,使用七段数码管显示。
四、实验步骤:
1、采用文本编辑器输入VHDL语言源程序,或采用原理图输入法从MF库中调用器件
74161,生成原理图,之后建立工程。
2、编译。
3、仿真。
4、对芯片进行编程。
5、根据管脚分配情况连线。
(1)四位二进制加法计数器,接入1.2Hz计数脉冲,清零复位信号接1个拨码开关,输出按照数据的高低位顺序连接4个LED灯。
(2)十二进制计数器,接入1.2Hz计数脉冲,清零复位信号接1个拨码开关,输出按照数据的高低位顺序连接4个LED灯。
(3)六进制/十二进制将计数器,接入1.2Hz计数脉冲,清零复位、M信号接2个拨码开关,输出端连接七段数码管a、b、c、d、e、f、g [SEL2,SEL1,SEL0]
信号接3个拨码开关。
6、控制输入信号拨码开关,观察实验结果。
7、改变输入时钟信号的频率,观察实验结果。
五、实验程序及部分仿真电路图:
1、用VHDL语言输入法设计一个上升沿触发、异步清零的四位二进制加法计数器。
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY T2_1 IS
PORT(CLK,CLR,UP:IN STD_LOGIC;
QA,QB,QC,QD:OUT STD_LOGIC);
END T2_1;
ARCHITECTURE ART OF T2_1 IS
SIGNAL COUNT_4:STD_LOGIC_VECTOR(3 DOWNTO 0);
BEGIN
QA<=COUNT_4(0);
QB<=COUNT_4(1);
QC<=COUNT_4(2);
QD<=COUNT_4(3);
PROCESS(CLK,CLR)
BEGIN
IF(CLR='0')THEN
COUNT_4<="0000";
ELSIF(CLK' EVENT AND CLK='1')THEN
IF(UP='1')THEN
COUNT_4<=COUNT_4+1;
ELSE
COUNT_4<=COUNT_4;
END IF;
END IF;
END PROCESS;
END ART;
2、用VHDL语言输入法设计一个下降沿触发、同步清零的十二进制计数器。
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY T2_2 IS
PORT (CLK,CLR,EN:IN STD_LOGIC;
QA,QB,QC,QD:OUT STD_LOGIC);
END T2_2;
ARCHITECTURE ART OF T2_2 IS
SIGNAL COUNT_4:STD_LOGIC_VECTOR(3 DOWNTO 0);
BEGIN
QA<=COUNT_4(0);
QB<=COUNT_4(1);
QC<=COUNT_4(2);
QD<=COUNT_4(3);
PROCESS(CLK,CLR)
BEGIN
IF(CLK'EVENT AND CLK='0')THEN
IF(CLR='0')THEN
COUNT_4<="0000";
ELSIF(CLK'EVENT AND CLK='0')THEN
IF(EN='0')THEN
COUNT_4<="0000";
ELSIF(COUNT_4="1100")THEN
COUNT_4<="0000";
ELSE
COUNT_4<=COUNT_4+1;
END IF;
END IF;
END IF;
END PROCESS;
END ART;
3、用原理图输入法使用74161宏,要求M=1时实现六进制,M=0时实现十二进制计
数器,使用七段数码管显示。
六、实验遇到问题以及感悟
实验一与实验二并没有出现什么问题,但是由于课本出现一个程序错误,导致我浪费很多时间,我作为初学者,并没有敢于挑战权威,所以,但是最终还是做出了改变这条语句,却发生变化,起初,我对VHDL语言时钟信号概念很模糊,不过程序T2-2中,存在两个始终判断信号,但是判断是同一个时钟,同一个下降沿,进程语句原因吧,我自己的见解,具体原因我并没有参阅到。
实验三,出现问题挺严重,M为高电平时候,仿真在0111,自动清零,后期解决不了,荀老师给讲解0111状态转变1000状态时候,Qd变化快存在1111的瞬时状态,导致CO毛刺,输出清零毛刺,被系统扑捉到导致清零。顿时明白了很多,也受益匪浅。
FPGA是一个多实验过程。所以我要多动手,勤练习。
实验三扫描驱动显示电路设计(设计性实验)
一、实验目的
1.了解实验箱中8位七段数码管显示模块的工作原理。
2.熟悉VHDL 硬件描述语言及设计专用数字集成电路的自顶向下的设计思想。
3.掌握利用CPLD/FPGA设计4位七段数码管扫描显示驱动电路的方法。
二、实验设备
1.计算机(配置为:P4 CPU 128M内存);
2.MAX+plusⅡ或Quartus Ⅱ开发工具软件;
3.EDA-V教学实验箱;
4.万用表;
5.DS 5022M型双踪数字示波器;
三、扫描原理
为了减少多位显示信号的接口接线,经常使用数码管动态扫描显示工作模式。实验箱中8位七段数码管的段码输入(a,b,c,d,e,f,g,dp)是分别并联在一起8根线,而每一个数码管是通过一个3位选择sel[2..0]来选定的。Sel信号与数码管之间是一3-8译码的关系,即sel 为“000”时,选中第1个数码管,sel为“001”时,选中第2个数码管,……,sel为“111”时,选中第8个数码管。
四、设计任务
本实验要求在给定子模块程序的基础上,画出设计原理图。自行编写顶层模块程序,完成扫描显示驱动电路的设计,实现在4个数码管上显示自己学号的末4位数字的功能。五、设计要求
1.要求在Max+plusⅡ/QuartusⅡ平台上用VHDL语言编写顶层模块程序,调试、仿真成功后,下载至ALTERA公司EP1K100QC208-3 或EP1K30TC144-3芯片,再利用外接电路实现以上设计功能。
2.扫描驱动显示电路有2个控制输入端:时钟信号clk,清零信号reset; 9个输出端:显示段码值a,b,c,d,e,f,g;位选信号s1, s0,全部为TTL电平,管脚分配任意,如下图所示。
3. 扩展功能:4位显示数字可以外部输入,数据形式自行定义。
4.根据芯片管脚分配连接电路。
六、实验报告要求
1.给出设计源程序、仿真结果、说明设计思路。
2.改变输入时钟信号的频率,观察实验结果如何改变。
3.字符扫描显示亮度与扫描频率的关系,且让人眼感觉不出闪烁现象的最低扫描频率是多少?