文档库 最新最全的文档下载
当前位置:文档库 › 基于CPLD的数字锁

基于CPLD的数字锁

基于CPLD的数字锁
基于CPLD的数字锁

- -

- 目录

第1章系统概述1

1.1总体思路1

1.2设计内容及设计要求1

1.2.1设计内容1

1.2.2 设计要求1

第2章总体设计方案2

2.1设计流程图2

2.2设计程序原理图3

第3章子模块程序设计4

3.1译码模块4

3.1.1程序解析4

3.1.2 仿真解析7

3.2显示模块8

3.2.1程序解析8

3.2.2 仿真解析9

3.3.1程序解析10

3.3.2 仿真解析11

第4章调试与结果12

总结13

附录14

第1章系统概述

1.1总体思路

本次课程设计主要是设计一个电子数字锁。思路如下:

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

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

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

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

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

1.2设计内容及设计要求

1.2.1设计内容

本次课程设计是使用EDA实验箱,基于EP1C3T144C8N芯片的设计方案。具体功能及其硬件如下:

(如110 1110表示十进制数0)(1)通过七位电平开关输入密码。

(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组成110 1110一个七位码并且转换为四位的间接码0000,通过输入信号XT来控制译码显示哪一位数码管。

具体程序如下:

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

ENTITY keycode IS

PORT(X:IN STD_LOGIC_VECTOR(2 DOWNTO 0);输入变量1

Y:IN STD_LOGIC_VECTOR(3 DOWNTO 0);输入变量2

XT:IN STD_LOGIC; 控制位选变量

C,D:OUT STD_LOGIC_VECTOR(6 DOWNTO 0):="0111111"; 输出译码变量

e,f,CO:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));

END keycode;输出间接码

ARCHITECTURE yima OF keycode IS

SIGNAL S,EN,EN1: STD_LOGIC;

BEGIN

PROCESS(X,Y)

VARIABLE xy: STD_LOGIC_VECTOR(6 DOWNTO 0);

BEGIN

xy:=(X&Y);

IF XT='1'THEN

CASE xy IS

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

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

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

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

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

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

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

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

WHEN"0111110"=>E<="1000";C(6 downto

0)<="1111111";--8

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

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

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

WHEN OTHERS=>E<="0000";C(6 downto 0)<="0111111";

END CASE;

ELSIF XT='0'THEN

CASE xy IS

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

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

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

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

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

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

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

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

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

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

WHEN OTHERS=>E<="0000";D(6 downto 0)<="0111111";

END CASE;

END IF;

END PROCESS;

END;

3.1.2 仿真解析

图3.2 译码模块仿真图

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

3.2显示模块

图3.3 显示模块元件图

3.2.1程序解析

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

具体程序如下:

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY SCAN_LED IS

PORT( A:IN STD_LOGIC_VECTOR(6 DOWNTO 0); 输入信号A B:IN STD_LOGIC_VECTOR(6 DOWNTO 0);输入信号B

CLK : IN STD_LOGIC; 时钟信号

E:OUT STD_LOGIC_VECTOR(6 DOWNTO 0);输出显示信号

BT : OUT STD_LOGIC_VECTOR(1 DOWNTO 0));输出位码

END;

ARCHITECTURE ONE OF SCAN_LED IS

SIGNAL N:STD_LOGIC_VECTOR(1 DOWNTO 0);

BEGIN

PROCESS(N)

BEGIN

CASE N IS

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

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

WHEN OTHERS=> NULL;

END CASE;

END PROCESS;

PROCESS(CLK)

BEGIN

IF CLK'EVENT AND CLK='1'THEN

N<=N+1;

END IF;

END PROCESS;

END;

3.2.2 仿真解析

图 3.4 显示模块仿真图

