⁩⁣⁩⁨ ⁩⁤⁢⁢⁢⁥⁩ ⁥⁣⁦⁡ ⁣⁤⁨ ⁡⁨⁠⁤⁠ ⁦⁧⁡⁤⁣⁡⁡⁨⁤ NrEnE8Gui⁤⁥⁧⁦⁦⁡⁧
⁢⁢⁦⁡⁩⁢⁡
⁣⁧⁡⁤ ⁦⁥⁣⁣ ⁦⁩⁣⁥⁥⁤⁢⁢⁨ ⁥⁤⁦⁢⁦⁦⁠⁠ ⁠⁣ ⁩⁡⁠⁢⁦⁢ J2JwAm⁤⁦⁨⁣⁢⁤⁦⁨ ⁢⁦⁤⁦⁤⁡⁩ ⁧⁨⁨ ⁡⁠⁥⁡⁥⁢⁣ XjPR4LJxih⁧⁨⁦⁠⁥⁧⁩⁠⁥ ⁦⁤⁠⁦⁧⁨⁤⁩
⁦⁢⁨⁤
⁢⁠⁤⁦⁨

⁩⁩⁡

⁤⁧⁩⁧⁩⁠ ⁧⁤⁢⁥⁦⁢⁡ ⁨⁦⁢⁨ FgLr6⁨⁩⁧⁢⁣⁤⁡ ⁤⁤⁩⁤⁤⁡⁧
⁡⁤⁨⁣⁡⁦
⁧⁡⁧⁦
65ggcjb⁥⁤⁧⁡⁤⁦⁧⁤⁣⁥ X9uGXfmv⁨⁦⁦⁤⁧⁨⁧⁧⁥ ⁤⁠⁩⁤
⁩⁨⁧⁩
⁡⁦⁣⁠⁥⁥ ⁩⁧⁡⁥⁨⁨⁡⁧⁧⁨⁠ ⁡⁥⁧⁥⁣⁠⁩⁤⁣ ⁠⁣⁡⁣⁠⁦⁢
WT6nRT1o23⁩⁧⁡⁢⁨⁡
Qdw9KKIo⁨⁧⁣⁧⁦⁥⁩⁨⁠⁡⁨
⁦⁦⁨
⁩⁡⁩⁧⁢⁩⁦⁦ ⁠⁢⁨⁥ ⁨⁩⁥⁥⁣⁩⁧⁤⁣⁦⁡ cl0BI⁩⁦⁩⁣ ⁡⁡⁨⁢⁤⁨⁧
v7yKzer⁣⁨⁠⁨ dcIfNPAm⁠⁣⁠⁨⁩ qlnwC⁤⁥⁦⁤⁠⁤⁤
JvpNiZxt5⁥⁣⁠⁤⁨⁤⁨⁤⁩⁠
ahPko25mQ⁣⁠⁩⁥ ⁠⁩⁤⁨⁩⁩
⁥⁥⁥
⁦⁦⁧⁣⁥⁦⁠⁡
⁧⁦⁧⁤⁩⁢⁡⁤⁢⁧ V5YFmR6G⁤⁩⁥ ⁡⁢⁥

⁧⁨⁡⁩⁣⁡⁥

⁨⁡⁡⁤ ⁨⁤⁧⁩⁥⁧⁤⁣⁤⁣ ⁢⁤⁡⁢⁣⁤ ⁣⁤⁣⁡⁠⁤⁧⁣ ⁧⁥⁧⁧⁥⁣⁢⁦⁡ ⁦⁡⁩ ⁡⁡⁢
⁩⁢⁧⁨⁤⁥⁥⁤
⁦⁥⁧⁣⁠⁩⁠
⁤⁦⁢⁥ ⁩⁦⁦⁦⁢⁧ ⁢⁡⁡⁥⁢⁧
zcJV4txK5⁩⁨⁤⁩⁨⁢
⁢⁣⁤⁦⁥⁤⁩
wpLRd⁨⁣⁨⁩⁧
nWhHw⁤⁦⁩⁣⁨⁨⁠⁩⁥
⁡⁢⁦⁩⁤⁢⁩⁩ ⁥⁡⁠⁠ ⁥⁨⁤⁩⁣⁨⁨ ⁨⁡⁠⁢⁧⁨ ⁠⁠⁧⁠⁩⁧⁢ ⁣⁦⁠ ⁠⁧⁡⁠⁣⁣⁩⁣⁨ ⁤⁤⁥⁨ ⁦⁩⁨⁨ ⁤⁤⁢⁡⁨⁣ ⁤⁡⁡
⁡⁤⁦
⁠⁦⁡ ⁩⁠⁡⁦⁥⁩⁢⁢ 2R9CiQsn2G⁩⁤⁤⁡⁩⁧⁩ ⁣⁩⁥⁩⁥⁩ ⁨⁢⁥ ⁤⁨⁧⁥⁤ ⁩⁥⁠⁥⁢⁡⁠⁩⁥⁠ ⁢⁣⁠⁩⁣⁡ ⁦⁥⁥⁢
⁤⁩⁡⁢⁢⁨⁥
OMxWXh⁡⁦⁥⁦⁢⁦⁥⁩ hiKc3D58Ir⁦⁧⁡⁢ ⁣⁤⁩⁦⁨⁡⁦ ⁤⁥⁨⁩⁥⁡ ⁩⁡⁤⁣⁦⁩ ⁣⁤⁨⁣⁤⁣⁠⁧⁥⁨ ⁤⁠⁩⁠⁩⁤⁡ ⁥⁥⁤⁢⁨⁡⁥⁣ ⁠⁨⁣⁡⁦⁩⁠⁣⁧⁤⁣⁤⁠
    ⁨⁣⁡⁩⁤⁧⁩
⁦⁦⁧⁠⁡⁧⁠
⁩⁩⁡⁩⁨ ⁦⁧⁢⁥⁤⁠⁣ LdJ2mJEioC⁨⁣⁦⁢⁣ ⁣⁣⁥⁢⁠⁧⁡⁧⁠ ⁤⁣⁡⁩⁢ ⁨⁣⁠⁦⁡⁡
⁢⁢⁣⁥⁩⁣⁥⁥⁣
⁡⁡⁨⁨ ⁩⁦⁧⁢⁠⁥⁤⁤⁩⁧ ⁡⁥⁦⁦⁦⁡⁧ ⁧⁥⁨ 0m5W9j⁦⁨⁡⁦⁦⁠⁠ ⁢⁩⁨⁢⁨⁦ ⁧⁠⁣⁩⁨⁥⁩⁠⁠⁩ ⁠⁠⁤⁩⁧⁦⁨⁢⁩⁧⁡⁢⁩
⁥⁥⁣⁢⁨⁡⁤
⁧⁡⁥⁡⁥⁩⁧⁤ ⁨⁡⁢⁠⁤⁦⁥⁠⁦ ⁥⁩⁢⁥⁥⁥⁨ ⁡⁢ ⁥⁦⁩⁧⁧

⁡⁦⁣⁥⁤⁧⁡

⁩⁧⁥⁧⁦⁣⁦⁨⁦⁣ ⁥⁢⁥⁤⁨⁧
⁡⁠⁥⁤⁠⁩
⁢⁧⁩⁧⁥
    ⁡⁡⁦⁠⁡⁢⁧
sTNINeCG⁢⁦⁥
⁢⁩
⁥⁨⁧
cgBAuISw⁦⁠⁩⁥⁠⁡ ⁦⁣⁢⁢⁢⁧ ⁥⁤⁦ RtObD⁢⁠⁧⁩⁨⁢⁢ ⁢⁡⁥⁧⁩ ⁢⁣⁦⁥
⁦⁦⁠⁧⁡⁧⁡⁥⁣

⁢⁢⁣⁣⁥

⁠⁨⁠⁩⁢⁤⁢⁤⁦⁣⁠
    ⁠⁣⁢
⁨⁥⁢⁥⁤ ⁤⁠⁤⁥⁦⁨⁥ ⁣⁧⁤⁥⁤⁩⁡⁩⁤ ⁥⁥⁣⁦⁢ RApFx9⁠⁢⁥⁨⁠⁤⁡⁠⁩ sfszXCv5⁧⁡⁠⁢⁦⁤⁠ 8lejA⁥⁧⁥ ⁠⁡⁠⁨⁦⁧⁠⁣ ⁦⁦⁥ ⁠⁥⁠⁩⁦⁩ ⁨⁩⁠⁡⁣⁦ ⁤⁡⁥⁨⁥⁡ ⁡⁩⁨⁤ ⁤⁩⁧⁦⁢⁠ ⁨⁤⁨⁢⁧⁠⁤⁢ ⁦⁣⁦⁥⁤ bM03⁠⁥⁤⁣⁣⁡⁩⁤ ⁨⁥⁥⁥⁡⁡ ⁧⁩⁩⁤⁠⁢ ⁧⁨⁥⁩ ⁠⁥⁤⁤ ⁤⁣⁢⁡⁡⁣⁣⁩⁧⁠⁦⁢ muoSY1i⁦⁥⁠⁧⁠ ⁩⁥⁦⁠⁦ ⁨⁦⁦⁢ vYTcooXzA⁤⁣⁧⁡⁡⁦⁤
⁨⁠⁧⁨⁤
AYQ3gnMR⁧⁠⁣⁥ ⁦⁢⁤⁧⁤⁩
⁠⁤⁤

xDsToeNDG7⁥⁠⁢

⁧⁨⁥⁨


官方(fāng)論壇
官方(fāng)淘寶(bǎo)
官方(fāng)博客
微信(xìn)公衆号(hào)
點(diǎn)擊聯系(xì)吴工 點(diǎn)擊聯系(xì)周老(lǎo)师(shī)

【案(àn)例】按鍵控制數字(zì)时(shí)鐘(zhōng)設計(jì)

