【正文】
SIGNAL C: STD_LOGIC_VECTOR(2 DOWNTO 0)。 鍵盤輸入去抖后的寄存器 SIGNAL N , F: STD_LOGIC_VECTOR(3 DOWNTO 0)。 數(shù)字、功能按鍵譯碼值的寄存器 SIGNAL FN , FF: STD_LOGIC 。 數(shù)字、功能按鍵標(biāo)志值數(shù)字、功能按鍵 SIGNAL SEL: STD_LOGIC_VECTOR (3 DOWNTO 0) 。 BEGIN 內(nèi)部連接 DATA_N = N 。 DATA_F = F 。 FLAG_N = FN 。 FLAG_F = FF 。 CLK_CTR = CLK 。 掃描信號(hào)發(fā)生器 COUNTER : BLOCK IS SIGNAL Q: STD_LOGIC_VECTOR(5 DOWNTO 0)。 SIGNAL SEL: STD_LOGIC_VECTOR(3 DOWNTO 0)。 1110110110110111BEGINCLK_DEBOUNCE=C_DEBOUNCE。 PROCESS(CLK_1K)ISBEGINIF CLK_1K39。EVENT AND CLK_1K = 39。139。 THEN Q = Q+1。END IF。C_DEBOUNCE = Q(2) 。 去抖時(shí)鐘信號(hào), 大約125Hz C_KEYBOARD = Q(5 DOWNTO 4) 。 產(chǎn)生鍵掃信號(hào)***00011011, 大約32HzC_DEBOUNCE = Q(1) 。 仿真時(shí)用 C_KEYBOARD = Q(5 DOWNTO 4) 。 仿真時(shí)用CLK = Q(0) 。 END PROCESS。 SEL = 1110 WHEN C_KEYBOARD=0 ELSE 1101 WHEN C_KEYBOARD=1 ELSE 1011 WHEN C_KEYBOARD=2 ELSE 0111 WHEN C_KEYBOARD=3 ELSE 1111。 CLK_SCAN = SEL 。 END BLOCK COUNTER 。 鍵盤去抖DEBOUNUING : BLOCK ISBEGINU1: DEBOUNCING PORT MAP (D_IN = KEY_IN(0) , D_OUT = C(0), CLK = C_DEBOUNCE)。 U2: DEBOUNCING PORT MAP (D_IN = KEY_IN(1) , D_OUT = C(1), CLK = C_DEBOUNCE)。 U3: DEBOUNCING PORT MAP (D_IN = KEY_IN(2) , D_OUT = C(2), CLK = C_DEBOUNCE)。 END BLOCK DEBOUNUING 。 鍵盤譯碼KEY_DECODER : BLOCK IS SIGNAL Z : STD_LOGIC_VECTOR(4 DOWNTO 0) 。 按鍵位置 BEGIN PROCESS(CLK) BEGIN Z = C_KEYBOARD amp。 C 。 IF CLK39。EVENT AND CLK = 39。139。 THENCASE Z IS WHEN 11101 = N = 0000 。 0 WHEN 00011 = N = 0001 。 1 WHEN 00101 = N = 0010 。 2 WHEN 00110 = N = 0011 。 3 WHEN 01011 = N = 0100 。 4 WHEN 01101 = N = 0101 。 5 WHEN 01110 = N = 0110 。 6 WHEN 10011 = N = 0111 。 7 WHEN 10101 = N = 1000 。 8 WHEN 10110 = N = 1001 。 9 WHEN OTHERS = N = 1111 。 END CASE 。 END IF 。 IF CLK39。EVENT AND CLK = 39。139。 THEN CASE Z IS WHEN 11011 = F = 0100 。 *_LOCK WHEN 11110 = F = 0001 。 _UNLOCK WHEN OTHERS = F = 1000 。 END CASE 。 END IF 。 END PROCESS 。 FN = NOT ( N(3) AND N(2) AND N(1) AND N(0) ) 。 FF = F(2) OR F(0) 。 END BLOCK KEY_DECODER 。 END ARCHITECTURE ART。 密碼鎖控制電路的VHDL源程序 圖53 控制電路框圖LIBRARY IEEE。 USE 。 USE 。 USE 。 ENTITY CTRL ISPORT (DATA_N: IN STD_LOGIC_VECTOR(3 DOWNTO 0)。 DATA_F: IN STD_LOGIC_VECTOR(3 DOWNTO 0)。 FLAG_N: IN STD_LOGIC。 FLAG_F: IN STD_LOGIC。 CLK: IN STD_LOGIC。 ALERT:OUT STD_LOGIC。 報(bào)警端口 ENLOCK: OUT STD_LOGIC。 1: LOCK 上鎖, 0: UNLOCK打開(kāi) DATA_BCD: OUT STD_LOGIC_VECTOR (15 DOWNTO 0))。 END ENTITY CTRL 。 ARCHITECTURE ART OF CTRL IS SIGNAL ACC, REG: STD_LOGIC_VECTOR (15 DOWNTO 0)。 ACC用于暫存鍵盤輸入的信息,REG用于存儲(chǔ)輸入的密碼 SIGNAL NC: STD_LOGIC_VECTOR (2 DOWNTO 0)。 SIGNAL RR2, CLR, BB, QA, QB: STD_LOGIC。 SIGNAL CNT:STD_LOGIC_VECTOR(1 DOWNTO 0)。 SIGNAL R1, R0: STD_LOGIC。 BEGIN寄存器清零信號(hào)的產(chǎn)生進(jìn)程 PROCESS(CLK) BEGIN IF CLK39。EVENT AND CLK=39。139。 THEN R1=R0。 R0=FLAG_F。 END IF。 RR2=R1 AND NOT R0。 CLR=RR2。 END PROCESS。 按鍵輸入數(shù)據(jù)的存儲(chǔ)、清零進(jìn)程 KEYIN_PROCESS : BLOCK IS SIGNAL RST, D0, D1: STD_LOGIC 。 BEGIN RST = RR2。 PROCESS(FLAG_N, RST) IS BEGIN IF RST = 39。139。 THEN ACC = 0000000000000000 。 CLEAR INPUT NC = 000 。 ELSE IF FLAG_N39。EVENT AND FLAG_N = 39。139。 THEN IF NC 4 THEN ACC = ACC(11 DOWNTO 0) amp。 DATA_N 。 NC = NC + 1 。 END IF。 END IF 。 END IF 。 END PROCESS 。 END BLOCK KEYIN_PROCESS 。 上鎖/開(kāi)鎖控制進(jìn)程 PROCESS(CLK, DATA_F) IS BEGIN IF (CLK39。EVENT AND CLK = 39。139。) THEN IF NC = 4 THEN IF DATA_F(2) = 39。139。 THEN 上鎖控制信號(hào)有效 (0100) REG = ACC 。 密碼存儲(chǔ) QA = 39。139。 。 QB = 39。039。 ELSIF DATA_F(0) = 39。139。 THEN 開(kāi)鎖控制信號(hào)有效 (0001) IF REG = ACC THEN 密碼核對(duì) QA= 39。039。 QB = 39。139。 。 ELSE IF CNT=11 THEN ALERT=39。139。 CNT=00。 ELSE CNT= CNT+1。 QA= 39。139。 QB = 39。039。 。 ALERT=39。039。 END IF。 END IF。 ELSIF ACC = 1000100010001000 THEN 設(shè)置8888為萬(wàn)用密碼 QA = 39。039。 。 QB= 39。139。 END IF 。 END IF。 END IF 。 END PROCESS 。 輸出上鎖/開(kāi)鎖控制信號(hào) ENLOCK = QA AND NOT QB 。 輸出顯示信息 DATA_BCD= ACC 。 END ARCHITECTURE ART。注:程序中使用語(yǔ)句“ACC = ACC(11 DOWNTO 0) amp。 DATA_N”非常簡(jiǎn)潔地同時(shí)實(shí)現(xiàn)了ACC中的低4位用DATA_N進(jìn)行更新,而高12位用ACC中原來(lái)的低12位左移而來(lái)的處理。 密碼鎖顯示電路的VHDL源程序 圖54 顯示譯碼器框圖 LIBRARY IEEE 。USE 。ENTITY DECL7S ISPORT ( DATA_BCD : IN STD_LOGIC_VECTOR(3 DOWNTO 0)。 BCD碼輸入信號(hào)LED7S : OUT STD_LOGIC_VECTOR(6 DOWNTO 0) ) 。 七段譯碼輸出信號(hào)END 。ARCHITECTURE ART OF DECL7S ISBEGINPROCESS(DATA_BCD)BEGINCASE DATA_BCD ISWHEN 0000 = LED7S = 0111111 。WHEN 0001 = LED7S = 0000110 。WHEN 0010 = LED7S = 1011011 。WHEN 0011 = LED7S = 1001111 。WHEN 0100 = LED7S = 1100110 。WHEN 0101 = LED7S = 1101101 。WHEN 0110 = LED7S = 1111101 。WHEN 0111 = LED7S = 0000111 。WHEN 1000 = LED7S = 1111111 。WHEN 1001 = LED7S = 1101111 。WHEN OTHERS = LED7S = 0000000 。END CASE 。END PROCESS 。END ARCHITECTURE ART。第6章 系統(tǒng)仿真分析及硬件驗(yàn)證 系統(tǒng)仿真分析 鍵盤輸入去抖電路的仿真圖61為鍵盤輸入去抖電路的仿真結(jié)果圖,圖中的輸出信號(hào)0,1,D_OUT1,DD0,DD1是為便于仿真時(shí)觀察中間結(jié)果而增加的觀測(cè)點(diǎn)的輸出,調(diào)試好后程序中的相應(yīng)語(yǔ)句會(huì)注釋掉。由圖上可以看出,原來(lái)的彈跳現(xiàn)象經(jīng)過(guò)鍵盤輸入去抖電路處理后已經(jīng)消除了,必須連續(xù)兩次取樣檢測(cè)到信號(hào)才會(huì)有反應(yīng),否則電路將其視為噪聲,不予理會(huì)。圖61 密碼鎖輸入電路的仿真圖62為密碼鎖輸入電路的仿真結(jié)果圖,圖中的輸出信號(hào)CLK_SCAN,CLK_DEBOUNCE是為便于仿真時(shí)觀察中間結(jié)果而增加的觀測(cè)點(diǎn)的輸出,調(diào)試好后程序中的相應(yīng)語(yǔ)句應(yīng)注釋掉。圖62 密碼鎖輸入電路仿真結(jié)果圖為便于觀測(cè)有關(guān)結(jié)果,仿真時(shí)假設(shè)CLK_1K為512Hz,相應(yīng)地,程序中的有關(guān)語(yǔ)句改為“C_DEBOUNCE = Q(1) ;C_KEYBOARD = Q(5 DOWNTO 4)”。從仿真圖上可以看出,CLK_CTR(即Q(0))為CLK_1K的2分頻,為256Hz;CLK _DEBOUNCE(即Q(1))為CLK_1K的22分頻,為128Hz;CLK_SCAN(即Q(5 DOWNTO 4))為CLK_1K的25分頻,為16Hz。同時(shí)當(dāng)CLK_SCAN、KEY_IN為1101011時(shí)對(duì)應(yīng)的按鍵為數(shù)字“4”,F(xiàn)LAG_N變?yōu)楦唠娖?,DATA_N則輸出數(shù)字H4,即B0