1、济南大学毕业设计( 论文)- 1 -基于 FPGA 的数字密码器设计(黑体小三,1.5 倍行距,段后 1 行,新起一页,居中)4.1 数字密码器总体设计(黑体四号,1.5 倍行距,段前 0.5 行)4.1.1 设计要求(黑体小四,1.5 倍行距,段前 0.5 行)1)密码预先在内部设置,可以设置任意位密码,这里采用 6 位十进制数字作为密码;2)密码输入正确后,密码器将启动开启装置。这里密码器只接受前 6 位密码输入,并以按键音提示,多余位数的密码输入将不起作用;3)允许密码输入错误的最大次数为三次, 密码错误次数超过三次则进入死锁状态, 并发出警报;4)报警后,内部人员可以通过按键 SETU
2、P 使密码器回到初始等待状态;5)密码器具有外接键盘,可以用来输入密码和操作指令;4.1.2 设计思路(黑体小四,1.5 倍行距,段前 0.5 行)先对数字密码器进行顶层设计并写出相应的 VHDL 程序,然后将数字密码器划分为分频模块、消抖同步模块、使能电路模块、密码预置模块、编码模块、比较模块、计数器选择模块、数码管显示译码模块、指示电路模块、数码管扫描模块、误码模块和控制器模块 12 个部分,将各个模块一一实现。顶层设计中各个模块是作为元件来引用的,因此这里需要将各个模块设计成独立设计实体的具体形式,这样便可以在顶层设计来引用这些模块了。4.1.3 数字密码器的基本原理(黑体小四,1.5
3、倍行距,段前 0.5 行)首先,密码器通过外接键盘输入数字密码,然后密码需要经过 10 线至 4 线编码器变成 BCD 码;接下来通过 4 位比较器与存储在系统中的预置密码进行比较,同时将输入的密码通过数码管扫描模块和数码管显示译码模块显示出来;最后将比较的结果 DEP 送到控制器模块中。本次设计中的密码是串行输入的,每次分别与一个预置码比较。可见,6 个十进制的密码分别有 24 个端口送入,因此需要使用一个数据选择器来进行选择。这里,数据选择器是一个 4 位的六选一数据选择器,它的两位选择信号是由一个模 6 的计数器来给出的,计数器的控制信号是由控制信号 RESET 和时钟信号 CNP 是由
4、控制模济南大学毕业设计( 论文)- 2 -块来提供的。外接键盘每送一个密码数字,计数器的计数值加 1。如果计数器的数值计到 6 时,那么表示 6 个密码已经输入完毕。接下来计数器应向控制器发出反馈信号 FULL,这表示控制器已经可以进入到启动状态。计数器 2 用来记录输入密码错误次数,当密码输入错误时,密码器将发出警报,并提示用户还可以输入密码的次数。当密码输入错误的达到次数三次时,计数器 2 应向控制器反馈信号 NOTC, 密码器将进入死锁状态 , 并发出警报。这时只能通过内部按键 SETUP 使密码器回到初始状态。(宋体小四,1.25 倍行距)4.2 数字密码器的实现(黑体四号,1.5 倍
5、行距,段前 0.5 行)密码器的顶层设计由各个子模块构成。其中各个模块是以元件的形式给出的,首先必须进行元件的说明,然后进行元件的例化调用就可以构成顶层模块。顶层设计的模块图如图 2-3 所示。图 2-3 顶层设计模块图由上图可以给出数字密码器的对外接口信号,即输入和输出信号。1、 数字按键输入信号 A0A9,用来进行密码的输入操作;2、 外部时钟信号 CLK,用来作为内部操作时钟和驱动蜂鸣器;3、 按键输入信号 READY,用来设置密码器的准备操作状态;4、 按键输入信号 WAIT_T,用来建立密码器的等待状态;5、 按键输入信号 SETUP,用来恢复密码器的等待状态;6、 按键输入信号 O
6、PEN_T, 用来设置密码器进入到启动状态;7、 绿灯指示驱动信号 LED_G,驱动绿灯显示;8、 红灯指示驱动信号 LED_R,驱动红灯显示;9、 蜂鸣器驱动信号 ALERT,驱动报警蜂鸣器;10、数码管显示译码输出 A,B,C,D,E,F,G。(宋体小四,1.25 倍行距)4.2.1 分频模块设计(黑体小四,1.5 倍行距,段前 0.5 行)1、分频模块的输入、输出济南大学毕业设计( 论文)- 3 -图 2-4 分频模块图分频模块的模块图如图 2-4 所示,可以定义输入、输出信号如下:CLK: 系统输入时钟,300Hz。CLK_DIV1、CLK_DIV2: 分频输出时钟信号,分别为 10H
7、z、1Hz。2、模块描述在数字密码器中,它的外部时钟信号 CLK 是由外部晶振来提供的,时钟频率为 300Hz。对CLK 进行分频输出两路时钟 CLK_DIV1 和 CLK_DIV2,其中 CLK_DIV1 作为按键检测消抖时钟和控制器模块时钟,而 CLK_DIV2 作为密码错误次数计数模块的时钟。CLK 时钟信号还作为蜂鸣器启动信号和 LED 显示扫描时钟信号。CLK_DIV1 设为 CLK 的 30 分频,为 10Hz。再将 CLK_DIV1 进行 10分频可以得到 CLK_DIV2 时钟,为 1HZ。因此,分频模块可以采用 10 分频和 30 分频电路来构成,如图 2-5 所示。 30
8、分频电路10 分频电路CLK CLK_DIV1CLK_DIV1 CLK_DIV2图 2-53、VHDL 设计由图 2-5 可知,分频模块内部含有两个单元电路:30 分频电路和 10 分频电路。首先需要进行 30 分频和 10 分频这两个单元电路的 VHDL 设计,这两个单元电路的设计可以采用计数的方法来完成。而对于分频模块的设计,可以通过对两个单元电路元件的例化调用来实现。其中 30 分频电路和 10 分频电路的 VHDL 程序分别为 clk_div30.vhd,clk_div10.vhd;分频模块的 VHDL 程序为 clkdiv_model.vhd。4.2.2 消抖同步模块设计(黑体小四,
9、1.5 倍行距,段前 0.5 行)1、消抖同步模块的输入、输出信号定义济南大学毕业设计( 论文)- 4 -图 2-6 消抖同步模块图消抖同步模块的模块图如图 2-6 所示,由图可以得到输入、输出信号定义:1)输入信号C1、C2、C3、C4:分别由 WAIT_T、SETUP、READY、OPEN_T 操作指令得到;AOOA90:由使能模块提供;CLK:由分频模块输出的 CLK_DIV1(10Hz)来提供;2)输出信号C11、C22、C33、C44: 由 WAIT_T、SETUP、READY、OPEN_T 经过消抖后产生;A01A91:有 AOOA90 经过消抖后产生。2、模块描述在数字密码器中,
10、由按键方式产生的数字密码 A0A9、READY、OPEN_T、WAIT_T、SETUP 的产生时刻和持续长短是随机不定的,同时存在因开关簧片反弹而引起的电平抖动现象,因此必须添加消抖同步模块,目的是保证系统能捕捉到输入脉冲,同时保证每按一键只形成一个宽度为系统时钟周期的脉冲。3、VHDL 设计在数字电路中,消抖同步电路的设计方案 11较多,本设计采用的是一种应用较为广泛的消抖同步电路。如图 2-7 所示。因为采用与非门构成的触发器使用底电平触发,因此按键输入的数字或者操作指令要设计成低电平有效。济南大学毕业设计( 论文)- 5 -D QCP QD QCP Q 输出输入CLK图 2-7根据图 2
11、-7 可以看出消抖同步电路含有两个与非门、一个与门和两个 D 触发器。所以首先必须进行 D 触发器的 VHDL 设计,然后构成消抖同步电路的 VHDL 设计,最后通过元件例化调用完成消抖同步模块的 VHDL 设计。其中,D 触发器的 VHDL 程序为 dff_1.vhd, 消抖同步电路的VHDL 程序为 key_sync.vhd, 消抖同步模块的 VHDL 程序为 keysync_model.vhd。4.2.3 使能电路模块设计(黑体小四,1.5 倍行距,段前 0.5 行)1、使能电路模块的输入、输出信号定义图 2-8 使能电路模块图使能电路模块的模块图如图 2-8 所示,模块的输入、输出信号
12、定义如下:1)输入信号A0A9:由按键 09 提供;EN :由控制器模块提供。2)输出信号A00A90:当其为低电平 0 时,表示对应的 A0A9 有信号输入。该输出用于提供给消抖同步模块。2、模块描述在数字密码器中,数字密码 A0A9 的按键输入信号是通过控制器模块给出的使能信号 EN来进行控制的:当使能信号有效(高电平)时,输入的信号 A0A9 有效;否则输出为高电平。济南大学毕业设计( 论文)- 6 -3、VHDL 设计使能电路模块的 VHDL 程序为 enable_model.vhd。4.2.4 密码预置模块设计(黑体小四,1.5 倍行距,段前 0.5 行)1、输入输出定义信号定义图
13、2-9 密码预置输出模块图密码预置输出模块的模块图如图 2-9 所示,模块的输入、输出信号定义如下:1)输入信号S0、S1、S2:由计数器选择模块提供。2)输出信号E1、E2、E3、E4:密码预置信号。2、模块描述该模块用来预置密码器的密码,用于与输入的数字密码进行比较操作。密码器的密码可以设置成任意位,这里设为 6 位,为“654321” 。它的输入有三个,分别为 s2、s1、s0,由计数器选择模块提供;输出有为 4 位的 2 进制密码。3、VHDL 设计密码预置输出模块的 VHDL 程序为 mux4_model.vhd。4.2.5 编码模块设计(黑体小四,1.5 倍行距,段前 0.5 行)
14、1、输入输出信号定义图 2-10 密码预置输出模块图密码预置输出模块的模块图如图 2-10 所示,模块的输入、输出定义如下:济南大学毕业设计( 论文)- 7 -1)输入信号A01A91:由消抖同步模块提供,对应于数字按键 09;RESET :由控制器模块提供;DUS :由控制器模块提供,用于检测是否有按键输入;2)输出信号B1B4:由按键信号转换成 4 位 BCD 码,用来提供给比较模块;DATA_IN:当其为高电平是,表示有密码输入,用来提供给控制器模块;DI :按键音信号,用来提供给指示模块,以驱动扬声器。IN1IN6:用于按顺序存储密码,其中 IN1 用于存储第一位密码,IN6 用于存储
15、第六位密码。该信号提供给数码管扫描信号,用于动态显示输入的密码。2、模块描述编码模块为子模块中的第二大模块,该模块用于将输入的按键信号转换成 4 位 BCD 码B1B4 送入到比较器中,这一步将通过 10 线至 4 线编码器来完成。除此以外,该模块还将输入的按键信号通过移位寄存器按照按键的顺序存储到 6 个 4 位 BCD 码输出信号 in1in6 中,用于提供给数码管扫描模块的输入信号。同时还将输出 di 信号提供给指示电路模块用于产生按键音。对于编码器的输出来说,B4 是 MSB,B1 是 LSB。3、VHDL 设计编码模块的 VHDL 程序为 encoder_model.vhd。 4.2
16、.6 比较模块设计(黑体小四,1.5 倍行距,段前 0.5 行)1、输入输出信号定义图 2-11 比较模块图比较模块的模块图如图 2-11 所示,模块的输入、输出信号定义如下:1)输入信号B1、B2、B3、B4:由编码模块提供,用于与密码预置模块输出的预置密码信号进行比较;E1、E2、E3、E4:密码预置信号,由密码预置模块提供。2)输出信号DEP :该信号用于反馈给控制器模块,用于说明比较的结果。2、模块描述在数字密码器中,比较模块的主要功能是对编码模块的输出 B1B4 这 4 位数据和密码预置输出模块的输出 E1E4 这 4 位数据进行比较,然后将比较的结果送入控制器模块的 DEP 端口上
17、。比较器的具体工作原理是:当比较结果相等是,DEP 的输出为 1;当比较结果不相等时,DEP 的输出为 0。济南大学毕业设计( 论文)- 8 -3、VHDL 设计比较模块的 VHDL 程序为 comparator_model.vhd。4.2.7 计数器选择模块设计(黑体小四,1.5 倍行距,段前 0.5 行)1、输入输出信号定义计数器选择模块的模块图如图 2-12 所示,模块的输入、输出信号定义如下:1)输入信号RESET:计数器的复位信号。CNP :计数器的输入脉冲信号,上升沿有效。2)输出信号S0、S1、S2:提供给密码预置输出模块的地址选择信号。FULL: 提供给密码预置输出模块,用于表
18、示 6 位密码是否输入完毕。图 2-12 计数器选择模块图2、模块描述在密码器中,计数器选择模块的功能是用来给出密码预置输出模块的地址选择信号 S0、S1和 S2,它的控制信号 RESET 和时钟信号 CNP 是由控制器模块来提供的;另外还有一个输出信号FULL,它表示 6 个密码已经输入完毕,控制器可以进入到启动状态。3、VHDL 设计计数器选择模块的 VHDL 程序为 counter_model.vhd。4.2.8 数码管显示译码模块设计(黑体小四,1.5 倍行距,段前 0.5 行)1、输入输出信号定义图 2-13 数码管显示译码模块图数码管显示译码模块的模块图如图 2-13 所示,模块的
19、输入、输出信号定义如下:1)输入信号济南大学毕业设计( 论文)- 9 -DATA :4 位的 BCD 码输入信号,由数码管扫描模块提供。2)输出信号A、B、C、D、E、F、G:分别对应 7 段 LED 的 7 个输入端口。2、模块描述在密码器中,显示设备由 8 个 7 段 LED 组成。前 6 个 LED 将显示输入的 6 个密码,后 2 个LED 在用来在误码状态下显示还可以输入的密码次数。由于采用动态扫描显示,只须输出一个LED 所须的驱动信号即可。这里采用共阴极 LED,所以输出 AG 高电平有效。3、VHDL 设计数码管显示译码模块的 VHDL 程序为 decoder_model.vh
20、d。4.2.9 指示电路模块设计(黑体小四,1.5 倍行距,段前 0.5 行)1、输入输出信号定义数码管扫描模块的模块图如图 2-14 所示,模块的输入、输出信号定义如下:1)输入信号CLKSCAN:数码管扫描频率,来源于系统时钟输入 CLK。RESET:数码管复位信号,由控制器模块提供。IN1IN6:数字密码显示输入信号,由编码模块提供。IN7、IN8:剩余密码输入次数显示输入信号,由密码错误次数计数模块提供。2)输出信号DATA:用于提供给数码管显示译码模块的数据输入。SEL: 3 位的 2 进制数码管选择信号,当其为 111 010 时,选择前 6 位数码管,用于显示输入的密码数字;当其
21、为 001000 时,选择后 2 位数码管,用于显示剩余密码输入次数。图 2-14 数码管扫描模块图2、模块描述在密码器中,输入的数字密码需显示在 LED 上,由于输入由 6 位,所以至少应采用 6 个 LED进行显示。若采用传统静态显示的方法,不仅需要消耗更大的芯片资源和管脚资源,而且还会在电路中会产生一个比较大的电流,很容易造成电路烧坏。通过动态扫描电路可以解决这一问题,通过产生一个扫描信号 SEL(000) - SEL(111) 来控制 8 个七段显示器,依次点亮 8 个七段显示器,也就是每次只点亮一个七段显示器。只要扫描信号 SEL(000) - SEL(111) 的频率超过人的眼睛视
22、觉暂留频率 24Hz 以上,就可以达到尽管每次点亮单个七段显示器,却能具有 8 个同时显示的视觉效果,而且显示也不致闪烁抖动。这里数码管扫描频率采用密码器时钟输入 CLK,为济南大学毕业设计( 论文)- 10 -300Hz。3、VHDL 设计数码管扫描模块的 VHDL 程序为 keyscan_model.vhd。4.2.10 数码管扫描模块设计(黑体小四,1.5 倍行距,段前 0.5 行)1、输入输出信号定义图 2-15 指示电路模块图指示电路模块的模块图如图 2-15 所示,模块的输入、输出信号定义如下:1)输入信号WAIT_L、S_LG、S_LR:由控制器模块提供的红绿灯驱动信号。DI:
23、由编码模块提供的按键音信号;BJY:由密码错误次数计数模块的警告音信号。CLK_DIV1:用于报警状态下的扬声器驱动信号。2)输出信号LED_G:绿灯驱动信号,高电平有效。LED_R:红灯驱动信号,高电平有效。ALERT: 扬声器驱动信号,高电平有效。2、模块描述在密码器中,指示电路模块的功能是用来产生红灯指示 LED_R、绿灯指示 LED_G 和蜂鸣装置ALERT。根据图 2-2 的模块划分图可以看出,绿灯指示 LED_G 是由控制器模块提供的置位信号S_LG 和按下 WAIT_T 键时提供的 WAIT_L 信号通过 RS 触发器来共同控制的;红灯是由控制器模块提供的置位信号 S_LR、信号
24、 WAIT_L 和 BJY 来来共同控制的;蜂鸣装置 ALERT 是由由控制器模块提供的置位信号 S_LR、信号 WAIT_L、单频信号 CLK_DIV1、DI 和 BJY 来共同控制的。3、VHDL 设计指示电路模块的主要元件是 RS 触发器,控制器提供的置位和复位信号都应该是低电平有效。所以首先应该进行 RS 触发器的 VHDL 设计,然后才能构成指示电路模块的 VHDL 设计。其中 RS触发器的 VHDL 程序为 rs_dff.vhd,指示电路模块的 VHDL 程序为 indicator_model.vhd。4.2.11 误码模块设计(黑体小四,1.5 倍行距,段前 0.5 行)1、输入输出信号定义