VHDL十六进制计数器.docx
《VHDL十六进制计数器.docx》由会员分享,可在线阅读,更多相关《VHDL十六进制计数器.docx(10页珍藏版)》请在冰豆网上搜索。
![VHDL十六进制计数器.docx](https://file1.bdocx.com/fileroot1/2023-2/1/a835e3a0-7eac-404b-a3ab-64c6ed0c6f32/a835e3a0-7eac-404b-a3ab-64c6ed0c6f321.gif)
VHDL十六进制计数器
徐州工程学院信电工程学院
可编程器件及应用实验
课题名称
设计一个十六进制计数器
姓名
王旭辉20100504144
赵永发20100504133
谢臻20010504121
杨红艳20100504111
学号
院、班级
10电信1班
专业
电子信息科学与技术
指导教师
贾燕玲
2013年1月2日
一、实验目的
1.进一步了解VHDL设计方法
2.熟悉数码管和LED的显示
二、实验所用仪器及元器件
1、计算机
2、QuartusII7.2(32-Bit)软件
3、EP2C5实验箱
三、实验内容
(1)、设计一个十六进制计数器,用一个数码管、8个彩灯循环显示计数状态。
(2)、有清零信号控制,按下后从零开始。
四、设计思路与过程
根据实验要求,需要实现在拨码开关或者按键的控制下实现十六进制计数器。
首先,确定输入输出变量:
输入:
拨码开关a:
清零;
时钟clk:
:
提供有效时钟沿;
输出SEL-LED:
8维向量b:
连接8个发光二极管。
输出SEL-DATA:
8维向量c:
连接数码管。
其次,确定电路工作状态
因为要实现计数十六进制计数器,所以首先要实现在时钟控制下实现计数;
还要考虑到清零信号;
再次,实现对计术状态的表示;也就是让计数状态用数码管和LED显示出来。
五、VHDL程序
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
ENTITYcount16IS
PORT(
CLK5:
INSTD_LOGIC;
RST:
INSTD_LOGIC;
SEG_SEL:
OUTSTD_LOGIC_VECTOR(2DOWNTO0);
SEG_DA:
OUTSTD_LOGIC_VECTOR(7DOWNTO0);
LED:
OUTSTD_LOGIC_VECTOR(7DOWNTO0)
);
ENDcount16;
ARCHITECTUREBEHAVEOFcount16IS
SIGNALSHIFT_CNT,TEMP:
STD_LOGIC_VECTOR(3DOWNTO0);
SIGNALCNT_VALUE:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
PROCESS(CLK5)
BEGIN
IFRST='1'THENTEMP<="0000";
ELSIFCLK5'EVENTANDCLK5='1'THEN
IFTEMP="1111"THEN
TEMP<="0000";
ELSE
TEMP<=TEMP+1;
ENDIF;
ENDIF;
ENDPROCESS;
SHIFT_CNT<=TEMP;
SEG_SEL<="000";
PROCESS(SHIFT_CNT)
BEGIN
CASESHIFT_CNTIS
WHEN"0000"=>SEG_DA<=x"3F";LED<="00000001";
WHEN"0001"=>SEG_DA<=x"06";LED<="00000010";
WHEN"0010"=>SEG_DA<=x"5B";LED<="00000100";
WHEN"0011"=>SEG_DA<=x"4F";LED<="00001000";
WHEN"0100"=>SEG_DA<=x"66";LED<="00010000";
WHEN"0101"=>SEG_DA<=x"6D";LED<="00100000";
WHEN"0110"=>SEG_DA<=x"7D";LED<="01000000";
WHEN"0111"=>SEG_DA<=x"07";LED<="10000000";
WHEN"1000"=>SEG_DA<=x"7F";LED<="00000001";
WHEN"1001"=>SEG_DA<=x"6F";LED<="00000010";
WHEN"1010"=>SEG_DA<=x"77";LED<="00000100";
WHEN"1011"=>SEG_DA<=x"7C";LED<="00001000";
WHEN"1100"=>SEG_DA<=x"39";LED<="00010000";
WHEN"1101"=>SEG_DA<=x"5E";LED<="00100000";
WHEN"1110"=>SEG_DA<=x"79";LED<="01000000";
WHEN"1111"=>SEG_DA<=x"71";LED<="10000000";
ENDCASE;
ENDPROCESS;
ENDBEHAVE;
六、实验QuarterII原理图:
七、实验过程
1、用QuartusII7.2打开已经写好的程序,编译,建立仿真文件,进行仿真。
2、打开计算机和EP2C5实验箱,用串口线连接好,打开电源。
3、为输入输出分配好引脚:
CLK5对应PIN145
RST对应PIN43
SEG_SEL[2to0]对应PIN141142143
SEG_DATA[7to0]对应PIN1441211108653
LED[7to0]对应PIN34333130151413
4、添加硬件,点击start;观察实验现象;
仿真波形
仿真分析:
TEMP在时钟上升沿处计数,SEG_DATA[7to0],LED[7to0]显示对应
TEMP的值:
图中TEMP=0;SEG_DATA[7to0]=00111111;LED[7to0]=00000001;
引脚分配图
实验现象:
八、故障及问题分析
本次实验整体比较顺利,但仍旧出现了一个个问题:
开始时引脚分配有问题,没有找到与EP2C5有关的引脚,后来找到了。
其他未出现什么问题,顺利地完成了实验。
九、总结和结论
本学期EDA实验共完成了8次实验,分别完成了以下四项任务:
Ø对实验板的熟悉;
Ø对QuartusII7.2(32-Bit)的初步认识,并熟悉掌握其图形编译功能;
Ø对QuartusII7.2(32-Bit)的进一步了解,初步结识VHDL语言,并用其实现了简单的计数器和译码器的功能,为最后一次实验打下基础;
Ø进一步熟悉VHDL语言,并用其实现实际电路设计;
纵观四次实验,让我感触颇深的就是,预习对实验的重要性。
QuarterII对我们来说是一个全新的东西,一切操作都得从头来学,好在它的界面友善,操作简单易懂,只是在编写VHDL程序的时候,需要事先学习其语言习惯。
如果预习充分,就能很顺利地完成实验任务,还留有时间思考其它问题,完成额外的题目。
实验要想仿真并下载成功,需要注意的细节很多,如,引脚设置、输入变量的周期设置等。
在第三次实验时,我犯了个小错误——锁定引脚后没有让程序再运行compilation一遍,导致的结果就是,仿真完全正确,但下载到实验板上怎么就不能正确工作,白白耽误了很长时间。
所以按部就班的操作是很必要的。
实验中还有一些细节,在预习时并未注意,只有去实验室实际操作时才发现。
如第三次实验实现7段数码译码器并用数码显示管显示时,预习时,并不知道,通过用一个八维向量c来控制8个数码显示管亮的管子的数量;再如第四次实验,预习的时候并不知道,板子上提供的时钟是50MHz,必须通过分频才能看清实验现象,就临场模仿书上例子做了分频器。
本学期的EDA实验,完成了理论与实验的结合,将一些很抽象的理论概念具体地体现出来,如,门的延迟对输出波形的影响,冒险现象的产生原因等等。
与此同时,我们学会了仿真工具QuarterII,初步掌握了VHDL语言,为理论学习提供了便利。
这些都使EDA的学习更具趣味性,同时更可以增强我们的动手动脑能力,从而达到学以致用的目的。