CPLD_FPGA設(shè)計(jì)及應(yīng)用課程設(shè)計(jì)--數(shù)字密碼鎖.doc
CPLD/FPGA設(shè)計(jì)及應(yīng)用課程設(shè)計(jì)課程設(shè)計(jì)報(bào)告題 目: 數(shù)字密碼鎖 院 (系): 信息科學(xué)與工程學(xué)院 專業(yè)班級: xxxxxxxx 學(xué)生姓名: xxxxx 學(xué) 號: xxxxxxxxxx 指導(dǎo)教師: xxxx 20 16年 4 月 11 日至20 16 年 5 月 6 日武昌首義學(xué)院制CPLD/FPGA設(shè)計(jì)及應(yīng)用課程設(shè)計(jì)任務(wù)書一、設(shè)計(jì)題目數(shù)字密碼鎖。二、設(shè)計(jì)主要內(nèi)容1. 掌握睿智FPGA開發(fā)板的基本構(gòu)造和功能,并能設(shè)計(jì)一些簡單的功能。2. 學(xué)會用VHDL語言來設(shè)計(jì)一些基本的邏輯模塊。3. 了解時(shí)序邏輯的設(shè)計(jì)方式,并運(yùn)用在密碼鎖的設(shè)計(jì)上。4. 精通數(shù)字編碼,AD/DA方式在程序中的運(yùn)作方式。5. 狀態(tài)機(jī)的使用,實(shí)現(xiàn)密碼比對和儲存讀取功能。三、原始資料1. CPLD/FPGA設(shè)計(jì)及應(yīng)用實(shí)驗(yàn)指導(dǎo)書 -馬玲;2. CPLD/FPGA設(shè)計(jì)及應(yīng)用馬玲,彭敏;四、要求的設(shè)計(jì)成果1. 熟練運(yùn)用QuartusII來設(shè)計(jì)邏輯時(shí)序的模塊;2. 熟悉設(shè)計(jì)一個(gè)成果的過程;3. 更深一步的學(xué)習(xí)VHDL語言;4. 運(yùn)用FPGA開發(fā)板設(shè)計(jì)數(shù)字密碼鎖,并具備消隱、設(shè)置密碼和三次報(bào)錯(cuò)的功能。五、進(jìn)程安排第1天:老師講解課程設(shè)計(jì)目的、意義,布置課題任務(wù),學(xué)生分組選題。第2天:學(xué)生根據(jù)所選課題自己下去通過網(wǎng)絡(luò)或者其他途徑尋找課題相關(guān)設(shè)計(jì)資料。第3-7天:在實(shí)驗(yàn)室或者自己的電腦上完成課題的程序以及相關(guān)的功能仿真通過。第8天:在實(shí)驗(yàn)室結(jié)合EDA實(shí)驗(yàn)箱完成程序的調(diào)試以及功能的實(shí)現(xiàn)。第9天:通過老師的驗(yàn)收并回答老師的提問。第10天:下去完成課程設(shè)計(jì)報(bào)告。六、主要參考資料1. CPLD/FPGA設(shè)計(jì)及應(yīng)用實(shí)驗(yàn)指導(dǎo)書 -馬玲;2. CPLD/FPGA設(shè)計(jì)及應(yīng)用馬玲,彭敏;指導(dǎo)教師(簽名): 2016 年 4 月 10 日目 錄1課程設(shè)計(jì)目的52課程設(shè)計(jì)題目描述和要求 53課程設(shè)計(jì)報(bào)告內(nèi)容53.1設(shè)計(jì)思路及原理 53.2設(shè)計(jì)需要解決的問題 53.3設(shè)計(jì)過程 64總結(jié)115.附錄 124數(shù)字密碼鎖設(shè)計(jì)1. 課程設(shè)計(jì)目的l 設(shè)計(jì)一個(gè)四位十進(jìn)制的密碼鎖。l 跟深一步的理解FPGA的用途,精通相應(yīng)的開發(fā)板。2. 課程設(shè)計(jì)題目描述和要求a) :密碼鎖串行輸入四位十進(jìn)制數(shù)字口令b) :輸入口令全部正確即開鎖c) :口令輸入最大次數(shù)3次,要求在完全輸入四位之后進(jìn)行判斷口令正確與否;輸入3次之后還不能開鎖,進(jìn)入鎖死狀態(tài)d) 有相應(yīng)的顯示功能e) 可以對輸入的口令消隱f) 開鎖后能再次上鎖3. 課程設(shè)計(jì)報(bào)告的內(nèi)容1) 設(shè)計(jì)思路及原理i. 密碼鎖原理利用邏輯電路將外接輸入的電信號轉(zhuǎn)化為時(shí)序電路,經(jīng)過內(nèi)部設(shè)定的規(guī)則,當(dāng)輸入的信號經(jīng)過處理后的時(shí)序邏輯達(dá)到內(nèi)部設(shè)定的條件是開啟某一種狀態(tài)及時(shí)解鎖狀態(tài),當(dāng)沒達(dá)到那種條件時(shí)始終保持一種或多種狀態(tài)。ii. 密碼鎖的設(shè)計(jì)要求 設(shè)計(jì)密碼鎖的系統(tǒng)描述:數(shù)字密碼鎖在設(shè)定口令和開鎖時(shí)要求輸入四位十進(jìn)制數(shù)據(jù),當(dāng)輸入狀態(tài)開啟時(shí),輸入正確顯示一種狀態(tài),如果錯(cuò)誤則顯示錯(cuò)誤次數(shù)加1,累計(jì)3次鎖死狀態(tài)并報(bào)警,如果不輸入則一直保持原來狀態(tài);當(dāng)檢測到儲存狀態(tài)時(shí),輸入密碼并存儲改變原有的儲存密碼;當(dāng)檢測到消隱信號時(shí),將不顯示輸入的數(shù)據(jù)。 2) 設(shè)計(jì)中需要解決的問題01. 時(shí)鐘掃描讀取輸入的信號:過小,還沒檢測到就進(jìn)入下次判斷或者多記一次,過大,響應(yīng)過慢,加上消斗模塊后容易引起碼間干擾不易讀取信號02. 密碼讀?。鹤x入按鍵開關(guān)信號要將信號處理編碼送入顯示和密碼比較狀態(tài)03. 密碼比較:首先是要將存入的數(shù)字進(jìn)行存儲和邏輯排序,然后將輸入的數(shù)據(jù)進(jìn)行一一比對,并進(jìn)行計(jì)數(shù),正確與否輸出狀態(tài)信號04. 顯示模塊:將輸入模式、開鎖狀態(tài)、密碼存儲狀態(tài)和鎖死狀態(tài)等的顯示狀態(tài)顯示的編碼05. 開發(fā)板引腳的配置等3) 設(shè)計(jì)過程l 密碼鎖的系統(tǒng)描述a) 輸入輸出端口定義:Sdin:輸入十進(jìn)制數(shù)信號按鍵(由于按鍵不夠,將09數(shù)據(jù)以按鍵按下次數(shù)來編譯)Lock:上鎖按鍵Sec:解鎖按鍵Clr:確認(rèn)按鍵Set:密碼存儲按鍵Crack:開鎖狀態(tài)按鍵Clk:輸入數(shù)字確定按鍵Dout:送現(xiàn)輸出信號端Yn:選碼信號S3鎖死b) 系統(tǒng)狀態(tài)轉(zhuǎn)換圖S2錯(cuò)誤S1解鎖 錯(cuò)誤 累計(jì)次數(shù)=3 解鎖 錯(cuò)誤次數(shù)3S0初始S4開鎖 密碼正確設(shè)置 上鎖c) 編碼規(guī)則輸入信號編碼信號邏輯意義000011000000數(shù)字“0”000111111001數(shù)字“1”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 時(shí)鐘模塊 由于輸入時(shí)鐘是50MHZ,一般掃描頻率一般1000HZ左右,過50分頻得到1M的頻率后經(jīng)過后續(xù)得到兩路時(shí)鐘來分別接入按鍵和比對模塊。l 輸入設(shè)置輸入模塊,由于進(jìn)行消斗處理用D觸發(fā)器來消抖動,將輸入的信號送入輸出,時(shí)序時(shí)鐘推遲一個(gè)周期。l 計(jì)數(shù)模塊和按鍵累積計(jì)數(shù)將輸入的信號進(jìn)行A/D轉(zhuǎn)換,根據(jù)確認(rèn)按鍵的輸入來計(jì)數(shù)時(shí)序,將輸入的3個(gè)數(shù)字按順序送入下個(gè)模塊;計(jì)數(shù)模塊達(dá)到3次輸出alert報(bào)警。l 編碼和處理模塊將輸入的十進(jìn)制信號轉(zhuǎn)化成斷碼,將時(shí)序邏輯進(jìn)行編碼來選碼管。l 選碼模塊將時(shí)序信號進(jìn)行編碼。4) 設(shè)計(jì)得到的成果及現(xiàn)象l 得到的總體結(jié)構(gòu):l 引腳配置:l 實(shí)物圖:1. 初始狀態(tài):2. 解鎖狀態(tài):3. 上鎖狀態(tài):4. 總結(jié)l 在這次課設(shè)中雖然遇到很多麻煩,剛剛開始用自己的方法編寫了個(gè)簡單的密碼比對,但缺乏很多功能,而且在消斗方面很不完善,容易屬錯(cuò)誤,現(xiàn)象出不來,后來網(wǎng)上搜了一個(gè),但由于時(shí)鐘沒有完善,所以出錯(cuò),后來看懂了也可以調(diào),但各個(gè)模塊的時(shí)鐘不一,所以難以完善,后來看了指導(dǎo)書上才做出來。l 在VHDL語言上有了很大的完善和提高,對基本的設(shè)計(jì)都應(yīng)該沒問題了,但還需要努力。l 在設(shè)計(jì)過程中需要細(xì)心、冷靜。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;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;時(shí)鐘分頻:library ieee;use ieee.std_logic_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=0000;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; 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;編碼計(jì)數(shù)模塊:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity 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; 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 pc_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: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_reg2=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=err_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 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 downto 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=11111111; 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;課程設(shè)計(jì)成績評定表成績評定項(xiàng) 目比例得 分平時(shí)成績(百分制記分)30%業(yè)務(wù)考核成績(百分制記分)70%總評成績(百分制記分)100%評定等級優(yōu) 良 中 及格 不及格指導(dǎo)教師(簽名):20 年 月 日23