參考自以下鏈接處:http://t.csdn.cn/4ws4t 下麵直接看代碼,代碼中會有註意事項。 `timescale 1ns/10ps module traffic_lights ; reg clk ; reg red ; reg amber ; reg green ; //產生時鐘脈衝的al ...
參考自以下鏈接處:
http://t.csdn.cn/4ws4t
下麵直接看代碼,代碼中會有註意事項。
`timescale 1ns/10ps module traffic_lights ; reg clk ; reg red ; reg amber ; reg green ; //產生時鐘脈衝的always塊 always #10 clk = ~clk; parameter on = 1 ; parameter off = 0 ; //定義交通燈開啟時間的任務 task light;//task<任務名> input [31:0] tics; output reg color;//<埠及數據類型聲明語句>,建議先輸入後輸出 begin repeat(tics) @(posedge clk);//等待tics個時鐘的上升沿 color=off;//關燈 end endtask //交通燈初始化 initial red=off; initial amber=off; initial green=off; //交通燈控制時序 always begin red=on; //開紅燈 light('d350,red); //調用等待任務, //(1)括弧中信號順序與task聲明的信號順序一致; //(2)不能是參數類型的數據,比如你放的是parameter定義的數據就不行; //(3)既然是調用,就是調用其中的邏輯功能,使用的信號都需要是module下定義的,而不是用task中定義的的color。 green=on; //開綠燈 light('d300,green); //等待 amber=on; //開黃燈 light('d200,amber); //等待 end endmodule
此代碼沒法模擬出波形,只是簡單的例子而已。
task與funtion還是蠻重要的知識點,下麵從我喜歡的視角簡單總結一下二者的內容和區別:
(1)先從Verilog定義二者的寫法開始,task的定義中直接加任務名稱,中間不會有位寬的聲明;而function畢竟就是函數,邏輯上使用函數一般就是賦值操作,賦值就要考慮位寬,所以function的定義中會加個位寬範圍,如果不寫就預設是1bit。
(2)寫到了下麵一部分,對於二者都是《埠及數據類型聲明語句》,但是function只能有input輸入變數,task則沒這個限制,可以有input、output、inout;
(3)下一部分則一定要用“begin end”來寫,這裡就是實實在在的二者想實現的邏輯功能語句了,其中task想怎麼寫怎麼寫,可以有時延符號,也可以純組合邏輯;但是function就只能是純組合邏輯,不能加時延類型的符號。所以funciton可以綜合。
(4)endtask、endfunction不能忘寫。
從中文字眼來看,也知道任務是高級一點、包容一點的東西,所以一般可以理解函數是任務的子集,任務可以調用函數,函數不能反過來調用任務的。
但是怎麼寫,怎麼用,還是得多練,多編譯,多模擬。