EDA4位密码锁的课程设计

更新时间:2023-07-29 10:21:02 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

完整版的EDA课程设计

信息技术学院

综合设计报告书

姓 名: 景显冬 班 级: B1106 学 号: 04 时 间: 2013.12.31 指导教师: 李海成

《可编程逻辑器件原理及应用》课程

完整版的EDA课程设计

设计密码锁设计

题目数据输入:每按一个数字键,就输入一个数值,并在显示器上的最右方显示出该 数值,并将先前已经输入的数据依序左移一个数字位置。 数码清除:按下此键可清除前面所有的输入值,清除成为“0000” 。 密码更改:按下此键时将目前的数字设定成新的密码。 激活电锁:按下此键可将密码锁上锁。 解除电锁:按下此键会检查输入的密码是否正确,密码正确即开锁。

设 计 要 求 和 任 务

完整版的EDA课程设计

设计方案本系统采用模块化的设计, 整个系统分为数字按键输入、 时钟输入、 功能按键输入、数字译码块、功能译码模块、核心处理模块、输出处理 模块、显示译码电路八个模块。整体电路如图1.1所示。数 字 按 键 输 入 时 钟 模 块 功 能 按 键 输 入

数 字 译 码 模 块 功 能 译 码 模 块

核 心 处 理 模 块

输 出 处 理 模 块

显 示 译 码 电 路

图1.1 数字密码锁总方框图

硬件电路的设计4 位数字密码锁包括五个基本逻辑模块,分别为:数字按键输入模 块(numinput) 、功能按键输入模块(funcinput) 、核心处理模块(core) 、 输出处理模块(allout) 、七段译码器模块(dataout) 。

数字按键输入--numinput说明: 读取数字键 0~9。 按键为矩阵形式, 高电平表示按键未按下, 低电平表示按键按下。 经数字按键输入模块处理后输出 4 位二进制代码, “0000”~“1001”分别表示 0~9,用“1010”表示其他无效输入。如 表 2.1 所示。

完整版的EDA课程设计

表 2.1 数字按键输入模块(numinput)的数据输入输出 按键数字 0 1 2 3 4 5 按键扫描输出 11011110 01111101 01111110 10110111 10111011 10111101 10111110 11010111 11011011 11011101 其他 Numinput 二进制输出 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 对应十进制数字 0 1 2 3 4 5 6 7 8 9 10

6 7 8 9

其他按键

(1)numinput--数字按键输入模块程序: library ieee; use ieee.std_logic_1164.all;

entity numinput is port(numin numstate,clk numout :IN std_logic_vector(7 downto 0); :IN std_logic; :OUT std_logic_vector(3 downto 0));

end numinput; architecture one of numinput is signal state signal mem begin process(clk) begin if clk'event and clk='1' then :std_logic; :std_logic_vector(7 downto 0);

完整版的EDA课程设计

if state/=numstate then if mem/=numin then case numin is when "11011110" => numout<="0000";---"0" when "01111101" => numout<="0001";---"1" when "01111110" => numout<="0010";---"2" when "10110111" => numout<="0011";---"3" when "10111011" => numout<="0100";---"4"

when "10111101" => numout<="0101";---"5" when "10111110" => numout<="0110";---"

6" when "11010111" => numout<="0111";---"7" when "11011011" => numout<="1000";---"8"

when "11011101" => numout<="1001";---"9" when others => numout<="1010"; end case; state<=numstate;

过end if;

else numout<="1010";

mem<=numin; end if;

end if; end process; end one; (2)数字按键输入模块仿真图:

完整版的EDA课程设计

设图 2.1 数字按键输入模块仿真图

由 图 可 知 , 当 数 字 按 键 输 入 模 块 的 输 入 依 次 为 "11011110" 、

"01111101" 、 "01111110" 、 "10110111" 、 "10111011" 、 "10111101" 、 "10111110"、"11010111"、"11011011"、"11011101"时,numout 输出依次 输出 “0000” 、 “0001” 、 “0010” 、 “0011” 、 “0100” 、 “0101” 、 “0110” 、 “0111” 、 “1000”“1001” 、 ;当为其他按键输入时,numout 输出均为“1010” 。

过(3)数字按键输入--numinput 符号文件:

图 2.2 数字按键输入--numinput 符号文件

功能按键输入模块 -- funcinput读取矩阵按键区控制功能按键 -— 清除键、改密键、上锁键、解锁键。 高电平表示按键未按下,低电平表示按键按下。按照“清除,改

完整版的EDA课程设计

