基于CPLD的数字锁.docx

上传人:b****8 文档编号:30434823 上传时间:2023-08-15 格式:DOCX 页数:15 大小:835.26KB
下载 相关 举报
基于CPLD的数字锁.docx_第1页
第1页 / 共15页
基于CPLD的数字锁.docx_第2页
第2页 / 共15页
基于CPLD的数字锁.docx_第3页
第3页 / 共15页
基于CPLD的数字锁.docx_第4页
第4页 / 共15页
基于CPLD的数字锁.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

基于CPLD的数字锁.docx

《基于CPLD的数字锁.docx》由会员分享,可在线阅读,更多相关《基于CPLD的数字锁.docx(15页珍藏版)》请在冰豆网上搜索。

基于CPLD的数字锁.docx

基于CPLD的数字锁

 

第1章系统概述

1.1总体思路

本次课程设计主要是设计一个电子数字锁。

思路如下:

(1)数字锁通过键入(电平)输入密码(两位十进制)。

(2)数字锁分上锁和解锁两个状态。

(3)可以通过程序预置密码。

(4)密码可以显示出来。

(5)解锁成功、失败都有信号显示。

1.2设计内容及设计要求

1.2.1设计内容

本次课程设计是使用EDA实验箱,基于EP1C3T144C8N芯片的设计方案。

具体功能及其硬件如下:

(1)通过七位电平开关输入密码。

(如1101110表示十进制数0)

(2)通过一位电平开关控制数码管的位码(分为0的时输入第一位数码管的值;1时输入第二位数码管的值)。

(3)通过一位电平开关控制上锁和开锁两个状态(分别为1和0)。

(4)通过两位数码管显示输入的密码。

(5)通过两个LED灯显示开锁成功和失败两种情况(LED1和LED2分别为10时成功,01时失败)。

1.2.2设计要求

(1)设计思路清晰,给出整体设计框图;

(2)设计各单元电路,完成其功能仿真和编译并生成低层模块;

(3)完成顶层设计并编译通过;

(4)完成设计下载并调试电路;

(5)写出设计报告;

第2章总体设计方案

2.1设计流程图

图2.1流程图

2.2设计程序原理图

 

图2.2程序原理图

第3章子模块程序设计

3.1译码模块

图3.1译码模块

3.1.1程序解析

本模块主要是对输入的信号进行编码以及译码,由输入信号X(三位),Y(四位)组成一个七位的间接码,比如X输入110,Y输入1110组成1101110一个七位码并且转换为四位的间接码0000,通过输入信号XT来控制译码显示哪一位数码管。

具体程序如下:

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

ENTITYkeycodeIS

PORT(X:

INSTD_LOGIC_VECTOR(2DOWNTO0);输入变量1

Y:

INSTD_LOGIC_VECTOR(3DOWNTO0);输入变量2

XT:

INSTD_LOGIC;控制位选变量

C,D:

OUTSTD_LOGIC_VECTOR(6DOWNTO0):

="0111111";输出译码变量

e,f,CO:

OUTSTD_LOGIC_VECTOR(3DOWNTO0));

ENDkeycode;输出间接码

ARCHITECTUREyimaOFkeycodeIS

SIGNALS,EN,EN1:

STD_LOGIC;

BEGIN

PROCESS(X,Y)

VARIABLExy:

STD_LOGIC_VECTOR(6DOWNTO0);

BEGIN

xy:

=(X&Y);

IFXT='1'THEN

CASExyIS

WHEN"1101110"=>E<="0000";C(6downto0)<="0111111";--0

WHEN"1101101"=>E<="0001";C(6downto0)<="0000110";--1

WHEN"1101011"=>E<="0010";C(6downto0)<="1011011";--2

WHEN"1100111"=>E<="0011";C(6downto0)<="1001111";--3

WHEN"1011110"=>E<="0100";C(6downto0)<="1100110";--4

WHEN"1011101"=>E<="0101";C(6downto0)<="1101101";--5

WHEN"1011011"=>E<="0110";C(6downto0)<="1111100";--6

WHEN"1010111"=>E<="0111";C(6downto0)<="0000111";--7

WHEN"0111110"=>E<="1000";C(6downto0)<="1111111";--8

WHEN"0111101"=>E<="1001";C(6downto0)<="1100111";--9

--WHEN"0111011"=>CO<="1010";

--WHEN"0110111"=>CO<="1011";

WHENOTHERS=>E<="0000";C(6downto0)<="0111111";

ENDCASE;

ELSIFXT='0'THEN

CASExyIS

WHEN"1101110"=>F<="0000";D(6downto0)<="0111111";

WHEN"1101101"=>F<="0001";D(6downto0)<="0000110";

WHEN"1101011"=>F<="0010";D(6downto0)<="1011011";

WHEN"1100111"=>F<="0011";D(6downto0)<="1001111";

WHEN"1011110"=>F<="0100";D(6downto0)<="1100110";

WHEN"1011101"=>F<="0101";D(6downto0)<="1101101";

