《CPLD_FPGA設計及應用課程設計--數(shù)字密碼鎖.doc》由會員分享,可在線閱讀,更多相關《CPLD_FPGA設計及應用課程設計--數(shù)字密碼鎖.doc(23頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、 CPLD/FPGA設計及應用課程設計課程設計報告題 目: 數(shù)字密碼鎖 院 (系): 信息科學與工程學院 專業(yè)班級: xxxxxxxx 學生姓名: xxxxx 學 號: xxxxxxxxxx 指導教師: xxxx 20 16年 4 月 11 日至20 16 年 5 月 6 日武昌首義學院制CPLD/FPGA設計及應用課程設計任務書一、設計題目數(shù)字密碼鎖。二、設計主要內(nèi)容1. 掌握睿智FPGA開發(fā)板的基本構造和功能,并能設計一些簡單的功能。2. 學會用VHDL語言來設計一些基本的邏輯模塊。3. 了解時序邏輯的設計方式,并運用在密碼鎖的設計上。4. 精通數(shù)字編碼,AD/DA方式在程序中的運作方式。
2、5. 狀態(tài)機的使用,實現(xiàn)密碼比對和儲存讀取功能。三、原始資料1. CPLD/FPGA設計及應用實驗指導書 -馬玲;2. CPLD/FPGA設計及應用馬玲,彭敏;四、要求的設計成果1. 熟練運用QuartusII來設計邏輯時序的模塊;2. 熟悉設計一個成果的過程;3. 更深一步的學習VHDL語言;4. 運用FPGA開發(fā)板設計數(shù)字密碼鎖,并具備消隱、設置密碼和三次報錯的功能。五、進程安排第1天:老師講解課程設計目的、意義,布置課題任務,學生分組選題。第2天:學生根據(jù)所選課題自己下去通過網(wǎng)絡或者其他途徑尋找課題相關設計資料。第3-7天:在實驗室或者自己的電腦上完成課題的程序以及相關的功能仿真通過。第
3、8天:在實驗室結合EDA實驗箱完成程序的調(diào)試以及功能的實現(xiàn)。第9天:通過老師的驗收并回答老師的提問。第10天:下去完成課程設計報告。六、主要參考資料1. CPLD/FPGA設計及應用實驗指導書 -馬玲;2. CPLD/FPGA設計及應用馬玲,彭敏;指導教師(簽名): 2016 年 4 月 10 日目 錄1課程設計目的52課程設計題目描述和要求 53課程設計報告內(nèi)容53.1設計思路及原理 53.2設計需要解決的問題 53.3設計過程 64總結115.附錄 124數(shù)字密碼鎖設計1. 課程設計目的l 設計一個四位十進制的密碼鎖。l 跟深一步的理解FPGA的用途,精通相應的開發(fā)板。2. 課程設計題目描
4、述和要求a) :密碼鎖串行輸入四位十進制數(shù)字口令b) :輸入口令全部正確即開鎖c) :口令輸入最大次數(shù)3次,要求在完全輸入四位之后進行判斷口令正確與否;輸入3次之后還不能開鎖,進入鎖死狀態(tài)d) 有相應的顯示功能e) 可以對輸入的口令消隱f) 開鎖后能再次上鎖3. 課程設計報告的內(nèi)容1) 設計思路及原理i. 密碼鎖原理利用邏輯電路將外接輸入的電信號轉(zhuǎn)化為時序電路,經(jīng)過內(nèi)部設定的規(guī)則,當輸入的信號經(jīng)過處理后的時序邏輯達到內(nèi)部設定的條件是開啟某一種狀態(tài)及時解鎖狀態(tài),當沒達到那種條件時始終保持一種或多種狀態(tài)。ii. 密碼鎖的設計要求 設計密碼鎖的系統(tǒng)描述:數(shù)字密碼鎖在設定口令和開鎖時要求輸入四位十進制
5、數(shù)據(jù),當輸入狀態(tài)開啟時,輸入正確顯示一種狀態(tài),如果錯誤則顯示錯誤次數(shù)加1,累計3次鎖死狀態(tài)并報警,如果不輸入則一直保持原來狀態(tài);當檢測到儲存狀態(tài)時,輸入密碼并存儲改變原有的儲存密碼;當檢測到消隱信號時,將不顯示輸入的數(shù)據(jù)。 2) 設計中需要解決的問題01. 時鐘掃描讀取輸入的信號:過小,還沒檢測到就進入下次判斷或者多記一次,過大,響應過慢,加上消斗模塊后容易引起碼間干擾不易讀取信號02. 密碼讀?。鹤x入按鍵開關信號要將信號處理編碼送入顯示和密碼比較狀態(tài)03. 密碼比較:首先是要將存入的數(shù)字進行存儲和邏輯排序,然后將輸入的數(shù)據(jù)進行一一比對,并進行計數(shù),正確與否輸出狀態(tài)信號04. 顯示模塊:將輸入
6、模式、開鎖狀態(tài)、密碼存儲狀態(tài)和鎖死狀態(tài)等的顯示狀態(tài)顯示的編碼05. 開發(fā)板引腳的配置等3) 設計過程l 密碼鎖的系統(tǒng)描述a) 輸入輸出端口定義:Sdin:輸入十進制數(shù)信號按鍵(由于按鍵不夠,將09數(shù)據(jù)以按鍵按下次數(shù)來編譯)Lock:上鎖按鍵Sec:解鎖按鍵Clr:確認按鍵Set:密碼存儲按鍵Crack:開鎖狀態(tài)按鍵Clk:輸入數(shù)字確定按鍵Dout:送現(xiàn)輸出信號端Yn:選碼信號S3鎖死b) 系統(tǒng)狀態(tài)轉(zhuǎn)換圖S2錯誤S1解鎖 錯誤 累計次數(shù)=3 解鎖 錯誤次數(shù)3S0初始S4開鎖 密碼正確設置 上鎖c) 編碼規(guī)則輸入信號編碼信號邏輯意義000011000000數(shù)字“0”000111111001數(shù)字“1
7、”001010100100數(shù)字“2”001110110000數(shù)字“3”010010011011數(shù)字“4”010110010010數(shù)字“5”011010000010數(shù)字“6”011111111000數(shù)字“7”100010000000數(shù)字“8”100110010000數(shù)字“9”101011101111解鎖成功“A”101101111111解鎖失敗Others11111111其他狀態(tài)01-11000000上鎖狀態(tài)10-00011000解鎖狀態(tài)l 時鐘模塊 由于輸入時鐘是50MHZ,一般掃描頻率一般1000HZ左右,過50分頻得到1M的頻率后經(jīng)過后續(xù)得到兩路時鐘來分別接入按鍵和比對模塊。l 輸入設置輸
8、入模塊,由于進行消斗處理用D觸發(fā)器來消抖動,將輸入的信號送入輸出,時序時鐘推遲一個周期。l 計數(shù)模塊和按鍵累積計數(shù)將輸入的信號進行A/D轉(zhuǎn)換,根據(jù)確認按鍵的輸入來計數(shù)時序,將輸入的3個數(shù)字按順序送入下個模塊;計數(shù)模塊達到3次輸出alert報警。l 編碼和處理模塊將輸入的十進制信號轉(zhuǎn)化成斷碼,將時序邏輯進行編碼來選碼管。l 選碼模塊將時序信號進行編碼。4) 設計得到的成果及現(xiàn)象l 得到的總體結構:l 引腳配置:l 實物圖:1. 初始狀態(tài):2. 解鎖狀態(tài):3. 上鎖狀態(tài):4. 總結l 在這次課設中雖然遇到很多麻煩,剛剛開始用自己的方法編寫了個簡單的密碼比對,但缺乏很多功能,而且在消斗方面很不完善,
9、容易屬錯誤,現(xiàn)象出不來,后來網(wǎng)上搜了一個,但由于時鐘沒有完善,所以出錯,后來看懂了也可以調(diào),但各個模塊的時鐘不一,所以難以完善,后來看了指導書上才做出來。l 在VHDL語言上有了很大的完善和提高,對基本的設計都應該沒問題了,但還需要努力。l 在設計過程中需要細心、冷靜。5. 附頁(程序)50分頻:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity PIN1M isport(clkin:in std_logic; clkout:out std_logic);end entity PIN1M
10、;architecture bj of PIN1M isbeginprocess(clkin)variable cnttemp : INTEGER RANGE 0 To 49;begin if clkinevent and clkin=1 then if cnttemp=49 then cnttemp:=0; else if cnttemp25 then clkout=1; else clkout=0;end if;cnttemp:=cnttemp+1; end if; end if;end process;end bj;時鐘分頻:library ieee;use ieee.std_logic
11、_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity fdiv isport(clk:in std_logic; divout:out std_logic);end entity fdiv;architecture bj of fdiv issignal d:std_logic_vector(3 downto 0);signal o: std_logic;beginprocess(clk)begin if clkevent and clk=1 then if d=1001 then d=000
12、0;o=not o; else d=d+1; end if; divout=o; end if;end process;end bj;觸發(fā)器:LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY Dchu IS PORT (trig,sdin,lock,sec,clr,set,crack:IN STD_LOGIC; sdin1,lock1,sec1,clr1,set1,crack1:OUT STD_LOGIC); END; ARCHITECTURE FFQ OF Dchu IS SIGNAL Q1,Q2,Q3,Q4,Q5,Q6:STD_LOGIC;
13、 BEGIN PROCESS (Q1,Q2,Q3,Q4,Q5,Q6,trig) BEGIN IF trigEVENT AND trig=1 THEN Q1=sdin; Q2=lock; Q3=sec; Q4=clr; Q5=set; Q6=crack; END IF; END PROCESS; sdin1=Q1; lock1=Q2; sec1=Q3; clr1=Q4; set1=Q5; crack1=Q6; END FFQ;編碼計數(shù)模塊:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity
14、 s_pw isport(SDIN:in std_logic; trig:in std_logic; lock:in std_logic; sec:in std_logic; CR:in std_logic; SET:in std_logic; CRACK:in std_logic; din:out INTEGER RANGE 15 DOWNTO 0; n_err:out std_logic_vector(1 downto 0); n_cr:out std_logic_vector(1 downto 0); ALERT:out std_logic; lock_out:out std_logic
15、; sc:out std_logic; dead_lock:out std_logic);end entity s_pw;architecture bj of s_pw issignal pW_reg0:INTEGER RANGE 15 DOWNTO 0;signal pW_reg1:INTEGER RANGE 15 DOWNTO 0;signal pW_reg2:INTEGER RANGE 15 DOWNTO 0;signal pW_reg3:INTEGER RANGE 15 DOWNTO 0;signal pc_reg0:INTEGER RANGE 15 DOWNTO 0;signal p
16、c_reg1:INTEGER RANGE 15 DOWNTO 0;signal pc_reg2:INTEGER RANGE 15 DOWNTO 0;signal pc_reg3:INTEGER RANGE 15 DOWNTO 0;signal data_cnt:INTEGER RANGE 15 DOWNTO 0;signal cr_cnt: std_logic_vector(1 downto 0);signal err_cnt: std_logic_vector(1 downto 0);signal tag: std_logic;signal sb: std_logic;signal bff:
17、INTEGER RANGE 15 DOWNTO 0;beginprocess(trig)beginif trigevent and trig=1 then if sec=0 then sb=not sb;sc=sb;end if; if lock=0 then lock_out=0;end if; if tag=1 then din=11; else if SDIN=0 then din=data_cnt; if data_cnt=9 then data_cnt=0; else data_cntpW_reg0=data_cnt;cr_cntpW_reg1=data_cnt;cr_cntpW_r
18、eg2=data_cnt;cr_cntpW_reg3=data_cnt;cr_cnt=cr_cnt+1;lock_outpw_reg0pc_reg0=data_cnt;cr_cntpc_reg1=data_cnt;cr_cntpc_reg2=data_cnt;cr_cntcr_cnt=cr_cnt+1; if(pc_reg0=pw_reg0) then if(pc_reg1=pw_reg1) then if(pc_reg2=pw_reg2) then if(data_cnt=pw_reg3) then din= 10;err_cnt=00; lock_out=1; else err_cnt=e
19、rr_cnt+1; end if; else err_cnt=err_cnt+1;end if; else err_cnt=err_cnt+1; end if; else err_cntALERTtagtagtagtag=1;ALERTtag=1;ALERT=1; end case; n_cr=cr_cnt; n_err=err_cnt; end if; dead_lock=tag;end process;end bj;編碼送顯:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity DIS
20、 isport(din:in std_logic_vector(3 downto 0); cr_cnt:in std_logic_vector(1 downto 0); err_cnt:in std_logic_vector(1 downto 0); set_crack:in std_logic_vector(1 downto 0); disclk:in std_logic; sec:in std_logic; lock:in std_logic; dout:out std_logic_vector(7 downto 0); encode:out std_logic_vector(2 down
21、to 0);end entity DIS;architecture bj of DIS issignal cnt:std_logic_vector(2 downto 0);signal c: std_logic;beginprocess(din,c,disclk)begin if disclkevent and disclk=1 then if cnt=100 then cnt =000;else cnt=cnt+1;end if;if cnt=000 then encodedoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdoutdout=1111111
22、1; end case;else dout=00000000; end if; else if cnt=001 then encodedoutdoutdoutdoutNULL; end case; else if cnt=010 then encode doutdoutdoutdoutNULL; end case; else if cnt=011 then encodedoutdoutdout=10111111; end case; else if cnt=100 then encode=100; if lock=0 then dout =00000001; else dout=11111111; end if; end if; end if; end if; end if; end if; end if;end process;process(sec)begin if secevent and sec=1 then c=not c; end if; end process;end bj;課程設計成績評定表成績評定項 目比例得 分平時成績(百分制記分)30%業(yè)務考核成績(百分制記分)70%總評成績(百分制記分)100%評定等級優(yōu) 良 中 及格 不及格指導教師(簽名):20 年 月 日23