您的当前位置:首页正文

cpld

来源:一二三四网


《 CPLD/FPGA设计及应用课程设计》

课程设计报告

题 目: 数字密码锁 院 (系): 信息科学与工程学院 专业班级: xxxxxxxx 学生姓名: xxxxx 学 号: xxxxxxxxxx 指导教师: xxxx

20 16年 4 月 11 日至20 16 年 5 月 6

武昌首义学院制

CPLD/FPGA设计及应用课程设计任务书

一、设计题目 数字密码锁。 二、设计主要内容 1. 2. 3. 4. 5. 掌握睿智FPGA开发板的基本构造和功能,并能设计一些简单的功能。 学会用VHDL语言来设计一些基本的逻辑模块。 了解时序逻辑的设计方式,并运用在密码锁的设计上。 精通数字编码,AD/DA方式在程序中的运作方式。 状态机的使用,实现密码比对和储存读取功能。 三、原始资料 1. 《CPLD/FPGA设计及应用》实验指导书 --马玲; 2. 《CPLD/FPGA设计及应用》—马玲,彭敏; 四、要求的设计成果 1. 熟练运用QuartusII来设计逻辑时序的模块; 2. 熟悉设计一个成果的过程; 3. 更深一步的学习VHDL语言; 4. 运用FPGA开发板设计数字密码锁,并具备消隐、设置密码和三次报错的功能。 2

五、进程安排 第1天:老师讲解课程设计目的、意义,布置课题任务,学生分组选题。 第2天:学生根据所选课题自己下去通过网络或者其他途径寻找课题相关设计资料。 第3-7天:在实验室或者自己的电脑上完成课题的程序以及相关的功能仿真通过。 第8天:在实验室结合EDA实验箱完成程序的调试以及功能的实现。 第9天:通过老师的验收并回答老师的提问。 第10天:下去完成课程设计报告。 六、主要参考资料 1. 《CPLD/FPGA设计及应用》实验指导书 --马玲; 2. 《CPLD/FPGA设计及应用》—马玲,彭敏; 指导教师(签名): 2016 年 4 月 10 日

3

目 录

1.课程设计目的…………………………………………………………………5 2.课程设计题目描述和要求 ……………………………………………5 3.课程设计报告内容……………………………………………………………5 3.1设计思路及原理 ……………………………………………………………5 3.2设计需要解决的问题 ………………………………………………………5 3.3设计过程 ……………………………………………………………6 4.总结……………………………………………………………………………11 5.附录 …………………………………………………………………………12

1

i

4

数字密码锁设计

1. 课程设计目的

 设计一个四位十进制的密码锁。

 跟深一步的理解FPGA的用途,精通相应的开发板。

2. 课程设计题目描述和要求

a) :密码锁串行输入四位十进制数字口令 b) :输入口令全部正确即开锁 c) :口令输入最大次数3次,要求在完全输入四位之后进行判断口令正确

与否;输入3次之后还不能开锁,进入锁死状态 d) 有相应的显示功能 e) 可以对输入的口令消隐 f) 开锁后能再次上锁

3. 课程设计报告的内容

1) 设计思路及原理

i. 密码锁原理

利用逻辑电路将外接输入的电信号转化为时序电路,经过内部

设定的规则,当输入的信号经过处理后的时序逻辑达到内部设定的条件是开启某一种状态及时解锁状态,当没达到那种条件时始终保持一种或多种状态。

ii. 密码锁的设计要求

设计密码锁的系统描述:数字密码锁在设定口令和开锁时要求输入四位十进制数据,当输入状态开启时,输入正确显示一种状态,如果错误则显示错误次数加1,累计3次锁死状态并报警,如果不输入则一直保持原来状态;当检测到储存状态时,输入密码并存储改变原有的储存密码;当检测到消隐信号时,将不显示输入的数据。

2) 设计中需要解决的问题

01. 时钟扫描读取输入的信号:过小,还没检测到就进入下次判断或

