zoukankan      html  css  js  c++  java
  • 在层次调用电路中改变参数的两个用法

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

    一、在引用实例时可以通过 #(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
        

    仿真图片:

  • 相关阅读:
    鼠标经过显示边框
    特殊字符
    HTML 列表
    embed 引入网上视频
    锚点定位
    盒子阴影
    Map的四种遍历方式
    Glide的 java.lang.RuntimeException: Expected instanceof GlideModule, but found:X.GlideModule@2e4554f
    Java标识符的命名规则
    django入门与实践
  • 原文地址:https://www.cnblogs.com/fhyfhy/p/4546001.html
Copyright © 2011-2022 走看看