基于CPLD的数字锁.docx
《基于CPLD的数字锁.docx》由会员分享,可在线阅读,更多相关《基于CPLD的数字锁.docx(15页珍藏版)》请在冰豆网上搜索。
![基于CPLD的数字锁.docx](https://file1.bdocx.com/fileroot1/2023-8/14/6bf7d74b-5a46-46e8-b252-5dfabe8a84de/6bf7d74b-5a46-46e8-b252-5dfabe8a84de1.gif)
基于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;