者多记一次,过大,响应过慢,加上消斗模块后容易引起码间干扰不易读取信号

02. 密码读取:读入按键开关信号要将信号处理编码送入显示和密码

比较状态

5

03. 密码比较:首先是要将存入的数字进行存储和逻辑排序,然后将

输入的数据进行一一比对,并进行计数,正确与否输出状态信号

04. 显示模块:将输入模式、开锁状态、密码存储状态和锁死状态等

的显示状态显示的编码

05. 开发板引脚的配置等

3) 设计过程

 密码锁的系统描述

a) 输入输出端口定义:

Sdin:输入十进制数信号按键(由于按键不够,将0—9数据以按键

按下次数来编译) Lock:上锁按键 Sec:解锁按键 Clr:确认按键 Set:密码存储按键 Crack:开锁状态按键 Clk:输入数字确定按键 Dout:送现输出信号端 Yn:选码信号

b) 系统状态转换图 S3 错误 S1 锁死 累计次数=3 S2 解锁 解锁 错误次数<3 错误 S0 密码正确 设置 初始 S4 上锁 开锁 c) 编码规则 输入信号 编码信号 逻辑意义 0000 11000000 数字“0” 0001 11111001 数字“1” 0010 10100100 数字“2” 0011 10110000 数字“3” 0100 10011011 数字“4” 0101 10010010 数字“5” 0110 10000010 数字“6” 0111 11111000 数字“7” 1000 10000000 数字“8” 6

1001 1010 1011 Others 01-- 10-- 10010000 11101111 01111111 11111111 11000000 00011000 数字“9” 解锁成功“A” 解锁失败 其他状态 上锁状态 解锁状态  时钟模块

由于输入时钟是50MHZ,一般扫描频率一般1000HZ左右,过50

分频得到1M的频率后经过后续得到两路时钟来分别接入按键和比对模块。

 输入设置

输入模块,由于进行消斗处理用D触发器来消抖动,将输入的信号送入输出,时序时钟推迟一个周期。

7

 计数模块和按键累积计数

将输入的信号进行A/D转换,根据确认按键的输入来计数时序,将输入的3个数字按顺序送入下个模块;计数模块达到3次输出alert报警。

 编码和处理模块

将输入的十进制信号转化成断码,将时序逻辑进行编码来选码管。

8

 选码模块

将时序信号进行编码。

4) 设计得到的成果及现象

 得到的总体结构:

9

 引脚配置:

 实物图:

1. 初始状态:

10

2. 解锁状态:

3. 上锁状态:

4. 总结

 在这次课设中虽然遇到很多麻烦,刚刚开始用自己的方法编写了个

简单的密码比对,但缺乏很多功能,而且在消斗方面很不完善,容易属错误,现象出不来,后来网上搜了一个,但由于时钟没有完善,所以出错,后来看懂了也可以调,但各个模块的时钟不一,所以难以完善,后来看了指导书上才做出来。

 在VHDL语言上有了很大的完善和提高,对基本的设计都应该没问题

了,但还需要努力。

 在设计过程中需要细心、冷静。

11

5. 附页(程序)

50分频:

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

entity PIN1M is

port(clkin:in std_logic; clkout:out std_logic); end entity PIN1M;

architecture bj of PIN1M is

begin

process(clkin)

variable cnttemp : INTEGER RANGE 0 To 49; begin

if clkin'event and clkin='1' then if cnttemp=49 then cnttemp:=0; else

if cnttemp<25 then clkout<='1'; else

clkout<='0'; end if;

cnttemp:=cnttemp+1; end if; end if; end process; end bj;

时钟分频: library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all; use ieee.std_logic_arith.all;

entity fdiv is

port(clk:in std_logic;

divout:out std_logic); end entity fdiv;

12

architecture bj of fdiv is

signal d:std_logic_vector(3 downto 0); signal o: std_logic;

begin

process(clk) begin

if clk'event and clk='1' then

