1.1设计要求 ...................................................................................................................... 1 1.2总体思路 ...................................................................................................................... 1 1.3设计流程图 .................................................................................................................. 2 第2章 总体设计方案 ............................................................................................................ 3
2.1设计程序原理图 .......................................................................................................... 3 2.2 顶层模块程序调用 ..................................................................................................... 4
2.2.1程序部分 ........................................................................................................... 4 2.2.2 顶层模块原理文件 .......................................................................................... 6
第3章 子模块程序设计 ........................................................................................................ 7
3.1译码模块 ...................................................................................................................... 7
3.1.1程序解析 ........................................................................................................... 7 3.1.2 仿真解析 .......................................................................................................... 9 3.2显示模块 .................................................................................................................... 10
3.2.1程序解析 ......................................................................................................... 10 3.2.2 仿真解析 ........................................................................................................ 11 3.3控制模块 .................................................................................................................... 11
3.3.1程序解析 ......................................................................................................... 11 3.3.2 仿真解析 ........................................................................................................ 13
第4章 调试与结果 .............................................................................................................. 14 总结 .......................................................................................................................................... 15
第1章 系统概述
1.1设计要求
CPLD为复杂可编程逻辑器件,通过EDA技术对其进行编程,可将一个较复杂的数字系统集成于一个芯片中,制成专用集成电路芯片,并可随时在系统修改其逻辑功能。并最终完成电路的编程调试。具体要求如下:
(1)开锁代码为二位十进制数,当输入代码的位数和位值与锁内给定的密码一致,且按规定程序开锁时,方可开锁,并点亮开锁指示灯LT。否则,系统进入“错误”状态,并发出报警信号。
(2)开锁程序由设计者确定,并要求锁内给定的密码是可调的,且预置方便,保密性好。
(3)并行数字锁的报警方式是点亮指示灯LF,并使喇叭鸣叫来报警,直到按下复位开关,报警才停止。此时,数字锁又自动进入等待下一次开锁的状态。
1.2总体思路
在电子密码锁的设计中,我们把逻辑功能划分为两个大的模块:控制部分和处理部分。控制模块是整个系统的控制核心 ,负责接收其模块传来的输入信号 ,再根据系统的功能产生相应的控制信号送到相关的模块。我首先考虑的方法:是用密码输入删除控制模块、动态扫描模块、寄存器模块、比较模块、触发模块实现的。在密码输入删除控制模块中,每输入一位数,数码管左移一位,设置删除信号back,每按一次,删除最后输入的数字,密码在数码管显示右移一位,左边空处0。
设置密码确认信号set,但四位密码输入完毕后,按下set,则密码被送到寄存器锁存,比较器模块得到数据A,同时密码显示电路清零。
设置密码锁状态显示信号lock。Lock=0表示锁未开,lock=1表示锁开,设置关锁信号close,当密码送到寄存器模块锁存后,按下close,则lock=0.
设置密码检验信号check ,在lock=0下从数据开关输入四位开锁数据,按下check,则开锁数码送寄存器锁存,数据比较模块得到数据B,若A=B,则触发器被置“1”, 设计成三个模块:控制部分和处理部分。
1
开始 密码输入 密码显示 判断 不开 开锁 LED1灭 LED2亮 LED1亮 LED2灭 报警 结束
图一 总体设计流程图
2
1.3设计流程图
第2章 总体设计方案
设计程序原理图
图二 程序原理图
3
2.1
2.2 顶层模块程序调用
2.2.1程序部分
LIBRARY ieee;
USE ieee.std_logic_11.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 COMPONENT 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 COMPONENT;
4
COMPONENT 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 COMPONENT;
COMPONENT 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 COMPONENT; 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);
5
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;
2.2.2 顶层模块原理文件
顶层模块原理文件如图三
图三 顶层模块
6
第3章 子模块程序设计
3.1译码模块
图四 译码模块
按键输入与对应的编码输出之间的关系如表3-1所示
表3-1 按键编码
按键输入 0000000001 0000000010 0000000100 0000001000 0000010000 0000100000 0001000000 0010000000 0100000000 1000000000
编码输出 0001 0010 0011 0100 0101 0110 0111 1000 1001 0000 对应的数字 1 2 3 4 5 6 7 8 9 0 3.1.1程序解析
本模块上接键盘扫描模块,下接七段数码显示电路模块。主要功能是实现键盘的译码。该模块封装图如图四。 具体程序如下: LIBRARY IEEE;
7
USE IEEE.STD_LOGIC_11.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\";
8
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 仿真解析
图五 译码模块仿真图
9
3.2显示模块
图六 显示模块元件图
3.2.1程序解析
输出显示电路通过一个二进制计数器对数码管进行片选,片选为0,输入的第0~3位在第一个数码关上显示;片选为1输入的第4~7位在第二个数码关上显示,片选为2输入的第8~11位在第三个数码关上显示,片选为3输入的第12~15位在第四个数码关上显示,进而实现数码管的动态显示。 具体程序如下: LIBRARY IEEE;
USE IEEE.STD_LOGIC_11.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;
10
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 仿真解析
图七 显示模块仿真图
如图七所示输入信号A为111 1111(十进制数8的段码),B为1100111(十进制数9的段码),当E为01时输出E=A,当E=10时输出E=B。
3.3控制模块
图八 控制模块元件图
3.3.1程序解析
密码锁的控制电路是整个电路的控制中心。
11
设置set为密码设置端口,check为密码检验端口,close为关锁端口,back为删除密码端口,clk时钟输入端口,dn[3..0]为3位数字输入端口,sout[15..0]为16位输出端口,lock密码锁状态显示端口。
在此电路中每输一位数,密码在数码管上左移一位。
设置删除密码back,每按下一次back,删除最后输入的数字,左边空处补0。 设置密码确认信号set,当四位密码输入完毕,按下set,设置的密码被存储。 设置密码锁状态信号lock, lock=0表示锁未开,lock=1表示锁开。 设置关锁信号close,按下close,则锁关闭。
设置密码检验信号check,在lock=0下从数据开关书去四位开锁数字,按下check,若数据等于设置的密码或万能密码,则lock=1。 具体程序如下: library ieee;
use ieee.std_logic_11.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';
12
else led1 <='0';led2 <= '1'; end if; end if ; end process; end architecture;
3.3.2 仿真解析
图九 控制模块仿真图
如图九所示当控制信号co=1时(上锁),E=5和F=5将存入锁存器中(即密码),当控制信号co=0时(解锁),输入信号E=0,F=5并不是密码,所以LED1和LED2都为1,当输入信号为(E=5,F=5)时,密码正确,LED1为1,LED2为0。
13
第4章 调试与结果
1、打开quartus2软件,找到工程文件,并打开vhd程序文件,选定cyclone中EP1C3T144C8芯片,在assignments下拉框中选中pins,按规定选好管脚。 2、打开实验箱,按管脚图接好线。将实验箱连接到电脑上,打开实验箱电源。 3、在quartus2中选定tools下拉框中的Programmer项,进入程序下载界面,点击Start按钮运行sof文件。看到右上方的Progress到达100%时运行完毕。
图十 实物图
如图十所示,在右下角电平开关中输入密码,状态开关为解锁状态,输入的密码为21,但是并不是密码,所以数码管上面的两个LED灯都亮了。
14
总结
这次EDA课程设计历时两个星期,在整整两个星期的日子里,可以说是苦多于甜,但是可以学的到很多很多的东西,同时不仅可以巩固以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次设计,进一步加深了对EDA的了解,让我对它有了更加浓厚的兴趣。特别是当每一个子模块编写调试成功时,心里特别的开心。但是在编写顶层文件的程序时,遇到了不少问题,特别是各元件之间的连接,以及信号的定义,总是有错误,在细心的检查下,终于找出了错误和警告,排除困难后,程序编译就通过了,心里终于舒了一口气。在波形仿真时,也遇到了一点困难,想要的结果不能在波形上得到正确的显示:在设定输入的时钟信号后,数字秒表开始计数,但是始终看不到秒和小时的循环计数。后来,在数十次的调试之后,才发现是因为输入的时钟信号对于器件的延迟时间来说太短了。经过屡次调试,终于找到了比较合适的输入数值:时钟周期设置在15秒左右比较合适。另外,Endtime的值需要设置的长一点:10us左右,这样就可以观察到完整的仿真结果。
总的来说,这次设计的电子密码锁还是比较成功的,在设计中遇到了很多问题,最后在老师的辛勤的指导下,终于游逆而解,有点小小的成就感,终于觉得平时所学的知识有了实用的价值,达到了理论与实际相结合的目的,不仅学到了不少知识,而且锻炼了自己的能力,使自己对以后的路有了更加清楚的认识,同时,对未来有了更多的信心。最后,对给过我帮助的所有同学和各位指导老师再次表示忠心的感谢!
15
参考文献
1. 康华光主编.电子技术基础(数字部分),高等教育出版社。 2. 阎石主编. 电子技术基础(数字部分),清华大学出版社。 3. 陈大钦主编,电子技术基础实验,高等教育出版社。 4. 彭介华主编,电子技术课程设计指导,高等教育出版社。 5. 张 原编著,可编程逻辑器件设计及应用,机械工业出版社。 6. 荀殿栋,徐志军编著,数字电路设计实用手册,电子工业出版社。7. 刘洪喜,陆颖编著. VHDL电路设计实用教程
清华大学出版社1
6
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- 69lv.com 版权所有 湘ICP备2023021910号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务