verilog中,对一个模块的多次调用,比如前一个调用还没有结束的情况下,就再次调用,后者是不是会覆盖前者?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了verilog中,对一个模块的多次调用,比如前一个调用还没有结束的情况下,就再次调用,后者是不是会覆盖前者?相关的知识,希望对你有一定的参考价值。
我的设计想多次降低图像的分辨率,就是说调用同一个分辨率降低模块,分几次调用后达到目的。而且在前一个处理到一定程度后,后面的低分辨率层就可以调用同样的模块来处理了。所以我只定义一个模块是不是会被覆盖?那么思路是什么?比如降低6次,难道我要定义6个相同的降低模块么?
Verilog中的模块都是电路,只能称之为例化,不能称之为调用。 如果你需要重复例化多个同样的模块,可以使用generate for语句:generate
genvar i;
for (i=0;i<N;i=i+1)
begin : inst_gen
....
end
endgenerate追问
请问,generate可以综合么?for语句中的N是不是不可综合?
追答是可以综合的语句。
参考技术A 你的功能用C语言比较合适。在Verilog中所以模块都是电路,并行处理所有信号,当然状态机可以调整信号时序,但不如CPU的顺序执行方便。 参考技术B 你可以去了解一下pipeline的原理,把你的模块分为多级去处理。verilog模块端口为二维数组如何调用?
参考技术A 必须分解为一维数组,然后再端口上一一列出。所以这点不如VHDL。 \\x0d\\x0a其实你如果嫌麻烦,可以变通一下的,比如做个接口,将两者对接。举例如下:\\x0d\\x0a你需要调用一个128*64存储器,但是设计128个64位宽的线组/寄存器组,管理起来很不方便,比如\\x0d\\x0aa0[63:0],a1[63:0],a2[63:0]..............a127[63:0],在外界调用时还得设计一个查找表。\\x0d\\x0a因此,你可以设计一个如下的寄存器组aa[128*64-1:0],在外界调用时,将二维数组的两个地址相乘就行了。\\x0d\\x0amoudle jiekou(aa,a0,a1.......a127);\\x0d\\x0ainput [8191:0] aa;\\x0d\\x0aoutput [63:0] a0,a1.....a127;\\x0d\\x0aassign a0=aa[63:0];\\x0d\\x0aassign a1=aa[127:64];\\x0d\\x0a.,,,,,,,\\x0d\\x0aendmodule以上是关于verilog中,对一个模块的多次调用,比如前一个调用还没有结束的情况下,就再次调用,后者是不是会覆盖前者?的主要内容,如果未能解决你的问题,请参考以下文章