相关代码将会开源在我的Github中
零.背景引入
在我们日常生活中,指纹的使用几乎已经成为了移动设备的标准配置。从手机解锁到上班打卡,再到身份证的个人信息验证,无一不需要指纹识别的辅助。但是,固定端,尤其以电脑为首的设别却罕见指纹识别系统,即使电脑在硬件上允许指纹的加入,很多公司和项目也会因为用户组的安全组策略,强制要求使用PIN码登录设备。面对这样的窘境,一个可以模拟键盘输入的外部指纹设备是极为有用的,它不仅可以使用户可以快速登录系统,而且由于密码和指纹都使用硬件本地管理,没有安全风险。用户在不记得密码的时候,也可以通过指纹重新打印密码。在如今密码的应用广泛的时代,设置类似的密码常常意味着安全性的降低,而设置完全没有关联的密码又容易忘掉,用户可以借助我们的指纹系统,在电脑上重新打印密码,使得密码的管理不再是一个难题。
功能介绍
该项目用于实现按下指纹解锁电脑的功能,一共有外部开关10个和指纹录入窗口,其中8个开关作为硬件密码开关,2个作为状态选择开关。
通过拨动2位的状态开关,可以调整当前模式为录入指纹,检测指纹还是清空指纹库,当按下指纹时功能启动,其中录入指纹和清空指纹库需要额外的指纹管理权限。
而通过拨动8个硬件开关,可以实现对指纹管理权限的调整。只有8位管理员密码正确,才能添加或删去指纹库中的指纹,否则将只能检测指纹是否正确。
硬件连接
该项目所用硬件有:Basys3的FPGA电路板一块, ZA620光学指纹模组一块,DIP排线转USB元件一块。
其中FPGA负责控制电路,管理密码并模拟键盘USB输入。
ZA620光学指纹模组负责将指纹的光学信号转换为电信号,并进行比对等操作,它通过UART简单通讯协议与控制模块FPGA连接。
而FPGA在完成控制后,若密码正确,则会启动模拟键盘的模块,将自己的5个外部引脚分别控制为USB公口的4种电压信号(其中D+需要两个外部引脚,因为其中一个需要1.5k欧的上拉电阻,布线通过导线和电路板完成)。
这些外部引脚通过导线和电路板连接到DIP排线转USB元件上,将形状变为USB公口的模样,使其可以插入电脑。
FPGA模块简介
控制模块
状态控制模块top
代码文件为StateMachine.v
,用经典的状态控制三段式构成,它同时也是整个程序的top
文件,通过这个模块,程序得以切换不同的指纹模式(录入,检测和清除指纹),并对下属的指纹交互模块和键盘模拟模块下达指令并收取反馈。
指纹交互模块
指纹交互模块的top
文件为FPcontrol.v
,由于负责人不同,与控制模块主要采用异步交互。其下属模块分为录入,检测和清除指纹3个,每种模块有着不同的功能。根据外部设备ZA620光学指纹模组的说明手册,利用简易的UART交互协议,每个模块都通过独自编写的分频器以及接收发送的移位器实现与模组的交互。
键盘USB模拟模块
键盘USB模拟模块的top
文件为PwdToPc.v
,使用FPGA模拟USB-HID键盘设备。其下包括密码管理模块PwdMgr.v
和键盘设备模拟模块usb_hid_top.v
,前者负责密码的管理,后者则定义了USB-HID设备的各种参数(包括USB协议规定的设备描述符、配置描述符、接口描述符、端点描述符和字符串描述符,以及HID类设备额外规定的HID描述符、报告描述符和物理描述符),并将这些参数储存在ROM中。键盘设备与PC端通过使用usb2.0协议的全速模式(12Mbps)进行通信,USB2.0全速传输模块封装在usbfs_core
ip核中。
经验与教训
- 在多人项目中,提前规划好每个人负责的内容以及相互间的接口尤为关键,释义不清的接口说明有时候将会产生巨大的麻烦(产生莫名其妙不易察觉的Bug)
- 在项目规划时,尽量让两人间的接口限定在一个模块上(为连接方便,可以设置一个过渡的模块),理由与上面相同。
- 进行后仿真仍无法发现问题,但在FPGA实际运行出错时,检查电路图(RTL->综合->映射),查看是否有信号悬空
- 使用Git等类似工具进行版本管理,防止因为修Bug思路不对,难以回退到之前版本。