本(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 概述
發(fà)光(guāng)二(èr)极(jí)管(guǎn)簡稱为(wèi)LED,是(shì)一(yī)種(zhǒng)常用(yòng)的(de)發(fà)光(guāng)器件(jiàn),通(tòng)过(guò)電(diàn)子與(yǔ)空穴複合釋放(fàng)能(néng)量(liàng)發(fà)光(guāng),可(kě)以(yǐ)高(gāo)效的(de)将電(diàn)能(néng)轉(zhuǎn)化(huà)为(wèi)光(guāng)能(néng),在(zài)現(xiàn)代(dài)社会(huì)具有(yǒu)廣泛的(de)用(yòng)途,如(rú)照明(míng)、平板顯示、醫療器件(jiàn)等。可(kě)通(tòng)过(guò)高(gāo)低電(diàn)平的(de)變(biàn)化(huà)来(lái)控制LED燈(dēng)的(de)明(míng)滅狀态,當輸出(chū)信(xìn)号(hào)为(wèi)低電(diàn)平时(shí),LED燈(dēng)亮(liàng),反(fǎn)之,當輸出(chū)信(xìn)号(hào)为(wèi)高(gāo)電(diàn)平时(shí),LED燈(dēng)滅。
1.1.2 設計(jì)目标(biāo)
內(nèi)容:開(kāi)發(fà)板上(shàng)有(yǒu)紅(hóng)黃綠(lǜ) LED 燈(dēng)各(gè)四(sì)个(gè),分(fēn)别放(fàng)在(zài)東(dōng)西(xī)南(nán)北(běi)方(fāng)向(xiàng)。參考交通(tòng)燈(dēng)的(de)情(qíng)況,即每个(gè)方(fāng)向(xiàng)都是(shì)綠(lǜ)燈(dēng)亮(liàng) 10 秒(miǎo),然後(hòu)黃燈(dēng)亮(liàng) 5 秒(miǎo),然後(hòu)紅(hóng)燈(dēng)亮(liàng) 15 秒(miǎo)。綠(lǜ)燈(dēng)按照東(dōng)西(xī)和(hé)南(nán)北(běi)的(de)順序依次(cì)亮(liàng)。
具體(tǐ)思(sī)路(lù):
1. 首先(xiān)分(fēn)東(dōng)西(xī)方(fāng)向(xiàng)和(hé)南(nán)北(běi)方(fāng)向(xiàng)来(lái)設計(jì)電(diàn)路(lù)。設計(jì)两(liǎng)个(gè)不(bù)同(tóng)的(de)狀态機(jī)来(lái)指示不(bù)同(tóng)的(de)狀态。東(dōng)西(xī)方(fāng)向(xiàng)的(de)燈(dēng)狀态相同(tóng),南(nán)北(běi)方(fāng)向(xiàng)的(de)燈(dēng)狀态相同(tóng)。
2. 4个(gè)方(fāng)向(xiàng)的(de)燈(dēng)依次(cì)为(wèi)紅(hóng)綠(lǜ)黃的(de)依次(cì)循环(huán)时(shí)間(jiān)为(wèi) 15+10+5=30 秒(miǎo),所(suǒ)以(yǐ)可(kě)以(yǐ)設計(jì)一(yī)个(gè)計(jì)數器,計(jì)时(shí) 30 秒(miǎo)鐘(zhōng),表(biǎo)示一(yī)个(gè)循环(huán)。計(jì)數器可(kě)以(yǐ)分(fēn)两(liǎng)个(gè)写,一(yī)个(gè)計(jì)时(shí) 1秒(miǎo),一(yī)个(gè)計(jì)时(shí) 30秒(miǎo)。
3. 然後(hòu)再根(gēn)據(jù)計(jì)數器的(de)計(jì)數值的(de)不(bù)同(tóng),決定(dìng)狀态機(jī)的(de)不(bù)同(tóng)狀态。
4. 首先(xiān)設計(jì)東(dōng)西(xī)方(fāng)向(xiàng)的(de)狀态機(jī),複位的(de)时(shí)候,綠(lǜ)燈(dēng)亮(liàng),計(jì)數器計(jì)到(dào) 10 秒(miǎo),黃燈(dēng)亮(liàng),計(jì)到(dào)15 秒(miǎo),紅(hóng)燈(dēng)亮(liàng),計(jì)滿 30 秒(miǎo),又是(shì)綠(lǜ)燈(dēng)亮(liàng)......依次(cì)循环(huán)。
5. 接着設計(jì)南(nán)北(běi)方(fāng)向(xiàng)的(de)狀态機(jī),複位的(de)时(shí)候,紅(hóng)燈(dēng)亮(liàng),計(jì)數器計(jì)到(dào)15 秒(miǎo),綠(lǜ)燈(dēng)亮(liàng),計(jì)到(dào)20 秒(miǎo),黃燈(dēng)亮(liàng),計(jì)滿 30 秒(miǎo),又是(shì)紅(hóng)燈(dēng)亮(liàng)......依次(cì)循环(huán)。
1.1.3信(xìn)号(hào)列表(biǎo)

1.1.4 設計(jì)思(sī)路(lù)
根(gēn)據(jù)題(tí)目功能(néng)要(yào)求,東(dōng)西(xī)南(nán)北(běi)四(sì)个(gè)方(fāng)向(xiàng)LED燈(dēng)按照“紅(hóng)燈(dēng)-綠(lǜ)燈(dēng)-黃燈(dēng)”的(de)順序依次(cì)循环(huán)时(shí)間(jiān)为(wèi) 15+10+5=30 秒(miǎo),所(suǒ)以(yǐ)可(kě)以(yǐ)設計(jì)一(yī)个(gè)計(jì)數器,計(jì)时(shí) 30 秒(miǎo)鐘(zhōng)表(biǎo)示一(yī)个(gè)循环(huán)。該計(jì)數器可(kě)以(yǐ)分(fēn)两(liǎng)个(gè)写,一(yī)个(gè)計(jì)时(shí) 1 秒(miǎo),一(yī)个(gè)計(jì)时(shí) 30秒(miǎo)。
因(yīn)为(wèi)在(zài)數字(zì)電(diàn)路(lù)中(zhōng)的(de)延时(shí)都是(shì)通(tòng)过(guò)計(jì)數器实現(xiàn)的(de),計(jì)數器*时(shí)鐘(zhōng)周期(qī)=延时(shí)时(shí)間(jiān)。本(běn)模块(kuài)中(zhōng),由(yóu)于(yú)輸入(rù)时(shí)鐘(zhōng)是(shì)50MHz,时(shí)鐘(zhōng)周期(qī)为(wèi)20ns,功能(néng)要(yào)求每1秒(miǎo)變(biàn)化(huà)一(yī)次(cì)。我(wǒ)们(men)通(tòng)过(guò)counter来(lái)表(biǎo)示延时(shí),當其值为(wèi)1s/20ns=5000_0000时(shí),表(biǎo)示1秒(miǎo)时(shí)間(jiān)到(dào)。
两(liǎng)个(gè)計(jì)數器的(de)架構图(tú):

时(shí)鐘(zhōng)計(jì)數器counter:該計(jì)數器用(yòng)于(yú)計(jì)算1s的(de)时(shí)鐘(zhōng)个(gè)數,加一(yī)条(tiáo)件(jiàn)为(wèi)1,表(biǎo)示一(yī)直(zhí)計(jì)數;數到(dào)5000_0000下(xià),則表(biǎo)示數到(dào)1秒(miǎo)的(de)时(shí)間(jiān)了(le)。
秒(miǎo)計(jì)數器:該計(jì)數器用(yòng)于(yú)計(jì)算1个(gè)周期(qī)內(nèi)三(sān)色(sè)LED按順序各(gè)點(diǎn)亮(liàng)1次(cì)的(de)时(shí)間(jiān),1周期(qī)的(de)时(shí)間(jiān)为(wèi)30秒(miǎo),加一(yī)条(tiáo)件(jiàn)为(wèi)时(shí)鐘(zhōng)計(jì)數器的(de)結束(shù)条(tiáo)件(jiàn),表(biǎo)示时(shí)鐘(zhōng)計(jì)數器每數完1s,秒(miǎo)計(jì)數器計(jì)數加一(yī);數到(dào)30下(xià),則表(biǎo)示數到(dào)30秒(miǎo)的(de)时(shí)間(jiān)了(le)。
下(xià)面(miàn)是(shì)两(liǎng)个(gè)計(jì)數器的(de)代(dài)碼:
1. parameter COUNT_TIME = 26'd5000_0000; 2. parameter CYCLE_TIME = 5'd30 ; 3. parameter COUNT_WID = 26 ; 4. parameter SEC_WID = 5 ; 5. 6. reg [COUNT_WID-1:0] counter ; 7. wire add_counter ; 8. wire end_counter ; 9. reg [SEC_WID-1:0] second ; 10. wire add_second ; 11. wire end_second ; 12. 13. always @(posedge clk or negedge rst_n) begin 14. if (rst_n==0) begin 15. counter <= 0; 16. end 17. else if(add_counter) begin 18. if(end_counter) 19. counter <= 0; 20. else 21. counter <= counter+1 ; 22. end 23. end 24. assign add_counter = 1; 25. assign end_counter = add_counter && counter == COUNT_TIME-1 ; 26. 27. 28. always @(posedge clk or negedge rst_n) begin 29. if (rst_n==0) begin 30. second <= 0; 31. end 32. else if(add_second) begin 33. if(end_second) 34. second <= 0; 35. else 36. second <= second+1 ; 37. end 38. end 39. assign add_second = end_counter; 40. assign end_second = add_second && second == CYCLE_TIME-1 ;
按照題(tí)目要(yào)求:分(fēn)東(dōng)西(xī)方(fāng)向(xiàng)和(hé)南(nán)北(běi)方(fāng)向(xiàng)来(lái)設計(jì)電(diàn)路(lù),因(yīn)此(cǐ)設計(jì)两(liǎng)个(gè)不(bù)同(tóng)的(de)狀态機(jī)来(lái)指示不(bù)同(tóng)的(de)狀态——同(tóng)一(yī)时(shí)間(jiān)內(nèi),東(dōng)西(xī)方(fāng)向(xiàng)的(de)燈(dēng)狀态相同(tóng),南(nán)北(běi)方(fāng)向(xiàng)的(de)燈(dēng)狀态相同(tóng)。
两(liǎng)个(gè)狀态機(jī)的(de)架構:


東(dōng)西(xī)方(fāng)向(xiàng)的(de)狀态機(jī):該狀态機(jī)用(yòng)于(yú)設定(dìng)東(dōng)西(xī)方(fāng)向(xiàng)LED的(de)顔色(sè)跳轉(zhuǎn)狀态。
1) 上(shàng)電(diàn)後(hòu),就(jiù)跳轉(zhuǎn)到(dào)綠(lǜ)燈(dēng)亮(liàng)狀态,綠(lǜ)燈(dēng)亮(liàng);
2) 10 秒(miǎo)後(hòu),黃燈(dēng)亮(liàng),跳轉(zhuǎn)条(tiáo)件(jiàn)为(wèi)秒(miǎo)計(jì)數器計(jì)數10下(xià),即add_second &&second==10-1,則表(biǎo)示數到(dào)10秒(miǎo)了(le);
3) 5 秒(miǎo)後(hòu),紅(hóng)燈(dēng)亮(liàng),跳轉(zhuǎn)条(tiáo)件(jiàn)为(wèi)秒(miǎo)計(jì)數器計(jì)數15下(xià),即add_second &&second==15-1,則表(biǎo)示數到(dào)15秒(miǎo)了(le);
4) 15 秒(miǎo)後(hòu),又是(shì)綠(lǜ)燈(dēng)亮(liàng),跳轉(zhuǎn)条(tiáo)件(jiàn)为(wèi)秒(miǎo)計(jì)數器計(jì)滿30下(xià),即add_second &&second==30-1,則表(biǎo)示數到(dào)30秒(miǎo)了(le)......依次(cì)循环(huán)。
南(nán)北(běi)方(fāng)向(xiàng)的(de)狀态機(jī):該狀态機(jī)用(yòng)于(yú)設定(dìng)南(nán)北(běi)方(fāng)向(xiàng)LED的(de)顔色(sè)跳轉(zhuǎn)狀态。
1) 上(shàng)電(diàn)後(hòu),就(jiù)跳轉(zhuǎn)到(dào)紅(hóng)燈(dēng)亮(liàng)狀态,紅(hóng)燈(dēng)亮(liàng);
2) 15 秒(miǎo)後(hòu),綠(lǜ)燈(dēng)亮(liàng),跳轉(zhuǎn)条(tiáo)件(jiàn)为(wèi)秒(miǎo)計(jì)數器計(jì)數15下(xià),即add_second &&second==15-1,則表(biǎo)示數到(dào)15秒(miǎo)了(le);
3) 10 秒(miǎo)後(hòu),黃燈(dēng)亮(liàng),跳轉(zhuǎn)条(tiáo)件(jiàn)为(wèi)秒(miǎo)計(jì)數器計(jì)數25下(xià),即add_second &&second==25-1,則表(biǎo)示數到(dào)25秒(miǎo)了(le);
4) 5 秒(miǎo)後(hòu),又是(shì)紅(hóng)燈(dēng)亮(liàng),跳轉(zhuǎn)条(tiáo)件(jiàn)为(wèi)秒(miǎo)計(jì)數器計(jì)滿30下(xià),即add_second &&second==30-1,則表(biǎo)示數到(dào)30秒(miǎo)了(le)......依次(cì)循环(huán)。
下(xià)面(miàn)是(shì)東(dōng)西(xī)、南(nán)北(běi)方(fāng)向(xiàng)的(de)两(liǎng)个(gè)狀态機(jī)代(dài)碼:
41. parameter LED_NUM = 3 ; 42. parameter STA_W = 2 ; 43. 44. parameter STA_G = 2'd1 ; 45. parameter STA_Y = 2'd2 ; 46. parameter STA_R = 2'd3 ; 47. parameter IDLE = 2'd0 ; 48. parameter GREEN = 3'b110 ; 49. parameter YELLOW = 3'b101 ; 50. parameter RED = 3'b011 ; 51. 52. input clk ; 53. input rst_n ; 54. output [LED_NUM-1:0] led_east ; 55. output [LED_NUM-1:0] led_south ; 56. output [LED_NUM-1:0] led_west ; 57. output [LED_NUM-1:0] led_north ; 58. 59. reg [LED_NUM-1:0] led_east ; 60. reg [LED_NUM-1:0] led_south ; 61. reg [LED_NUM-1:0] led_west ; 62. reg [LED_NUM-1:0] led_north ; 63. 64. reg [STA_W-1:0] ew_state_c ; 65. reg [STA_W-1:0] ew_state_n ; 66. wire idle2sta_g_start_ew ; 67. wire sta_g2sta_y_start_ew ; 68. wire sta_y2sta_r_start_ew ; 69. wire sta_r2sta_g_start_ew ; 70. 71. reg [STA_W-1:0] sn_state_c ; 72. reg [STA_W-1:0] sn_state_n ; 73. wire idle2sta_r_start_sn ; 74. wire sta_r2sta_g_start_sn ; 75. wire sta_g2sta_y_start_sn ; 76. wire sta_y2sta_r_start_sn ; 77. 78. always @(posedge clk or negedge rst_n) begin 79. if (rst_n==0) begin 80. ew_state_c <= STA_G ; 81. end 82. else begin 83. ew_state_c <= ew_state_n; 84. end 85. end 86. 87. always @(*) begin 88. case(ew_state_c) 89. STA_G :begin 90. if(sta_g2sta_y_start_ew) 91. ew_state_n = STA_Y ; 92. else 93. ew_state_n = ew_state_c ; 94. end 95. STA_Y :begin 96. if(sta_y2sta_r_start_ew) 97. ew_state_n = STA_R ; 98. else 99. ew_state_n = ew_state_c ; 100. end 101. STA_R :begin 102. if(sta_r2sta_g_start_ew) 103. ew_state_n = STA_G ; 104. else 105. ew_state_n = ew_state_c ; 106. end 107. default : ew_state_n = STA_G ; 108. endcase 109. end 110. 111. assign sta_g2sta_y_start_ew = ew_state_c==STA_G && add_second && second == 10-1; 112. assign sta_y2sta_r_start_ew = ew_state_c==STA_Y && add_second && second == 15-1; 113. assign sta_r2sta_g_start_ew = ew_state_c==STA_R && add_second && second == 30-1; 114. 115. always @(posedge clk or negedge rst_n)begin 116. if(rst_n==1'b0)begin 117. led_east<=GREEN; 118. end 119. else if(ew_state_c==STA_G)begin 120. led_east<=GREEN; 121. end 122. else if(ew_state_c==STA_Y)begin 123. led_east<=YELLOW; 124. end 125. else if(ew_state_c==STA_R)begin 126. led_east<=RED; 127. end 128. else begin 129. led_east<=GREEN; 130. end 131. end 132. 133. always @(posedge clk or negedge rst_n)begin 134. if(rst_n==1'b0)begin 135. led_west<=GREEN; 136. end 137. else if(ew_state_c==STA_G)begin 138. led_west<=GREEN; 139. end 140. else if(ew_state_c==STA_Y)begin 141. led_west<=YELLOW; 142. end 143. else if(ew_state_c==STA_R)begin 144. led_west<=RED; 145. end 146. else begin 147. led_west<=GREEN; 148. end 149. end 150. 151. 152. 153. always @(posedge clk or negedge rst_n) begin 154. if (rst_n==0) begin 155. sn_state_c <= STA_R ; 156. end 157. else begin 158. sn_state_c <= sn_state_n; 159. end 160. end 161. 162. always @(*) begin 163. case(sn_state_c) 164. STA_R :begin 165. if(sta_r2sta_g_start_sn) 166. sn_state_n = STA_G ; 167. else 168. sn_state_n = sn_state_c ; 169. end 170. STA_G :begin 171. if(sta_g2sta_y_start_sn) 172. sn_state_n = STA_Y ; 173. else 174. sn_state_n = sn_state_c ; 175. end 176. STA_Y :begin 177. if(sta_y2sta_r_start_sn) 178. sn_state_n = STA_R ; 179. else 180. sn_state_n = sn_state_c ; 181. end 182. default : sn_state_n = STA_R ; 183. endcase 184. end 185. 186. assign sta_r2sta_g_start_sn = sn_state_c==STA_R && add_second && second == 15-1; 187. assign sta_g2sta_y_start_sn = sn_state_c==STA_G && add_second && second == 25-1; 188. assign sta_y2sta_r_start_sn = sn_state_c==STA_Y && add_second && second == 30-1; 189. 190. always @(posedge clk or negedge rst_n)begin 191. if(rst_n==1'b0)begin 192. led_south<=RED; 193. end 194. else if(sn_state_c==STA_G)begin 195. led_south<=GREEN; 196. end 197. else if(sn_state_c==STA_Y)begin 198. led_south<=YELLOW; 199. end 200. else if(sn_state_c==STA_R)begin 201. led_south<=RED; 202. end 203. else begin 204. led_south<=GREEN; 205. end 206. end 207. 208. always @(posedge clk or negedge rst_n)begin 209. if(rst_n==1'b0)begin 210. led_north<=RED; 211. end 212. else if(sn_state_c==STA_G)begin 213. led_north<=GREEN; 214. end 215. else if(sn_state_c==STA_Y)begin 216. led_north<=YELLOW; 217. end 218. else if(sn_state_c==STA_R)begin 219. led_north<=RED; 220. end 221. else begin 222. led_north<=GREEN; 223. end 224. end
1.1.5參考設計(jì)代(dài)碼
225. /************************************************************************************ 226. The code is designed and produced by MDY Science and Education Co., Ltd, which has the entire ownership. It is only for personal learning, which cannot be used for commercial or profit-making purposes without permission. 227. 228. MDY's Mission: Develop Chip Talents and Realize National Chip Dream. 229. 230. We sincerely hope that our students can learn the real IC / FPGA code through our standard and rigorous code. 231. 232. For more FPGA learning materials, please visit the Forum: http://fpgabbs.com/ and official website: http://old.mdy-edu.com/index.html 233. 234. *************************************************************************************/ 235. 236. 237. module traf_light2( 238. clk , 239. rst_n , 240. led_east , 241. led_south , 242. led_west , 243. led_north 244. ); 245. 246. 247. 248. parameter COUNT_TIME = 26'd5000_0000; 249. parameter CYCLE_TIME = 5'd30 ; 250. parameter COUNT_WID = 26 ; 251. parameter SEC_WID = 5 ; 252. parameter LED_NUM = 3 ; 253. parameter STA_W = 2 ; 254. 255. parameter STA_G = 2'd1 ; 256. parameter STA_Y = 2'd2 ; 257. parameter STA_R = 2'd3 ; 258. parameter GREEN = 3'b110 ; 259. parameter YELLOW = 3'b101 ; 260. parameter RED = 3'b011 ; 261. 262. 263. input clk ; 264. input rst_n ; 265. output [LED_NUM-1:0] led_east ; 266. output [LED_NUM-1:0] led_south ; 267. output [LED_NUM-1:0] led_west ; 268. output [LED_NUM-1:0] led_north ; 269. 270. reg [LED_NUM-1:0] led_east ; 271. reg [LED_NUM-1:0] led_south ; 272. reg [LED_NUM-1:0] led_west ; 273. reg [LED_NUM-1:0] led_north ; 274. 275. reg [COUNT_WID-1:0] counter ; 276. wire add_counter ; 277. wire end_counter ; 278. reg [SEC_WID-1:0] second ; 279. wire add_second ; 280. wire end_second ; 281. 282. reg [STA_W-1:0] ew_state_c ; 283. reg [STA_W-1:0] ew_state_n ; 284. wire idle2sta_g_start_ew ; 285. wire sta_g2sta_y_start_ew ; 286. wire sta_y2sta_r_start_ew ; 287. wire sta_r2sta_g_start_ew ; 288. 289. reg [STA_W-1:0] sn_state_c ; 290. reg [STA_W-1:0] sn_state_n ; 291. wire idle2sta_r_start_sn ; 292. wire sta_r2sta_g_start_sn ; 293. wire sta_g2sta_y_start_sn ; 294. wire sta_y2sta_r_start_sn ; 295. 296. 297. always @(posedge clk or negedge rst_n) begin 298. if (rst_n==0) begin 299. counter <= 0; 300. end 301. else if(add_counter) begin 302. if(end_counter) 303. counter <= 0; 304. else 305. counter <= counter+1 ; 306. end 307. end 308. assign add_counter = 1; 309. assign end_counter = add_counter && counter == COUNT_TIME-1 ; 310. 311. 312. always @(posedge clk or negedge rst_n) begin 313. if (rst_n==0) begin 314. second <= 0; 315. end 316. else if(add_second) begin 317. if(end_second) 318. second <= 0; 319. else 320. second <= second+1 ; 321. end 322. end 323. assign add_second = end_counter; 324. assign end_second = add_second && second == CYCLE_TIME-1 ; 325. 326. 327. always @(posedge clk or negedge rst_n) begin 328. if (rst_n==0) begin 329. ew_state_c <= STA_G ; 330. end 331. else begin 332. ew_state_c <= ew_state_n; 333. end 334. end 335. 336. always @(*) begin 337. case(ew_state_c) 338. STA_G :begin 339. if(sta_g2sta_y_start_ew) 340. ew_state_n = STA_Y ; 341. else 342. ew_state_n = ew_state_c ; 343. end 344. STA_Y :begin 345. if(sta_y2sta_r_start_ew) 346. ew_state_n = STA_R ; 347. else 348. ew_state_n = ew_state_c ; 349. end 350. STA_R :begin 351. if(sta_r2sta_g_start_ew) 352. ew_state_n = STA_G ; 353. else 354. ew_state_n = ew_state_c ; 355. end 356. default : ew_state_n = STA_G ; 357. endcase 358. end 359. 360. assign sta_g2sta_y_start_ew = ew_state_c==STA_G && add_second && second == 10-1; 361. assign sta_y2sta_r_start_ew = ew_state_c==STA_Y && add_second && second == 15-1; 362. assign sta_r2sta_g_start_ew = ew_state_c==STA_R && add_second && second == 30-1; 363. 364. always @(posedge clk or negedge rst_n)begin 365. if(rst_n==1'b0)begin 366. led_east<=GREEN; 367. end 368. else if(ew_state_c==STA_G)begin 369. led_east<=GREEN; 370. end 371. else if(ew_state_c==STA_Y)begin 372. led_east<=YELLOW; 373. end 374. else if(ew_state_c==STA_R)begin 375. led_east<=RED; 376. end 377. else begin 378. led_east<=GREEN; 379. end 380. end 381. 382. always @(posedge clk or negedge rst_n)begin 383. if(rst_n==1'b0)begin 384. led_west<=GREEN; 385. end 386. else if(ew_state_c==STA_G)begin 387. led_west<=GREEN; 388. end 389. else if(ew_state_c==STA_Y)begin 390. led_west<=YELLOW; 391. end 392. else if(ew_state_c==STA_R)begin 393. led_west<=RED; 394. end 395. else begin 396. led_west<=GREEN; 397. end 398. end 399. 400. 401. 402. always @(posedge clk or negedge rst_n) begin 403. if (rst_n==0) begin 404. sn_state_c <= STA_R ; 405. end 406. else begin 407. sn_state_c <= sn_state_n; 408. end 409. end 410. 411. always @(*) begin 412. case(sn_state_c) 413. STA_R :begin 414. if(sta_r2sta_g_start_sn) 415. sn_state_n = STA_G ; 416. else 417. sn_state_n = sn_state_c ; 418. end 419. STA_G :begin 420. if(sta_g2sta_y_start_sn) 421. sn_state_n = STA_Y ; 422. else 423. sn_state_n = sn_state_c ; 424. end 425. STA_Y :begin 426. if(sta_y2sta_r_start_sn) 427. sn_state_n = STA_R ; 428. else 429. sn_state_n = sn_state_c ; 430. end 431. default : sn_state_n = STA_R ; 432. endcase 433. end 434. 435. assign sta_r2sta_g_start_sn = sn_state_c==STA_R && add_second && second == 15-1; 436. assign sta_g2sta_y_start_sn = sn_state_c==STA_G && add_second && second == 25-1; 437. assign sta_y2sta_r_start_sn = sn_state_c==STA_Y && add_second && second == 30-1; 438. 439. always @(posedge clk or negedge rst_n)begin 440. if(rst_n==1'b0)begin 441. led_south<=RED; 442. end 443. else if(sn_state_c==STA_G)begin 444. led_south<=GREEN; 445. end 446. else if(sn_state_c==STA_Y)begin 447. led_south<=YELLOW; 448. end 449. else if(sn_state_c==STA_R)begin 450. led_south<=RED; 451. end 452. else begin 453. led_south<=GREEN; 454. end 455. end 456. 457. always @(posedge clk or negedge rst_n)begin 458. if(rst_n==1'b0)begin 459. led_north<=RED; 460. end 461. else if(sn_state_c==STA_G)begin 462. led_north<=GREEN; 463. end 464. else if(sn_state_c==STA_Y)begin 465. led_north<=YELLOW; 466. end 467. else if(sn_state_c==STA_R)begin 468. led_north<=RED; 469. end 470. else begin 471. led_north<=GREEN; 472. end 473. end 474. 475. endmodule 476.
1.2 效果(guǒ)和(hé)總(zǒng)結
點(diǎn)撥板:
1. 複位,東(dōng)西(xī)綠(lǜ)燈(dēng)亮(liàng),南(nán)北(běi)紅(hóng)燈(dēng)亮(liàng)

2. 10秒(miǎo)後(hòu),東(dōng)西(xī)黃燈(dēng)亮(liàng),南(nán)北(běi)還(huán)是(shì)紅(hóng)燈(dēng)亮(liàng)

3. 15秒(miǎo)後(hòu),東(dōng)西(xī)紅(hóng)燈(dēng)亮(liàng),南(nán)北(běi)綠(lǜ)燈(dēng)亮(liàng)

4. 20秒(miǎo)後(hòu)。東(dōng)西(xī)還(huán)是(shì)紅(hóng)燈(dēng)亮(liàng),南(nán)北(běi)黃燈(dēng)亮(liàng)

5. 30秒(miǎo)後(hòu),東(dōng)西(xī)綠(lǜ)燈(dēng)亮(liàng),南(nán)北(běi)紅(hóng)燈(dēng)亮(liàng)

Mp801:
1. 複位,東(dōng)西(xī)綠(lǜ)燈(dēng)亮(liàng),南(nán)北(běi)紅(hóng)燈(dēng)亮(liàng)

2. 10秒(miǎo)後(hòu),東(dōng)西(xī)黃燈(dēng)亮(liàng),南(nán)北(běi)還(huán)是(shì)紅(hóng)燈(dēng)亮(liàng)

3. 15秒(miǎo)後(hòu),東(dōng)西(xī)紅(hóng)燈(dēng)亮(liàng),南(nán)北(běi)綠(lǜ)燈(dēng)亮(liàng)

4. 20秒(miǎo)後(hòu)。東(dōng)西(xī)還(huán)是(shì)紅(hóng)燈(dēng)亮(liàng),南(nán)北(běi)黃燈(dēng)亮(liàng)

5. 30秒(miǎo)後(hòu),東(dōng)西(xī)綠(lǜ)燈(dēng)亮(liàng),南(nán)北(běi)紅(hóng)燈(dēng)亮(liàng)

实验(yàn)箱:
1. 複位,東(dōng)西(xī)綠(lǜ)燈(dēng)亮(liàng),南(nán)北(běi)紅(hóng)燈(dēng)亮(liàng)

2. 10秒(miǎo)後(hòu),東(dōng)西(xī)黃燈(dēng)亮(liàng),南(nán)北(běi)還(huán)是(shì)紅(hóng)燈(dēng)亮(liàng)

3. 15秒(miǎo)後(hòu),東(dōng)西(xī)紅(hóng)燈(dēng)亮(liàng),南(nán)北(běi)綠(lǜ)燈(dēng)亮(liàng)

4. 20秒(miǎo)後(hòu)。東(dōng)西(xī)還(huán)是(shì)紅(hóng)燈(dēng)亮(liàng),南(nán)北(běi)黃燈(dēng)亮(liàng)

5. 30秒(miǎo)後(hòu),東(dōng)西(xī)綠(lǜ)燈(dēng)亮(liàng),南(nán)北(běi)紅(hóng)燈(dēng)亮(liàng)

观看(kàn)上(shàng)面(miàn)的(de)現(xiàn)象(xiàng),可(kě)以(yǐ)發(fà)現(xiàn),各(gè)項功能(néng)正(zhèng)常:開(kāi)發(fà)板上(shàng)有(yǒu)紅(hóng)黃綠(lǜ)三(sān)色(sè) LED 燈(dēng)各(gè)四(sì)个(gè),在(zài)東(dōng)西(xī)南(nán)北(běi)方(fāng)向(xiàng)各(gè)有(yǒu)一(yī)組。參考交通(tòng)燈(dēng)的(de)情(qíng)況,即每个(gè)方(fāng)向(xiàng)都是(shì)綠(lǜ)燈(dēng)亮(liàng) 10 秒(miǎo),然後(hòu)黃燈(dēng)亮(liàng) 5 秒(miǎo),然後(hòu)紅(hóng)燈(dēng)亮(liàng) 15 秒(miǎo)。綠(lǜ)燈(dēng)按照東(dōng)西(xī)和(hé)南(nán)北(běi)的(de)順序依次(cì)亮(liàng)。成(chéng)功完成(chéng)設計(jì)目标(biāo)。
温(wēn)馨提(tí)示:明(míng)德揚2023推出(chū)了(le)全(quán)新課程——邏輯設計(jì)基本(běn)功修煉課,降低学習FPGA門(mén)檻的(de)同(tóng)时(shí),增加了(le)学習的(de)趣味性(xìng),并組織了(le)考試赢積分(fēn)活動(dòng)
http://www.minyingyiyuan.com/ffkc/415.html
(點(diǎn)擊→了(le)解(jiě)課程詳情(qíng)☝)感(gǎn)興趣請聯系(xì)易老(lǎo)师(shī):13112063618(微信(xìn)同(tóng)步)