if d=\"1001\" then d<=\"0000\";o<=not o; else d<=d+'1'; end if; divout<=o; end if; end process; end bj;

触发器: LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

ENTITY Dchu IS

PORT (trig,sdin,lock,sec,clr,set,crack:IN STD_LOGIC; sdin1,lock1,sec1,clr1,set1,crack1:OUT STD_LOGIC); END;

ARCHITECTURE FFQ OF Dchu IS

SIGNAL Q1,Q2,Q3,Q4,Q5,Q6:STD_LOGIC; BEGIN

PROCESS (Q1,Q2,Q3,Q4,Q5,Q6,trig) BEGIN

IF trig'EVENT AND trig='1' THEN

13

Q1<=sdin; Q2<=lock; Q3<=sec; Q4<=clr; Q5<=set; Q6<=crack; END IF; END PROCESS; sdin1<=Q1; lock1<=Q2; sec1<=Q3; clr1<=Q4; set1<=Q5; crack1<=Q6; END FFQ;

编码计数模块: library ieee;

use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all;

entity s_pw is

port(SDIN:in std_logic; trig:in std_logic;

lock:in std_logic;

14

sec:in std_logic; CR:in std_logic; SET:in std_logic; CRACK:in std_logic;

din:out INTEGER RANGE 15 DOWNTO 0; n_err:out std_logic_vector(1 downto 0); n_cr:out std_logic_vector(1 downto 0); ALERT:out std_logic; lock_out:out std_logic;

sc:out std_logic;

dead_lock:out std_logic);

end entity s_pw;

architecture bj of s_pw is

signal pW_reg0:INTEGER RANGE 15 DOWNTO 0; signal pW_reg1:INTEGER RANGE 15 DOWNTO 0; signal pW_reg2:INTEGER RANGE 15 DOWNTO 0; signal pW_reg3:INTEGER RANGE 15 DOWNTO 0;

signal pc_reg0:INTEGER RANGE 15 DOWNTO 0; signal pc_reg1:INTEGER RANGE 15 DOWNTO 0; signal pc_reg2:INTEGER RANGE 15 DOWNTO 0; signal pc_reg3:INTEGER RANGE 15 DOWNTO 0;

signal data_cnt:INTEGER RANGE 15 DOWNTO 0; signal cr_cnt: std_logic_vector(1 downto 0);

15

signal err_cnt: std_logic_vector(1 downto 0); signal tag: std_logic; signal sb: std_logic;

signal bff:INTEGER RANGE 15 DOWNTO 0; begin process(trig) begin

if trig'event and trig='1' then if sec='0' then sb<=not sb;sc<=sb;

end if;

if lock='0' then lock_out<='0';

end if;

if tag='1' then din<=11; else if SDIN='0' then

din<=data_cnt;

if data_cnt=9 then data_cnt<=0; else data_cnt<=data_cnt+1; end if; end if;

end if;

if tag='0' then if CR='0' then

16

if SET='0' then

case cr_cnt is

when \"00\"=>pW_reg0<=data_cnt;cr_cnt<=cr_cnt+'1';

when \"01\"=>pW_reg1<=data_cnt;cr_cnt<=cr_cnt+'1'; when \"10\"=>pW_reg2<=data_cnt;cr_cnt<=cr_cnt+'1'; when

\"11\"=>pW_reg3<=data_cnt;cr_cnt<=cr_cnt+'1';lock_out<='0';

when others=>pw_reg0<=0;

end case;

else if crack='0' then case cr_cnt is

when \"00\"=>pc_reg0<=data_cnt;cr_cnt<=cr_cnt+'1'; when \"01\"=>pc_reg1<=data_cnt;cr_cnt<=cr_cnt+'1'; when \"10\"=>pc_reg2<=data_cnt;cr_cnt<=cr_cnt+'1'; when \"11\"=>cr_cnt<=cr_cnt+'1'; if(pc_reg0=pw_reg0) then if(pc_reg1=pw_reg1) then

