在层次调用电路中改变参数的两个用法

一般在设计中会遇到有计数器(如分频等),计数值比较大,在仿真的时候会很浪费时间,一般则可以在源程序中通过修改参数来减少计数值,提高效率。但是,往往在仿真成功后忘记将仿真参数修改回原始参数而使在硬件上达不到实验效果。而本文介绍的两种方法可以不用修改源程序来访真。

一、在引用实例时可以通过 #(A,B,C)来改变参数。如果#()内的参数个数比实例中参数个数少,则实例中后面部分参数不改变。默认按顺序对应。

例子:

   module  parameter_top  (
                                         clk,
                                         rst_n,
                               
                                         led
                                             );
     input          clk;
     input          rst_n;
     
     output  [2:0]  led;
     
     //----------------------------//
      test_led  #(10,20)   U1(
                                                     .clk(clk),
                                                     .rst_n(rst_n),
                                                     
                                                     .led(led[0])
                                    
                                                        );
                                                        
      test_led  #(30)    U2(
                                                     .clk(clk),
                                                     .rst_n(rst_n),
                                                     
                                                     .led(led[1])
                                    
                                                        );
        test_led            U3(
                                                     .clk(clk),
                                                     .rst_n(rst_n),
                                                     
                                                     .led(led[2])
                                    
                                                        );                                                
    endmodule
    
    
    module  test_led  (
               clk,
               rst_n,
               
                         led
                 );
     input          clk;
     input          rst_n;
     
     output         led;
     
    //---------------------------//
    parameter  tck = 20;
    parameter  tcf = 40;
    
    reg   [5:0]     cnt;
    always @(posedge clk or negedge rst_n)
     begin
      if(!rst_n)
       begin
         cnt <= 0;
        end
      else if(cnt >= tcf )
        begin
         cnt <= 0;
        end
        else  cnt <= cnt + 1;
      end
        
    assign led = (cnt < tck );    
    
    
    endmodule
    

 测试程序:

 

 
/********************************Copyright**************************************                           
**----------------------------File information--------------------------
** File name  :test.v  
** CreateDate :2015.06
** Funtions   :测试文件
** Operate on :M5C06N3L114C7
** Copyright  :All rights reserved. 
** Version    :V1.0
**---------------------------Modify the file information----------------
** Modified by   :
** Modified data :        
** Modify Content:
*******************************************************************************/
 
   module test;
     
     reg       clk;
     reg       rst_n;
     
     wire  [2:0]  led;
     
    parameter_top  k1(
                                         .clk,
                                         .rst_n,
                               
                                         .led
                                             );
                                             
    //-------------------//                
    
     parameter tck = 24;
     parameter t = 1000/tck;
     
     always 
       #(t/2) clk = ~clk;
    
     initial 
      begin
       clk = 0;
         
         rst_n = 0;
         
         #(15*t) rst_n = 1;
      
      end
    endmodule
    
     

 测试波形:

   

 

 

二、还可以在TOP或者testbench文件中通过defparam 来改变参数。格式为 defparam  例化名.内层例化名.参数名 = 数值。例如:在top中例化,defparam  U1.S1.K = 2;

   注意:此种方法 只能改变parameter 声明的参数,不能改变localparam声明的参数。因为localparam是局部参数,但它不能被重定义,也就是说在实例化的时候不能通过层次引用进行重定义,parameter 是全局参数,可以被改变。

 例子:

 

  module  parameter_top_2  (
                                         clk,
                                         rst_n,
                               
                                         led
                                             );
     input          clk;
     input          rst_n;
     
     output  [2:0]  led;
     
     //----------------------------//
     
      test_led         U1(
                                                     .clk(clk),
                                                     .rst_n(rst_n),
                                                     
                                                     .led(led[0])
                                    
                                                        );
                                                        
      test_led           U2(
                                                     .clk(clk),
                                                     .rst_n(rst_n),
                                                     
                                                     .led(led[1])
                                    
                                                        );
        test_led            U3(
                                                     .clk(clk),
                                                     .rst_n(rst_n),
                                                     
                                                     .led(led[2])
                                    
                                                        );    
                                                        
    defparam  U1.tck = 10;
    defparam  U1.tcf = 20;
    
    defparam  U2.tck = 25,     //,不是;
            U2.tcf = 30;
    
    defparam  U3.tck = 5;
    defparam  U3.tcf = 25;            
    
    endmodule
    
    module  test_led  (
               clk,
               rst_n,
               
                         led
                 );
     input          clk;
     input          rst_n;
     
     output         led;
     
    //---------------------------//
    parameter  tck = 20;
    parameter  tcf = 40;
    
    reg   [5:0]     cnt;
    always @(posedge clk or negedge rst_n)
     begin
      if(!rst_n)
       begin
         cnt <= 0;
        end
      else if(cnt >= tcf )
        begin
         cnt <= 0;
        end
        else  cnt <= cnt + 1;
      end
        
    assign led = (cnt < tck );    
    
    
    endmodule
    
    

测试程序:

   module test;
     
     reg       clk;
     reg       rst_n;
     
     wire  [2:0]  led;
     
    parameter_top_2  k1(
                                         .clk,
                                         .rst_n,
                               
                                         .led
                                             );
                                             
    //-------------------//                
    
     parameter tck = 24;
     parameter t = 1000/tck;
     
     always 
       #(t/2) clk = ~clk;
    
     initial 
      begin
       clk = 0;
         
         rst_n = 0;
         
         #(15*t) rst_n = 1;
      
      end
    endmodule
    

 

 

仿真图片:

 

posted @ 2015-06-02 11:35  远航路上ing  阅读(465)  评论(0编辑  收藏  举报