如上图所示输入信号A为111 1111(十进制数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都亮。

具体程序如下:

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

entity taxi is

port ( e,f: IN STD_LOGIC_vector(3 downto 0);输入的密码co : IN STD_LOGIC;状态开关(上锁、解锁)

led1,LED2 : OUT STD_LOGIC结果显示(成功、失败)

);

end entity taxi;

architecture one of taxi is

signal G,H:STD_LOGIC_vector(3 downto 0);

begin

PROCESS(e,f,co)

begin

if co='1' then –上锁

g <= e;

h <= f;

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

else --解锁

if g=e and h=f then led1<='1';led2<='0';

else led1 <='0';led2 <= '1';

end if;

end if ;

end process;

end architecture;

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”,这就让我很纠结了,根本无从下手,后来在网上看到了一些X例程序,照着编了一段,编译通过,但是还是没有得不到按键信息,其他的模块我都自己编好调试好了,仿真也没问题,就差这一个了,直到最后一天我都没有找到解决的办法,只能使用最简单的电平输入了,稍微将程序改了一下,勉强能实现功能。

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

参考文献

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

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

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

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

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

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

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

附录

主程序:

LIBRARY ieee;

USE ieee.std_logic_1164.all;

LIBRARY work;

ENTITY block1 IS

PORT

(

xt : IN STD_LOGIC;--端口定义

clk : IN STD_LOGIC;

co_in : IN STD_LOGIC;

x : IN STD_LOGIC_VECTOR(2 DOWNTO 0);

y : IN STD_LOGIC_VECTOR(3 DOWNTO 0);

k : OUT STD_LOGIC;

m : OUT STD_LOGIC;

bt : OUT STD_LOGIC_VECTOR(1 DOWNTO 0);

co : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);

e : OUT STD_LOGIC_VECTOR(6 DOWNTO 0)

);

END block1;

ARCHITECTURE bdf_type OF block1 IS

PONENT scan_led—显示模块

PORT(CLK : IN STD_LOGIC;--内部端口定义

A : IN STD_LOGIC_VECTOR(6 DOWNTO 0);

B : IN STD_LOGIC_VECTOR(6 DOWNTO 0);

BT : OUT STD_LOGIC_VECTOR(1 DOWNTO 0);

E : OUT STD_LOGIC_VECTOR(6 DOWNTO 0)

);

END PONENT;

PONENT keycode—显示模块

PORT(XT : IN STD_LOGIC;--内部端口定义

X : IN STD_LOGIC_VECTOR(2 DOWNTO 0);

Y : IN STD_LOGIC_VECTOR(3 DOWNTO 0);

C : OUT STD_LOGIC_VECTOR(6 DOWNTO 0);

CO : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);

D : OUT STD_LOGIC_VECTOR(6 DOWNTO 0);

e : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);

f : OUT STD_LOGIC_VECTOR(3 DOWNTO 0)

);

END PONENT;

PONENT taxi—控制模块

PORT(co : IN STD_LOGIC;

e : IN STD_LOGIC_VECTOR(3 DOWNTO 0);

f : IN STD_LOGIC_VECTOR(3 DOWNTO 0);

led1 : OUT STD_LOGIC;

LED2 : OUT STD_LOGIC

);

END PONENT;

SIGNAL SYNTHESIZED_WIRE_0 : STD_LOGIC_VECTOR(6 DOWNTO 0);

SIGNAL SYNTHESIZED_WIRE_1 : STD_LOGIC_VECTOR(6 DOWNTO 0);

SIGNAL SYNTHESIZED_WIRE_2 : STD_LOGIC_VECTOR(3 DOWNTO 0);

SIGNAL SYNTHESIZED_WIRE_3 : STD_LOGIC_VECTOR(3 DOWNTO 0);

BEGIN

b2v_inst : scan_led

PORT MAP(CLK => clk,

A => SYNTHESIZED_WIRE_0,

B => SYNTHESIZED_WIRE_1,

BT => bt,

E => e);

b2v_inst1 : keycode

PORT MAP(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

PORT MAP(co => co_in,

e => SYNTHESIZED_WIRE_2,

f => SYNTHESIZED_WIRE_3,

led1 => k,

LED2 => m); END bdf_type;

相关文档