当前位置:文档之家› 基于FPGA 的数字系统设计

基于FPGA 的数字系统设计

《基于FPGA的数字系统设计》项目设计项目名称: 电子密码锁姓名:蒋流洲院系:应用技术学院专业: 09电子信息工程(应电应本)学号: 200915254137指导教师:徐正坤完成时间: 2011年6月 30日目录1 项目名称、内容与要求………………………………………… 1页1.1 设计内容……………………………………………………… 1页1.2 具体要求……………………………………………………… 1页2 系统整体架构(Architecture Description)…………………1页2.1 设计思路……………………………………………………… 1页2.2 系统原理(包含:框图等阐述)与设计说明等内容…………2页2.3 创新点与原创性内容………………………………………… 3页3 系统设计 (含HDL 或原理图输入设计)……………………… 3页注:此部分包含主要逻辑单元、模块、源代码等内容3.1 HDL 代码……………………………………………………… 3页3.2 系统整体电路图(或RTL 级电路图)……………………… 11页4 系统仿真(Simulation Waveform)……………………………12页5 FPGA 实现(FPGA Implementation)………………………… 12页注:此处应包含硬件验证、操作过程、结果等说明6 总结(Closing)……………………………………………… 15页参考书目(Reference):………………………………………… 16页1项目名称、内容与要求1.1 设计内容实验板上有10个按键k1~k10,其中k1~k10作为密码输入按键,k10作为复位按键,一便重新开始输入的密码。

当然,这个电子密码锁与实际的电子密码锁的设计有一些不一样,也许实际的电子密码锁并不设置复位按键,而是当密码输入错误后,延长很长一段时间才接受新密码的输入。

假设电子密码锁的密码为四位数3216。

利用实验板上的一个数码管显示输入密码次数,当输入密码正确时,在数码管上显示字符“H”;当输入密码不正确时,在数码管上显示字符“E”。

1.2 具体要求1﹞.具有密码输入功能。

2﹞.设置复位按键,以便重新输入新的密码。

3﹞.在数码管上显示输入密码次数。

4﹞.拒绝接受超过规定次数的密码输入信号。

5﹞.当密码输入正确时,在数码管上显示字符“H”;当密码输入不正确时,在数码管上显示字符“E”;2 系统整体架构2.1 设计思路电子密码锁在生活中十分常见,在这我将设计一个具有较低成本的电子密码锁,本文讲述了我整个设计过程及收获。

讲述了电子密码锁的的工作原理以及各个模块的功能,并讲述了所有部分的设计思路,对各部分电路方案的选择、元器件的筛选、以及对它们的调试、对波形图的分析,到最后的总体图的分析。

2.2 系统原理(包含:框图等阐述)与设计说明等内容用VHDL编写程序实现电子密码锁,其原理框图如图所示,程序中的时终信号clk为石英(32 768Hz)分频后的8Hz标准信号,作为产生0.5s信号的输入信号。

七中k1k9为按键输入信号,k10作为复位按键。

当没有按键按下时连接到CPLD或FPGA的信号k1k10都为高电平信号;当有按键按下时,k1~k10的一个信号为低电平。

电子密码锁采用状态机和对按键输入次数相结合的方法,保证只有输入正确的密码,状态机才能转换到最后正确的状态,显示开锁字符。

程序由7个进程组成,进程P1和P2将8Hz标准信号分频后,产生0.5s脉冲信号(carry),与按键输入信号配合,消除按键输入的抖动,并作为状态转换进程P4的时终输入信号。

进程P3锁存按键输入信号,为状态机提供一个稳定的按键输入信号。

进程P4将下一个状态(next_state)转换为当前状态(state)。

进程P5产生次态信号(next_state),只有当有按键输入和状态转移控制信号en为逻辑“1”时才能够产生次态信号。

进程P4和进程P5是电子密码锁的核心,密码的设置也是编写状态机时确定的。

进程P6对按键输入次数计数,并且为显示按键输入次数的7段译码器BCD码数据。

进程P7判断按键输入次数是否已经输入3次,如果输入密码的次数小于等于3,状态转移控制信号en为逻辑“1”,否则为逻辑“0”。

当仍然有密码输入时,禁止状态发生变化,因此如果输入密码过程中,只要输入一个错误密码,就不可能转换到最后正确的状态。