發(fà)布(bù)时(shí)間(jiān):2021-06-25   作者(zhě):admin 浏覽量(liàng):

案(àn)例編号(hào):001600000062

至(zhì)簡設計(jì)系(xì)列_按鍵控制數字(zì)时(shí)鐘(zhōng)

--作者(zhě):小黑(hēi)同(tóng)学

本(běn)文(wén)为(wèi)明(míng)德揚原創及(jí)录(lù)用(yòng)文(wén)章(zhāng),轉(zhuǎn)载請注明(míng)出(chū)处!

1.1 總(zǒng)體(tǐ)設計(jì)

1.1.1 概述

數字(zì)时(shí)鐘(zhōng)是(shì)采用(yòng)數字(zì)電(diàn)路(lù)技術(shù)实現(xiàn)时(shí)、分(fēn)、秒(miǎo)計(jì)时(shí)顯示的(de)裝(zhuāng)置,可(kě)以(yǐ)用(yòng)數字(zì)同(tóng)时(shí)顯示时(shí),分(fēn),秒(miǎo)

的(de)精确时(shí)間(jiān)并实現(xiàn)準确校(xiào)时(shí),具備體(tǐ)積小、重(zhòng)量(liàng)輕(qīng)、抗干(gàn)擾能(néng)力強(qiáng)、对(duì)环(huán)境要(yào)求高(gāo)、高(gāo)精确性(xìng)、容易

開(kāi)發(fà)等特(tè)性(xìng),在(zài)工業控制系(xì)統、智能(néng)化(huà)儀器表(biǎo)、辦(bàn)公自(zì)動(dòng)化(huà)系(xì)統等诸多(duō)領域取(qǔ)得了(le)极(jí)为(wèi)廣泛的(de)應(yìng)用(yòng),

诸如(rú)自(zì)動(dòng)報警、按时(shí)自(zì)動(dòng)打(dǎ)鈴、时(shí)間(jiān)程序自(zì)動(dòng)控制、定(dìng)时(shí)廣播、自(zì)定(dìng)啟閉路(lù)燈(dēng)、定(dìng)时(shí)開(kāi)關(guān)烘箱、通(tòng)斷

動(dòng)力設備、甚至(zhì)各(gè)種(zhǒng)定(dìng)时(shí)電(diàn)器的(de)自(zì)動(dòng)啟用(yòng)等。與(yǔ)傳統表(biǎo)盤式機(jī)械时(shí)鐘(zhōng)相比,數字(zì)时(shí)鐘(zhōng)具有(yǒu)更(gèng)高(gāo)的(de)準确

性(xìng)和(hé)直(zhí)观性(xìng),由(yóu)于(yú)沒(méi)有(yǒu)機(jī)械裝(zhuāng)置,其使用(yòng)壽命更(gèng)长。

1.1.2 設計(jì)目标(biāo)

本(běn)設計(jì)要(yào)求实現(xiàn)可(kě)設置的(de)數字(zì)时(shí)鐘(zhōng)(速度(dù)快(kuài) 10 倍,每过(guò) 0.1s,秒(miǎo)數加 1),具體(tǐ)要(yào)求如(rú)下(xià):

1、 按下(xià)按鍵 key1,时(shí)鐘(zhōng)暫停,跳到(dào)設置时(shí)間(jiān)狀态,在(zài)按按鍵 key1,回(huí)到(dào)正(zhèng)常狀态。

2、 通(tòng)过(guò)按鍵 key2,選擇要(yào)設置的(de)位置,初始时(shí)設置秒(miǎo)低位,按一(yī)下(xià),設置秒(miǎo)高(gāo)位,再按下(xià),

設置分(fēn)低位,依次(cì)類(lèi)推,循环(huán)設置。

3、 通(tòng)过(guò)按鍵 key3,設置數值,按一(yī)下(xià)數值加 1,如(rú)果(guǒ)溢出(chū),則重(zhòng)新變(biàn)为(wèi) 0。

4、 通(tòng)过(guò)數碼管(guǎn)将时(shí)間(jiān)实时(shí)顯示出(chū)来(lái)。

5、 如(rú)果(guǒ)開(kāi)發(fà)板上(shàng)的(de)按鍵是(shì)矩阵(zhèn)鍵盤,那(nà)麼(me)要(yào)産生(shēng)需要(yào)的(de)按鍵信(xìn)号(hào),需要(yào)通(tòng)过(guò)例化(huà)矩阵(zhèn)鍵盤模块(kuài)

来(lái)産生(shēng)。

1.1.3 系(xì)統結構框图(tú)

系(xì)統結構框图(tú)如(rú)下(xià)所(suǒ)示:

「每周FPGA案(àn)例」按鍵控制數字(zì)时(shí)鐘(zhōng)設計(jì)
「每周FPGA案(àn)例」按鍵控制數字(zì)时(shí)鐘(zhōng)設計(jì)

結構图(tú)共(gòng)分(fēn)两(liǎng)个(gè),如(rú)果(guǒ)使用(yòng)的(de)開(kāi)發(fà)板上(shàng)是(shì)普通(tòng)按鍵的(de)时(shí)候,对(duì)應(yìng)的(de)結構图(tú)是(shì)图(tú)一(yī)。如(rú)果(guǒ)使用(yòng)的(de)開(kāi)

發(fà)板上(shàng)是(shì)矩阵(zhèn)鍵盤的(de)时(shí)候,对(duì)應(yìng)的(de)結構图(tú)是(shì)图(tú)二(èr)。

1.1.4 模块(kuài)功能(néng)

➢ 按鍵檢测模块(kuài)实現(xiàn)功能(néng)

将外(wài)来(lái)异(yì)步信(xìn)号(hào)打(dǎ)两(liǎng)拍处理,将异(yì)步信(xìn)号(hào)同(tóng)步化(huà);

实現(xiàn) 20ms 按鍵消抖功能(néng),并輸出(chū)有(yǒu)效按鍵信(xìn)号(hào)。

➢ 矩阵(zhèn)鍵盤模块(kuài)实現(xiàn)功能(néng)

将外(wài)来(lái)异(yì)步信(xìn)号(hào)打(dǎ)两(liǎng)拍处理,将异(yì)步信(xìn)号(hào)同(tóng)步化(huà);

实現(xiàn) 20ms 按鍵消抖功能(néng);

实現(xiàn)矩阵(zhèn)鍵盤的(de)按鍵檢测功能(néng),并輸出(chū)有(yǒu)效按鍵信(xìn)号(hào)。

➢ 时(shí)間(jiān)産生(shēng)模块(kuài)实現(xiàn)功能(néng)

産生(shēng)时(shí)間(jiān)數據(jù);

根(gēn)據(jù)接收(shōu)到(dào)的(de)不(bù)同(tóng)的(de)按鍵信(xìn)号(hào),産生(shēng)暫停、開(kāi)啟、設置时(shí)間(jiān)的(de)功能(néng)。

➢ 數碼管(guǎn)顯示模块(kuài)实現(xiàn)功能(néng)

对(duì)接收(shōu)到(dào)的(de)时(shí)間(jiān)數據(jù)進(jìn)行譯碼。

1.1.5 頂层信(xìn)号(hào)

「每周FPGA案(àn)例」按鍵控制數字(zì)时(shí)鐘(zhōng)設計(jì)

1.1.6 參考代(dài)碼

下(xià)面(miàn)是(shì)使用(yòng)普通(tòng)按鍵的(de)頂层代(dài)碼:


1.	module  key_clock(  
2.	    clk    ,  
3.	    rst_n  ,  
4.	    key    ,  
5.	    segment,  
6.	    seg_sel  
7.	);  
8.	  
9.	parameter   COUNT_TIME      =   23'd500_0000;  
10.	parameter   DELAY_TIME      =   10000       ;  
11.	parameter   SEG_WID         =   8           ;  
12.	parameter   SEG_SEL         =   6           ;  
13.	  
14.	parameter   KEY_S           =   4           ;  
15.	parameter   KEY_W           =   3           ;  
16.	  
17.	input                   clk         ;  
18.	input                   rst_n       ;  
19.	input   [ 2:0]          key         ;  
20.	output  [ 7:0]          segment     ;  
21.	output  [ 6:0]          seg_sel     ;  
22.	  
23.	wire    [ 2:0]          key_vld     ;  
24.	wire    [23:0]          segment_data;  
25.	wire    [ 3:0]          cnt2        ;  
26.	wire    [ 3:0]          cnt3        ;  
27.	wire    [ 3:0]          cnt4        ;  
28.	wire    [ 3:0]          cnt5        ;  
29.	wire    [ 3:0]          cnt6        ;  
30.	wire    [ 3:0]          cnt7        ;  
31.	  
32.	  
33.	             key_module  uut0(  
34.	                .clk     (clk    ),  
35.	                .rst_n   (rst_n  ),  
36.	                .key_in  (key    ),  
37.	                .key_vld (key_vld)  
38.	             );  
39.	  
40.	  
41.	             time_data  uut1(  
42.	                .clk      (clk    ),   
43.	                .rst_n    (rst_n  ),   
44.	                .key_vld  (key_vld),   
45.	                .cnt2     (cnt2   ),   
46.	                .cnt3     (cnt3   ),   
47.	                .cnt4     (cnt4   ),   
48.	                .cnt5     (cnt5   ),   
49.	                .cnt6     (cnt6   ),   
50.	                .cnt7     (cnt7   )   
51.	  
52.	             );  
53.	  
54.	  
55.	             seg_disp  uut2(  
56.	                 .clk          (clk                          ),   
57.	                 .rst_n        (rst_n                        ),   
58.	                 .segment      (segment                      ),   
59.	                 .seg_sel      (seg_sel                      ),  
60.	                 .segment_data (cnt7,cnt6,cnt5,cnt4,cnt3,cnt2)   
61.	  
62.	             );  
63.	  
64.	  
65.	endmodule  


