湖南科技大学信息与电气工程学院
《VHDL语言》
课程设计报告
题 目: VHDL语言课程设计
专 业:
班 级:
姓 名:
学 号:
课程设计任务书
一、 课程设计的目的:
1,通过本次课程设计,熟练掌握MAX-PLUS2的应用,操作,并对VHDL语言的编程做一实践检验,编出程序,并进行仿真,并根据所得仿真图形分析和推断并改进所涉及的程序,让程序在现实生活中得以更贴近的应用。
2,本次操作的命题一是:循环彩灯控制器,本设计的要求是:设计一个循环彩灯控制器,该控制器控制红,绿,黄三个发光管循环点亮。要求红发光管亮3秒,绿发光管亮2秒,黄发光管亮1秒。
3,本次操作的命题二是:数字显示的秒表,本设计的要求是:设计一块用数码管显示的秒表,能够准确的计时并显示。最大计时为59秒,最小精确到0.1秒。
二、设计方案的论证:
命题一循环彩灯控制器的方案一:在本题中要求控制器可以控制红,绿,黄三个发光管循环点亮,并且要求发光的时间不一样,这样,本质设计思想是循环累加,即时钟信号高电平开始,m值开始累加,
CASE m IS
WHEN "001"=>dout<="100";
WHEN "010"=>dout<="100";
WHEN "011"=>dout<="100";
WHEN "100"=>dout<="010";
WHEN "101"=>dout<="010";
WHEN "110"=>dout<="001";
WHEN OTHERS=>dout<="111";
END CASE;
前三个值都将赋值给dout1,也就是红灯发光的三秒,然后两个赋值给绿灯,最后一秒赋值给黄灯。这样,dout的不同值将点亮不同颜色的灯,下面是表示三种灯的点亮程序。
red<=dout(2);
green<=dout(1);
yellow<=dout(0);
以此类推,我们可以实现三个彩灯不同时间的循环点亮。
真值表如下:
命题一循环彩灯控制器方案二:根据题目要求,可以设计一个计数器来实现,在开始计数前,我们采用计数器将每一个数字进行技术,然后再根据不同的点亮时间一次分派不同颜色的灯让他们显示。这样就需要编程三个进程,在需要依次肤质就可以达到效果。
综上两种方案:方案一,简单可行性好,容易理解,编程简单,使读者更容易懂,设计者也方便设计,而方案二也可以达到课设的要求,但是,有很多不足之处,编程繁琐,给设计者带来诸多不便,相对之下,还是选择第一种方案,
命题二数字显示的秒表设计方案,在设计过程中要求设计的秒表能够准确显示时间,最大计时为59秒,最小精确到0.1秒。通过分析,我们可以通过三个进程分别显示一个数字,每一个进程分别计数,因为在VHDL语言中,进程是同时进行的,只有在进程内部才是按照顺序进行的,所以,计数是同时进行的,我们可以通过采取计数的原理来实现秒表的显示,后面两位都是十进制,最前面的计数到5结束,在进行设计过程中考虑到实际现实中的应用,做了相应改进,我们可以通过一个时钟控制它无法显示到59.9秒的时候,然后重新开始,即复位,我们也可以在计数的时候按照我们的意愿让秒表暂停。这样设计更符合实际应用。
命题二改进(1):
IF(CLR='1')THEN
OUT1<="0000";
遇到中途计数清零设计,我们可以通过对clr的控制来控制秒表的计数。
命题二改进(2):
IF(START='1')THEN
OUT1<=OUT1+'0';
增加这个程序段,我们可以中途暂停,如果不加,那么整个程序只能在到达计数末端才能清零,即每次都是从0到59.9秒的计数,但是增加该段,那么,我们就可以在0到59.9之间,任何一个时间点暂停,以供我们的需求。
三、设计仿真及结果分析:
命题一循环彩灯控制器:
根据程序调试仿真图如下:(仿真图中的us表示现实中表示s)
分析:从图形可以看出,清零端低电平,时钟信号上升沿时m值开始计数,随着m值的变化,彩灯的显示一块变化,图示显示,red灯点亮3秒,gree灯点亮2秒,yellow灯点亮1秒,整个周期是六秒一个循环,基本上实现了题目的要求。
命题二数字显示的秒表
数字显示秒表仿真结果如下:
仿真结果分析:
根据程序仿真,时钟上升沿开始计数,从图形可以看出,out1从1开始计数到9,然后循环继续重复上述计数,在out1计数到9的时候,现实中,应给out2开始计数,从图形来看,符合实际应用,当out2 计数到9的时候,out3开始计数,也就是说,每一个都符合计数的要求和现实生活的应用。但是这样只能计数从0开始到59.9秒,符合题目的要求,但是,在现实中,我们需要一个多用的计数器,所以,进行了改进,我们可以根据需要,让秒表停到我们需要的数字,这样便于应用,而且,我们在没计数到59.9秒的时候进行清零,这样我们更贴切生活的应用。
上述的仿真结果分析:处理在前面的计数和正常显示外,从图上我们可以看出,当CLR为高电平时,所有计数都清零,从新开始计数,在START为高电平时,计数暂停在该点,也符合我们日常生活的应用。这样就解决了前面遇到的问题。
四、设计及仿真中的体会。
这次课程设计中,我们不但学习了max plus 软件的应用,而且巩固了以前所学的理论知识,特别是VHDL语言的学习和编程,我们也学习了数电和电路的相关知识,也是一次很好的复习,也是一次很好的实践。下面就本次课程设计中遇到的问题和解决方案做一总结:
第一:初次接触max plus,刚开始的时候只是对软件的熟悉,通过老师的指导和书本的查阅,基本掌握该软件的简单应用。
第二:程序的编程和调试。我们在理论学习中就编程,所以,编程不会是很大的问题,但是以前只是理论上的编程,只是随着认得意识而编写的,所以,当我们编程完成以后开始调试的时候发现很多问题。在进行程序调试的时候首先发现了路径无法打开,进过老师的指导,结合理论知识的解释,我们做了很多改变开得以解决。其次,受C语言的影响,编程有些太复杂,出现特多警告,后来在老师的耐性指导和修改下,然后通过自己的思考将其改正。在调试的过程中还会出现很多很普通的错误,比如说,标点符号,定义变量名的时候出现了相当多的错误,这些只要编程序时细心认真就可以解决。
第三:程序的仿真。程序的仿真应该说是这次课程设计中最有收获的,因为之前从没接触过,通过仿真,我们可以清楚的看出程序的应用,和相关需要出现的结果,还有一些我们在编程过程中的变量等等的显示,这样也有助于我们的程序编程的改进,贴别是在设计命题二的时候,只要仿真完就可以 发现问题,并及时修改,最后达到完美。
第四,程序优化,改进。在按照课题的设计过程中,发现,如果按照题目的要求设计,那么,这个硬件的设计太单一,而且在应用中不太理想,所以,就做了些许改进,命题二在题目的要求基础上,加了中途暂停和在没有计数满的情况下清零功能,这样,更符合实际的应用。
五、对本次课程设计的体会和建议:
通过两周的紧张努力,我们成功完成了这次课程设计,我们不但学会了max plus软件的应用,而且复习了前面学过的很多理论知识,我们统筹兼顾的学习了理论和实践应用的区别,让我体会深刻的是,实践是检验整理的唯一标准,如果没有这次课程设计,就没法想到VHDL语言在我们学习和和生活中的重大应用,这将给我们一个很好的体会,给我们以后更好学习专业课程做了铺垫,也是我们将来工作的一个帮手。
在这次课程设计中也有很多遗憾,所以通过这次课程设计我们可以做以下建议:首先,在正常的理论教学中,引导学生学习max plus软件的应用,在短时间的学习效果不是很好。二,希望有机会,我们可以再自己做好编程和调试的基础上做出实物,相信这样会有更好的收获。
六、参考文献:
参考书目:
【1】侯伯亨编,《VHDL硬件描述语言与数字逻辑电路设计》,西安电子科技大学出版社,1999年版。
【2】邢建平 曾繁太编,《VHDL设计教程》,清华大学出版社,2005版
【3】刘凯,VHDL硬件描述语言与数字逻辑电路设计,西安电子科技大学出版社,2009.8
七、附录:
附录一 选题一源程序:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY caideng IS
PORT(clk,clr:IN STD_LOGIC;
red,green,yellow:OUT STD_LOGIC);
END ENTITY caideng;
ARCHITECTURE xh_rtl OF caideng IS
SIGNAL dout:STD_LOGIC_VECTOR(2 DOWNTO 0);
SIGNAL m:STD_LOGIC_VECTOR(2 DOWNTO 0);
BEGIN
red<=dout(2);
green<=dout(1);
yellow<=dout(0);
PROCESS(clk) IS
BEGIN
IF(clr='1')THEN
m<="001";
ELSIF(clk'EVENT AND clk='1')THEN
IF(m="110")THEN
m<="001";
ELSE
m<=m+1;
END IF;
CASE m IS
WHEN "001"=>dout<="100";
WHEN "010"=>dout<="100";
WHEN "011"=>dout<="100";
WHEN "100"=>dout<="010";
WHEN "101"=>dout<="010";
WHEN "110"=>dout<="001";
WHEN OTHERS=>dout<="111";
END CASE;
END IF;
END PROCESS;
END ARCHITECTURE xh_rtl;
附录二 选题二源程序:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY miaobiao IS
PORT(CLK:IN STD_LOGIC;
DIN:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
WR3,WR2,WR1,CLR,START:IN STD_LOGIC;
DOUT3:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
DOUT2:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
DOUT1:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));
END ENTITY miaobiao;
ARCHITECTURE EXAMPLE OF miaobiao IS
SIGNAL OUT3:STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL OUT2:STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL OUT1:STD_LOGIC_VECTOR(3 DOWNTO 0);
BEGIN
DOUT3<=OUT3;
DOUT2<=OUT2;
DOUT1<=OUT1;
PROCESS(CLK) IS
BEGIN
IF(CLR='1')THEN
OUT1<="0000";
ELSIF(CLK'EVENT AND CLK='1')THEN
IF(START='1')THEN
OUT1<=OUT1+'0';
ELSIF(WR1='1')THEN
OUT1<=DIN;
ELSIF(OUT1="1001")THEN
OUT1<="0000";
ELSE
OUT1<=OUT1+1;
END IF;
END IF;
END PROCESS;
PROCESS(CLK) IS
BEGIN
IF(CLR='1')THEN
OUT2<="0000";
ELSIF(CLK'EVENT AND CLK='1')THEN
IF(START='1')THEN
OUT2<=OUT2+'0';
ELSIF(WR2='1')THEN
OUT2<=DIN;
ELSIF(OUT1="1001")THEN
IF(OUT2="1001")THEN
OUT2<="0000";
ELSE
OUT2<=OUT2+1;
END IF;
END IF;
END IF;
END PROCESS;
PROCESS(CLK) IS
BEGIN
IF(CLR='1')THEN
OUT3<="0000";
IF(CLK'EVENT AND CLK='1')THEN
IF(START='1')THEN
OUT3<=OUT3+'0';
ELSIF(WR3='1')THEN
OUT3<=DIN;
ELSIF(OUT1="1001")THEN
IF(OUT2="1001")THEN
IF(OUT3="0101")THEN
OUT3<="0000";
ELSE
OUT3<=OUT3+1;
END IF;
END IF;
END IF;
END IF;
END PROCESS;
END ARCHITECTURE EXAMPLE;
第二篇:微机接口实验报告(循环彩灯)
目 录
第一章 需求分析
1.1 设计目的..................................................................................................1
1.2 设计任务与要求......................................................................................1
1.3 软硬件运行环境及开发工具..................................................................1
第二章 概要分析
2.1 总体方案与说明.......................................................................................2
2.2 8255A芯片图............................................................................................3
2.3 循环彩灯流程图......................................................................................4
第三章 详细设计
3.1 硬件设计与实现......................................................................................5
3.2 实验电路图与说明...................................................................................6
3.3 源程序代码...............................................................................................6
第四章 系统调试与操作说明
4.1 系统调试...................................................................................................9
4.2 操作说明...................................................................................................9
第五章 总结体会 ............................................................................10
参考文献......................................................................................................10
第一章:需求分析
1.1设计目的
巩固和加深课堂所学知识;熟悉各种指令的应用及条件;
学习掌握一般的软硬件的设计方法和查阅、运用资料的能力;
深入了解与掌握8255A在PC机系统的典型接法和8255A的工作方法及应用编程。
1.2设计任务与要求
任务:
循环彩灯控制系统输出四种参考花型如下:数位为1时表示灯亮
1)00000001 左循环
2)10000000 右循环
3)按10000001,11000011,11100111,11111111 规律递增,
全亮后同时闪烁十次,循环不断。
4)按11110000,00001111 交替闪烁。
要求:
1.画出硬件原理图(接口芯片和外设部分)和实验连线图;
2.功能要求:
1)循环彩灯的循环速度可调;
2)按键要求
① 启动/暂停,按K0开关启动系统,按K1开关停止系统工作。
② 花型变换,由开关K2、K3进行四种花型切换;
1.3软硬件运行环境及开发工具
利用TDN86/88实验平台进行硬件电路的连接,在Wmd86软件下进行程序的调试,直 到使循环彩灯按照设计要求运行, 实验所使用的实验开发平台是Wmd86,使用的编程语言是汇编。
第二章:概要设计
2.1 总体方案与说明
根据所学内容和对8255A的应用,整个系统硬件采用8086微处理器,和8255A可编程并行接口芯片和8个led彩灯。
Intel 8255A是一种通用的可编程并行接口芯片,由于它是可以编程的,可以通过程序来设置芯片的工作方式,通用性强,使用灵活,可为多种不同的CPU与外设之间提供并行输入/输出的通道;8086微处理器,选择最小工作模式,所有的总线控制信号均由8086产生;8086CPU的地址\数据总线AD15-AD0和地址\状态总线A16/S3-A19/S6是复用的,必须通过地址锁存器把地址总线和数据总线分离。
可编程并行通信接口芯片8255A:
方式0为简单I/O,查询方式,端口A、端口B、端口C均可使用。
方式1为选通I/O,中断方式,端口A、端口B可以使用,选通的输入/输出方式。
方式2为双向I/O,中断方式,只有端口A可以使用,双向的传输方式。
三个8位端口PA、PB、PC
端口A(PA口):有一个8位数据输入锁存器和一个8位数据输入锁存/缓冲器;
端口B(PB口):有一个8位数据输入锁存器和一个8位数据输入/输出,锁存/缓冲器;
端口C(PC口):有一个8位数据输入锁存器和一个8位数据锁存/缓冲器。
通常PA口与PB口用作输入/输出的数据端口,PC口用作控制和状态信息端口。PC口可以分为两个四位的端口,每个端口包含一个四位锁存器,可分别同PA口和PB口配合使用,用作控制信号(输出)或作为状态信号(输入)。
方式0也叫基本输入/输出方式。一种方式,不需要应答联络信号,端口A、端口B和端口C的高4位及低4位都可以作为输入或输出端口。方式0的应用场合有无条件传送和查询传送2种; 故根据我们系统设计的要求,综上可知,选择8255A为工作方式0。
然而8255A的3种基本工作方式:由方式选择控制字来决定,D7=1(特征位)表明是设定方式选择控制字;D7=0,则表示是端口C按位置位/复位控制字;
端口C分成高4位(PC7~PC4)和低4位(PC3~PC0),可分别设置成输入端口或输出端口;端口C的高4位与端口A配合组成A组,端口C的低4位与端口B配合组成B组。
综上可得此系统需要满足A端口为输出,输出数据给到8个彩灯;端口C为输入,需要检测按键的输入情况。
2.2 8255A芯片图
如图所示:
2.3循环彩灯流程图
图如下:
这个实验我是采用K0K1来空间开关的开合关的,用K2K3来切换彩灯花型的变化,上面流程图清楚的表达了整个实验的实现过程。
第三章:详细设计
3.1硬件设计与实现
8255A的数据线,片选信号,地址线,读写控制线等与系统总线相连,CS与译码器的也相连,通过译码器连接到系统总线。电路使用共阳极接线发,提供低电平时发光二极管发光。通过软件向8255A中发送信号,启动系统,使彩灯实现循环的花形。再使开关可以控制彩灯在我们事先编译的花形中进行切换。k2和k3的状态为00则00000001左循环,k2和
k3的状态为01则执行10000000右循环,k2和k3的状态为10则执行按10000001, 11000011……11111111规律递增,全亮后同时闪烁十次,循环不断。k2和k3的状态为11
则执行按11110000,00001111,红绿灯循环闪烁不断。
实验原理图如下:
3.2 实验电路图与说明
实验电路图如下:
如上图,在8255A芯片中,PA口作为输出,工作在0方式下。PA7---PA0接LED发光二极管D7—D0。PB作为输入端口,工作在0方式下。PB口的PB0和PB1接开关K2和K3,控制四种花形。PC口的 上C口作为输入口,PC7和PC6接开关K0和K1,K0启动系统,K1退出程序,停止系统工作。PB0和PB1控制四种花型的切换,当PB0PB1为00时,灯闪亮为左循环,当为01时时右循环,当为10时时两边向里规律递增循环,11为红绿灯交替闪烁循环。
3.3源程序代码如下:
SPEED EQU 5000H
STACK SEGMENT
DW 64 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE
START:MOV AL,8AH ;8255初始化
OUT 63H,AL
A0: IN AL,62H
TEST AL,40H ;检测开关K0,启动
JZ A0
EXIT: MOV AX,004CH
INT 21H
A1: IN AL,62H
TEST AL,80H ;检测开关K1,停止
JNZ EXIT
IN AL,61H
AND AL,0FH ;屏蔽高四位
CMP AL,00H ;AL状态为00H
JZ L1 ;调用L1
CMP AL,01H ;AL状态为01H
JZ L2 ;调用L2
CMP AL,02H ;AL状态为02H
JZ L3 ;调用L3
CMP AL,03H ;AL状态为03H
JZ L4 ;调用L4
L1: MOV CX,08H ;左移动子程序
MOV AL,0FEH
L11: OUT 60H,AL
CALL DALLY ;左移动子程序
ROL AL,1
CALL DALLY
LOOP L11
JMP A1
INT 21H
L2: MOV CX,08H ;右移动子程序
MOV AL,3H
L21: OUT 60H,AL
CALL DALLY ;调用延时程序
ROR AL,1
CALL DALLY
LOOP L21
JMP A1
L3: MOV CX,08H ;两边向里规律递增子程序
MOV AL,07EH
OUT 60H,AL
CALL DALLY
MOV AL,03CH
OUT 60H,AL
CALL DALLY
MOV AL,018H
OUT 60H,AL
CALL DALLY
MOV AL,00H
OUT 60H,AX
CALL DALLY
PUSH CX
MOV CX,10
L31:MOV AL,00H
OUT 60H,AX
CALL DALLY
MOV AL,0FFH
OUT 60H,AX
CALL DALLY
LOOP L31
JMP A1
POP CX
LOOP L3
L4: MOV CX,04H ;交替亮灯子程序
L41: MOV AL,0FH
OUT 60H,AL
CALL DALLY
MOV AL,0F0H
OUT 60H,AL
CALL DALLY
LOOP L41
JMP A1
INT 21H
DALLY: PUSH CX ;延时子程序
PUSH DX
MOV CX,SPEED ;延时
LOOP5:MOV DX,SPEED
LOOP6:DEC DX
JNZ LOOP6
POP DX
POP CX
RET
CODE ENDS
END START
四:系统调试与操作说明
4.1 系统调试
首先按照实验电路图连接实验线路,确认无误后。输入编写好的源程序代码,确认没有输入错误以后,编译连接加载程序,在下方会显示程序中出现的错误,找到出错的位置,因为我将PA口作为输出口,PB口作为输入口,PC口高4位作为输入口低4位作为输出口,所以将8255初始化为MOV AL 8AH ,PC6连接K2即01000000H,TEST AL 40H ,PC7连接K3即10000000H,TEST AL 80H ,A口地址为60H,作为输出所以OUT 60H AL,B口地址为61H,作为输入口所以IN AL 62H。经过以上的调式,编译加栽后系统能够正常的运行。
4.2操作说明
首先输入源程序代码,然后编译连接加载,加载成功后运行。本系统主要由四个开关控制,分别为K0、K1、K2和K3。K0置1时启动系统,K1置1时退出系统。K2和K3的状态为00则00000001左循环,K0和K1的状态为01则执行10000000右循环,K2和K3的状态
为10则执行按1000001,11000011……11111111规律递增,全亮后同时闪烁十次,循环不断。K2和K3的状态为11则执行按11110000,00001111闪烁。
第五章:总结体会
这又是一次关于计算机语言的课程设计了,以前我们做过c,java等计算机语言的编程课程设计,那都是纯软件的课程设计,这次是用汇编语言编写程序,而且其中还涉及到了硬件电路的应用。
我的选题是循环彩灯的设计,开始拿到题目的时候,我想到了上课时候做的实验,虽然比较简单,但是原理是大同小异的。我用了8255A的芯片来设计这次实验的电路,用到了PA口,PB口和PC口,利用PA口的八个口输出,连接八个灯,显示灯的亮和灭;利用PB0和PB1连接K2和K3开关,来控制彩灯四种形状的切换;利用PC6和PC7连接K0和K1开关,来控制运行的开始与停止,最后成功的完成这次实验。
在写程序的过程中,我遇到了一些问题,关于循环语句的应用,我不是很明白,经过看书和查阅资料,我懂得了循环语句的应用,并且成功的解决了设计中所需要的循环次数的问题,其中我学到了不少东西,上课的时候讲的子程序,在这次实验中都应用到了,给了自己一个实践锻炼的机会,也让我成功的完成了程序设计。
这次的课程设计,和以前的课程设计一样,我接触到了自己学过的东西,也接触了自己没学到的东西,既巩固了所学习的知识,也让自己对新的知识得到了一定的了解,每次的课程设计,总是能让自己学到很多的东西。
妈妈总说做事情要有耐心,老师总说学习要用心,耐心和用心加起来就是最好问题事情的武器,在课程设计中总是能感觉到这样的道理。学习就是为了把学的东西运用起来,俗话也有说:台上一分钟,台下十年工,所以学习要持之以恒。在以后的学习中,我会不断的努力前进的。
参考文献:
彭虎,周佩玲,傅忠谦,《微机原理与接口技术》(第二版),电子工业出版社,20##年3月。
戴梅萼,《微机计算机技术与应用》(第三版),清华大学出版社,20##年。
艾德才,《Pentium系列微型计算机原理与接口技术》,高等教育出版社,20##年。