if(pc_reg2=pw_reg2) then

if(data_cnt=pw_reg3) then din<=

10;err_cnt<=\"00\";

lock_out<='1'; else err_cnt<=err_cnt+'1'; end if;

else err_cnt<=err_cnt+'1';

17

end if;

else err_cnt<=err_cnt+'1'; end if;

else err_cnt<=err_cnt+'1'; end if;

when others=>ALERT<='1';

end case; end if;

end if;

end if; end if;

case err_cnt is when \"00\"=>tag<='0';

when \"01\"=>tag<='0'; when \"10\"=>tag<='0';

when \"11\"=>tag<='1';ALERT<='1'; when others=>tag<='1';ALERT<='1';

end case;

n_cr<=cr_cnt; n_err<=err_cnt; end if;

18

dead_lock<=tag;

end process; end bj;

编码送显: library ieee;

use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all;

entity DIS is

port(din:in std_logic_vector(3 downto 0); cr_cnt:in std_logic_vector(1 downto 0);

err_cnt:in std_logic_vector(1 downto 0); set_crack:in std_logic_vector(1 downto 0); disclk:in std_logic; sec:in std_logic; lock:in std_logic;

dout:out std_logic_vector(7 downto 0); encode:out std_logic_vector(2 downto 0));

end entity DIS;

architecture bj of DIS is

signal cnt:std_logic_vector(2 downto 0); signal c: std_logic; begin

19

process(din,c,disclk) begin

if disclk'event and disclk='1' then

if cnt=\"100\" then cnt <=\"000\";else cnt<=cnt+'1';

end if;

if cnt=\"000\" then encode<=\"000\"; if c='0' then case din is

when\"0000\"=>dout<=\"11000000\";

when\"0001\"=>dout<=\"11111001\"; when\"0010\"=>dout<=\"10100100\"; when\"0011\"=>dout<=\"10110000\"; when\"0100\"=>dout<=\"10011001\"; when\"0101\"=>dout<=\"10010010\"; when\"0110\"=>dout<=\"10000010\"; when\"0111\"=>dout<=\"11111000\"; when\"1000\"=>dout<=\"10000000\"; when\"1001\"=>dout<=\"10010000\"; when\"1010\"=>dout<=\"11101111\"; when\"1011\"=>dout<=\"01111111\"; when others=>dout<=\"11111111\";

end case;

else dout<=\"00000000\";

end if;

20

else if cnt=\"001\" then encode<=\"001\"; case cr_cnt is

when \"00\"=>dout<=\"11111001\";

when \"01\"=>dout<=\"10100100\"; when \"10\"=>dout<=\"10110000\"; when \"11\"=>dout<=\"10011001\"; when others=>NULL;

end case;

else if cnt=\"010\" then encode <=\"010\"; case err_cnt is

else if cnt=\"011\" then encode<=\"011\";

case set_crack is

when\"01\"=>dout<=\"00000000\";

when\"10\"=>dout<=\"11111111\"; when others=>dout<=\"10111111\"; when \"00\"=>dout<=\"11111001\";

when \"01\"=>dout<=\"10100100\"; when \"10\"=>dout<=\"10110000\"; when \"11\"=>dout<=\"10011001\"; when others=>NULL;

end case;

end case;

else if cnt=\"100\" then encode<=\"100\";

21

if lock='0' then dout <=\"00000001\"; else dout<=\"11111111\";

end if;

end if; end if; end if; end if; end if; end if; end process; process(sec) begin

if sec'event and sec='1' then c<=not c; end if; end process; end bj;

22

课程设计成绩评定表

项 目 比例 得 分 成 绩 平时成绩(百分制记分) 30% 业务考核成绩(百分制记分) 70% 评 定 总评成绩(百分制记分) 100% 评定等级 指导教师(签名): 优 良 中 及格 不及格 20 年 月 日 23

因篇幅问题不能全部显示,请点此查看更多更全内容

Top