WHEN"1011011"=>F<="0110";D(6downto0)<="1111100";

WHEN"1010111"=>F<="0111";D(6downto0)<="0000111";

WHEN"0111110"=>F<="1000";D(6downto0)<="1111111";

WHEN"0111101"=>F<="1001";D(6downto0)<="1100111";

WHENOTHERS=>E<="0000";D(6downto0)<="0111111";

ENDCASE;

ENDIF;

ENDPROCESS;

END;

3.1.2仿真解析

图3.2译码模块仿真图

如上图所示输入信号X为011,Y为1101输入0111101也就是间接值为1001(十进制数9),XT为1时输到第一个数码管E,当XT为0,并且X为101,Y为1110组成1011110也就是输入间接值0100(十进制数4)到第二位数码管上(F为4)。

3.2显示模块

图3.3显示模块元件图

3.2.1程序解析

本模块是将译码模块译码好的段码信号输入到数码管中,并且通过BT控制位码显示在两个数码管中的一个上。

具体程序如下:

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYSCAN_LEDIS

PORT(A:

INSTD_LOGIC_VECTOR(6DOWNTO0);输入信号A

B:

INSTD_LOGIC_VECTOR(6DOWNTO0);输入信号B

CLK:

INSTD_LOGIC;时钟信号

E:

OUTSTD_LOGIC_VECTOR(6DOWNTO0);输出显示信号

BT:

OUTSTD_LOGIC_VECTOR(1DOWNTO0));输出位码

END;

ARCHITECTUREONEOFSCAN_LEDIS

SIGNALN:

STD_LOGIC_VECTOR(1DOWNTO0);

BEGIN

PROCESS(N)

BEGIN

CASENIS

WHEN"00"=>BT<="01";E<=A;

WHEN"01"=>BT<="10";E<=B;

WHENOTHERS=>NULL;

ENDCASE;

ENDPROCESS;

PROCESS(CLK)

BEGIN

IFCLK'EVENTANDCLK='1'THEN

N<=N+1;

ENDIF;

ENDPROCESS;

END;

3.2.2仿真解析

图3.4显示模块仿真图

如上图所示输入信号A为1111111(十进制数8的段码),B为1100111(十进制数9的段码),当E为01时输出E=A,当E=10时输出E=B。

3.3控制模块

图3.5控制模块元件图

3.3.1程序解析

本模块作为密码控制程序,由译码模块输入的间接值E,F,通过输入状态控制信号co=1来控制上锁(E和F存入寄存器G和H中),co=0来控制开锁(判断输入的E,F是否分别等于寄存器存好的G和H),如果开锁成功LED1亮,LED2灭;如果开锁失败LED1和LED2都亮。

具体程序如下:

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entitytaxiis

port(e,f:

INSTD_LOGIC_vector(3downto0);输入的密码

co:

INSTD_LOGIC;状态开关(上锁、解锁)

led1,LED2:

OUTSTD_LOGIC结果显示(成功、失败)

);

endentitytaxi;

architectureoneoftaxiis

signalG,H:

STD_LOGIC_vector(3downto0);

begin

PROCESS(e,f,co)

begin

ifco='1'then–上锁

g<=e;

h<=f;

led1<='0';led2<='0';

else--解锁

ifg=eandh=fthenled1<='1';led2<='0';

elseled1<='0';led2<='1';

endif;

endif;

endprocess;

endarchitecture;

3.3.2仿真解析

图3.6控制模块仿真图

如图所示当控制信号co=1时(上锁),E=5和F=5将存入锁存器中(即密码),当控制信号co=0时(解锁),输入信号E=0,F=5并不是密码,所以LED1和LED2都为1,当输入信号为(E=5,F=5)时,密码正确,LED1为1,LED2为0。

第4章调试与结果

1、打开quartus2软件,找到工程文件,并打开vhd程序文件,选定cyclone中EP1C3T144C8芯片,在assignments下拉框中选中pins,按规定选好管脚。

2、打开实验箱,按管脚图接好线。

将实验箱连接到电脑上,打开实验箱电源。

3、在quartus2中选定tools下拉框中的Programmer项,进入程序下载界面,点击Start按钮运行sof文件。

看到右上方的Progress到达100%时运行完毕。

图4.1实物图

如上图所示,在右下角电平开关中输入密码,状态开关为解锁状态,输入的密码为21,但是并不是密码,所以数码管上面的两个LED灯都亮了。

总结

通过本次课程设计,我深刻的了解到自己的不足。

EDA这门课程是上学期学的,因为课程比较紧,当时在VHDL语言上下的功夫很少,就造成了我这次课程设计的囧态。

刚开始拿到课题,看到课题的设计内容和要求,感觉不是很难,但是一开始做就遇到问题—程序的编写,那时候学的时候根本就是模仿的编写的,现在要自己动手编,感觉无从下手,语言规则什么的都不是很明确,就是照着书上编一段小的模块,那错就是十几个,排错误没有经验也只能请教高手和网络了,慢慢的一步一步的过来了,编了一个主模块,然而程序是编好但是并没有达到我想要的结果。

