- -
- 目录
第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;