FPGA編程—組合邏輯編碼器等verilog實現


  FPGA編程—組合邏輯編碼器等verilog實現本篇博客主要實現對組合邏輯電路的一些常用模塊的實現。組合邏輯中,包括譯碼器,編碼器,輸入輸出選擇器,數值比較器,算法單元等。

   FPGA編程—組合邏輯編碼器等verilog實現 先來實現編碼器,最常用的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/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM