数电实验大作业2-实验十一 电子密码锁

 

实验要求..在下面这个链接里:

http://docs.google.com/fileview?id=0B_IAvxLi-MonMjhmMDM5OTgtNzgyMC00MTMwLWJiNGItMmUxODQ4MGY2ZmUz&hl=zh_CN

 

完整的实验报告:

1. 电子锁功能要求

l 2种工作模式,可以设置和校验密码

l 密码长度为8位,内容为数字1-9,分别对应9个微动开关

l 8个数码管实时显示当前输入的密码值

l 密码校验正确则点阵显示为绿色的”OK”,同时播放一种音乐

l 密码校验错误则点阵显示为红色的”NO”,同时播放另一种音乐

2. 需求分析与系统设计

l 密码有8位,且每位的内容为数字1-9

l 需要一个4位的寄存器来存储一个密码位的值,总共需要8个寄存器来存储一个密码.

l 再有一个比较模块来比较2个存储模块中存储的密码是否相同.

l 点阵与蜂鸣器根据比较结果来做出相应的输出

l 数码管实时显示当前存储器中的各位密码值

3. 各模块具体设计

1) 密码存储模块

image

Data[3..0]为一位密码的输入端口,由clk[8..1]中的有效位来控制将该位密码存入某个寄存器中,s1[3..0]~s8[3..0]为各位寄存器的状态输出端口,可用来获得各位密码的值.

在本系统中总共需要2个这样的寄存模块,一个用来存放设置的原密码,另一个用来存放用户验证时输入的密码.然后只要比较这两个寄存模块的值就可确定密码是否输入正确了.

2) 获得键盘值模块

image

根据9个针脚上连接的按键的响应情况来转码输出对应的密码值

3) 主要逻辑控制模块

image

• 根据拨码开关状态来控制设置或者校验密码这2种工作方式

• 将按键输入的各个密码值送到各自的存储器中存储

• 发出密码输入完毕开始校验的状态

4) 点阵显示模块

image

根据main的指令来控制点阵显示相应的内容.

5) 数码管显示模块

根据main指令选择不同的存储器,实时显示密码值到数码管上.

image

6) 音频播放模块

image

将验证的结果的正确与否使用不同的曲子来表示

若结果正确,播放一段升音阶的旋律

若不正确,播放一段降音阶的旋律

7) 其他模块

有了上述这6个主要的功能模块后,还需要配合一些基本的小模块来完成实验.比如需要一个按键消抖的模块来准确的获得按键值.需要一个七段数码管模块来输出显示信号.需要一个22位的计数器来进行分频等.

4. 系统顶层图

lock-plus-top

5. 实验中碰到的问题及解决方案

l 点阵与led的显示出现非预设的结果.原因是clk频率太高,由于人的视觉残留等原因造成错觉.降低了显示的刷新频率后解决

l 按键的消抖做的不好,还是有误按.逐步调试,慢慢降低了键盘检测的频率(等于是使键盘响应变迟钝)后解决.目前高速击键都可以被正常识别,没有错误现象了

6. 实验心得

这个实验应该是综合率比较高的了.把2种按键输入,点阵,数码管和蜂鸣器这3种输出以及存储器的读写功能都实现了.通过这个实验可以充分的学习并利用到所有的功能,感受到实验的乐趣.

7. 程序源码附录

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

-EOF-

  • 10
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
基于VHDL设计用PGA实现一款简易电子密码锁QUARTUS工程源码+文档说明 library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all; use IEEE.std_logic_arith.all; entity time_counter is port( clk:in std_logic; --50M时钟输入 reset_n:in std_logic; --复位信号输入 password1_in:in std_logic_vector(3 downto 0); -- password2_in:in std_logic_vector(3 downto 0); -- password3_in:in std_logic_vector(3 downto 0); -- password4_in:in std_logic_vector(3 downto 0); -- ok_signal_counter_in:in std_logic_vector(2 downto 0); seg_duan:out std_logic_vector(7 downto 0); --数码管段信号输出 seg_wei:out std_logic_vector(7 downto 0) --数码管位信号输出 ); end time_counter; architecture time_counter_behave of time_counter is signal clk_1hz: std_logic; signal count: std_logic_vector(24 downto 0); signal clk_scan: std_logic; signal seg_select: std_logic_vector(2 downto 0); signal scan_count: std_logic_vector(13 downto 0); begin -- //**************************************************************************************************** -- // 模块名称:50M时钟分频至1HZ模块 -- // 功能描述: -- //**************************************************************************************************** process(clk,reset_n) begin if(reset_n = '0')then clk_1hz <= '0'; count <= "0000000000000000000000000"; elsif(clk'event and clk = '1')then--上升沿触发 if(count = "1011111010111100001000000")then-- count <= "0000000000000000000000000"; clk_1hz <= not clk_1hz; else count <= count + '1'; end if; end if; end process; -- //**************************************************************************************************** -- // 模块名称:数码管扫描时钟产生模块 -- // 功能描述: -- //************************************************************************************
以下是一个使用Verilog语言实现的电梯控制器的示例代码: ```verilog module ElevatorController( input wire clk, // 时钟信号 input wire reset, // 复位信号 input wire up_button, // 上行按钮信号 input wire down_button, // 下行按钮信号 input wire floor1_button, // 1楼按钮信号 input wire floor2_button, // 2楼按钮信号 input wire floor3_button, // 3楼按钮信号 output wire[4:0] led, // LED指示灯信号 output wire[1:0] display // 数码管显示信号 ); reg [2:0] current_floor; // 当前楼层 reg [2:0] target_floor; // 目标楼层 reg [2:0] next_floor; // 下一楼层 always @(posedge clk or posedge reset) begin if (reset) begin current_floor <= 3'b000; // 初始楼层为1楼 target_floor <= 3'b000; // 初始目标楼层为1楼 next_floor <= 3'b000; // 初始下一楼层为1楼 end else begin // 根据按钮信号更新目标楼层 if (up_button && current_floor < 3'b110) begin target_floor <= current_floor + 1; end else if (down_button && current_floor > 3'b000) begin target_floor <= current_floor - 1; end else if (floor1_button) begin target_floor <= 3'b000; end else if (floor2_button) begin target_floor <= 3'b010; end else if (floor3_button) begin target_floor <= 3'b100; end // 根据当前楼层和目标楼层计算下一楼层 if (current_floor < target_floor) begin next_floor <= current_floor + 1; end else if (current_floor > target_floor) begin next_floor <= current_floor - 1; end else begin next_floor <= current_floor; end // 更新当前楼层 current_floor <= next_floor; end end // 根据当前楼层和目标楼层更新LED指示灯和数码管显示 always @(current_floor, target_floor) begin case (current_floor) 3'b000: begin led <= 5'b00001; // LED1亮,其余熄灭 display <= 2'b00; // 数码管显示00 end 3'b010: begin led <= 5'b00010; // LED2亮,其余熄灭 display <= 2'b01; // 数码管显示01 end 3'b100: begin led <= 5'b00100; // LED3亮,其余熄灭 display <= 2'b10; // 数码管显示10 end default: begin led <= 5'b00000; // 所有LED熄灭 display <= 2'b11; // 数码管显示11 end endcase end endmodule ``` 该代码实现了一个简单的电梯控制器,根据按钮信号控制电梯的运行和指示灯的亮灭。根据当前楼层和目标楼层,更新LED指示灯和数码管显示。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值