本篇博客主要實現對組合邏輯電路的一些常用模塊的實現。組合邏輯中,包括譯碼器,編碼器,輸入輸出選擇器,數值比較器,算法單元等。
先來實現編碼器,最常用的8-3編碼器,這里先講一下要用到的case ,casex,casez三者的關系和區別。對於8-3編碼器因為用到優先級編碼,所以三者的區別。Casex中對於某些位呈現x或者z,對這些位比較就會忽略,不予考慮,而只關注其他位的比較結果。casez中對於某些位呈現高組態,對這些位的比較就會忽略,不予考慮,而只關注其他位的比較結果。而case是一種全比較型,逐一進行比較。在應用過程中不建議采用casex或者casez的形式,因為有些綜合其不能對兩者進行綜合,所以建議采用case語句。這里在modelsim中采用casex形式對編碼器進行編碼。
這里講解一下verilog書寫代碼的格式,首先調用預編譯命令`timescale命令,指定仿真時間單位和仿真時間精度,不可省略。
Module(
Input clk,
Input rst_n,
nput xxx,(這里加入其它輸入信號)
output xx(這里加入其它輸出信號)
);
reg xxx;
always@(posedge clk or negedge rst_n)
begin
if(rst_n)
//這里加入要初始化的參數
else if()
//這里加入滿足此條件的功能
else()
end
assign 輸出信號 = 滿足要求的輸出變量值;
endmodule
上述是簡單的verilog結構,verilog語法有很多種,其實常用的不多,記住常用的語法就可以了。比如如下:
localparam N = 20;
parameter N = 20;
上述兩個參數的作用范圍不一樣,parameter定義的參數可以用於參數的傳遞,而localparam定義的的參數只能在module內使用。
task
begin
//加入要執行的語句
end
endtask
這里說一下task和function的區別,在面試的時候可能會被問到。
task的結構定義需要在過程塊的外部,不能定義在內部。task的調用必須在過程塊內調用。task的定義可以定義有輸入輸出端口,也可以不用定義,task可以調用function和其他類的函數。
function的結構定義也是不能定義在過程快的內部,而且function內部不能出現時延參數,#、@ 等。function只有input變量,不過可以通過參數名來傳遞一個返回值。
所以上述兩者的區別就是:
task有輸入輸出端口,function只有輸入端口,沒有輸出端口。
task的調用必須通過輸出端口來傳遞輸出值,function是通過函數名來傳遞一個返回值。
function中不能調用任務類函數,task可以調用function。
function可以出現在過程塊或者連續賦值語句中,task只能出現在過程塊中。
function只能與主模塊共用一個仿真時間單位,其內部不能有其他時延參數參與,task中沒有此限制。
repeat();該語句執行重復命令,括號內填寫重復的數字即可,如repeat (4) @(posedge clk),該語句的意思是重復執行clk上升沿4次。
forever # (N/2) clk = !clk;
forever語句是永遠執行的意思,常常用於時鍾信號的產生。
initial
begin
//加入要執行的語句
end
代碼實現部分可以參考 個人專博,網址:http://www.raymontec.com/