下(xià)面(miàn)是(shì)使用(yòng)矩阵(zhèn)鍵盤的(de)頂层代(dài)碼:


66.	module  key_clock_jvzhen(  
67.	    clk    ,  
68.	    rst_n  ,  
69.	    key_col,  
70.	    key_row,  
71.	    segment,  
72.	    seg_sel  
73.	);  
74.	  
75.	parameter   COUNT_TIME      =   23'd500_0000;  
76.	parameter   DELAY_TIME      =   10000       ;  
77.	parameter   SEG_WID         =   8           ;  
78.	parameter   SEG_SEL         =   6           ;  
79.	  
80.	parameter   KEY_S           =   4           ;  
81.	parameter   KEY_W           =   3           ;  
82.	  
83.	input                   clk         ;  
84.	input                   rst_n       ;  
85.	input   [ 3:0]          key_col     ;  
86.	output  [ 3:0]          key_row     ;  
87.	output  [ 7:0]          segment     ;  
88.	output  [ 6:0]          seg_sel     ;  
89.	  
90.	wire    [ 3:0]          key_vld     ;  
91.	wire    [ 3:0]          cnt2        ;  
92.	wire    [ 3:0]          cnt3        ;  
93.	wire    [ 3:0]          cnt4        ;  
94.	wire    [ 3:0]          cnt5        ;  
95.	wire    [ 3:0]          cnt6        ;  
96.	wire    [ 3:0]          cnt7        ;  
97.	  
98.	  
99.	             key_scan  uut0(  
100.	                .clk     (clk    ),  
101.	                .rst_n   (rst_n  ),  
102.	                .key_col (key_col),  
103.	                .key_row (key_row),  
104.	                .key_en  (key_vld)  
105.	             );  
106.	  
107.	  
108.	             time_data  uut1(  
109.	                .clk      (clk    ),   
110.	                .rst_n    (rst_n  ),   
111.	                .key_vld  (key_vld),   
112.	                .cnt2     (cnt2   ),   
113.	                .cnt3     (cnt3   ),   
114.	                .cnt4     (cnt4   ),   
115.	                .cnt5     (cnt5   ),   
116.	                .cnt6     (cnt6   ),   
117.	                .cnt7     (cnt7   )   
118.	  
119.	             );  
120.	  
121.	  
122.	             seg_disp  uut2(  
123.	                 .clk          (clk                            ),   
124.	                 .rst_n        (rst_n                          ),   
125.	                 .segment      (segment                        ),   
126.	                 .seg_sel      (seg_sel                        ),  
127.	                 .segment_data ({cnt7,cnt6,cnt5,cnt4,cnt3,cnt2})  
128.	             );  
129.	  
130.	  
131.	endmodule  


1.2 按鍵檢测模块(kuài)設計(jì)

1.2.1 接口(kǒu)信(xìn)号(hào)

「每周FPGA案(àn)例」按鍵控制數字(zì)时(shí)鐘(zhōng)設計(jì)

1.2.2 設計(jì)思(sī)路(lù)

➢ 硬(yìng)件(jiàn)電(diàn)路(lù)

「每周FPGA案(àn)例」按鍵控制數字(zì)时(shí)鐘(zhōng)設計(jì)

独立式按鍵工作原理如(rú)上(shàng)图(tú)所(suǒ)示,4 条(tiáo)輸入(rù)線(xiàn)連(lián)接到(dào) FPGA 的(de) IO 口(kǒu)上(shàng),當按鍵 S1 按下(xià)时(shí),3.

3V 的(de)電(diàn)源通(tòng)过(guò)電(diàn)阻 R53 再通(tòng)过(guò)按鍵 S1 最(zuì)終(zhōng)進(jìn)入(rù) GND 形成(chéng)一(yī)条(tiáo)通(tòng)路(lù),这(zhè)条(tiáo)線(xiàn)路(lù)的(de)全(quán)部(bù)電(diàn)壓都加在(zài) R

53 上(shàng),則 KS0 是(shì)低電(diàn)平。當松開(kāi)按鍵後(hòu),線(xiàn)路(lù)斷開(kāi),就(jiù)不(bù)会(huì)有(yǒu)電(diàn)流通(tòng)过(guò),KS0 應(yìng)該是(shì) 3.3V,为(wèi)高(gāo)電(diàn)

平。我(wǒ)们(men)可(kě)以(yǐ)通(tòng)过(guò) KS0 这(zhè)个(gè) IO 口(kǒu)的(de)高(gāo)低電(diàn)平狀态来(lái)判斷是(shì)否有(yǒu)按鍵按下(xià)。其他(tā)按鍵原理與(yǔ) S1 一(yī)致(zhì)。

從图(tú)上(shàng)可(kě)以(yǐ)看(kàn)出(chū),如(rú)果(guǒ)我(wǒ)们(men)按下(xià)按鍵,那(nà)麼(me)按鍵就(jiù)会(huì)接通(tòng)并連(lián)接到(dào)低電(diàn)平 GND,如(rú)果(guǒ)我(wǒ)们(men)沒(méi)有(yǒu)

按下(xià),那(nà)麼(me)按鍵就(jiù)会(huì)斷開(kāi)并接到(dào) 3.3V,因(yīn)此(cǐ)按鍵为(wèi)低電(diàn)平有(yǒu)效。通(tòng)常的(de)按鍵所(suǒ)用(yòng)開(kāi)關(guān)为(wèi)機(jī)械弹性(xìng)開(kāi)

關(guān),當機(jī)械觸點(diǎn)斷開(kāi)或(huò)者(zhě)閉合时(shí),由(yóu)于(yú)機(jī)械觸點(diǎn)的(de)弹性(xìng)作用(yòng),一(yī)个(gè)按鍵開(kāi)關(guān)在(zài)閉合时(shí)不(bù)会(huì)马上(shàng)稳定(dìng)地(dì)

接通(tòng),在(zài)斷開(kāi)时(shí)也(yě)不(bù)会(huì)一(yī)下(xià)子斷開(kāi)。因(yīn)而(ér)機(jī)械式按鍵在(zài)閉合及(jí)斷開(kāi)的(de)瞬間(jiān)均伴随有(yǒu)一(yī)連(lián)串的(de)抖動(dòng),如(rú)

果(guǒ)不(bù)進(jìn)行处理,会(huì)使系(xì)統識别到(dào)抖動(dòng)信(xìn)号(hào)而(ér)進(jìn)行不(bù)必要(yào)的(de)反(fǎn)應(yìng),導致(zhì)模块(kuài)功能(néng)不(bù)正(zhèng)常,为(wèi)了(le)避免这(zhè)種(zhǒng)

現(xiàn)象(xiàng)的(de)産生(shēng),需要(yào)進(jìn)行按鍵消抖的(de)操作

➢ 按鍵消抖

按鍵消抖主(zhǔ)要(yào)分(fēn)为(wèi)硬(yìng)件(jiàn)消抖和(hé)软(ruǎn)件(jiàn)消抖。两(liǎng)个(gè)"與(yǔ)非(fēi)"門(mén)構成(chéng)一(yī)个(gè) RS 觸發(fà)器为(wèi)常用(yòng)的(de)硬(yìng)件(jiàn)消抖。

软(ruǎn)件(jiàn)方(fāng)法消抖,即檢测出(chū)鍵閉合後(hòu)執行一(yī)个(gè)延时(shí)程序,抖動(dòng)时(shí)間(jiān)的(de)长短(duǎn)由(yóu)按鍵的(de)機(jī)械特(tè)性(xìng)決定(dìng),一(yī)般

为(wèi) 5ms~20ms,讓前(qián)沿抖動(dòng)消失後(hòu)再一(yī)次(cì)檢测鍵的(de)狀态,如(rú)果(guǒ)仍保持(chí)閉合狀态電(diàn)平,則确認按下(xià)按

鍵操作有(yǒu)效。當檢测到(dào)按鍵釋放(fàng)後(hòu),也(yě)要(yào)給(gěi) 5ms~20ms 的(de)延时(shí),待後(hòu)沿抖動(dòng)消失後(hòu)才能(néng)轉(zhuǎn)入(rù)該鍵的(de)

处理程序。經(jīng)过(guò)按鍵消抖的(de)行人(rén)优先(xiān)按鍵,判斷按鍵有(yǒu)效後(hòu),按鍵信(xìn)号(hào)傳遞給(gěi)控制系(xì)統,控制系(xì)統再

進(jìn)入(rù)相應(yìng)的(de)处理程序。

「每周FPGA案(àn)例」按鍵控制數字(zì)时(shí)鐘(zhōng)設計(jì)

由(yóu)于(yú)按鍵按下(xià)去(qù)的(de)时(shí)間(jiān)一(yī)般都会(huì)大于(yú) 20ms,为(wèi)了(le)达(dá)到(dào)不(bù)管(guǎn)按鍵按下(xià)多(duō)久,都視为(wèi)按下(xià)一(yī)次(cì)的(de)效

果(guǒ),提(tí)出(chū)以(yǐ)下(xià)計(jì)數器架構,如(rú)下(xià)图(tú)所(suǒ)示:

「每周FPGA案(àn)例」按鍵控制數字(zì)时(shí)鐘(zhōng)設計(jì)

消抖計(jì)數器 cnt:用(yòng)于(yú)計(jì)算 20ms 的(de)时(shí)間(jiān),加一(yī)条(tiáo)件(jiàn)为(wèi) flag==0 &&(&key_in_ff1==0),表(biǎo)示當

某个(gè)按鍵按下(xià)就(jiù)開(kāi)始計(jì)數;結束(shù)条(tiáo)件(jiàn)为(wèi) 100000,表(biǎo)示數到(dào) 20ms 就(jiù)結束(shù)