密,上锁,解锁”顺序读取按键时,只能输出一位控制信号。输出 的信号为 3 位二进制代码, “001”~“100” ,依次表示“清除按键、改 密按键、上锁,解锁” ,用“000”表示输入不为功能按键信号。表 2.2 控制功能按键输入模块(funcinput)的输出输入数据 功能按键 功能按键扫描输出 Funcinput 二进制输 出 清除键 改密键 对应十进制数字

11100111 11101101 11101110 11101011其他

001 010 011 100 000

1 2 3 4 0

上锁键 解锁键 其他按键

(1)Funcinput--功能按键输入模块程序: library ieee; use ieee.std_logic_1164.all; entity funcinput is

port( funcin: constate,clk:

IN std_logic_vector(7 downto 0); IN std_logic;

conout:OUT std_logic_vector(2 downto 0)); end funcinput;

architecture one of funcinput is signal state: signal mem: begin process(clk) begin if clk'event and clk='1' then if constate/=state then state<=constate; std_logic; std_logic_vector(7 downto 0);

完整版的EDA课程设计

if mem/=funcin then with funcin select when "11100111" , --清除键 when "11101101",--改密键 when "11101110", --上锁键 when "11101011" , --解锁键 when others;

conout<="001" "010" "011" "100" "000" mem<=funcin;

else conout<="000"; end if; end if; end if;

end process; end one; (2)功能按键输入模块仿真图:

程图 2.3 功能按键输入模块仿真图

由图可知:当功能按键输入模块的输入依次为“11100111”、 “ 11101101”、“ 11101110”、“ 11101011”时,conout 输出依次为 “001”、“010”、“011”、“100”, 当为其他按键输入时,conout 输出均为“000”。 (3)功能按键输入模块--funcinput 符号文件:

完整版的EDA课程设计

图 2.4 功能按键输入模块 --funcinput 符号文件

心处理模块--core 设核心处理模块将根据输入(数字按键输入以及功能按键输入)来改变存储器 状态、数码管显示以及LED灯显示(红灯亮为上锁,绿灯亮为解锁) 。

(1)Core--核心处理程序: library ieee;

use ieee.std_logic_1164.all; entity core is port( numin: conin: in std_logic_vector(3 downto 0); in std_logic_vector(2 downto 0); in std_logic; out std_logic_vector(3 downto 0); out std_logic);

clk:

dataa,datab,datac,datad: ledr,ledg,numout,conout: end entity;

architecture one of core is type lockstate is (unlock,locked); signal numa,numb,numc,numd,codea,codeb,codec,coded:std_logic_vector(3 downto 0); signal numstate,constate: signal locksta: begin process(clk,numin,conin) std_logic; lockstate;

完整版的EDA课程设计

if clk'event and clk='1' then--上升沿 if numin/="1010" then--当不是其他键时 numd<=numc; numc<=numb; numb<=numa; numa<=numin;---移位 end if; if conin/="000" then

if conin="001" then--清除键按下 numa<="0000";--全部清零 numb<="0000"; numc<="0000";

numd<="0000"; elsif conin="010" then --改密键按下 if locksta/=locked then--锁并不是上锁状态 codea<=numa;

codeb<=numb; codec<=numc; coded<=numd; end if;

elsif conin="011" then

--上锁键按下

if locksta/=locked then numa<="0000"; numb<="0000"; numc<="0000"; numd<="0000"; locksta<=locked; end if; elsif conin="100" then --解锁键按下 --锁定密码锁

完整版的EDA课程设计

if locksta=locked then if numa=codea and numb=codeb then 码 if numc=codec and numd=coded then locksta<=unlock; --锁开 end if; end if; end if; --输入正确密

end if; end if; if locksta=locked then ledr<='1'; --若锁锁定 --led 等高电平,红灯闪烁

计else

ledg<='0';

ledr<='0'; ledg<='1';

end if; dataa<=numa; datab<=numb; datac<=numc;

datad<=numd; if numstate='1' then numstate<='0'; else numstate<='1'; end if; if constate='1' then constate<='0'; else constate<='1'; end if; numout<=numstate; conout<=constate;

完整版的EDA课程设计

end if; end process; end one;

(2)核心处理模块仿真图: 当数字按键输入为有效输入(即输入的按键为数字按键 0~9 时) , 此时虽输入 9 位数字,但只有前四位有效,所以密码应为“1234” 若 。 conin 输入为“011” (即按下上锁键) ,此时可以看到 ledr 为高电平,所

以此时红灯闪烁一次,表示密码锁已上锁。仿真波形图如下:

过图 2.5 核心处理模块仿真图(一)

图 2.6 核心处理模块仿真图(二)

由图可知:若 conin 输入为“100”时(解锁时) ,当再次输入密码 “1234” 并此时 ledg 输出为低电平 , (绿灯亮) Dataa 输出密码 。 “1234” , 则表示此时密码锁已解锁。 (3)核心处理模块--core 符号文件:

完整版的EDA课程设计

图 2.7 处理核心模块--core 符号文件

输出处理模块—allout对处理核心模块—core 输出的数据进行刷新,使数码管及时显示刷 新的

数字。

(1)Allout--输出处理程序: library ieee; use ieee.std_logic_1164.all; entity allout is

port( dataa,datab,datac,datad: clk: dataout: 0);

in std_logic_vector(3 downto 0); in std_logic; out std_logic_vector(3 downto

程end allout; architecture one of allout is signal timer: begin process(clk) begin

outsel: 0));

out std_logic_vector(1 downto

std_logic_vector(1 downto 0);

if clk'event and clk='1' then--上升沿

完整版的EDA课程设计

if timer="00" then dataout<=dataa; outsel<="00"; timer<="01"; elsif timer="01" then dataout<=datab; outsel<="01"; timer<="10";

elsif timer="10" then dataout<=datac; outsel<="10"; timer<="11";

else ataout<=datad; outsel<="11"; timer<="00";

过end process; end one;

end if; end if;

(2)输出处理模块仿真图:

图 2.8 输出处理模块仿真图

完整版的EDA课程设计

当输出密码为“0123”时,经过输出处理模块的处理后,能刷新输 出密码“0123”对应的二进制“0000” “0001” “0010” “0011” 、 、 、 ,当 密码改为 “5678” 该模块也能对应刷新出新密码对应二进制 时, “0101” 、 “0110”“0111”“1000”。 、 、

(3)输出处理模块—allout 符号文件:

图 2.9 输出处理模块—allout 符号文件

七段译码器模块—dataout把 4 位 2 进制数翻译成数码管代码,使输入的密码或修改的密码能

及时显示在数码管上。 (1)Dataout--七段译码器模块程序: library ieee; use ieee.std_logic_1164.all;

entity dataout is port( datain:IN std_logic_vector(3 downto 0); dataout:OUT std_logic_vector(6 downto 0)); end dataout; architecture one of dataout is begin process(datain) begin case datain is

完整版的EDA课程设计

when "0000" => dataout<="1111110"; --数码管显示 0 when "0001" => dataout<="0110000"; --数码管显示 1 when "0010" => dataout<="1101101"; --数码管显示 2 when "0011" => dataout<="1111001"; --数码管显示 3 when "0100" => dataout<="0110011"; --数码管显示 4 when "0101" => dataout<="1011011"; --数码管显示 5 when "0110" => dataout<="1011111"; --数码管显示 6 when "0111" => dataout<="1110000"; --数码管显示 7

when "1000" => dataout<="1111111"; --数码管显示 8 when "1001" => dataout<="1111011"; --数码管显示 9 when others => dataout<="0000000"; --不显示 end case;

end process; end one; (2)Dataout--七段译码器模块仿真图:

程图 2.10 七段译码器模块仿真图

由图可知: 当七段译码器的输入信号 (datain) “0000”“0001” 为 、 、 “0010”、 “0011”、 “0100”、 “0101”、 “0110”、 “0111”、 “1000”、 “1001” 输出信号 , (dataout) 依次为: 1111110” 0110000” 1101101” “ 、 “ 、 “ 、 “ 1111001”、“ 0110011”、“ 1011011”、“ 1011111”、“ 1110000”、 “1111111”、“ 1111011”,当 conin 输入信号为其他时,译码输出为 “0000000”。表 2.3 七段译码器的输入及译码对

照表

完整版的EDA课程设计

二进制译 码输入 0000 0001 0010 0011 0100 0101

二进制译码输出

数码管显示数字

1111110 0110000 1101101 1111001 0110011 1011011 1011111 1110000 1111111 1111011 0000000

0 1 2 3 4 5 6 7 8 9 无显示

0110 0111 1000

1001 其他输入

(3)输出处理模块—Dataout 符号文件:

图 2.11 输出处理模块—allout 符号文件

软件设计四位密码锁的电路设计原理图如下:

完整版的EDA课程设计

图3.1 四位密码锁的电路设计原理图

系统仿真该四位数字密码锁的设计是一个实时的系统,对于每一个按键的操 作都是在时钟的上升沿完成的,是一个动态的逻辑关系;而系统输出为

数码管显示的实时输出,不便于分析该系统电路的功能,且系统电路中 存在自动刷新的功能模块,因而电路仿真时不能较好地观察输出结果, 为了解决这一问题,故修改电路的原理图如下:

完整版的EDA课程设计

设图4.1 便于观察输出结果的原理图

程图4.2 系统仿真图(一)

本文来源:https://www.bwwdw.com/article/zqfm.html

Top