其实在开始我都是想使用3*4键盘扫描的,但是这不是单片机,扫描原理和硬件原理我都不知道,请教了很多实验室的高手,都是说“不会”,“我学的是VLOG”,这就让我很纠结了,根本无从下手,后来在网上看到了一些范例程序,照着编了一段,编译通过,但是还是没有得不到按键信息,其他的模块我都自己编好调试好了,仿真也没问题,就差这一个了,直到最后一天我都没有找到解决的办法,只能使用最简单的电平输入了,稍微将程序改了一下,勉强能实现功能。

虽然这次没有达到我想要的最好的结果,但是实实在在我学到了很多东西,很感谢那些帮助过我的同学和朋友,谢谢!

 

参考文献

1.康华光主编.电子技术基础(数字部分),高等教育出版社。

2.阎石主编.电子技术基础(数字部分),清华大学出版社。

3.陈大钦主编,电子技术基础实验,高等教育出版社。

4.彭介华主编,电子技术课程设计指导,高等教育出版社。

5.张原编著,可编程逻辑器件设计及应用,机械工业出版社。

6.荀殿栋,徐志军编著,数字电路设计实用手册,电子工业出版社。

7.刘洪喜,陆颖编著.VHDL电路设计实用教程清华大学出版社

 

附录

主程序:

LIBRARYieee;

USEieee.std_logic_1164.all;

LIBRARYwork;

ENTITYblock1IS

PORT

xt:

INSTD_LOGIC;--端口定义

clk:

INSTD_LOGIC;

co_in:

INSTD_LOGIC;

x:

INSTD_LOGIC_VECTOR(2DOWNTO0);

y:

INSTD_LOGIC_VECTOR(3DOWNTO0);

k:

OUTSTD_LOGIC;

m:

OUTSTD_LOGIC;

bt:

OUTSTD_LOGIC_VECTOR(1DOWNTO0);

co:

OUTSTD_LOGIC_VECTOR(3DOWNTO0);

e:

OUTSTD_LOGIC_VECTOR(6DOWNTO0)

);

ENDblock1;

ARCHITECTUREbdf_typeOFblock1IS

COMPONENTscan_led—显示模块

PORT(CLK:

INSTD_LOGIC;--内部端口定义

A:

INSTD_LOGIC_VECTOR(6DOWNTO0);

B:

INSTD_LOGIC_VECTOR(6DOWNTO0);

BT:

OUTSTD_LOGIC_VECTOR(1DOWNTO0);

E:

OUTSTD_LOGIC_VECTOR(6DOWNTO0)

);

ENDCOMPONENT;

COMPONENTkeycode—显示模块

PORT(XT:

INSTD_LOGIC;--内部端口定义

X:

INSTD_LOGIC_VECTOR(2DOWNTO0);

Y:

INSTD_LOGIC_VECTOR(3DOWNTO0);

C:

OUTSTD_LOGIC_VECTOR(6DOWNTO0);

CO:

OUTSTD_LOGIC_VECTOR(3DOWNTO0);

D:

OUTSTD_LOGIC_VECTOR(6DOWNTO0);

e:

OUTSTD_LOGIC_VECTOR(3DOWNTO0);

f:

OUTSTD_LOGIC_VECTOR(3DOWNTO0)

);

ENDCOMPONENT;

COMPONENTtaxi—控制模块

PORT(co:

INSTD_LOGIC;

e:

INSTD_LOGIC_VECTOR(3DOWNTO0);

f:

INSTD_LOGIC_VECTOR(3DOWNTO0);

led1:

OUTSTD_LOGIC;

LED2:

OUTSTD_LOGIC

);

ENDCOMPONENT;

SIGNALSYNTHESIZED_WIRE_0:

STD_LOGIC_VECTOR(6DOWNTO0);

SIGNALSYNTHESIZED_WIRE_1:

STD_LOGIC_VECTOR(6DOWNTO0);

SIGNALSYNTHESIZED_WIRE_2:

STD_LOGIC_VECTOR(3DOWNTO0);

SIGNALSYNTHESIZED_WIRE_3:

STD_LOGIC_VECTOR(3DOWNTO0);

BEGIN

b2v_inst:

scan_led

PORTMAP(CLK=>clk,

A=>SYNTHESIZED_WIRE_0,

B=>SYNTHESIZED_WIRE_1,

BT=>bt,

E=>e);

b2v_inst1:

keycode

PORTMAP(XT=>xt,

X=>x,

Y=>y,

C=>SYNTHESIZED_WIRE_0,

CO=>co,

D=>SYNTHESIZED_WIRE_1,

e=>SYNTHESIZED_WIRE_3,

f=>SYNTHESIZED_WIRE_2);

b2v_inst2:

taxi

PORTMAP(co=>co_in,

e=>SYNTHESIZED_WIRE_2,

f=>SYNTHESIZED_WIRE_3,

led1=>k,

LED2=>m);

ENDbdf_type;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1