案(à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ǒ)示:
結構图(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)
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)
1.2.2 設計(jì)思(sī)路(lù)
➢ 硬(yìng)件(jiàn)電(diàn)路(lù)
独立式按鍵工作原理如(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)处理程序。
由(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ǒ)示:
消抖計(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)
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)
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ǒ)示:
該架構由(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)
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 設置數值。
➢ 下(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 設置數值。
➢ 下(xià)图(tú)是(shì)該工程在(zài) ms980 試验(yàn)箱上(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 設置數值。
由(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ú)务。