按鍵:表(biǎo)示被(bèi)按下(xià)的(de)按鍵,沒(méi)被(bèi)按下(xià)时(shí)为(wèi)高(gāo)電(diàn)平,按下(xià)後(hòu)为(wèi)低電(diàn)平。

Flag:20ms 指示信(xìn)号(hào),默認为(wèi)低電(diàn)平,當按鍵按鍵按下(xià) 20ms 後(hòu)變(biàn)为(wèi)高(gāo)電(diàn)平,直(zhí)到(dào)按鍵信(xìn)号(hào)變(biàn)

高(gāo)電(diàn)平,重(zhòng)新拉低。

1.2.3 參考代(dài)碼

使用(yòng)明(míng)德揚的(de)計(jì)數器模板,可(kě)以(yǐ)很快(kuài)速很熟練地(dì)写出(chū)按鍵消抖模块(kuài)。


132.	module key_module(  
133.	    clk    ,  
134.	    rst_n  ,  
135.	    key_in ,  
136.	    key_vld   
137.	);  
138.	parameter                           DATA_W    = 20          ;  
139.	parameter                           KEY_W     = 3           ;  
140.	parameter                           TIME_20MS = 1_000_000   ;  
141.	  
142.	input                               clk                     ;  
143.	input                               rst_n                   ;  
144.	input           [KEY_W-1 :0]        key_in                  ;  
145.	output          [KEY_W-1 :0]        key_vld                 ;  
146.	reg             [KEY_W-1 :0]        key_vld                 ;  
147.	reg             [DATA_W-1:0]        cnt                     ;  
148.	wire                                add_cnt                 ;  
149.	wire                                end_cnt                 ;  
150.	reg                                 flag_add                ;  
151.	reg             [KEY_W-1 :0]        key_in_ff1              ;  
152.	reg             [KEY_W-1 :0]        key_in_ff0              ;  
153.	  
154.	  
155.	always  @(posedge clk or negedge rst_n)begin  
156.	    if(rst_n==1'b0)begin  
157.	        cnt <= 20'b0;  
158.	    end  
159.	    else if(add_cnt)begin  
160.	        if(end_cnt)  
161.	            cnt <= 20'b0;  
162.	        else  
163.	            cnt <= cnt + 1'b1;  
164.	    end  
165.	    else begin  
166.	        cnt <= 0;  
167.	    end  
168.	end  
169.	  
170.	assign add_cnt = flag_add==1'b0 && (&key_in_ff1==0);  
171.	assign end_cnt = add_cnt && cnt == TIME_20MS - 1;  
172.	  
173.	  
174.	always  @(posedge clk or negedge rst_n)begin  
175.	    if(rst_n==1'b0)begin  
176.	        flag_add <= 1'b0;  
177.	    end  
178.	    else if(end_cnt)begin  
179.	        flag_add <= 1'b1;  
180.	    end  
181.	    else if(&key_in_ff1==1)begin  
182.	        flag_add <= 1'b0;  
183.	    end  
184.	end  
185.	  
186.	  
187.	always  @(posedge clk or negedge rst_n)begin  
188.	    if(rst_n==1'b0)begin  
189.	        key_in_ff0 <= {{KEY_W}{1'b1}};  
190.	        key_in_ff1 <= {{KEY_W}{1'b1}};  
191.	    end  
192.	    else begin  
193.	        key_in_ff0 <= key_in    ;  
194.	        key_in_ff1 <= key_in_ff0;  
195.	    end  
196.	end  
197.	  
198.	  
199.	always  @(posedge clk or negedge rst_n)begin  
200.	    if(rst_n==1'b0)begin  
201.	        key_vld <= 0;  
202.	    end  
203.	    else if(end_cnt)begin  
204.	        key_vld <= ~key_in_ff1;  
205.	    end  
206.	    else begin  
207.	        key_vld <= 0;  
208.	    end  
209.	end  
210.	  
211.	  
212.	endmodule  


1.3 矩阵(zhèn)鍵盤模块(kuài)設計(jì)

1.3.1 接口(kǒu)信(xìn)号(hào)

「每周FPGA案(àn)例」按鍵控制數字(zì)时(shí)鐘(zhōng)設計(jì)

1.3.2 設計(jì)思(sī)路(lù)

在(zài)前(qián)面(miàn)的(de)案(àn)例中(zhōng)已經(jīng)有(yǒu)矩阵(zhèn)鍵盤的(de)介紹,所(suǒ)以(yǐ)这(zhè)里(lǐ)不(bù)在(zài)过(guò)多(duō)介紹,詳细(xì)介紹請看(kàn)下(xià)方(fāng)鍊(liàn)接:

http://fpgabbs.com/forum.php?mod=viewthread&tid=310

1.3.3 參考代(dài)碼


1.	module  key_scan(  
2.	                 clk    ,  
3.	                 rst_n  ,  
4.	                 key_col,  
5.	                 key_row,  
6.	                 key_en     
7.	               );  
8.	  
9.	  
10.	    parameter      KEY_W    =   4      ;  
11.	    parameter      CHK_COL  =   0      ;  
12.	    parameter      CHK_ROW  =   1      ;  
13.	    parameter      DELAY    =   2      ;  
14.	    parameter      WAIT_END =   3      ;  
15.	    parameter      COL_CNT  =   16     ;  
16.	    parameter      TIME_20MS=   1000000;  
17.	  
18.	    input               clk              ;  
19.	    input               rst_n            ;  
20.	    input [3:0]         key_col          ;  
21.	  
22.	    output[3:0]         key_en           ;  
23.	    output[KEY_W-1:0]   key_row          ;  
24.	  
25.	    reg   [3:0]         key_out          ;  
26.	    reg   [KEY_W-1:0]   key_row          ;  
27.	    reg                 key_vld          ;  
28.	  
29.	  
30.	    reg   [3:0]         key_col_ff0      ;  
31.	    reg   [3:0]         key_col_ff1      ;  
32.	    reg   [1:0]         key_col_get      ;  
33.	    reg   [3:0]         key_en           ;  
34.	    wire                end_shake_cnt    ;  
35.	    reg                 end_shake_cnt_ff0;  
36.	    reg   [3:0]         state_c          ;  
37.	    reg   [19:0]        shake_cnt        ;  
38.	    reg   [3:0]         state_n          ;  
39.	    reg   [1:0]         row_index        ;  
40.	    reg   [15:0]        row_cnt          ;  
41.	    wire                col2row_start    ;   
42.	    wire                row2del_start    ;  
43.	    wire                del2wait_start   ;  
44.	    wire                wait2col_start   ;  
45.	    wire                add_row_cnt      ;  
46.	    wire                end_row_cnt      ;  
47.	    wire                add_shake_cnt    ;  
48.	    wire                add_row_index    ;  
49.	    wire                end_row_index    ;  
50.	  
51.	  
52.	always  @(posedge clk or negedge rst_n)begin  
53.	    if(rst_n==1'b0)begin  
54.	        key_col_ff0 <= 4'b1111;  
55.	        key_col_ff1 <= 4'b1111;  
56.	    end  
57.	    else begin  
58.	        key_col_ff0 <= key_col    ;  
59.	        key_col_ff1 <= key_col_ff0;  
60.	    end  
61.	end  
62.	  
63.	  
64.	always @(posedge clk or negedge rst_n) begin   
65.	    if (rst_n==0) begin  
66.	        shake_cnt <= 0;   
67.	    end  
68.	    else if(add_shake_cnt) begin  
69.	        if(end_shake_cnt)  
70.	            shake_cnt <= 0;   
71.	        else  
72.	            shake_cnt <= shake_cnt+1 ;  
73.	   end  
74.	end  
75.	assign add_shake_cnt = key_col_ff1!=4'hf;  
76.	assign end_shake_cnt = add_shake_cnt  && shake_cnt == TIME_20MS-1 ;  
77.	  
78.	  
79.	always  @(posedge clk or negedge rst_n)begin  
80.	    if(rst_n==1'b0)begin  
81.	        state_c <= CHK_COL;  
82.	    end  
83.	    else begin  
84.	        state_c <= state_n;  
85.	    end  
86.	end  
87.	  
88.	always  @(*)begin  
89.	    case(state_c)  
90.	        CHK_COL: begin  
91.	                     if(col2row_start )begin  
92.	                         state_n = CHK_ROW;  
93.	                     end  
94.	                     else begin  
95.	                         state_n = CHK_COL;  
96.	                     end  
97.	                 end  
98.	        CHK_ROW: begin  
99.	                     if(row2del_start)begin  
100.	                         state_n = DELAY;  
101.	                     end  
102.	                     else begin  
103.	                         state_n = CHK_ROW;  
104.	                     end  
105.	                 end  
106.	        DELAY :  begin  
107.	                     if(del2wait_start)begin  
108.	                         state_n = WAIT_END;  
109.	                     end  
110.	                     else begin  
111.	                         state_n = DELAY;  
112.	                     end  
113.	                 end  
114.	        WAIT_END: begin  
115.	                     if(wait2col_start)begin  
116.	                         state_n = CHK_COL;  
117.	                     end  
118.	                     else begin  
119.	                         state_n = WAIT_END;  
120.	                     end  
121.	                  end  
122.	       default: state_n = CHK_COL;  
123.	    endcase  
124.	end  
125.	assign col2row_start = state_c==CHK_COL  && end_shake_cnt;  
126.	assign row2del_start = state_c==CHK_ROW  && row_index==3 && end_row_cnt;  
127.	assign del2wait_start= state_c==DELAY    && end_row_cnt;  
128.	assign wait2col_start= state_c==WAIT_END && key_col_ff1==4'hf;  
129.	  
130.	always  @(posedge clk or negedge rst_n)begin  
131.	    if(rst_n==1'b0)begin  
132.	        key_row <= 4'b0;  
133.	    end  
134.	    else if(state_c==CHK_ROW)begin  
135.	        key_row <= ~(1'b1 << row_index);  
136.	    end  
137.	    else begin  
138.	        key_row <= 4'b0;  
139.	    end  
140.	end  
141.	  
142.	  
143.	  
144.	  
145.	  
146.	always @(posedge clk or negedge rst_n) begin   
147.	    if (rst_n==0) begin  
148.	        row_index <= 0;   
149.	    end  
150.	    else if(add_row_index) begin  
151.	        if(end_row_index)  
152.	            row_index <= 0;   
153.	        else  
154.	            row_index <= row_index+1 ;  
155.	   end  
156.	   else if(state_c!=CHK_ROW)begin  
157.	       row_index <= 0;  
158.	   end  
159.	end  
160.	assign add_row_index = state_c==CHK_ROW && end_row_cnt;  
161.	assign end_row_index = add_row_index  && row_index == 4-1 ;  
162.	  
163.	  
164.	always @(posedge clk or negedge rst_n) begin   
165.	    if (rst_n==0) begin  
166.	        row_cnt <= 0;   
167.	    end  
168.	    else if(add_row_cnt) begin  
169.	        if(end_row_cnt)  
170.	            row_cnt <= 0;   
171.	        else  
172.	            row_cnt <= row_cnt+1 ;  
173.	   end  
174.	end  
175.	assign add_row_cnt = state_c==CHK_ROW || state_c==DELAY;  
176.	assign end_row_cnt = add_row_cnt  && row_cnt == 16-1 ;  
177.	  
178.	  
179.	  
180.	always  @(posedge clk or negedge rst_n)begin  
181.	    if(rst_n==1'b0)begin  
182.	        key_col_get <= 0;  
183.	    end  
184.	    else if(state_c==CHK_COL && end_shake_cnt ) begin  
185.	        if(key_col_ff1==4'b1110)  
186.	            key_col_get <= 0;  
187.	        else if(key_col_ff1==4'b1101)  
188.	            key_col_get <= 1;  
189.	        else if(key_col_ff1==4'b1011)  
190.	            key_col_get <= 2;  
191.	        else   
192.	            key_col_get <= 3;  
193.	    end  
194.	end  
195.	  
196.	  
197.	always  @(posedge clk or negedge rst_n)begin  
198.	    if(rst_n==1'b0)begin  
199.	        key_out <= 0;  
200.	    end  
201.	    else if(state_c==CHK_ROW && end_row_cnt)begin  
202.	        key_out <= {row_index,key_col_get};  
203.	    end  
204.	    else begin  
205.	        key_out <= 0;  
206.	    end  
207.	end  
208.	  
209.	always  @(posedge clk or negedge rst_n)begin  
210.	    if(rst_n==1'b0)begin  
211.	        key_vld <= 1'b0;  
212.	    end  
213.	    else if(state_c==CHK_ROW && end_row_cnt && key_col_ff1[key_col_get]==1'b0)begin  
214.	        key_vld <= 1'b1;  
215.	    end  
216.	    else begin  
217.	        key_vld <= 1'b0;  
218.	    end  
219.	end  
220.	  
221.	  
222.	always  @(*)begin  
223.	    if(rst_n==1'b0)begin  
224.	        key_en = 0;  
225.	    end  
226.	    else if(key_vld && key_out==0)begin  
227.	        key_en = 4'b0001;  
228.	    end  
229.	    else if(key_vld && key_out==1)begin  
230.	        key_en = 4'b0010;  
231.	    end  
232.	    else if(key_vld && key_out==2)begin  
233.	        key_en = 4'b0100;  
234.	    end  
235.	    else begin  
236.	        key_en = 0;  
237.	    end  
238.	end  
239.	  
240.	  
241.	Endmodule


1.4 时(shí)間(jiān)産生(shēng)模块(kuài)設計(jì)

1.4.1 接口(kǒu)信(xìn)号(hào)

「每周FPGA案(àn)例」按鍵控制數字(zì)时(shí)鐘(zhōng)設計(jì)

1.4.2 設計(jì)思(sī)路(lù)

根(gēn)據(jù)題(tí)目功能(néng)要(yào)求可(kě)知,要(yào)設計(jì)數字(zì)时(shí)鐘(zhōng),由(yóu)此(cǐ)我(wǒ)们(men)可(kě)以(yǐ)提(tí)出(chū) 7 个(gè)計(jì)數器的(de)架構,如(rú)下(xià)图(tú)所(suǒ)示:

「每周FPGA案(àn)例」按鍵控制數字(zì)时(shí)鐘(zhōng)設計(jì)

該架構由(yóu) 7 个(gè)計(jì)數器組成(chéng):时(shí)鐘(zhōng)計(jì)數器 cnt1、秒(miǎo)低位計(jì)數器 cnt2、秒(miǎo)高(gāo)位計(jì)數器 cnt3、分(fēn)低位

計(jì)數器 cnt4、分(fēn)高(gāo)位計(jì)數器 cnt5、时(shí)低位計(jì)數器 cnt6、时(shí)高(gāo)位計(jì)數器 cnt7。

时(shí)鐘(zhōng)計(jì)數器 cnt1:用(yòng)于(yú)計(jì)算 0.1 秒(miǎo)的(de)时(shí)鐘(zhōng)个(gè)數,加一(yī)条(tiáo)件(jiàn)为(wèi) key1_func==0,表(biǎo)示刚上(shàng)電(diàn)时(shí)開(kāi)始

計(jì)數,key1 按下(xià)之後(hòu)停止計(jì)數,再按下(xià)又重(zhòng)新開(kāi)始計(jì)數;結束(shù)条(tiáo)件(jiàn)为(wèi) 5000000,表(biǎo)示數到(dào) 0.1 秒(miǎo)就(jiù)

清(qīng)零(líng)。

秒(miǎo)低位計(jì)數器 cnt2:用(yòng)于(yú)对(duì)"1 秒(miǎo)"(实際为(wèi) 0.1 秒(miǎo))進(jìn)行計(jì)數,加一(yī)条(tiáo)件(jiàn)为(wèi)(key1_func &&cn

t0==0 &&key3_func)||(key1_func==0 &&end_cnt1),表(biǎo)示在(zài)設置狀态下(xià)可(kě)通(tòng)过(guò)按鍵 key3 来(lái)控制加

一(yī),或(huò)者(zhě)在(zài)正(zhèng)常狀态时(shí)數到(dào) 1 秒(miǎo)就(jiù)加 1;結束(shù)条(tiáo)件(jiàn)为(wèi) 10,表(biǎo)示數到(dào) 10 秒(miǎo)就(jiù)清(qīng)零(líng)。

秒(miǎo)高(gāo)位計(jì)數器 cnt3:用(yòng)于(yú)对(duì) 10 秒(miǎo)進(jìn)行計(jì)數,加一(yī)条(tiáo)件(jiàn)为(wèi)(key1_func &&cnt0==1 &&key3_func)

||(key1_func==0 &&end_cnt2),表(biǎo)示在(zài)設置狀态下(xià)可(kě)通(tòng)过(guò)按鍵 key3 来(lái)控制加一(yī),或(huò)者(zhě)在(zài)正(zhèng)常狀态时(shí)

數到(dào) 10 秒(miǎo)就(jiù)加 1;結束(shù)条(tiáo)件(jiàn)为(wèi) 6,表(biǎo)示數到(dào) 60 秒(miǎo)就(jiù)清(qīng)零(líng)。

分(fēn)低位計(jì)數器 cnt4:用(yòng)于(yú)对(duì) 1 分(fēn)進(jìn)行計(jì)數,加一(yī)条(tiáo)件(jiàn)为(wèi)(key1_func &&cnt0==2 &&key3_func)|

|(key1_func==0 &&end_cnt3),表(biǎo)示在(zài)設置狀态下(xià)可(kě)通(tòng)过(guò)按鍵 key3 来(lái)控制加一(yī),或(huò)者(zhě)在(zài)正(zhèng)常狀态时(shí)

數到(dào) 1 分(fēn)就(jiù)加 1;結束(shù)条(tiáo)件(jiàn)为(wèi) 10,表(biǎo)示數到(dào) 10 分(fēn)就(jiù)清(qīng)零(líng)。

分(fēn)高(gāo)位計(jì)數器 cnt5:用(yòng)于(yú)对(duì) 10 分(fēn)進(jìn)行計(jì)數,加一(yī)条(tiáo)件(jiàn)为(wèi)(key1_func &&cnt0==3 &&key3_func)

||(key1_func==0 &&end_cnt4),表(biǎo)示在(zài)設置狀态下(xià)可(kě)通(tòng)过(guò)按鍵 key3 来(lái)控制加一(yī),或(huò)者(zhě)在(zài)正(zhèng)常狀态时(shí)

數到(dào) 10 分(fēn)就(jiù)加 1;結束(shù)条(tiáo)件(jiàn)为(wèi) 6,表(biǎo)示數到(dào) 60 分(fēn)就(jiù)清(qīng)零(líng)。

时(shí)低位計(jì)數器 cnt6:用(yòng)于(yú)对(duì) 1 小时(shí)進(jìn)行計(jì)數,加一(yī)条(tiáo)件(jiàn)为(wèi)(key1_func &&cnt0==4 &&key3_fun

c)||(key1_func==0 &&end_cnt5),表(biǎo)示在(zài)設置狀态下(xià)可(kě)通(tòng)过(guò)按鍵 key3 来(lái)控制加一(yī),或(huò)者(zhě)在(zài)正(zhèng)常狀态

时(shí)數到(dào) 1 小时(shí)就(jiù)加 1;結束(shù)条(tiáo)件(jiàn)为(wèi) x,表(biǎo)示數到(dào) x 小时(shí)就(jiù)清(qīng)零(líng)。

时(shí)高(gāo)位計(jì)數器 cnt7:用(yòng)于(yú)对(duì) 10 小时(shí)進(jìn)行計(jì)數,加一(yī)条(tiáo)件(jiàn)为(wèi)(key1_func &&cnt0==5 &&key3_fu

nc)||(key1_func==0 &&end_cnt6),表(biǎo)示在(zài)設置狀态下(xià)可(kě)通(tòng)过(guò)按鍵 key3 来(lái)控制加一(yī),或(huò)者(zhě)在(zài)正(zhèng)常狀

态时(shí)數到(dào) 10 小时(shí)就(jiù)加 1;結束(shù)条(tiáo)件(jiàn)为(wèi) y,表(biǎo)示數到(dào) y*10 小时(shí)就(jiù)清(qīng)零(líng)。

1.4.3 參考代(dài)碼

使用(yòng)明(míng)德揚的(de)計(jì)數器模板,可(kě)以(yǐ)很快(kuài)速很熟練地(dì)写出(chū)时(shí)間(jiān)産生(shēng)模块(kuài)。


1.	module time_data(  
2.	    clk      ,  
3.	    rst_n    ,  
4.	    key_vld  ,  
5.	    cnt2     ,  
6.	    cnt3     ,  
7.	    cnt4     ,  
8.	    cnt5     ,  
9.	    cnt6     ,  
10.	    cnt7  
11.	);  
12.	input                   clk         ;  
13.	input                   rst_n       ;  
14.	input   [ 3:0]          key_vld     ;  
15.	output  [ 3:0]          cnt2        ;  
16.	output  [ 3:0]          cnt3        ;  
17.	output  [ 3:0]          cnt4        ;  
18.	output  [ 3:0]          cnt5        ;  
19.	output  [ 3:0]          cnt6        ;  
20.	output  [ 3:0]          cnt7        ;  
21.	  
22.	reg                     key1_func   ;  
23.	reg                     key3_func   ;  
24.	reg     [ 2:0]          cnt0        ;  
25.	wire                    add_cnt0    ;  
26.	wire                    end_cnt0    ;  
27.	reg     [ 23:0]          cnt1       ;  
28.	wire                    add_cnt1    ;  
29.	wire                    end_cnt1    ;  
30.	reg     [ 3:0]          cnt2        ;  
31.	wire                    add_cnt2    ;  
32.	wire                    end_cnt2    ;  
33.	reg     [ 3:0]          cnt3        ;  
34.	wire                    add_cnt3    ;  
35.	wire                    end_cnt3    ;  
36.	reg     [ 3:0]          cnt4        ;  
37.	wire                    add_cnt4    ;  
38.	wire                    end_cnt4    ;  
39.	reg     [ 3:0]          cnt5        ;  
40.	wire                    add_cnt5    ;  
41.	wire                    end_cnt5    ;  
42.	reg     [ 3:0]          cnt6        ;  
43.	reg     [ 3:0]          x           ;  
44.	wire                    add_cnt6    ;  
45.	wire                    end_cnt6    ;  
46.	reg     [ 3:0]          cnt7        ;  
47.	reg     [ 1:0]          y           ;  
48.	wire                    add_cnt7    ;  
49.	wire                    end_cnt7    ;  
50.	  
51.	  
52.	  
53.	always  @(posedge clk or negedge rst_n)begin  
54.	    if(rst_n==1'b0)begin  
55.	        key1_func<=1'b0;  
56.	    end  
57.	    else if(key_vld[0]==1'b1)begin  
58.	        key1_func<=~key1_func;  
59.	    end  
60.	    else begin  
61.	        key1_func<=key1_func;  
62.	    end  
63.	end  
64.	  
65.	  
66.	  
67.	always @(posedge clk or negedge rst_n) begin   
68.	    if (rst_n==0) begin  
69.	        cnt0 <= 0;   
70.	    end  
71.	    else if(add_cnt0) begin  
72.	        if(end_cnt0)  
73.	            cnt0 <= 0;   
74.	        else  
75.	            cnt0 <= cnt0+1 ;  
76.	   end  
77.	end  
78.	assign add_cnt0 = key_vld[1];  
79.	assign end_cnt0 = add_cnt0  && cnt0 == 6-1 ;  
80.	  
81.	  
82.	always  @(posedge clk or negedge rst_n)begin  
83.	    if(rst_n==1'b0)begin  
84.	        key3_func<=1'b0;  
85.	    end  
86.	    else if(key1_func==1'b1 && key_vld[2]==1'b1)begin       
87.	        key3_func<=1'b1;  
88.	    end  
89.	    else begin  
90.	        key3_func<=1'b0;  
91.	    end  
92.	end  
93.	  
94.	  
95.	always @(posedge clk or negedge rst_n) begin   
96.	    if (rst_n==0) begin  
97.	        cnt1 <= 0;   
98.	    end  
99.	    else if(add_cnt1) begin  
100.	        if(end_cnt1)  
101.	            cnt1 <= 0;   
102.	        else  
103.	            cnt1 <= cnt1+1 ;  
104.	   end  
105.	   else begin  
106.	       cnt1 <= 0;  
107.	   end  
108.	end  
109.	assign add_cnt1 = key1_func==0;  
110.	assign end_cnt1 = add_cnt1  && cnt1 == 500_0000-1 ;  
111.	  
112.	  
113.	  
114.	  
115.	always @(posedge clk or negedge rst_n) begin   
116.	    if (rst_n==0) begin  
117.	        cnt2 <= 0;   
118.	    end  
119.	    else if(add_cnt2) begin  
120.	        if(end_cnt2)  
121.	            cnt2 <= 0;   
122.	        else  
123.	            cnt2 <= cnt2+1 ;  
124.	   end  
125.	end  
126.	assign add_cnt2 = (key1_func && cnt0==0 && key3_func) || (key1_func==0 && end_cnt1);  
127.	assign end_cnt2 = add_cnt2  && cnt2 == 10-1 ;  
128.	  
129.	  
130.	  
131.	  
132.	always @(posedge clk or negedge rst_n) begin   
133.	    if (rst_n==0) begin  
134.	        cnt3 <= 0;   
135.	    end  
136.	    else if(add_cnt3) begin  
137.	        if(end_cnt3)  
138.	            cnt3 <= 0;   
139.	        else  
140.	            cnt3 <= cnt3+1 ;  
141.	   end  
142.	end  
143.	assign add_cnt3 = (key1_func && cnt0==1 && key3_func) || (key1_func==0 && end_cnt2);  
144.	assign end_cnt3 = add_cnt3  && cnt3 == 6-1 ;  
145.	  
146.	  
147.	  
148.	always @(posedge clk or negedge rst_n) begin   
149.	    if (rst_n==0) begin  
150.	        cnt4 <= 0;   
151.	    end  
152.	    else if(add_cnt4) begin  
153.	        if(end_cnt4)  
154.	            cnt4 <= 0;   
155.	        else  
156.	            cnt4 <= cnt4+1 ;  
157.	   end  
158.	end  
159.	assign add_cnt4 = (key1_func && cnt0==2 && key3_func) || (key1_func==0 && end_cnt3);  
160.	assign end_cnt4 = add_cnt4  && cnt4 == 10-1 ;  
161.	  
162.	  
163.	always @(posedge clk or negedge rst_n) begin   
164.	    if (rst_n==0) begin  
165.	        cnt5 <= 0;   
166.	    end  
167.	    else if(add_cnt5) begin  
168.	        if(end_cnt5)  
169.	            cnt5 <= 0;   
170.	        else  
171.	            cnt5 <= cnt5+1 ;  
172.	   end  
173.	end  
174.	assign add_cnt5 = (key1_func && cnt0==3 && key3_func) || (key1_func==0 && end_cnt4);  
175.	assign end_cnt5 = add_cnt5  && cnt5 == 6-1 ;  
176.	  
177.	  
178.	always @(posedge clk or negedge rst_n) begin   
179.	    if (rst_n==0) begin  
180.	        cnt6 <= 0;   
181.	    end  
182.	    else if(add_cnt6) begin  
183.	        if(end_cnt6)  
184.	            cnt6 <= 0;   
185.	        else  
186.	            cnt6 <= cnt6+1 ;  
187.	   end  
188.	end  
189.	assign add_cnt6 = (key1_func && cnt0==4 && key3_func) || (key1_func==0 && end_cnt5);  
190.	assign end_cnt6 = add_cnt6  && cnt6 == x-1 ;  
191.	  
192.	  
193.	  
194.	always @(posedge clk or negedge rst_n) begin   
195.	    if (rst_n==0) begin  
196.	        cnt7 <= 0;   
197.	    end  
198.	    else if(add_cnt7) begin  
199.	        if(end_cnt7)  
200.	            cnt7 <= 0;   
201.	        else  
202.	            cnt7 <= cnt7+1 ;  
203.	   end  
204.	end  
205.	assign add_cnt7 = (key1_func && cnt0==5 && key3_func) || (key1_func==0 && end_cnt6);  
206.	assign end_cnt7 = add_cnt7  && cnt7 == y-1 ;  
207.	  
208.	  
209.	always  @(*)begin  
210.	    if(cnt7==2)begin  
211.	        x = 4;  
212.	    end  
213.	    else begin  
214.	        x =10;  
215.	    end  
216.	end  
217.	  
218.	always  @(*)begin  
219.	    if(cnt6>=4)begin  
220.	        y = 2;  
221.	    end  
222.	    else begin  
223.	        y = 3;  
224.	    end  
225.	end  
226.	  
227.	  
228.	endmodule  


1.5 數碼管(guǎn)顯示模块(kuài)設計(jì)

1.5.1 接口(kǒu)信(xìn)号(hào)

「每周FPGA案(àn)例」按鍵控制數字(zì)时(shí)鐘(zhōng)設計(jì)

1.5.2 設計(jì)思(sī)路(lù)

在(zài)前(qián)面(miàn)的(de)案(àn)例中(zhōng)已經(jīng)有(yǒu)數碼管(guǎn)顯示的(de)介紹,所(suǒ)以(yǐ)这(zhè)里(lǐ)不(bù)在(zài)过(guò)多(duō)介紹,詳细(xì)介紹請看(kàn)下(xià)方(fāng)鍊(liàn)接:

http://fpgabbs.com/forum.php?mod=viewthread&tid=399

1.5.3 參考代(dài)碼


1.	module seg_disp(  
2.	    clk         ,  
3.	    rst_n       ,  
4.	    segment     ,  
5.	    segment_data,  
6.	    seg_sel  
7.	);  
8.	parameter   ZERO            =   8'b1100_0000;  
9.	parameter   ONE             =   8'b1111_1001;  
10.	parameter   TWO             =   8'b1010_0100;  
11.	parameter   THREE           =   8'b1011_0000;  
12.	parameter   FOUR            =   8'b1001_1001;  
13.	parameter   FIVE            =   8'b1001_0010;  
14.	parameter   SIX             =   8'b1000_0010;  
15.	parameter   SEVEN           =   8'b1111_1000;  
16.	parameter   EIGHT           =   8'b1000_0000;  
17.	parameter   NINE            =   8'b1001_0000;  
18.	  
19.	  
20.	  
21.	input                   clk         ;  
22.	input                   rst_n       ;  
23.	input   [23:0]          segment_data;  
24.	output  [ 7:0]          segment     ;  
25.	output  [ 5:0]          seg_sel     ;  
26.	  
27.	  
28.	reg     [ 7:0]          segment     ;  
29.	wire    [ 7:0]          segment_tmp ;  
30.	reg     [ 5:0]          seg_sel     ;  
31.	  
32.	  
33.	reg     [15:0]          cnt8        ;  
34.	wire                    add_cnt8    ;  
35.	wire                    end_cnt8    ;  
36.	reg     [ 2:0]          cnt9        ;  
37.	wire                    add_cnt9    ;  
38.	wire                    end_cnt9    ;  
39.	  
40.	  
41.	  
42.	  
43.	always @(posedge clk or negedge rst_n) begin   
44.	    if (rst_n==0) begin  
45.	        cnt8 <= 0;   
46.	    end  
47.	    else if(add_cnt8) begin  
48.	        if(end_cnt8)  
49.	            cnt8 <= 0;   
50.	        else  
51.	            cnt8 <= cnt8+1 ;  
52.	   end  
53.	end  
54.	assign add_cnt8 = 1;  
55.	assign end_cnt8 = add_cnt8  && cnt8 == 10000-1 ;  
56.	  
57.	  
58.	  
59.	  
60.	always @(posedge clk or negedge rst_n) begin   
61.	    if (rst_n==0) begin  
62.	        cnt9 <= 0;   
63.	    end  
64.	    else if(add_cnt9) begin  
65.	        if(end_cnt9)  
66.	            cnt9 <= 0;   
67.	        else  
68.	            cnt9 <= cnt9+1 ;  
69.	   end  
70.	end  
71.	assign add_cnt9 = end_cnt8;  
72.	assign end_cnt9 = add_cnt9  && cnt9 == 6-1 ;  
73.	  
74.	  
75.	  
76.	  
77.	assign segment_tmp = segment_data[(1+cnt9)*4-1 -:4];  
78.	  
79.	always@(posedge clk or negedge rst_n)begin  
80.	    if(rst_n==1'b0)begin  
81.	         segment<=ZERO;  
82.	    end  
83.	    else  begin  
84.	        case(segment_tmp)  
85.	            4'd0:segment <= ZERO;  
86.	            4'd1:segment <= ONE;  
87.	            4'd2:segment <= TWO;  
88.	            4'd3:segment <= THREE;  
89.	            4'd4:segment <= FOUR;  
90.	            4'd5:segment <= FIVE ;  
91.	            4'd6:segment <= SIX ;  
92.	            4'd7:segment <= SEVEN ;  
93.	            4'd8:segment <= EIGHT ;  
94.	            4'd9:segment <= NINE ;  
95.	            default:begin  
96.	                segment<=segment;  
97.	            end  
98.	        endcase  
99.	    end  
100.	end  
101.	  
102.	  
103.	  
104.	  
105.	always@(posedge clk or negedge rst_n)begin  
106.	    if(rst_n==1'b0)begin  
107.	        seg_sel <= 6'b11_1110;  
108.	    end  
109.	    else begin  
110.	        seg_sel <= ~(6'b1<<cnt9);  
111.	    end  
112.	end  
113.	  
114.	endmodule  


1.6 效果(guǒ)和(hé)總(zǒng)結

➢ 下(xià)图(tú)是(shì)該工程在(zài) mp801 開(kāi)發(fà)板上(shàng)的(de)現(xiàn)象(xiàng)

其中(zhōng)按鍵 s4 控制數字(zì)时(shí)鐘(zhōng)的(de)暫停與(yǔ)開(kāi)始,按鍵 s3 来(lái)選擇需要(yào)設置的(de)位,按鍵 s2 設置數值。

「每周FPGA案(àn)例」按鍵控制數字(zì)时(shí)鐘(zhōng)設計(jì)

➢ 下(xià)图(tú)是(shì)該工程在(zài) db603 開(kāi)發(fà)板上(shàng)的(de)現(xiàn)象(xiàng)

其中(zhōng)按鍵 s1 控制數字(zì)时(shí)鐘(zhōng)的(de)暫停與(yǔ)開(kāi)始,按鍵 s2 来(lái)選擇需要(yào)設置的(de)位,按鍵 s3 設置數值。

「每周FPGA案(àn)例」按鍵控制數字(zì)时(shí)鐘(zhōng)設計(jì)

➢ 下(xià)图(tú)是(shì)該工程在(zài) ms980 試验(yàn)箱上(shàng)的(de)現(xiàn)象(xiàng)

「每周FPGA案(àn)例」按鍵控制數字(zì)时(shí)鐘(zhōng)設計(jì)

其中(zhōng)按鍵 s1 控制數字(zì)时(shí)鐘(zhōng)的(de)暫停與(yǔ)開(kāi)始,按鍵 s2 来(lái)選擇需要(yào)設置的(de)位,按鍵 s3 設置數值。

由(yóu)于(yú)該項目的(de)上(shàng)板現(xiàn)象(xiàng)是(shì)動(dòng)态的(de),開(kāi)始、暫停、时(shí)間(jiān)設置等

現(xiàn)象(xiàng)无法通(tòng)过(guò)图(tú)片(piàn)表(biǎo)現(xiàn)出(chū)来(lái),想(xiǎng)观看(kàn)

完整現(xiàn)象(xiàng)的(de)朋友可(kě)以(yǐ)看(kàn)一(yī)下(xià)現(xiàn)象(xiàng)演示的(de)視頻。

設計(jì)視頻教程、工程源文(wén)件(jiàn)請到(dào)明(míng)德揚論壇观看(kàn)或(huò)下(xià)载!

感(gǎn)興趣的(de)朋友也(yě)可(kě)以(yǐ)訪問(wèn)明(míng)德揚論壇(http://www.fpgabbs.cn/)進(jìn)行 FPGA 相關(guān)工程設計(jì)学習。

往期(qī)推薦:

《基于(yú) FPGA 的(de)密碼鎖設計(jì)》

《波(bō)形相位頻率可(kě)調 DDS 信(xìn)号(hào)發(fà)生(shēng)器》

《基于(yú) FPGA 的(de)曼徹斯特(tè)編碼解(jiě)碼設計(jì)》

《基于(yú) FPGA 的(de)出(chū)租車計(jì)費系(xì)統》

《數電(diàn)基礎與(yǔ) Verilog 設計(jì)》

《基于(yú) FPGA 的(de)頻率、電(diàn)壓测量(liàng)》

《基于(yú) FPGA 的(de)漢明(míng)碼編碼解(jiě)碼設計(jì)》

《關(guān)于(yú)鎖存器問(wèn)題(tí)的(de)讨論》

《阻塞賦值與(yǔ)非(fēi)阻塞賦值》

《參數例化(huà)时(shí)自(zì)動(dòng)計(jì)算位宽(kuān)的(de)解(jiě)決辦(bàn)法》


明(míng)德揚是(shì)一(yī)家(jiā)專注于(yú) FPGA 領域的(de)專業性(xìng)公司,公司主(zhǔ)要(yào)業务包(bāo)括開(kāi)發(fà)板、教育培訓、項目承

接、人(rén)才服(fú)务等多(duō)个(gè)方(fāng)向(xiàng)。

點(diǎn)撥開(kāi)發(fà)板——学習 FPGA 的(de)入(rù)門(mén)之選。

MP801 開(kāi)發(fà)板——千(qiān)兆(zhào)网(wǎng)、ADDA、大容量(liàng) SDRAM 等,学習和(hé)項目需求一(yī)步到(dào)位。

网(wǎng)絡培訓班——不(bù)管(guǎn)时(shí)間(jiān)和(hé)空間(jiān),明(míng)德揚随时(shí)在(zài)你身(shēn)邊(biān),助你快(kuài)速学習 FPGA。

周末(mò)培訓班——明(míng)天(tiān)的(de)你会(huì)感(gǎn)激現(xiàn)在(zài)的(de)努力進(jìn)取(qǔ),升(shēng)職加薪明(míng)德揚来(lái)助你。

就(jiù)業培訓班——七(qī)大企業級項目实訓,獲得豐富的(de)項目經(jīng)验(yàn),高(gāo)薪就(jiù)業。

專題(tí)課程——高(gāo)手(shǒu)修煉課:提(tí)升(shēng)設計(jì)能(néng)力;实用(yòng)調試技巧課:提(tí)升(shēng)定(dìng)位和(hé)解(jiě)決問(wèn)題(tí)能(néng)力;FIFO 架構

設計(jì)課:助你快(kuài)速成(chéng)为(wèi)架構設計(jì)师(shī);时(shí)序約束(shù)、數字(zì)信(xìn)号(hào)处理、PCIE、綜合項目实踐課等你来(lái)選。

項目承接——承接企業 FPGA 研發(fà)項目。

人(rén)才服(fú)务——提(tí)供人(rén)才推薦、人(rén)才代(dài)培、人(rén)才派遣等服(fú)务。

   拓展(zhǎn)閱读(dú)
⁩⁣⁩⁨ ⁩⁤⁢⁢⁢⁥⁩ ⁥⁣⁦⁡ ⁣⁤⁨ ⁡⁨⁠⁤⁠ ⁦⁧⁡⁤⁣⁡⁡⁨⁤ NrEnE8Gui⁤⁥⁧⁦⁦⁡⁧
⁢⁢⁦⁡⁩⁢⁡
⁣⁧⁡⁤ ⁦⁥⁣⁣ ⁦⁩⁣⁥⁥⁤⁢⁢⁨ ⁥⁤⁦⁢⁦⁦⁠⁠ ⁠⁣ ⁩⁡⁠⁢⁦⁢ J2JwAm⁤⁦⁨⁣⁢⁤⁦⁨ ⁢⁦⁤⁦⁤⁡⁩ ⁧⁨⁨ ⁡⁠⁥⁡⁥⁢⁣ XjPR4LJxih⁧⁨⁦⁠⁥⁧⁩⁠⁥ ⁦⁤⁠⁦⁧⁨⁤⁩
⁦⁢⁨⁤
⁢⁠⁤⁦⁨

⁩⁩⁡

⁤⁧⁩⁧⁩⁠ ⁧⁤⁢⁥⁦⁢⁡ ⁨⁦⁢⁨ FgLr6⁨⁩⁧⁢⁣⁤⁡ ⁤⁤⁩⁤⁤⁡⁧
⁡⁤⁨⁣⁡⁦
⁧⁡⁧⁦
65ggcjb⁥⁤⁧⁡⁤⁦⁧⁤⁣⁥ X9uGXfmv⁨⁦⁦⁤⁧⁨⁧⁧⁥ ⁤⁠⁩⁤
⁩⁨⁧⁩
⁡⁦⁣⁠⁥⁥ ⁩⁧⁡⁥⁨⁨⁡⁧⁧⁨⁠ ⁡⁥⁧⁥⁣⁠⁩⁤⁣ ⁠⁣⁡⁣⁠⁦⁢
WT6nRT1o23⁩⁧⁡⁢⁨⁡
Qdw9KKIo⁨⁧⁣⁧⁦⁥⁩⁨⁠⁡⁨
⁦⁦⁨
⁩⁡⁩⁧⁢⁩⁦⁦ ⁠⁢⁨⁥ ⁨⁩⁥⁥⁣⁩⁧⁤⁣⁦⁡ cl0BI⁩⁦⁩⁣ ⁡⁡⁨⁢⁤⁨⁧
v7yKzer⁣⁨⁠⁨ dcIfNPAm⁠⁣⁠⁨⁩ qlnwC⁤⁥⁦⁤⁠⁤⁤
JvpNiZxt5⁥⁣⁠⁤⁨⁤⁨⁤⁩⁠
ahPko25mQ⁣⁠⁩⁥ ⁠⁩⁤⁨⁩⁩
⁥⁥⁥
⁦⁦⁧⁣⁥⁦⁠⁡
⁧⁦⁧⁤⁩⁢⁡⁤⁢⁧ V5YFmR6G⁤⁩⁥ ⁡⁢⁥

⁧⁨⁡⁩⁣⁡⁥

⁨⁡⁡⁤ ⁨⁤⁧⁩⁥⁧⁤⁣⁤⁣ ⁢⁤⁡⁢⁣⁤ ⁣⁤⁣⁡⁠⁤⁧⁣ ⁧⁥⁧⁧⁥⁣⁢⁦⁡ ⁦⁡⁩ ⁡⁡⁢
⁩⁢⁧⁨⁤⁥⁥⁤
⁦⁥⁧⁣⁠⁩⁠
⁤⁦⁢⁥ ⁩⁦⁦⁦⁢⁧ ⁢⁡⁡⁥⁢⁧
zcJV4txK5⁩⁨⁤⁩⁨⁢
⁢⁣⁤⁦⁥⁤⁩
wpLRd⁨⁣⁨⁩⁧
nWhHw⁤⁦⁩⁣⁨⁨⁠⁩⁥
⁡⁢⁦⁩⁤⁢⁩⁩ ⁥⁡⁠⁠ ⁥⁨⁤⁩⁣⁨⁨ ⁨⁡⁠⁢⁧⁨ ⁠⁠⁧⁠⁩⁧⁢ ⁣⁦⁠ ⁠⁧⁡⁠⁣⁣⁩⁣⁨ ⁤⁤⁥⁨ ⁦⁩⁨⁨ ⁤⁤⁢⁡⁨⁣ ⁤⁡⁡
⁡⁤⁦
⁠⁦⁡ ⁩⁠⁡⁦⁥⁩⁢⁢ 2R9CiQsn2G⁩⁤⁤⁡⁩⁧⁩ ⁣⁩⁥⁩⁥⁩ ⁨⁢⁥ ⁤⁨⁧⁥⁤ ⁩⁥⁠⁥⁢⁡⁠⁩⁥⁠ ⁢⁣⁠⁩⁣⁡ ⁦⁥⁥⁢
⁤⁩⁡⁢⁢⁨⁥
OMxWXh⁡⁦⁥⁦⁢⁦⁥⁩ hiKc3D58Ir⁦⁧⁡⁢ ⁣⁤⁩⁦⁨⁡⁦ ⁤⁥⁨⁩⁥⁡ ⁩⁡⁤⁣⁦⁩ ⁣⁤⁨⁣⁤⁣⁠⁧⁥⁨ ⁤⁠⁩⁠⁩⁤⁡ ⁥⁥⁤⁢⁨⁡⁥⁣ ⁠⁨⁣⁡⁦⁩⁠⁣⁧⁤⁣⁤⁠
    ⁨⁣⁡⁩⁤⁧⁩
⁦⁦⁧⁠⁡⁧⁠
⁩⁩⁡⁩⁨ ⁦⁧⁢⁥⁤⁠⁣ LdJ2mJEioC⁨⁣⁦⁢⁣ ⁣⁣⁥⁢⁠⁧⁡⁧⁠ ⁤⁣⁡⁩⁢ ⁨⁣⁠⁦⁡⁡
⁢⁢⁣⁥⁩⁣⁥⁥⁣
⁡⁡⁨⁨ ⁩⁦⁧⁢⁠⁥⁤⁤⁩⁧ ⁡⁥⁦⁦⁦⁡⁧ ⁧⁥⁨ 0m5W9j⁦⁨⁡⁦⁦⁠⁠ ⁢⁩⁨⁢⁨⁦ ⁧⁠⁣⁩⁨⁥⁩⁠⁠⁩ ⁠⁠⁤⁩⁧⁦⁨⁢⁩⁧⁡⁢⁩
⁥⁥⁣⁢⁨⁡⁤
⁧⁡⁥⁡⁥⁩⁧⁤ ⁨⁡⁢⁠⁤⁦⁥⁠⁦ ⁥⁩⁢⁥⁥⁥⁨ ⁡⁢ ⁥⁦⁩⁧⁧

⁡⁦⁣⁥⁤⁧⁡

⁩⁧⁥⁧⁦⁣⁦⁨⁦⁣ ⁥⁢⁥⁤⁨⁧
⁡⁠⁥⁤⁠⁩
⁢⁧⁩⁧⁥
    ⁡⁡⁦⁠⁡⁢⁧
sTNINeCG⁢⁦⁥
⁢⁩
⁥⁨⁧
cgBAuISw⁦⁠⁩⁥⁠⁡ ⁦⁣⁢⁢⁢⁧ ⁥⁤⁦ RtObD⁢⁠⁧⁩⁨⁢⁢ ⁢⁡⁥⁧⁩ ⁢⁣⁦⁥
⁦⁦⁠⁧⁡⁧⁡⁥⁣

⁢⁢⁣⁣⁥

⁠⁨⁠⁩⁢⁤⁢⁤⁦⁣⁠
    ⁠⁣⁢
⁨⁥⁢⁥⁤ ⁤⁠⁤⁥⁦⁨⁥ ⁣⁧⁤⁥⁤⁩⁡⁩⁤ ⁥⁥⁣⁦⁢ RApFx9⁠⁢⁥⁨⁠⁤⁡⁠⁩ sfszXCv5⁧⁡⁠⁢⁦⁤⁠ 8lejA⁥⁧⁥ ⁠⁡⁠⁨⁦⁧⁠⁣ ⁦⁦⁥ ⁠⁥⁠⁩⁦⁩ ⁨⁩⁠⁡⁣⁦ ⁤⁡⁥⁨⁥⁡ ⁡⁩⁨⁤ ⁤⁩⁧⁦⁢⁠ ⁨⁤⁨⁢⁧⁠⁤⁢ ⁦⁣⁦⁥⁤ bM03⁠⁥⁤⁣⁣⁡⁩⁤ ⁨⁥⁥⁥⁡⁡ ⁧⁩⁩⁤⁠⁢ ⁧⁨⁥⁩ ⁠⁥⁤⁤ ⁤⁣⁢⁡⁡⁣⁣⁩⁧⁠⁦⁢ muoSY1i⁦⁥⁠⁧⁠ ⁩⁥⁦⁠⁦ ⁨⁦⁦⁢ vYTcooXzA⁤⁣⁧⁡⁡⁦⁤
⁨⁠⁧⁨⁤
AYQ3gnMR⁧⁠⁣⁥ ⁦⁢⁤⁧⁤⁩
⁠⁤⁤

xDsToeNDG7⁥⁠⁢

⁧⁨⁥⁨