您好,欢迎来到六九路网。
搜索
您的当前位置:首页嵌入式课设

嵌入式课设

来源:六九路网
第1章 系统概述 .................................................................................................................. 1

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

本站由北京市万商天勤律师事务所王兴未律师提供法律服务