【文章內(nèi)容簡介】
1 2 3 4 5 6ABCD654321DCBAT i t l eN um be r R e vi s i o nS iz eBD a t e : 6 M a y 20 10 S h e e t of F il e : F :\ by\ M yD e s i g db D r a w n B y:c l k _ sc a nk e y d r v [ 4 . . . 0 ]k e y sa ni n st 圖 外部接口圖 圖 波形仿真圖 鍵盤譯碼電路 鍵盤譯碼電路是從 keydrv4 到 keydrv0 和 keyin5 到 keyin0 信號(hào)中譯碼出按鍵鍵值的電路。按鍵標(biāo)志產(chǎn)生電路是產(chǎn)生按鍵標(biāo)志信號(hào) keypressed 的電路,其外部接口如圖 所示。其中 clk 為全局時(shí)鐘信號(hào),它是由 FPGA 芯片的外部晶振給出的。 clk 在系統(tǒng)中的頻率是最高,其他時(shí)鐘都由它分頻產(chǎn)生。 keydrv 為鍵盤掃描信號(hào), keyin 為鍵 盤輸入信號(hào),keypressed 表示有一個(gè)按鍵被按下,每發(fā)生一次按鍵動(dòng)作, keypressed 就輸出一個(gè)寬度為全局時(shí)鐘周期的正脈沖。該信號(hào)用于與其他模塊一起,負(fù)責(zé)通知其他模塊鍵盤上有按鍵發(fā)生。其他模塊在 keyypressed 有效時(shí),可以讀取鍵值。 程序如下: library IEEE。 第 18 頁 共 41 頁 use 。 use 。 entity keydecoder is port( keyin:in std_logic_vector(5 downto 0)。 鍵盤輸入 keydrv:in std_logic_vector(4downto 0)。 掃描信號(hào) clk:in std_logic。 全局時(shí)鐘 clk_scan: in std_logic。 掃描時(shí)鐘 c_u1,c_u2,c_u3,c_u4,c_u5,c_u6,c_u7,c_u8,c_u9:out std_logic。 輸出值 c_d2,c_d3,c_d4,c_d5,c_d6 ,c_d7, c_d8, c_d9, c_d10:out std_logic。 d1,d2,d3,d4,d5,d6,d7,d8,d9,d10:out std_logic。 quick,clr:out std_logic。 keypressed: out std_logic)。 有鍵被按下標(biāo)志 end keydecoder。 architecture rt1 of keydecoder is signal temp:std_logic_vector(10downto 0)。 temp= keyinamp。keydrv signal temp_pressed:std_logic。 用于產(chǎn)生 keypressed signal q1,q2,q3,q4,q5,q6,q7,q8,q9,q10:std_logic。 10 個(gè)寄存器 signal keypressed_asy:std_logic。 同步化的 keypressed begin temp=keydrvamp。keyin。 process(temp) 譯碼進(jìn)程 begin case temp is when 11110111110=c_u1=39。139。 temp_pressed=39。139。 when 11110111101=c_u2=39。139。 temp_pressed=39。139。 when 11110111011=c_u3=39。139。 temp_pressed=39。139。 when 11110110111=c_u4=39。139。 第 19 頁 共 41 頁 temp_pressed=39。139。 when 11110101111=c_u5=39。139。 temp_pressed=39。139。 when 11110111111= c_u6=39。139。 temp_pressed=39。139。 when 11101111110= c_u7=39。139。 temp_pressed=39。139。 when 11101111101= c_u8=39。139。 temp_pressed=39。139。 when 11101111011= c_u9=39。139。 temp_pressed=39。139。 when 11101110111=c_d2=39。139。 temp_pressed=39。139。 when 11101101111= c_d3=39。139。 temp_pressed=39。139。 when 11101011111= c_d4=39。139。 temp_pressed=39。139。 when 11011111110= c_d5=39。139。 temp_pressed=39。139。 when 11011111101= c_d6=39。139。 temp_pressed=39。139。 when 11011111011= c_d7=39。139。 temp_pressed=39。139。 when 11011110111= c_d8=39。139。 temp_pressed=39。139。 when 11011101111= c_d9=39。139。 temp_pressed=39。139。 when 11011011111= c_d10=39。139。 temp_pressed=39。139。 when 10111111110=d1=39。139。 第 20 頁 共 41 頁 temp_pressed=39。139。 when 10111111101=d2=39。139。 temp_pressed=39。139。 when 10111111011=d3=39。139。 temp_pressed=39。139。 when 10111110111=d4=39。139。 temp_pressed=39。139。 when 10111101111=d5=39。139。 temp_pressed=39。139。 when 10111011111=d6=39。139。 temp_pressed=39。139。 when 01111111110=d7=39。139。 temp_pressed=39。139。 when 01111111101=d8=39。139。 temp_pressed=39。139。 when 01111111011=d9=39。139。 temp_pressed=39。139。 when 01111110111=d10=39。139。 temp_pressed=39。139。 when 01111101111=quick=39。139。 temp_pressed=39。139。 when 01111011111=clr=39。139。 temp_pressed=39。139。 when others= temp_pressed=39。039。 end case。 end process。 process(clk_scan) 按鍵標(biāo)志產(chǎn)生電路 begin if(clk_scan39。event and clk_scan=39。139。) then 第 21 頁 共 41 頁 q1=temp_pressed。 q2=q1。 q3=q2。 q4=q3。 q5=q4。 q6=q5。 q7=q6。 q8=q7。 end if。 keypressed_asy=q1 or q2 or q3 or q4 or q5 or q6 or q7 or q8。 end process。 process(clk) 同步化 keypressed_asy begin if(clk39。event and clk=39。139。) then q9=keypressed_asy。 q10=q9。 end if。 keypressed=q9 and not(q10)。 end process。 end rt1。 輸入信號(hào) clk_scan,它是用于產(chǎn)生掃描信號(hào)的時(shí)鐘,周期為 10ms。按鍵信號(hào)temp_pressed 首先通過 clk_scan 信號(hào)的上升沿采樣。通過采樣后,抖動(dòng)噪聲被消除。采樣后的信號(hào)被分別延遲 1到 8個(gè) clk_scan周期得到 8個(gè)信號(hào) q1,q2,q3和 q4 ,q5, q6, q7, q8,。這 8 個(gè)信號(hào)進(jìn)行或運(yùn)算得到一個(gè)寬約 160ms 并且與全局時(shí)鐘異步的按鍵信號(hào)keypressed_asy。原來程序中一個(gè)長時(shí)間的按鍵過程有可能會(huì)被認(rèn)為是多次按鍵,通過這種方法使得一個(gè)長時(shí)間的按鍵仍然被認(rèn)為是一次按鍵。 第 22 頁 共 41 頁 k e y in [ 5 . . 0 ]1k e y d r y [ 4 . . 0 ]2c lk3c lk _ s c a n4c _ u 15c _ u 26c _ u 37c _ u 48c _ u 59c _ u 610c _ u 711c _ u 812c _ u 913c _ d 214c _ d 315c _ d 416c _ d 517c _ d 618c _ d 719c _ d 820c _ d 921c _ d 1 022d123d224d325d426d527d628d729d830d931d 1 032q u i c k33c lr34k e y p r e s s e d35k e yd e c o de ri n s t 圖 外部接口圖 時(shí)鐘產(chǎn)生電路 時(shí)鐘產(chǎn)生電路 是用用于產(chǎn)生掃描時(shí)鐘的,它的輸出提供給鍵盤掃描電路和按鍵標(biāo)志產(chǎn)生電路,其外部接口如圖 所示。它的輸入是全局時(shí)鐘,在這里假設(shè)全局時(shí)鐘頻率為32MHz。他的輸出是周期為 100ms 的掃描時(shí)鐘。 第 23 頁 共 41 頁 程序如下: library IEEE。 use 。 use 。 entity clk_gen is port(clk:in std_logic。 全局時(shí)鐘 clk_scan:out std_logic)。 掃描時(shí)鐘 end clk_gen。 architecture rt1 of clk_gen is signal t:integer range 0 to 199。 做程序仿真時(shí),用這個(gè)語句 begin process(clk) 計(jì)數(shù)模塊 begin if(clk39。event and clk=39。139。) then if(t=t39。high) then t=0。 else t=t+1。 end if。 end if。 end process。 process(t,clk) 譯碼輸出 begin if(clk39。event and clk=39。139。) then 寄存器鎖存輸出,目的消除波形上的“毛刺”(小的抖動(dòng)) if t=t39。high/2 then clk_scan=39。139。 else clk_scan=39。039。 end if。 第 24 頁 共 41 頁 end if。 end process。 end rt1。 該程序主要包