最近在學Verilog HDL語言,覺得learn in doing是比較好的學習方式,所以我們來直接分析分析代碼好了。
先來一波代碼:
1 module q_decode_38(data_in,data_out); 2 3 input[2:0] data_in; //端口聲明 4 output[7:0] data_out; 5 reg[7:0] data_out; 6 7 always@(data_in) 8 begin 9 case(data_in) 10 3'd0:data_out = 8'b0000_0001; 11 3'd1:data_out = 8'b0000_0010; 12 3'd2:data_out = 8'b0000_0100; 13 3'd3:data_out = 8'b0000_1000; 14 3'd4:data_out = 8'b0001_0000; 15 3'd5:data_out = 8'b0010_0000; 16 3'd6:data_out = 8'b0100_0000; 17 3'd7:data_out = 8'b1000_0000; 18 endcase 19 end 20 21 endmodule
代碼分析如下:
知識點:
(1)基本語句
1)條件語句---case語句
case語句很明顯了,格式跟c語言中的類似,不解釋。值得注意的是上述代碼中是不是少了defaule這種情況呢?此處省略是因為已列出所有的情況 ,不過一般不提倡省略,因為若出現了未知情況,則很容易生成不必要的鎖存器。
2)順序塊語句---begin...end語句
begin...end語句沒什么特殊要求,就是在順序塊begin...end之間的語句是從上至下、從左往右逐句執行的。
3)過程語句---always語句
always語句的格式是always@() 后加begin...end語句,括號中為觸發條件,上述代碼中表示,只要data_in的值發生變化,就執行always后的begin...end部分,否則不執行。
(2)基本功能實現
這是一個比較簡單的3-8譯碼器電路程序,具體功能就不說了,不過這倒是可以下載到FPGA板子里進行觀察,比如,可以通過三個撥碼開關控制8個led燈來觀察撥碼開關與led燈之間的狀態聯系。