BCD码-7段译码器显示按键输入次数和输入密码正确或者错误2.3 创新点与原创性内容新增显示正确与错误功能3 系统设计 (含HDL 或原理图输入设计)3.1 HDL 代码Library ieee;Use ieee.std_logic_1164.all;Use ieee.std_logic_arith.all;Use ieee.std_logic_unsigned.all;Entity elock isPort(clk,k1,k2,k3,k4,k5:in std_logic;k6,k7,k8,k9,k10:in std_logic;row:out std_logic_vector(2 downto 0);led:out std_logic_vector(7 downto 0));end elock;architecture behavioral of elock issignal count:std_logic_vector(1 downto 0);signal count1:std_logic_vector(3 downto 0);type states is(s4,s3,s2,s1,s0);signal state:states:=s0;signal next_state:states:=s0;signal en,carry,op,k11,k22,k33,k44,k55:std_logic; signal k66,k77,k88,k99,k100:std_logic;signal row1:std_logic_vector(2 downto 0);beginp1:process(clk)beginif rising_edge(clk) thencount<=count+'1';end if;end process p1;p2:process(clk)beginif rising_edge(clk) thenif count="11"thencarry<='1'; ºelsecarry<='0';end if;end if;end process p2;p3:process(carry,k1,k2,k3,k6,k9) if rising_edge(carry) thenif(k1='0') thenk11<='0';elsek11<='1';end if;if(k2='0') thenk22<='0';elsek22<='1'; end if;if(k3='0') then k33<='0'; elsek33<='1'; end if;if(k4='0') then k44<='0'; elsek44<='1'; end if;if(k5='0') then k55<='0'; elsek55<='1'; end if;if(k6='0') then k66<='0'; elsek66<='1';end if;if(k7='0') thenk77<='0';elsek77<='1';end if;if(k8='0') thenk88<='0';elsek88<='1';end if;if(k9='0') thenk99<='0';elsek99<='1';end if;if(k10='0') thenk100<='0';elsek100<='1';end if;end if;end process p3;p4:process(carry)beginif rising_edge(carry) thenstate<=next_state;end if;end process p4;p5:process(state,k11,k22,k33,k44,k55,k66,k77,k88,k99,k100) begincase state iswhen s0=>if k33='0' and en='1' thennext_state<=s1;op<='0';end if;when s1=>if k22='0' and en='1' thennext_state<=s2;op<='0';end if;when s2=>if k11='0' and en='1' thennext_state<=s3;op<='0';end if;when s3=>if k66='0' and en='1' thennext_state<=s4;op<='0';end if;when s4=>op<='1';when others=>next_state<=s0;end case;if k100='0' thennext_state<=s0;end if;end process p5;p6:process(carry,k11,k22,k33,k44,k55,k66,k77,k88,k99,k100) beginif rising_edge(carry) thenif k100='0' thencount1<="0000";elsif op='1'thencount1<="1111";elsif (en='0' and op='1') thencount1<="1110";elsif(en='1' and(k11='0' or k22='0' or k33='0' or k44='0'or k55='0' or k66='0' or k77='0' or k88='0' ork99='0')) thencount1<=count1+1;end if;end if;end process p6;p7:process(count1)beginif count1<="011"thenEn<='1';elseEn<='0';end if;end process p7;--a,b,c,d,e,f,g,dpwith count1select--7¶ÎÒëÂëÆ÷led<="01100000"when"0001", --1"11011010"when"0010", --2"11110010" when "0011", --3 "01100110" when "0100", --4 "10110110" when "0101", --5 "10111110" when "0110", --6 "11100000" when "0111", --7 "11111110" when "1000", --8 "11110110" when "1001", --9 "01101110" when "1111", ¡ "10011110" when "1110", ¡ "11111100" when others ; --0 row <="101"; -- ¾ end behavioral ;3.2 系统整体电路图(或RTL 级电路图)elockinstclk k1k2k3k4k5k6k7k8k9k10row[2..0]led[7..0]4 系统仿真(Simulation Waveform)5 FPGA 实现(FPGA Implementation)建一个工程建一个vhdl语言文本框和仿真对系统进行设置,编译下载6 总结(Closing)通过这次设计,使我对EDA产生了浓厚的兴趣。

相关主题