09EDA实验指导书.docx
- 文档编号:27665070
- 上传时间:2023-07-03
- 格式:DOCX
- 页数:27
- 大小:96.57KB
09EDA实验指导书.docx
《09EDA实验指导书.docx》由会员分享,可在线阅读,更多相关《09EDA实验指导书.docx(27页珍藏版)》请在冰豆网上搜索。
09EDA实验指导书
EDA实验指导书
目录
实验一基于QUARTUSII图形输入电路的设计2
实验二含异步清零和同步使能的加法计数器5
实验三图形和VHDL混合输入的电路设计7
实验四矩阵键盘接口电路的设计10
实验五交通灯控制电路实验16
附图EP1K10TC100管脚图24
主芯片:
ACEX1K系列的EP1K10TC100-3
下载电缆:
ByteBlasterII
实验一基于QUARTUSII图形输入电路的设计
一、实验目的
1、通过一个简单的3线—8线译码器的设计,掌握组合逻辑电路的设计方法。
2、初步了解QUARTUSII原理图输入设计的全过程。
3、掌握组合逻辑电路的静态测试方法。
二、实验原理
3线-8线译码器三输入,八输出。
当输入信号按二进制方式的表示值为N时,输出端标号为N的输出端输出高电平表示有信号产生,而其它则为低电平表示无信号产生。
因为三个输入端能产生的组合状态有八种,所以输出端在每种组合中仅有一位为高电平的情况下,能表示所有的输入组合。
其真值表如表1-1所示
输入
输出
D2
D1
D0
Y7
Y6
Y5
Y4
Y3
Y2
Y1
Y0
0
0
0
0
0
0
0
0
0
0
1
0
0
1
0
0
0
0
0
0
1
0
0
1
0
0
0
0
0
0
1
0
0
0
1
1
0
0
0
0
1
0
0
0
1
0
0
0
0
0
1
0
0
0
0
1
0
1
0
0
1
0
0
0
0
0
1
1
0
0
1
0
0
0
0
0
0
1
1
1
1
0
0
0
0
0
0
0
表1-13线-8线译码器真值表
译码器不需要像编码器那样用一个输出端指示输出是否有效。
但可以在输入中加入一个输出使能端,用来指示是否将当前的输入进行有效的译码,当使能端指示输入信号无效或不用对当前信号进行译码时,输出端全为高电平,表示无任何信号。
本例设计中没有考虑使能输入端,自己设计时可以考虑加入使能输入端时,程序如何设计。
三、实验内容
在本实验中,用三个拨动开关来表示3线-8线译码器的三个输入(D2-D0);用八个LED来表示3线-8线译码器的八个输出(Y0-Y7)。
通过输入不同的值来观察输入的结果与3线-8线译码器的真值表(表1-1)是否一致。
实验箱中的拨动开关当开关闭合(拨动开关的档位在下方)时其输出为低电平,反之输出高电平。
LED灯与其对应的端口为高电平时LED就会发光,反之LED灯灭。
四、实验步骤
1、打开QUARTUSII软件,新建一个工程。
2、
建完工程之后,再新建一个图形设计文件SchematicFile。
并输入3线-8线译码器电路图1-1所示。
图1-1设计文件的输入
3、编译仿真无误后,根据用户自己的要求进行管脚分配。
分配完成后,再进行全编译一次,以使管脚分配生效。
4、根据实验内容用实验导线将上面管脚分配的FPGA管脚与对应的模块连接起来。
如果是调用的本书提供的VHDL代码,则实验连线如下:
D2-D0:
编码输入端,接3个拨动开关S1-S3。
Y0-Y7:
编码输出信号,接8个LED灯D1-D8。
5、用下载电缆将对应的sof文件加载到FPGA中。
观察实验结果。
6、用VHDL语言设计上述3线-8线译码器,新建VHDL设计文件,输入程序如下:
(其中增加了en使能输入端,低电平有效)
五、实验现象与结果
文件加载到目标器件后,拨动拨动开关,LED灯会按表1-1所示的真值表对应的点亮。
六、实验报告
1、进一步熟悉和理解QUARTUSII软件的使用方法。
实验二含异步清零和同步使能的加法计数器
一、实验目的
1、了解二进制计数器的工作原理。
2、进一步熟悉QUARTUSII软件的使用方法和VHDL输入。
3、时钟在编程过程中的作用。
二、实验原理
二进制计数器中应用最多、功能最全的计数器之一,含异步清零和同步使能的加法计数器的具体工作过程如下:
在时钟上升沿的情况下,检测使能端是否允许计数,如果允许计数(定义使能端高电平有效)则开始计数,否则一直检测使能端信号。
在计数过程中再检测复位信号是否有效(低电平有效),当复位信号起作用时,使计数值清零,继续进行检测和计数。
其工作时序如图2-1所示:
图2-1计数器的工作时序
三、实验内容
本实验要求完成的任务是在时钟信号的作用下,通过使能端和复位信号来完成加法计数器的计数。
实验中时钟信号使用数字时钟源模块的1HZ信号,用一位拨动开关S1表示使能端信号,用复位开关K1表示复位信号,用LED模块的D1~D4来表示计数的二进制结果。
实验LED亮表示对应的位为‘1’,LED灭表示对应的位为‘0’。
通过输入不同的值模拟计数器的工作时序,观察计数的结果。
四、实验步骤
1、打开QUARTUSII软件,新建一个工程。
2、建完工程之后,再新建一个VHDLFile,打开VHDL编辑器对话框。
3、按照实验原理和自己的想法,在VHDL编辑窗口编写VHDL程序。
注意:
要求有异步清零信信号ret,低电平有效;
同步时能信号en,高电平有效
4、编写完VHDL程序后,保存起来。
方法同实验一。
5、对自己编写的VHDL程序进行编译并仿真,对程序的错误进行修改。
6、编译仿真无误后,根据用户自己的要求进行管脚分配。
分配完成后,再进行全编译一次,以使管脚分配生效。
7、根据实验内容用实验导线将上面管脚分配的FPGA管脚与对应的模块连接起来。
8、用下载电缆将对应的sof文件加载到FPGA中。
观察实验结果是否与自己的编程思想一致。
9、思考:
把该设计改成是加减法可控的计数器,增加控制输入端M,当M=0时,进行加法计数,当M=1时,进行减法计数。
五、实验现象与结果
六、实验报告
1、绘出仿真波形,并作说明。
2、写出在VHDL编程过程中需要说明的规则。
3、将实验原理、设计过程、编译仿真波形和分析结果、硬件测试结果记录下来。
4、改变时钟频率,看实验现象会有什么改变,试解释这一现象。
实验三图形和VHDL混合输入的电路设计
一、实验目的
1、学习在QUARTUSII软件中模块符号文件的生成与调用。
2、掌握模块符号与模块符号之间的连线规则与方法。
3、掌握从设计文件到模块符号的创建过程。
二、实验原理
在层次化的设计文件中,经常需要将已经设计好的工程文件生成一个模块符号文件作为自己的功能模块符号在顶层调用,该符号就像图形设计文件中的任何其它宏功能符号一样可被高层设计重复调用。
三、实验内容
在实验中,时钟信号选取12KHZ做为数码管的扫描时钟,拨动开关输入一个预置的八位数据,经过数控分频电路分频后得到一个较低的频率做为加法计数器(实验一)的时钟频率进行计数器的加法运算。
得到的值给数码显示译码电路在数码管上显示出来。
四、实验步骤
1、打开QUARTUSII软件,新建一个工程。
2、其中,本实验的三个组成模块,分别为:
计数器模块(exp1.vhd),实验一。
数码显示译码器模块(ymq.vhd),;
数控分频器的设计(fpq.vhd)
3、对设计文件(exp1.vhd;ymq.vhd;fpq.vhd)进行模块符号文件的创建。
4、新建一个图形编辑文件,调用3中创建的模块符号,输入设计电路如图3-1所示。
图3-1
实验三的设计电路
5、编译仿真无误后,根据用户自己的要求进行管脚分配。
分配完成后,再进行全编译一次,以使管脚分配生效。
如果是调用的本书提供的VHDL代码,则实验连线如下:
CLK:
FPGA时钟信号,接数字时钟CLOCK3,并将这组时钟设为1024HZ。
DATA[7..0]:
分频数据输入信号,分别接拨动开关的S8-S1。
COUT:
计数进位输出信号,接一个LED灯D1。
RET:
计数复位信号,接一个按键开关K1。
LEDAG[6..0]:
数码管显示信号,接数码管的G、F、E、D、C、B、A。
SEL[2..0]:
数码管的位选信号,接数码管的SEL2、SEL1、SEL0。
6、根据实验内容用实验导线将上面管脚分配的FPGA管脚与对应的模块连接起来。
7、用下载电缆将对应的sof文件加载到FPGA中。
观察实验结果是否与自己的编程思想一致。
五、实验现象与结果
以设计的参考示例为例,当设计文件加载到目标器件后,拨动八位拨动开关,使其为一个数值,则八位数码管按一定的速率开始显示“0-F”,当数码管显示A-F时LED灯LED1开始被点亮,显示其它数值时熄灭。
按S1键显示的数值又从0开始,拨动八位拨动开关,置于其它数据,数码管的显示速率会发生改变。
六、实验报告
1、出仿真波形,并作说明。
2、自己设计文件,然后通过设计文件到模块符号文件的转换,设计自己的电路并在实验系统中验证。
进一步掌握这种方法。
3、写出在软件中通过其它方法从设计文件到模块符号文件的转换过程。
实验四矩阵键盘接口电路的设计
一、实验目的
1、了解普通4×4键盘扫描的原理。
2、进一步加深七段码管显示过程的理解。
3、了解对输入/输出端口的定义方法。
一、实验原理
实现键盘有两种方案:
一是采用现有的一些芯片实现键盘扫描;再就是用软件实现键盘扫描。
作为一个嵌入系统设计人员,总是会关心产品成本。
目前有很多芯片可以用来实现键盘扫描,但是键盘扫描的软件实现方法有助于缩减一个系统的重复开发成本,且只需要很少的CPU开销。
嵌入式控制器的功能能强,可能充分利用这一资源,这里就介绍一下软键盘的实现方案。
图4-1简单键盘电路
通常在一个键盘中使用了一个瞬时接触开关,并且用如图4-1所示的简单电路,微处理器可以容易地检测到闭合。
当开关打开时,通过处理器的I/O口的一个上拉电阻提供逻辑1;当开关闭合时,处理器的/IO口的输入将被拉低得到逻辑0。
可遗憾的是,开关并不完善,因为当它们被按下或者被释放时,并不能够产生一个明确的1或者0。
尽管触点可能看起来稳定而且很快地闭合,但与微处理器快速的运行速度相比,这种动作是比较慢的。
当触点闭合时,其弹起就像一个球。
弹起效果将产生如图4-2所示的好几个脉冲。
弹起的持续时间通常将维持在5ms∼30ms之间。
如果需要多个键,则可以将每个开关连接到微处理器上它自己的输入端口。
然而,当开关的数目增加时,这种方法将很快使用完所有的输入端口。
图4-2按键抖动
键盘上阵列这些开关最有效的方法(当需要5个以上的键时)就形成了一个如图4-3所示的二维矩阵。
当行和列的数目一样多时,也就是方型的矩阵,将产生一个最优化的布列方式(I/O端被连接的时候)。
一个瞬时接触开关(按钮)放置在每一行与线一列的交叉点。
矩阵所需的键的数目显然根据应用程序而不同。
每一行由一个输出端口的一位驱动,而每一列由一个电阻器上拉且供给输入端口一位。
图4-3矩阵键盘
键盘扫描的实现过程如下:
对于4×4键盘,通常连接为4行、4列,因此要识别按键,只需要知道是哪一行和哪一列即可,为了完成这一识别过程,我们的思想是,首先固定输出4行为高电平,然后输出4列为低电平,在读入输出的4行的值,通常高电平会被低电平拉低,如果读入的4行均为高电平,那么肯定没有按键按下,否则,如果读入的4行有一位为低电平,那么对应的该行肯定有一个按键按下,这样便可以获取到按键的行值。
同理,获取列值也是如此,先输出4列为高电平,然后在输出4行为低电平,再读入列值,如果其中有哪一位为低电平,那么肯定对应的那一列有按键按下。
获取到行值和列值以后,组合成一个8位的数据,根据实现不同的编码在对每个按键进行匹配,找到键值后在7段码管显示。
二、实验内容
本实验要求完成的任务是通过编程实现对4X4矩阵键盘按下键的键值的读取,并在数码管上完成一定功能(如移动等)的显示。
三、实验步骤
1、打开QUARTUSII软件,新建一个工程。
2、建完工程之后,再新建一个VHDLFile,打开VHDL编辑器对话框。
3、按照实验原理和自己的想法,在VHDL编辑窗口编写VHDL程序,用户可参照光盘中提供的示例程序。
参考程序:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
------------------------------------------------------------------
entityexp12is
port(Clk:
instd_logic;--时钟信号
Kr:
instd_logic_vector(3downto0);--键盘行
Kc:
bufferstd_logic_vector(3downto0);--键盘列
a,b,c,d,e,f,g:
outstd_logic;--七段码管显示
Sa,sb,sc:
bufferstd_logic);--七段码管片选
endexp12;
------------------------------------------------------------------
architecturebehaveofexp12is
signalkeyr,keyc:
std_logic_vector(3downto0);
signalkcount:
std_logic_vector(2downto0);
signaldcount:
std_logic_vector(2downto0);
signalkflag1,kflag2:
std_logic;
signalbuff1,buff2,buff3,buff4,buff5,buff6,buff7,buff8:
integerrange0to15;
signalDisp_Temp:
integerrange0to15;
signalDisp_Decode:
std_logic_vector(6downto0);
begin
process(Clk)--扫描键盘
begin
if(Clk'eventandClk='1')then
if(Kr="1111")then
kflag1<='0';
kcount<=kcount+1;
if(kcount=0)then
kc<="1110";
elsif(kcount=1)then
kc<="1101";
elsif(kcount=2)then
kc<="1011";
else
kc<="0111";
endif;
else
kflag1<='1';
keyr<=Kr;
keyc<=Kc;
endif;
kflag2<=kflag1;
endif;
endprocess;
process(Clk)--显示右移
begin
if(Clk'eventandClk='1')then
if(kflag1='1'andkflag2='0')then
buff1<=buff2;
buff2<=buff3;
buff3<=buff4;
buff4<=buff5;
buff5<=buff6;
buff6<=buff7;
buff7<=buff8;
endif;
endif;
endprocess;
process(Clk)--获取键值
begin
if(Clk'eventandClk='1')then
if(kflag1='1'andkflag2='0')then
if(keyr="0111")then
casekeycis
when"0111"=>buff8<=15;
when"1011"=>buff8<=14;
when"1101"=>buff8<=13;
when"1110"=>buff8<=12;
whenothers=>buff8<=buff8;--nochange
endcase;
elsif(keyr="1011")then
casekeycis
when"0111"=>buff8<=11;
when"1011"=>buff8<=10;
when"1101"=>buff8<=9;
when"1110"=>buff8<=8;
whenothers=>buff8<=buff8;--nochange
endcase;
elsif(keyr="1101")then
casekeycis
when"1110"=>buff8<=4;
when"1101"=>buff8<=5;
when"1011"=>buff8<=6;
when"0111"=>buff8<=7;
whenothers=>buff8<=buff8;--nochange
endcase;
elsif(keyr="1110")then
casekeycis
when"1110"=>buff8<=0;
when"1101"=>buff8<=1;
when"1011"=>buff8<=2;
when"0111"=>buff8<=3;
whenothers=>buff8<=buff8;--nochange
endcase;
endif;
endif;
endif;
endprocess;
process(dcount)
begin
case(dcount)is
when"000"=>Disp_Temp<=buff1;--'-'
when"001"=>Disp_Temp<=buff2;
when"010"=>Disp_Temp<=buff3;
when"011"=>Disp_Temp<=buff4;
when"100"=>Disp_Temp<=buff5;
when"101"=>Disp_Temp<=buff6;
when"110"=>Disp_Temp<=buff7;
when"111"=>Disp_Temp<=buff8;--'1'
endcase;
endprocess;
process(Clk)
begin
if(Clk'eventandClk='1')then--扫描累加
dcount<=dcount+1;
a<=Disp_Decode(0);
b<=Disp_Decode
(1);
c<=Disp_Decode
(2);
d<=Disp_Decode(3);
e<=Disp_Decode(4);
f<=Disp_Decode(5);
g<=Disp_Decode(6);
sa<=dcount(0);
sb<=dcount
(1);
sc<=dcount
(2);
endif;
endprocess;
process(Disp_Temp)--显示转换
begin
caseDisp_Tempis
when0=>Disp_Decode<="0111111";--'0'
when1=>Disp_Decode<="0000110";--'1'
when2=>Disp_Decode<="1011011";--'2'
when3=>Disp_Decode<="1001111";--'3'
when4=>Disp_Decode<="1100110";--'4'
when5=>Disp_Decode<="1101101";--'5'
when6=>Disp_Decode<="1111101";--'6'
when7=>Disp_Decode<="0000111";--'7'
when8=>Disp_Decode<="1111111";--'8'
when9=>Disp_Decode<="1101111";--'9'
when10=>Disp_Decode<="1110111";--'A'
when11=>Disp_Decode<="1111100";--'b'
when12=>Disp_Decode<="0111001";--'C'
when13=>Disp_Decode<="1011110";--'d'
when14=>Disp_Decode<="1111001";--'E'
when15=>Disp_Decode<="1110001";--'F'
whenothers=>Disp_Decode<="0000000";--全灭
endcase;
endprocess;
endbehave;
4、编写完VHDL程序后,保存起来。
5、对自己编写的VHDL程序进行编译并仿真,对程序的错误进行修改。
6、编译仿真无误后,根据用户自己的要求进行管脚分配。
分配完成后,再进行全编译一次,以使管脚分配生效。
7、根据实验内容用实验导线将上面管脚分配的FPGA管脚与对应的模块连接起来。
如果是调用的本书提供的VHDL代码,则实验连线如下:
Clk:
FPGA工作时钟信号,接数字时钟CLOCK3,并设为1024HZ。
Kr[0:
3]:
分别接4×4键盘部分的R1、R2、R3和R4。
Kc[0:
3]:
分别接4×4键盘部分的C1、C2、C3和C4。
Sa、Sb、Sc:
接七段码显示区的Sel0、Sel1和Sel2。
A、B、C、D、E、F、G:
接七段码显示区的A、B、C、D、E、F和G
8、用下载电缆将对应的sof文件加载到FPGA中。
观察实验结果是否与自己的编程思想一致。
四、实验结果与现象
以设计的参考示例为例,当设计文件加载到目标器件后,按下矩阵键盘的某一个键,则在数码管上显示对应的这个键标识的键值,当再按下第二个键的时候前一个键的键值在数码管上左移一位。
五、实验报告
1、绘出不同的键值时的数码管的仿真波形,并作说明。
2、根据自己的思路,找一找还有没有其它方法进行键盘的扫描显示。
并画出流程图。
1、将实验原理、设计过程、编译仿真波形和分析结果、硬件测试结果记录下来。
实验五交通灯控制电路实验
一、实验目的
1、了解交通灯的燃灭规律。
2、了解交通灯控制器的工作原理。
3、熟悉VHDL语言编程,了解实际设计中的优化方案。
二、实验原理
交通灯的显示有很多方式,如十字路口、丁字路口等,而对于同一个路口又有很多不同的显示要求,比如十字路口,车辆如果只要东西和南北方向通行就
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 09 EDA 实验 指导书