<acronym id="xonnx"></acronym>
      <td id="xonnx"></td>
    1. <pre id="xonnx"></pre>

      1. 專注電子技術學習與研究
        當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

        芯片設計:verilog語法

        作者:白櫟旸   來源:本站原創   點擊數:  更新時間:2014年04月30日   【字體:

         1. 組合邏輯:assign wire = 。。。。。。;

        2. 時序邏輯:always @(敏感列表) begin end
                     always @(*) begin end
        3. module name #(parameters) (signals); .............. endmodule
         
        4. for 循環:
           genvar i;
           generate
               for(i=0;i<10;i=i+1)
               begin
                   always .....
                   assign .....
                end 
           endgenerate 
         
           while()
           begin
                 .....................
           end
         
        5. case({list})
                stat1:
                stat2:
                default:
           endcase
         
        6. task模塊:task模塊如果用到不可綜合的語句,就無法綜合,只能用在system verilog中用于描述行為。
           task一般用在仿真里,在RTL不推薦使用。
           從C語言的角度講,task相當于一個函數,被調用時方可執行。
           
           【task的一般格式】:
         
                          task ts_name;   // ts_name后面不列輸入輸出信號列表
                                input .....
                                output .....
                                電路描述
                           endtask
         
            task 中不能包含 initial 和 always 塊。但反過來,always塊中可以包含task,task中甚至可以用<=.
            task 的output必須是個reg,而不是wire。
            
            【task的調用格式】:
                   時序邏輯:
                           always @(..........)
                           begin
        ts_name(list);  //沒有task字樣,只有task的名字,list包括輸入和輸出
                           end  //輸出必須是reg
         
                   組合邏輯:
                            ts_name(list); //沒有明顯的賦值格式
             
              這是人家對task的簡單評價:“用task只能得到最終的一個值,不能得到連續值。所以task適合在某個時刻給某個信號賦值,而不適合給某個信號在一段時間內不間斷的賦值,要實現仿真,只能把task的內容提到上層中。”所以task一般不用在RTL中。
         
        7. function:功能跟task一樣,但可用于RTL代碼中,一般FIFO中的GRAY編碼和解碼使用function編寫。
           task的輸出列在列表中,所以可以是多個,而function的輸出就是function本身,只有一個輸出。
           【funciton的一般格式】:
         
        function wire [1:0] func_name; //如果不寫wire [1:0],默認為reg [0:0]
                              input ........;          //注意,沒有output
                              電路描述
                              func_name = ....;        //最后總要得到結果
                        endfunction
         
            function只能用來表示組合邏輯,表示時不用assign,也不用always。
            
           【function的調用格式】    
                           (1) assign a = func_name(input_list);
                           (2) always @()
                                   a <= func_name(input_list);  
                           (3) initial 
                                   a = func_name(input_list);
           【舉例】
            function [3:0] junc;
                input a,b,c,d;
                reg [3:0] a1;    //這里的a1,b1,c1,d1能寫成reg,不能寫成wire
                reg [3:0] b1;
                reg [3:0] c1;
                reg [3:0] d1;
         
                a1 = {3'b0,a};
                b1 = {3'b0,b};
                c1 = {3'b0,c};
                d1 = {3'b0,d};
                junc = a1+(b1<<1)+(c1<<2)+(d1<<3);
                $display(junc);
           
             上例用for循環做,和C語言一樣:
         
            parameter NUM1 = 3;
            function [NUM1:0] junc1;
                input   [NUM1:0]       a;
                reg     [NUM1:0]       b[NUM1:0];  
                int                    cnt;       //支持int,但不可綜合
         
                for(cnt=0;cnt<=NUM1;cnt++)
                    b[cnt] = {{NUM1{1'b0}},a[cnt]};
         
                junc1 = b[0];
                for(cnt=1;cnt<=NUM1;cnt++)
                    junc1 += b[cnt]<<cnt;
                $display("addr=",junc1);
            endfunction
         
            注意: 可綜合的function中不支持generate塊。
                   可綜合的function中電路描述必須被 begin 。。。。。end 包裹。
                   可綜合的function中不支持int,但可以用integer代替。不如對for循環進行計數時。
         
        8. 定義宏:
           `define ABC
         
           `ifdef  ABC
           `elsif  CCC //不是elseif,而是elsif,和perl一樣。
           `endif
         
           `ifndef ABC ....................
         
           `include ..................
         
        9. 數碼順序:就是DSP中所謂大端小端的問題,
           verilog中,如定義 4比特信號 a = {1,0,1,0} , 則 a 表示的是4'b1010,而不是4'b0101。a[0] 是 0 而不是1,所以{1,0,1,0}只是4'b1010的一種表示方法,和C語言中初始化數組的{1,0,1,0}是反向的。
         
        關閉窗口

        相關文章

        欧美性色欧美精品视频,99热这里只有精品mp4,日韩高清亚洲日韩精品一区二区,2020国自产拍精品高潮