亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial programming >> Verilog

Verilog 数学函数

Verilog 数学函数可以用来代替常量表达式,并且支持 integer真实的 数学。

整数数学函数

函数$clog2 返回给定参数的 log2 的上限。这通常用于计算寻址给定大小的内存所需的最小宽度。

例如,如果设计有 7 个并行加法器,则表示所有 7 个加法器所需的最小位数为 $clog2 7 产生 3。

  
  
module des 
  #(parameter NUM_UNITS = 7) 
  
  // Use of this system function helps to reduce the 
  // number of input wires to this module
  (input [$clog2(NUM_UNITS)-1:0] active_unit);
  
  initial 
    $monitor("active_unit = %d", active_unit);
endmodule

`define NUM_UNITS 5

module tb;
  integer i;
  reg [`NUM_UNITS-1:0] 	active_unit;
  
  des #(.NUM_UNITS(`NUM_UNITS)) u0(active_unit);
  
  initial begin
    active_unit     = 1;     
	#10 active_unit = 7;
    #10 active_unit = 8;    
  end
endmodule

  

请注意,信号 active_unit 有 3 位来存储总共 5 个单元。

模拟日志
xcelium> run
active_unit = 001
active_unit = 111
active_unit = 000
xmsim: *W,RNQUIE: Simulation is complete.

真正的数学函数

这些系统函数接受 real 参数并返回一个 real 号码。

函数 说明
$ln(x) 自然对数 log(x)
$log10(x) 十进制对数 log10(x)
exp(x) x 的指数 (e x ) 其中 e=2.718281828...
sqrt(x) x 的平方根
$pow(x, y) x y
$floor(x) 楼层 x
$ceil(x) 天花板x
$sin(x) x 的正弦,其中 x 以弧度表示
$cos(x) x 的余弦,其中 x 的单位是弧度
$tan(x) x 的正切,其中 x 以弧度表示
$asin(x) x 的反正弦
$acos(x) x 的反余弦
$atan(x) x 的反正切
$atan2(x, y) x/y 的反正切
$hypot(x, y) x 和 y 的斜边:sqrt(x x + y y )
$sinh(x) x的双曲正弦
$cosh(x) x 的双曲余弦
$tanh(x) x 的双曲正切
$asinh(x) x的反双曲正弦
$acosh(x) x的反双曲余弦
$atanh(x) x的反双曲正切
  
  

module tb;
  real x, y;
  
  initial begin
    x = 10000;
    $display("$log10(%0.3f) = %0.3f", x, $log10(x));
    
    x = 1;
    $display("$ln(%0.3f) = %0.3f", x, $ln(x));
    
    x = 2;
    $display("$exp(%0.3f) = %0.3f", x, $exp(x));
    
    x = 25;
    $display("$sqrt(%0.3f) = %0.3f", x, $sqrt(x));
    
    x = 5;
    y = 3;
    $display("$pow(%0.3f, %0.3f) = %0.3f", x, y, $pow(x, y));
    
    x = 2.7813;
    $display("$floor(%0.3f) = %0.3f", x, $floor(x));
    
    x = 7.1111;
    $display("$ceil(%0.3f) = %0.3f", x, $ceil(x));
    
    x = 30 * (22.0/7.0) / 180;   // convert 30 degrees to radians
    $display("$sin(%0.3f) = %0.3f", x, $sin(x));
    
    x = 90 * (22.0/7.0) / 180;
    $display("$cos(%0.3f) = %0.3f", x, $cos(x));
    
    x = 45 * (22.0/7.0) / 180;
    $display("$tan(%0.3f) = %0.3f", x, $tan(x));
    
    x = 0.5;
    $display("$asin(%0.3f) = %0.3f rad, %0.3f deg", x, $asin(x), $asin(x) * 7.0/22.0 * 180);
    
    x = 0;
    $display("$acos(%0.3f) = %0.3f rad, %0.3f deg", x, $acos(x), $acos(x) * 7.0/22.0 * 180);
    
    x = 1;
    $display("$atan(%0.3f) = %0.3f rad, %f deg", x, $atan(x), $atan(x) * 7.0/22.0 * 180);    
  end
endmodule


  
模拟日志
xcelium> run
$log10(10000.000) = 4.000
$ln(1.000) = 0.000
$exp(2.000) = 7.389
$sqrt(25.000) = 5.000
$pow(5.000, 3.000) = 125.000
$floor(2.781) = 2.000
$ceil(7.111) = 8.000
$sin(0.524) = 0.500
$cos(1.571) = -0.001
$tan(0.786) = 1.001
$asin(0.500) = 0.524 rad, 29.988 deg
$acos(0.000) = 1.571 rad, 89.964 deg
$atan(1.000) = 0.785 rad, 44.981895 deg
xmsim: *W,RNQUIE: Simulation is complete.


Verilog

  1. Verilog 简介
  2. Verilog 教程
  3. Verilog 连接
  4. Verilog 作业
  5. Verilog 阻塞和非阻塞
  6. Verilog 函数
  7. Verilog 任务
  8. Verilog 时钟发生器
  9. Verilog 时间格式
  10. Verilog 时间刻度范围
  11. Verilog 文件 IO 操作
  12. Verilog Hello World