[Verilog] 怎样自动定义参数的位宽?
本帖最后由 reaction100 于 2013-2-17 21:37 编辑写串口模块的时候遇到的问题:
系统时钟频率是50MHz,串口波特率要求是9600
为了便于使用,模块的开始部分使用这样的语句:
parameter DELAY = 50_000_000 / 9600;
(或者 `define DELAY 50_000_000 / 9600 )
如果时钟改为100MHz,波特率改为38400,参数就能改为
parameter DELAY = 100_000_000 / 38400;
这样使用虽然方便了,但是不同的参数位数不同,下文使用的时候就会出现warning
warning虽然不影响使用,但总是不好看。
如果模块后面的计数器部分也用默认的32位,虽然没有warning,但会浪费资源,因此不是个好办法。
请问有什么办法能方便使用,而且不产生warning?
在模块的module后面增加位宽变量,可以到调用该模块的上级对该位宽变量进行重新赋值,顺便把你上面提到的变量一起引到上层,一起修改就可以了。 文件最后添加:/*Get How Many Bits is Required to Represent 0 or 0 to V-1: (V <= 2) ? 1 : $clog2(V)*/
function integer CGetW(input V); reg i;
begin CGetW = 1; for(i = 0; (1 << i) < V; i = i + 1) CGetW = 1 + i; end endfunction
用parameter,宽度调用这个函数,函数的参数是值。Google一下就能得到。
$clog2也可以用,但是特殊值有问题,另外一个是部分综合器支持的不好;不如自己的常数Function。 dr2001 发表于 2013-2-19 15:27 static/image/common/back.gif
文件最后添加:用parameter,宽度调用这个函数,函数的参数是值。Google一下就能得到。
$clog2也可以用, ...
非常感谢! dr2001的方法可靠些!顶! dr2001 发表于 2013-2-19 15:27 static/image/common/back.gif
文件最后添加:用parameter,宽度调用这个函数,函数的参数是值。Google一下就能得到。
$clog2也可以用, ...
纠结了几天的问题,居然在这里找到了方法,非常感谢! function bitw;
input value;
reg i = 0;
while((1<<i) < value) i = i + 1;
bitw = i;
endfunction
页:
[1]