今天一個學弟來問我關於狀態機的事,我就給他講了下經典的三段式狀態機,而後就讓他試着用狀態機去點亮幾個LED燈。spa
狀態一:讓全部的燈所有熄滅;狀態二:所有的燈按照奇偶位的來進行閃爍;狀態三:所有的燈從左邊開始亮,一直到右邊;狀態四:所有的燈從右邊開始亮直到左邊。他寫了一個小時左右仍是作不出來,一氣之下,我本身來寫,結果我本身也沒寫出來,我以爲是狀態跳轉的太快了,因此致使LED看起來不清楚。code
因而,我就用序列機寫了一個花樣流水燈。效果是,開始二十六個燈所有按照奇偶位閃爍八次,而後從左邊依次點亮全部的LED燈,再從右邊依次點亮全部的LED燈,而後就是普通的流水燈了,一直循環下去。blog
代碼比較簡單,就不解釋了。剛纔導師到酒店裏打包回來了一大桌子菜,吃的有點小撐,有一個同窗勸我多吃一些,我就說沒有幹體力勞動,不用多吃,導師就說,幹體力活的吃白饅頭就行,寫代碼的消耗更大,要吃肉,終於找到一個能解釋爲何我吃這麼多了,不是由於貪吃,二十確實是處在巨大消耗當中呀。input
1 module flash_LED( 2 clk, 3 rst_n, 4 LED, 5 ); 6 7 input clk; 8 input rst_n; 9 output reg[25:0] LED; 10 11 reg[27:0] cnt; 12 13 always@(posedge clk or negedge rst_n) 14 if(!rst_n) 15 cnt <= 28'd0; 16 else if(cnt == 4999999) //100ms 17 cnt <= 28'd0; 18 else 19 cnt <= cnt + 1'b1; 20 21 reg div_clk; 22 always@(posedge clk or negedge rst_n) //10Hz 分頻 23 if(!rst_n) 24 div_clk <= 0; 25 else if(cnt == 4999999) 26 div_clk <= ~div_clk; 27 else 28 div_clk <= div_clk; 29 30 reg[6:0] counter; 31 always@(posedge div_clk or negedge rst_n) //序列機 32 if(!rst_n) 33 counter <= 7'd0; 34 else if(counter == 113) 35 counter <= 7'd0; 36 else 37 counter <= counter + 1'b1; 38 39 always@(posedge clk or negedge rst_n) 40 if(!rst_n) 41 LED <= 26'b000000000000000000000000000; 42 else begin 43 case(counter) 44 0:LED <= 26'b01010101010101010101010101; 45 1:LED <= 26'b10101010101010101010101010; 46 2:LED <= 26'b01010101010101010101010101; 47 3:LED <= 26'b10101010101010101010101010; 48 4:LED <= 26'b01010101010101010101010101; 49 5:LED <= 26'b10101010101010101010101010; 50 6:LED <= 26'b01010101010101010101010101; 51 7:LED <= 26'b10101010101010101010101010; 52 8:LED <= 26'b00000000000000000000000001; 53 9:LED <= 26'b00000000000000000000000011; 54 10:LED <= 26'b00000000000000000000000111; 55 11:LED <= 26'b00000000000000000000001111; 56 12:LED <= 26'b00000000000000000000011111; 57 13:LED <= 26'b00000000000000000000111111; 58 14:LED <= 26'b00000000000000000001111111; 59 15:LED <= 26'b00000000000000000011111111; 60 16:LED <= 26'b00000000000000000111111111; 61 17:LED <= 26'b00000000000000001111111111; 62 18:LED <= 26'b00000000000000011111111111; 63 19:LED <= 26'b00000000000000111111111111; 64 20:LED <= 26'b00000000000001111111111111; 65 21:LED <= 26'b00000000000011111111111111; 66 22:LED <= 26'b00000000000111111111111111; 67 23:LED <= 26'b00000000001111111111111111; 68 24:LED <= 26'b00000000011111111111111111; 69 25:LED <= 26'b00000000111111111111111111; 70 26:LED <= 26'b00000011111111111111111111; 71 27:LED <= 26'b00000111111111111111111111; 72 28:LED <= 26'b00001111111111111111111111; 73 29:LED <= 26'b00011111111111111111111111; 74 30:LED <= 26'b00111111111111111111111111; 75 31:LED <= 26'b01111111111111111111111111; 76 32:LED <= 26'b11111111111111111111111111; 77 33:LED <= 26'b01111111111111111111111111; 78 34:LED <= 26'b00111111111111111111111111; 79 35:LED <= 26'b00011111111111111111111111; 80 36:LED <= 26'b00001111111111111111111111; 81 37:LED <= 26'b00000111111111111111111111; 82 38:LED <= 26'b00000011111111111111111111; 83 39:LED <= 26'b00000001111111111111111111; 84 40:LED <= 26'b00000000111111111111111111; 85 41:LED <= 26'b00000000011111111111111111; 86 42:LED <= 26'b00000000001111111111111111; 87 43:LED <= 26'b00000000000111111111111111; 88 44:LED <= 26'b00000000000011111111111111; 89 45:LED <= 26'b00000000000001111111111111; 90 46:LED <= 26'b00000000000000111111111111; 91 47:LED <= 26'b00000000000000011111111111; 92 48:LED <= 26'b00000000000000001111111111; 93 49:LED <= 26'b00000000000000000111111111; 94 50:LED <= 26'b00000000000000000011111111; 95 51:LED <= 26'b00000000000000000001111111; 96 52:LED <= 26'b00000000000000000000111111; 97 53:LED <= 26'b00000000000000000000011111; 98 54:LED <= 26'b00000000000000000000001111; 99 55:LED <= 26'b00000000000000000000000111; 100 56:LED <= 26'b00000000000000000000000011; 101 57:LED <= 26'b00000000000000000000000001; 102 58:LED <= 26'b01010101010101010101010101; 103 59:LED <= 26'b10101010101010101010101010; 104 60:LED <= 26'b01010101010101010101010101; 105 61:LED <= 26'b10101010101010101010101010; 106 62:LED <= 26'b00000000000000000000000001; 107 63:LED <= 26'b00000000000000000000000010; 108 64:LED <= 26'b00000000000000000000000100; 109 65:LED <= 26'b00000000000000000000001000; 110 66:LED <= 26'b00000000000000000000010000; 111 67:LED <= 26'b00000000000000000000100000; 112 68:LED <= 26'b00000000000000000001000000; 113 69:LED <= 26'b00000000000000000010000000; 114 70:LED <= 26'b00000000000000000100000000; 115 71:LED <= 26'b00000000000000001000000000; 116 72:LED <= 26'b00000000000000010000000000; 117 73:LED <= 26'b00000000000000100000000000; 118 74:LED <= 26'b00000000000001000000000000; 119 75:LED <= 26'b00000000000010000000000000; 120 76:LED <= 26'b00000000000100000000000000; 121 77:LED <= 26'b00000000001000000000000000; 122 78:LED <= 26'b00000000010000000000000000; 123 79:LED <= 26'b00000000100000000000000000; 124 80:LED <= 26'b00000001000000000000000000; 125 81:LED <= 26'b00000010000000000000000000; 126 82:LED <= 26'b00000100000000000000000000; 127 83:LED <= 26'b00001000000000000000000000; 128 84:LED <= 26'b00010000000000000000000000; 129 85:LED <= 26'b00100000000000000000000000; 130 86:LED <= 26'b01000000000000000000000000; 131 87:LED <= 26'b10000000000000000000000000; 132 88:LED <= 26'b01000000000000000000000000; 133 89:LED <= 26'b00100000000000000000000000; 134 90:LED <= 26'b00010000000000000000000000; 135 91:LED <= 26'b00001000000000000000000000; 136 92:LED <= 26'b00000100000000000000000000; 137 93:LED <= 26'b00000010000000000000000000; 138 94:LED <= 26'b00000001000000000000000000; 139 95:LED <= 26'b00000000100000000000000000; 140 96:LED <= 26'b00000000010000000000000000; 141 97:LED <= 26'b00000000001000000000000000; 142 98:LED <= 26'b00000000000100000000000000; 143 99:LED <= 26'b00000000000010000000000000; 144 100:LED <= 26'b00000000000010000000000000; 145 101:LED <= 26'b00000000000001000000000000; 146 102:LED <= 26'b00000000000000100000000000; 147 103:LED <= 26'b00000000000000010000000000; 148 104:LED <= 26'b00000000000000001000000000; 149 105:LED <= 26'b00000000000000000100000000; 150 106:LED <= 26'b00000000000000000010000000; 151 107:LED <= 26'b00000000000000000001000000; 152 108:LED <= 26'b00000000000000000000100000; 153 109:LED <= 26'b00000000000000000000010000; 154 110:LED <= 26'b00000000000000000000001000; 155 111:LED <= 26'b00000000000000000000000100; 156 112:LED <= 26'b00000000000000000000000010; 157 113:LED <= 26'b00000000000000000000000001; 158 default:LED<=26'b00000000000000000000000000; 159 endcase 160 end 161 endmodule