欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

專注電子技術學習與研究
當前位置:單片機教程網 >> 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}是反向的。
 
關閉窗口

相關文章