參考自以下鏈接處:
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不能忘寫,
從中文字眼來看,也知道任務是高級一點、包容一點的東西,所以一般可以理解函式是任務的子集,任務可以呼叫函式,函式不能反過來呼叫任務的,
但是怎么寫,怎么用,還是得多練,多編譯,多仿真,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/510885.html
標籤:Verilog
上一篇:Django 出現 frame because it set X-Frame-Options to deny 錯誤
下一篇:關于IDEA除錯的一些基本操作
